Open Database Connectivity sur Jaguar
L’une des fonctions nouvelles, quoique virtuellement non documentées, de Jaguar est l’ODBC, ou Open Database Connectivity (Connectivité de Base de Données Ouverte). ODBC permet à des programmes de se connecter à des bases de données de fournisseurs différents en utilisant le même ensemble de protocoles de communication. Cela permet la programmation de bases de données simplifiées aussi bien que l’accès à une base de données à partir de programmes qui n’autoriseraient normalement pas un tel accès. Par exemple, avec ODBC vous pouvez utiliser Excel pour obtenir des données de MySQL, ou bien utiliser FileMaker pour obtenir des données d’Oracle.
Cet article présentera un rapide apreçu de ODBC, puis retracera mes expériences pour faire marcher ODBC avec MySQL. Enfin j’évoquerai des détails sur la manière de faire marcher ODBC avec postgreSQL.
Un rapide aperçu de ODBC
A la base, ODBC requiert quatre éléments pour fonctionner:
- Une source de données.
- Un gestionnaire ODBC pour la source de données.
- Une interface au gestionnaire ODBC.
- Un programme compatible ODBC pour accéder aux données (comme FileMaker, Excel, RealBASIC).
Les requêtes ODBC fonctionnent grossièrement de cette façon:
- Le programme compatible ODBC cherche le gestionnaire correct à utiliser dans l’interface au gestionnaire.
- Le programme utilise le gestionnaire pour se connecter à la source de données.
Vous êtes probablement en train de vous demander probablement comment le programme compatible ODBC sait quel gestionnaire rechercher et quelle source de données utiliser. Il y a un fichier d’initialisation nommé odbc.ini qui manipule toutes sortes d’informations de configuration, comme des informations sur les gestionnaires et sur les alias de source de données individuels, aussi appelés DSNs (pour datasource names, noms de sources de données). Configurer correctement le fichier odbc.ini est la clé pour faire fonctionner ODBC correctement. Vous pourriez éditer le fichier à la main, mais heureusement, Apple et iODBC fournissent tous les deux des administrateurs d’ODBC basés sur Cocoa, ce qui rend l’édition de fichier odbc.ini très facile.
Une Seconde … C’est quoi iODBC ?
L’interface de gestionnaires ODBC livré avec Jaguar est en fait le produit iODBC de OpenLink Software (cliquez ici pour plus d’information). iODBC est une interface de gestionnaires et un SDK open source pour faire fonctionner ODBC sur les environnements *nix, y compris Jaguar. OpenLink fournit aussi des gestionnaires ODBC commerciaux de grande qualité pour différentes bases de données et plates-formes de systèmes d’exploitation. iODBC fournit un SDK ODBC pour OS X qui inclut une interface de gestionnaires ODBC mis à jour de même que son propre administrateur ODBC basé sur Cocoa. Je recommenderais d’utiliser le SDK de iODBC comme interface de gestionnaires ; il se comporte mieux et l’administrateur ODBC a plus de fonctionnalités que celui d’Apple.
Remarquez que j’ai utilisé le SDK de iODBC pour tous les exemples de cet article. Pour télécharger ls SDK et obtenir d’autres informations utiles sur ODBC en général, allez visiter le site web de iODBC pour plus d’informations.
MyODBC et l’Installation MySQL Standard
Le premier pas pour faire marcher ODBC avec MySQL a été de télécharger le gestionnaire ODBC de MySQL, appelé MyODBC. Puisque j’avais l’installation standard de MySQL (l’installation “pkg” de mysql.com), je suis allé sur mysql.com et j’ai téléchargé le gestionnaire ODBC. Puis j’ai installé les ports dans /usr/local/, comme recommandé dans le manuel.
Une fois le port installé, l’étape suivante a été de configurer le gestionnaire et le DSN dans l’administrateur ODBC. C’est un processus assez direct. Vous lancez l’administrateur ODBC, choisissez l’onglet “Gestionnaires”, puis “Ajouter”. A partir de là vous donnez un nom au gestionnaire et trouvez le fichier pour le gestionnaire. Il n’y a pas eu besoin de configurer des paires clé-valeur à ce niveau carje n’avais pas d’options qui étaient universelles pour toutes les instances de ce gestionnaire.
La distribution MyODBC inclut certains fichiers lib aussi assurez-vous de choisir le fichier correct. Le fichier lib qui nous intéresse est libmyodbc3.so, qui est un lien symbolique vers libmyodb3-VERSION.so, où VERSION est la version de MyODBC que vous avez.
Lorsque le gestionnaire a été installé, l’étape suivante a été de configurer le DSN. Pour cela, j’ai d’abord choisi l’onglet “DSN utilisateur” dans l’administrateur ODBC. Pour ajouter un nouveau DSN, cliquez sur le bouton “Ajouter” et choisissez un gestionnaire que vous voulez utiliser. Dans ce cas j’ai sélectionné le gestionnaire MyODBC que je venais d’installer.
Il y a ensuite une page de configuration pour le DSN qui s’ouvre. J’ai choisi le nom “test” pour mon DSN puis j’en suis arrivé à ajouter des paires clé-valeur pour cette source de données. Ces paires clé-valeur donnent toutes les informations requises par le gestionnaire ODBC pour se connecter à la base de données. Les données minimales nécessaires pour que MyODBC se connecte à une base de données locale sont: base de données, utilisateur et mot de passe (Je réalise que dans un environnement d’installation inclure un mot de passe est une mesure de sécurité, mais pour la configuration et le test il est sensiblement plus facile d’inclure le mot de passe ici). Une fois les paires clé-valeur configurées, nous pouvons tester notre connection.
Emplacement, emplacement, et Type
Il y a deux manières de tester une connection ODBC : la première est d’utiliser l’application en ligne de commande odbctest (fournie avec Jaguar et localisée dans /usr/bin), la seconde est d’utiliser la fonction de test de l’administrateur de iODBC. Je recommenderais de faire le test avec les deux applications avant de décider définitivement si votre gestionnaire ou votre configuration fonctionne. J’ai expérimenté divers gestionnaires, où l’un marchait alors que l’autre nonmait une connexion ODBC pouvait être établie avec ce dernier.
J’ai commencé par tester à partir de l’administrateur d’iODBC. J’ai choisi mon DSN dans l’onglet DSN utilisateur, ai croisé les doigts et ai cliqué sur test. Et ça n’a pas marché. J’ai reçu deux messages :
- IM003 [iODBC][Driver Manager]Specified driver could not be loaded followed by
- 0000 [iODBC][Driver Manager]NSLinkModule0 failed for dlopen()
La situation était grave, mais aucun des messages ne donnait beaucoup d’indications sur le vrai problème, aussi était-il temps de le tester avec odbctest :
[troll:local/mysql/bin] aaa% odbctest iODBC Demonstration program This program shows an interactive SQL processor Enter ODBC connect string (? shows list): ? DSN | Description --------------------------------------------------------------- test | myodbc Enter ODBC connect string (? shows list): dsn=test dyld errors during link edit for file /Users/mysqldev/venu/local/mysql/lib/mysql/libmysqlclient.10.dylib dyld: odbctest can't open library: /Users/mysqldev/venu/local/mysql/lib/mysql/libmysqlclient.10.dylib (No such file or directory, errno = 2) Abort [troll:local/mysql/bin] aaa%
Sans surprise, cela ne fonctionnait toujours pas, mais les erreurs étaient plus claires. Il semble qu’il ne peut trouver libmysqlclient.10.dylib et la raison semble être que le répertoire qu’il recherche n’existe pas. MySQL n’est pas installé sur OS X de la même manière que sur *nix et il apparaît qu’il recherchait le fichier dans l’emplacement *nix standard. Et bien pourquoi ne pas ruser avec un lien symbolique à libmysqlclient.10.dylib dans la structure de répertoire qu’il demande et voir ce qui se passe ?
Et me voilà parti chercher libmysqlclient.10.dylib. Tout d’abord, je consulte le répertoire MySQL lib… Pas là. Puis je cherche dans toute la structure de répertoire MySQL… Pas là non plus. Finalement je décide d’abandonner et de chercher dans tout le système de fichiers. Une seconde, libmysqlclient.10.dylib n’existe pas sur mon système. Apparemment la chose la plus proche est libmysqlclient.a.
Une librairie statique, c’est pas bon. On a besoin d’une librairie dynamique. Les .dylib (tout comme les fichiers .so, et les fichiers .bundle sur Mac OS X) sont des librairies dynamiques, ce qui signifie que quand un programme est compilé vous éditez juste un lien vers le fichier, vous n’incluez pas le fichier dans votre exécutable. A l’opposé les fichiers .a sont des librairies statiques, quand un programme est compilé vous éditez un lien vers le fichier et la librairie est incluse dans votre exécutable. Le problème ici est que libmysqlclient.a est une librairie statique et ne peut être dynamiquement liée.
On dirait que si je veux connecter MySQL à MyODBC, je vais devoir soit recompiler la librairie partagée de MyODBC et la faire lier statiquement à libmysqlclient.a, ou bien recompiler libmysqlclient en tant que librairie partagée.
Autres Options
Je n’étais pas enthousiasmé à l’idée de recompiler, car cela impliquerait de tripatouiller soit les scripts configure soit les makefiles, aucun des deux ne m’amusant. J’étais toutefois déterminé à faire fonctionner l’ensemble, aussi refais-je un tour sur le site mysql.com pour télécharger le MySQL debug package pour OS/X (qui inclut le code source de MySQL) et le code source de MyODBC.
Pendant le téléchargement, j’ai fait quelques recherches sur Google pour voir si on ne pouvait pas trouver quelque part du code source, de la documentation, des FAQs ou n’importe quoi d’autre qui pourrait faire avancer les choses. Je n’ai trouvé aucune documentation utile, mais je suis cependant tombé sur le site de logiciels Server Logistics OS X, qui avait une distribution pkg de MySQL qui avait l’air différente de celle de mysql.com, et cette version prétendait inclure le support ODBC. Je n’avais rien à perdre, aussi ai-je décidé de télécharger le fichier et de l’installer pour voir ce que ça donnait.
Apreès le téléchargement, j’ai archivé mes données MySQL et j’ai effacé la version de MySQL que j’avais installé. Le package Server Logistics est une image disque (dmg) comprenant plusieurs packages ainsi que de la documentation sur la configuration, l’installation et la désinstallation du logiciel. J’ai installé MySQL et les packages MyODBC, puis j’ai regardé quelles libs avaient été installées. Dans ce cas libmysqlclient était une lib dynamique. Pas mal jusqu’ici, aussi ai-je restauré mes données et ai tené de configurer ODBC une nouvelle fois.
La première étape était de configurer le gestionnaire ODBC dans l’administrateur d’iODBC. La démarche était la même que la première fois sauf que le fichier du gestionnaire était libmyodbc3.bundle et qu’il se trouvait dans /Library/MyODBC/lib. J’ai ensuite configuré le DSN, exactement de la même manière que pour la configuration précédente.
Puis il a fallu tester. J’ai d’abord essayé le bouton “Test” dans le “DSN utilisateur”, ce qui a renvoyé un résultat intéressant:
- HY000: [MySQL][ODBC 3.5.1] No DSN entered
Hmm… Je pensais que c’était une erreur bizarre, aussi ai-je voulu voir ce que odbctest allait dire :
[troll:~] aaa% /usr/bin/odbctest iODBC Demonstration program This program shows an interactive SQL processor Enter ODBC connect string (? shows list): ? DSN | Description --------------------------------------------------------------- mysqltest | MyODBC Enter ODBC connect string (? shows list): dsn=mysqltest Driver: 03.51.06 SQL> show tables; Tables_in_test -------------- testaaa result set 1 returned 1 rows.
Oulah, on dirait que ça a marché ! Ilétait maintenant temps de le tester avec une application compatible ODBC, Excel V.x. (Note: Quand Excel V.x émet des requêtes ODBC il utilise en fait une application appelée Microsoft Query. Microsoft Query n’est pas inclus dans la distribution standard de Office V.x, vous devrez donc la télécharger sur Microsoft). Une fois à l’intérieur de Excel je choisis “Data”, “Get External Data”, “New Database Query”. Cela ouvre un écran qui ressemble à l’écran de l’interface iODBC. Je choisis le DSN que je veux tester, clique sur “OK” et j’arrive maintenant dans le formulaire de requêtes de Microsoft Query. Comme par magie, la liste de tables de ma base de données s’est affichée sur le côté droit de l’écran. Croisant les doigts je lance une requéte et… voila !!! J’ai une connexion ODBC à ma base de données MySQL.
Dernières idées
Aprés m’être un peu creusé la tête, j’ai enfin fait marcher MySQL avec ODBC. Il est malheureux que la distribution de base que mysql.com fournit (probablement celle que le plus grand nombre de personnes ont installée) ne fonctionne pas avec ses gestionnaires ODBC. C’est souvent le cas cependant avec les logiciels open source. Je recommande vivement la distribution Server Logistics, qui se configure facilement et qui offre quelques bonus non présents dans la distribution standard.

Textes originaux en anglais sur O’Reilly : Open Database Connectivity in Jaguar par Andrew Anderson
Chargement
Commentaires récents