26. Pilote ODBC
MIRAJ ODBC Driver est le pilote ODBC natif de MIRAJ. Il parle le protocole MySQL à miraj-server (port 7007 par défaut) et n'a besoin d'aucun autre composant : ni MariaDB Connector/ODBC, ni bibliothèque cliente MySQL. Il vise le niveau Core et le niveau 1 de l'API ODBC 3.8, en 64 bits, pour les applications qui lisent MIRAJ par ODBC : Excel, Power BI, Access (tables liées), LibreOffice Base, pyodbc, FireDAC (Delphi), DBeaver.
| Système | Bibliothèque | Installée par |
|---|---|---|
| Windows 64 bits | miraj_odbc.dll | l'assistant d'installation (dossier du programme) ou le zip |
| macOS (Apple silicon) | /usr/local/miraj-express/lib/libmiraj_odbc.dylib | le paquet .pkg |
| Linux 64 bits | libmiraj_odbc.so | le zip Linux |
Le nom du pilote, à écrire tel quel dans les chaînes de connexion, est MIRAJ ODBC Driver. Le serveur n'a rien à régler pour lui : un compte MIRAJ ordinaire suffit (chapitre 10).
26.1 Installation#
Windows#
L'assistant d'installation (2.2) copie miraj_odbc.dll à côté de miraj-server.exe et déclare le pilote à Windows, dans la vue 64 bits du registre :
- la clé
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\MIRAJ ODBC Driver, avec les valeursDriveretSetup(chemin de la DLL),APILevel=1,ConnectFunctions=YYY,DriverODBCVer=03.80,SQLLevel=1etFileUsage=0; - la valeur
MIRAJ ODBC Driver=Installeddans la clé...\ODBCINST.INI\ODBC Drivers.
Le pilote apparaît alors dans l'onglet Pilotes de l'administrateur de sources de données ODBC 64 bits (odbcad32.exe du dossier System32). Il n'existe pas en 32 bits : une application 32 bits (Access ou Excel 32 bits, ancien Delphi 32) ne le voit pas, et il faut une édition 64 bits de l'application. Les éditions Express et Entreprise déclarent le même nom ; si les deux sont installées, c'est la dernière installée qui l'emporte.
Sans l'assistant (zip) : décompresser le dossier où l'on veut, puis lancer, dans un PowerShell 64 bits ouvert en administrateur :
.\Declarer-ODBC.ps1 # miraj_odbc.dll à côté du script
.\Declarer-ODBC.ps1 -Dll C:\MIRAJ\miraj_odbc.dllLe dossier de la DLL ne doit plus être déplacé après la déclaration (le registre en garde le chemin) ; pour le déplacer, relancer le script.
macOS#
Le paquet MIRAJ-<version>-Express-macos-<arch>.pkg (2.2, 21.13) dépose /usr/local/miraj-express/lib/libmiraj_odbc.dylib, et son script de fin d'installation ajoute la section [MIRAJ ODBC Driver] à /Library/ODBC/odbcinst.ini (fichier créé au besoin), ainsi qu'à /usr/local/etc/odbcinst.ini et /opt/homebrew/etc/odbcinst.ini s'ils existent (unixODBC installé par Homebrew). Les autres pilotes de ces fichiers ne sont pas modifiés ; une réinstallation remplace seulement la section de MIRAJ.
[MIRAJ ODBC Driver]
Description=MIRAJ ODBC Driver (protocole MySQL vers miraj-server)
Driver=/usr/local/miraj-express/lib/libmiraj_odbc.dylib
Setup=/usr/local/miraj-express/lib/libmiraj_odbc.dylibmacOS ne fournit pas de Driver Manager : installer unixODBC (brew install unixodbc) ou utiliser celui d'une application (Excel pour Mac embarque iODBC, qui lit le même odbcinst.ini). Vérification :
odbcinst -q -d # liste les pilotes : « MIRAJ ODBC Driver » doit y figurerLinux#
Le zip MIRAJ-<version>-Express-linux-x64.zip contient libmiraj_odbc.so et, dans odbc/, deux scripts. Il faut unixODBC (unixodbc sous Debian et Ubuntu, unixODBC sous Fedora et RHEL). Après décompression, par exemple dans /opt/miraj :
sudo /opt/miraj/odbc/register.sh # déclare le pilote dans odbcinst.ini
sudo /opt/miraj/odbc/register.sh --lib /opt/miraj/libmiraj_odbc.so # chemin expliciteLe script cherche le fichier indiqué par odbcinst -j (ligne DRIVERS, en général /etc/odbcinst.ini), retire une ancienne section [MIRAJ ODBC Driver] puis écrit la nouvelle, en laissant le reste intact. Il est répétable. --ini <fichier> vise un autre fichier (plusieurs fois possible), par exemple un odbcinst.ini d'essai ou celui d'un ODBCSYSINI particulier. La même section peut aussi s'écrire à la main, ou se déclarer par odbcinst -i -d -f modèle.ini avec un fichier contenant la section ci-dessus.
26.2 Chaîne de connexion#
Une chaîne ODBC est une suite de MOT=valeur;MOT=valeur. Les mots sont insensibles à la casse, un mot répété garde sa première valeur, et un mot inconnu est ignoré (les outils en ajoutent). Une valeur qui contient ; s'écrit entre accolades : PWD={a;b}.
DRIVER={MIRAJ ODBC Driver};SERVER=127.0.0.1;PORT=7007;UID=root;PWD=mot de passe;DATABASE=ventes| Mot | Rôle | Défaut |
|---|---|---|
DRIVER | nom du pilote ({MIRAJ ODBC Driver}) ; choisit le pilote auprès du Driver Manager | |
DSN | nom d'une source de données (26.3) ; les mots de la chaîne l'emportent sur ceux de la source | |
SERVER (ou HOST) | nom ou adresse du serveur | 127.0.0.1 |
PORT | port TCP | 7007 |
UID (ou USER) | compte MIRAJ | |
PWD (ou PASSWORD) | mot de passe ; jamais écrit dans un message d'erreur ni dans la chaîne rendue à l'application | |
DATABASE (ou DB) | base courante à la connexion | aucune |
SSLMODE | TLS : disabled, preferred, required, verify-ca, verify-full | preferred |
SSLCA | fichier d'autorités de certification (PEM ou DER) pour verify-ca et verify-full | autorités publiques |
SSLCERT, SSLKEY | certificat et clé privée du client, ensemble, clé non chiffrée | aucun |
COMPRESS | protocole compressé (1, yes, true, on) | 0 |
PREPONCLIENT | 1 : les paramètres ? sont substitués dans le texte SQL par le pilote ; 0 : requêtes préparées par le serveur | 0 |
CONNECTTIMEOUT, READTIMEOUT, WRITETIMEOUT | délais, en secondes | aucun |
INITSTMT | instruction exécutée après la connexion | aucune |
LOG | chemin d'un journal du pilote (ou variable d'environnement MIRAJ_ODBC_LOG) ; sans mot de passe ni valeurs, fichier en 0600, limité à 64 Mio | désactivé |
TLS. disabled n'utilise jamais TLS. preferred chiffre si le serveur le propose et retombe sinon en clair, sans vérifier le certificat : il ne protège pas d'un attaquant actif. required exige TLS (la connexion échoue avant l'envoi du mot de passe si le serveur ne le propose pas) sans vérifier le certificat. verify-ca et verify-full vérifient la chaîne avec SSLCA et que le nom du serveur figure dans le certificat (limite de la bibliothèque cliente : verify-ca ne peut pas ignorer le nom, il est donc aussi strict que verify-full). Sans SSLCA, seules les autorités publiques sont crues : un certificat auto-signé exige SSLCA. Pour un réseau qui n'est pas de confiance, utiliser verify-full avec le certificat de l'autorité du serveur :
DRIVER={MIRAJ ODBC Driver};SERVER=miraj.exemple.fr;UID=app;PWD=...;SSLMODE=verify-full;SSLCA=C:\certs\ca.pemUn serveur lancé avec --require-tls refuse SSLMODE=disabled (erreur 3159).
PREPONCLIENT. Par défaut, SQLPrepare utilise les requêtes préparées du serveur (protocole binaire : types exacts, BLOB envoyés par morceaux). Mettre PREPONCLIENT=1 si un outil prépare des requêtes que le serveur n'accepte pas sous cette forme : le pilote échappe alors lui-même les valeurs et envoie le texte complet.
COMPRESS. Utile sur un lien lent (résultats volumineux) ; sur le réseau local, le gain est nul et le processeur travaille plus.
26.3 Sources de données (DSN)#
Une source de données (DSN) range les mots de la chaîne de connexion sous un nom ; l'application n'écrit plus que DSN=nom (et, au besoin, UID et PWD).
Windows#
Une source se range dans le registre : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\<nom> pour une source Système (visible de tous les comptes), HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\<nom> pour une source Utilisateur, avec une valeur Driver (chemin de miraj_odbc.dll) et un mot du tableau 26.2 par valeur, et le nom dans la clé ...\ODBC.INI\ODBC Data Sources (valeur MIRAJ ODBC Driver). Exemple pour une source Utilisateur, dans PowerShell :
$k = "HKCU:\SOFTWARE\ODBC\ODBC.INI\MIRAJ ventes"
New-Item $k -Force | Out-Null
Set-ItemProperty $k Driver "C:\Program Files\Miraj Express\miraj_odbc.dll"
Set-ItemProperty $k SERVER "127.0.0.1"
Set-ItemProperty $k PORT "7007"
Set-ItemProperty $k DATABASE "ventes"
New-Item "HKCU:\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources" -Force | Out-Null
Set-ItemProperty "HKCU:\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources" "MIRAJ ventes" "MIRAJ ODBC Driver"La source se voit ensuite dans odbcad32.exe (64 bits), onglet DSN utilisateur ou DSN système. Le mot de passe n'est pas à ranger dans la source : l'application le demande et le transmet à la connexion. Le pilote ne fournit pas de fenêtre de saisie propre à MIRAJ dans odbcad32.exe (bouton Configurer) : les sources se créent par le registre comme ci-dessus.
macOS et Linux : odbc.ini#
unixODBC lit les sources dans ~/.odbc.ini (utilisateur) et dans odbc.ini du dossier de configuration (/etc/odbc.ini sous Linux, /Library/ODBC/odbc.ini sous macOS ; odbcinst -j en donne les chemins). Le pilote lit ces fichiers lui-même quand la chaîne contient DSN= :
[MIRAJ ventes]
Driver = MIRAJ ODBC Driver
Description = Base des ventes
SERVER = 127.0.0.1
PORT = 7007
UID = lecteur
DATABASE = ventes
SSLMODE = verify-full
SSLCA = /etc/ssl/miraj-ca.pemVérification, sans écrire de programme (isql est livré avec unixODBC) :
isql -v "MIRAJ ventes" lecteur 'mot de passe'Un mot de passe écrit dans odbc.ini (PWD = ...) y est en clair : réserver cet usage aux postes de confiance et protéger le fichier (chmod 600 ~/.odbc.ini).
26.4 Exemples#
Python (pyodbc)#
import pyodbc
cn = pyodbc.connect(
"DRIVER={MIRAJ ODBC Driver};SERVER=127.0.0.1;PORT=7007;"
"UID=root;PWD=mot de passe;DATABASE=ventes")
cur = cn.cursor()
cur.execute("SELECT id, nom FROM client WHERE ville = ?", "Alger")
for ligne in cur.fetchall():
print(ligne.id, ligne.nom)
cn.close()Le script tools/validation/odbc.py (40 vérifications) s'exécute avec ce pilote : python3 tools/validation/odbc.py --port 7007 --password '...' --driver "MIRAJ ODBC Driver".
Excel#
Données → Obtenir des données → À partir d'autres sources → À partir d'ODBC, puis choisir une source de données (DSN) ou Chaîne de connexion et saisir la chaîne (DRIVER={MIRAJ ODBC Driver};SERVER=...), puis les identifiants, la table et Charger. Excel doit être en 64 bits (Fichier → Compte → À propos d'Excel). Sous macOS, Excel passe par iODBC : le pilote doit être dans /Library/ODBC/odbcinst.ini (fait par le paquet), la source dans ~/Library/ODBC/odbc.ini ou /Library/ODBC/odbc.ini.
Power BI Desktop#
Obtenir les données → ODBC, choisir le DSN ou coller la chaîne de connexion dans Options avancées, puis les identifiants (Base de données). Le mode Import est celui qui convient (le pilote n'a pas de mode DirectQuery propre). Une passerelle de données locale (actualisation dans le service en ligne) doit avoir le pilote installé sur la machine de la passerelle, et la source en DSN système.
Access (tables liées)#
Access 64 bits seulement. Données externes → Source de données ODBC → Lier à la source de données, onglet Source de données machine (DSN système ou utilisateur), choisir les tables. Pour une table sans clé primaire déclarée, Access demande les colonnes qui identifient une ligne : les choisir pour pouvoir modifier la table liée.
LibreOffice Base#
Fichier → Nouveau → Base de données → Se connecter à une base de données existante → ODBC, saisir le nom du DSN (LibreOffice s'appuie sur unixODBC sous Linux et macOS, sur le Driver Manager sous Windows) ; le nom d'utilisateur se demande à l'étape suivante.
FireDAC, DBeaver, autres#
FireDAC : DriverID=ODBC, ODBCDriver=MIRAJ ODBC Driver (ou DataSource=<DSN>). DBeaver (pilote générique ODBC) et tout outil qui accepte un DSN ou une chaîne ODBC fonctionnent de même.
26.5 Limites#
- Pas de 32 bits : le pilote est livré en 64 bits seulement (Windows x64, macOS Apple silicon, Linux 64 bits). Les applications 32 bits ne le voient pas (26.1).
- Curseur en avant seul : pas de défilement ni de curseur modifiable.
SQLFetchScrolln'accepte queSQL_FETCH_NEXT. Un autre type de curseur demandé par l'application est remplacé par le curseur en avant, avec l'avertissement01S02(option modifiée). - Niveaux : fonctions ODBC Core et niveau 1 ; pas de niveau 2 (pas de
SQLSetPos, deSQLBulkOperations, deSQLBrowseConnect). Les mises à jour se font en SQL (INSERT,UPDATE,DELETE). - Un seul flux réseau par connexion : une seconde instruction exécutée alors qu'un
SELECTest à moitié lu fait tamponner en mémoire le reste du premier résultat ; les curseurs entrelacés et leCOMMITavec curseur ouvert fonctionnent, mais un très gros résultat laissé à moitié lu occupe de la mémoire. - Non pris en charge : paramètres de sortie (
SQL_PARAM_OUTPUT,{? = call}), données envoyées au vol avecPARAMSET_SIZE> 1, signets, descripteurs d'application explicites liés à une instruction. - Heures : une valeur
TIMEnégative ou supérieure à 24 h lue enSQL_C_TYPE_TIMEest rendue sans signe ; la lire enSQL_C_CHARdonne la valeur exacte. - Annulation : les fonctions de catalogue (
SQLTables,SQLColumns…) ne sont pas annulables. - Catalogue : le schéma ODBC est toujours vide ; les index du serveur sont tous de type hachage ; les colonnes
AUTO_INCREMENTne sont pas signalées parSQLColumns. - Authentification :
mysql_native_passwordetcaching_sha2_password; pasclient_ed25519. - TLS : pas de clé privée du client protégée par mot de passe .
- Fenêtre de configuration : pas de boîte de dialogue MIRAJ dans
odbcad32.exe(26.3). - Dépendances : l'annulation d'une requête (
SQLCancel) ouvre une seconde connexion et envoieKILL QUERY: le compte doit avoir le droit de tuer ses propres requêtes. - Transactions :
AUTOCOMMITet les niveaux d'isolation sont ceux de MIRAJ (chapitre 9). - Les limites du serveur (chapitre 16) s'appliquent aussi : types non pris en charge, instructions non reconnues.
26.6 Désinstallation#
Windows#
Désinstaller MIRAJ depuis Paramètres → Applications (2.2) : l'assistant retire miraj_odbc.dll et la déclaration du pilote (la clé MIRAJ ODBC Driver et la valeur de ODBC Drivers). Les sources de données créées par l'utilisateur restent dans le registre (elles ne fonctionnent plus) ; les supprimer dans odbcad32.exe. Après une installation par zip, retirer la déclaration avant de supprimer le dossier :
.\Retirer-ODBC.ps1macOS#
La désinstallation d'un .pkg n'est pas gérée par macOS : retirer le pilote à la main, dans un terminal.
sudo /usr/local/miraj-express/bin/miraj-odbc-unregister.sh # retire la section des odbcinst.ini
sudo rm /usr/local/miraj-express/lib/libmiraj_odbc.dylibLe script ne touche qu'à la section [MIRAJ ODBC Driver] ; les autres pilotes et les sources de données (odbc.ini) restent. Le reste de MIRAJ se désinstalle comme décrit en 21.13.
Linux#
sudo /opt/miraj/odbc/unregister.sh # retire la section de odbcinst.inipuis supprimer le dossier décompressé.