Voraussetzung:

  • ein laufender MySQL Server (die aktuelle Version schadet hier nie. Die Ports sind hier zu empfehlen, der MySQL Server 5.1 wird stets sehr schnell von den Port Maintainern aktualisiert.)
  • libtools
  • autotools
  • libIODBC oder UnixODBC (meine Empfehlung ist hier: libIODBC)
  • gcc
  • mehr fällt mir jetzt nicht ein, aber eigentlich gibt es auch automatisch Mecker vom System, wenn noch etwas anderes fehlen sollte
Source:

Leider sind die Ports zum Thema MyODBC so gar nicht aktuell. Es empfiehlt sich hier tatsächlich das selbstkompilieren.

Die Sourcen gibt es unter http://www.mysql.de
dort unter Community -> Download -> Connectors -> Connector/ODBC

Jetzt bleibt die Qual der Wahl zwischen 3.51 und 5.1

MyODBC 3.51 ist derzeit noch die "stabile Version". Allerdings ohne Unicode Unterstützung.
MyODBC 5.1 ist noch die "alpha  Version".  Das macht aber in diesem Fall nichts, dennoch ist sie durchaus empfehlenswert. Der Vorteil dieser Version ist die Unicode Unterstützung.

Egal auf welche Version die Entscheidung fällt, jetzt heisst es erst einmal Source code downloaden.

Für die 3.51er Version befindet sich der Source Download ganz unten auf der Webseite.

Für die 5.1er Version hoffentlich in Zukunft ebenfalls. Derzeit ist dieser fälschlicher Weise mehrmal zwischen die Linuxabschnitte gelandet.

Entpacken:

Nach dem Herunterladen, sollte die Datei erstmal entpackt werden, wie hier am Beispiel für MyODBC 3.51.22 gezeigt ist:

 $ tar xvzf mysql-connector-odbc-3.51.22r857.tar.gz
Systemkonfiguration:

Bevor jetzt mit der Konfiguration und dem Kompilieren begonnen werden kann, sollte noch eine Sache sichergestellt sein:

FreeBSD versucht gleichzeitig meherere Versionen der GNU Autotools zu unterstützen. Das ist manchmal etwas schwierig, vorallem, wenn die Installationsreihenfolge wichtig ist. Sie schreiben in unterschiedliche Verzeichnisse von "/usr/local/share". Irgendwie ist hier allerdings der Wurm drin, wenn es über FreeBSD ports installiert wurde.

Problem ist zum Beispiel, dass dort installiert ist:

"/usr/local/share/aclocal"
"/usr/local/share/aclocal-1.9"
"/usr/local/share/aclocal19"

Libtool scheint "libtool.m4" in das letzte installiert zu haben.
Aber das "aclocal" Kommando wird es dort nicht suchen.
Es lässt das letzte Verzeichnis einfach aus.

Eine "sichere" Änderung ist, "libtool.m4" zu verschieben,
aber einen soften Link zu lassen, damit nichts anderes kaputt geht.
% cd /usr/local/share
% mv aclocal19/libtool.m4 aclocal-1.9/
% rmdir aclocal19
% ln -s aclocal-1.9 aclocal19
 
Konfiguration:

Nun kann mit der Konfiguration des MyODBC Sourcecodes begonnen werden. Einfach in das Verzeichnis wechseln, welches nach dem Entpacken angelegt wurde. In meinem Beispiel ist es: "mysql-connector-odbc-3.51.22r857".

Hier nun das "configure" Kommando absetzen:

 $ ./configure --with-debug --with-iODBC --disable-gui --with-mysql-path=/usr/local --with-iodbc-includes=/usr/local/include --with-iodbc-libs=/usr/local/lib
Die Optionen:
  • --with-debug: wenn ein Debuggen erforderderlich sein soll. Diese Option kann natürlich weggelassen werden, sofern kein Debug gewünscht wird.
  • --with-iODBC: diese Option ist wichtig. Hier wird festgelegt, welcher Driver Manager (z.B. libIODBC oder UnixODBC) verwendet wird. Da ich libIODBC empfehle, habe ich hier natürlich auch diesen verwendet.
  • --disable-gui: naja, wer braucht schon GUI? Es gibt für MyODBC auch noch eine GUI, diese ist QT basiert. Wer jemals QT4 versucht hat auf FreeBSD zu kompilieren, kann vielleicht meine negative Einstellung zu QT verstehen. In der Unixwelt ist die GUI für einen ODBC-Treiber in meinen Augen eh eher überflüssig. Aber natürlich stellt MySQL hier für die "Klick"-Freunde eine GUI zur Verfügung. Ich empfehle allerdings, wer sich nicht auch noch mit QT herumplagen möchte, sollte auf die GUI lieber verzichten.
  • --with-mysql-path: hier wird festgelegt, wo die MySQL Bibliotheken und Includes liegen. Standardmäßig ist dieses bei FreeBSD /usr/local
  • --with-iodbc-includes: hier wird festgelegt, wo die Includes von libIODBC liegen.Standardmäßig ist dieses bei FreeBSD /usr/local/include
  • --with-iodbc-libs: hier wird festgelegt, wo die Bibliotheken von libIODBC liegen. Dieses ist standardmäßig unter FreeBSD in /usr/local/lib

Kompilieren:

Wenn beim Kompilieren keine Fehler aufgetaucht sind, kann nun mit der Kompilierung begonnen werden.
 $ make
 Nach einer gewissen Zeit (üblicher Weise nach der Kaffeepause), sollte die Kompilierung fehlerfrei abgeschlossen sein.

!!! Fertig !!!

Wer MyODBC für alle Benutzer zugänglich machen möchte, kann jetzt noch ein ...
 % make install
anstossen. Dabei werden die Bibliotheken nach /usr/local/lib/ kopiert.

Konfiguration:

Nun sollten die Konfigurationsdateien angepasst werden, wie bereits in frueheren Beiträgen beschrieben habe: http://www.miracee.org/2007/08/22/ und http://www.miracee.org/2007/08/31/

Zum Testen reicht eine einfache, benutzerspezifische Konfiguration. Dafür sollte sichergestellt sein, dass es keine Datei (oder höchstens mit leerem Inhalt) namens odbc.ini oder odbcinst.ini in den Verzeichnissen: /etc oder /usr/local/etc oder /usr/local/etc/libiodbc/ liegt.

MySQL hat standardmäßig den User root, der alles darf und kein Passwort hat. Natürlich kann auch jeder andere User mit sund ohne Passwort verwendet werden. Hier sollte nur sichergestellt sein, dass dem User mit Grants die entsprechenden Zugriffsrechte über den Socket bzw. Localhost vergeben wurden.

Zum Verbindungstesten ist jetzt noch eine Datenbank notwendig. Natürlich kann hier anfangs die Datenbank "mysql" verwendet werden, ist aber unschön. Hier empfehle ich, falls MySQL sie noch nicht selbst angelegt einfach eine Testdatenbank zu erstellen.

$ mysql -u root
mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql>\q
Bye

Jetzt im Home-Verzeichnis mit einem Editor die Datei: .odbc.ini erstellen:

[myodbctest]
Server         = 127.0.0.1
Database    = test
Port             = 3306
Driver          = /usr/home/meinhome/
mysql-connector-odbc-3.51.22r857/driver/.libs/libmyodbc3.so
User            = root
;Password    =

[ODBC]
Trace=1
TraceFile=/home/meinhome/mysql.myodbc3.$t.trace

 
Der untere Abschnitt ist nicht zwingend notwendig. Eine Trace-Datei jedoch gibt Aufschluß über die Verbindung und alles was mit der ODBC-Verbindung passiert. Für jede Verbindung wird hier eine Trace-Datei erstellt. Durch die Angabe $t im Namen, erhält der Name einen Zeitstempel. Wenn kein Tracefile erstellt werden soll, dann einfach die unteren 3 Zeilen mit ";" (wie beim Password gezeigt) auskommentieren oder Trace = 0 setzen.

Bei der obigen Konfiguration ist der DSN-Name: myodbctest

Wird für den Server statt der IP-Adresse 127.0.0.1 der Name "localhost" eingegeben, so wird automatisch nicht die TCP-Verbindung verwendet, sondern der Unix-Domain-Socket.

Testen:

Testen läßt sich die Verbindung am besten mit einem kleinen C-Programm:

#include <stdio.h>
#include <sql.h>
#include <sqlext.h>

int main()
{
  SQLHENV env;
  SQLHDBC dbc;
  SQLRETURN ret; /* ODBC API return status */
  SQLCHAR outstr[1024];
  SQLSMALLINT outstrlen;

  /* Allocate an environment handle */
  SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
 
  /* We want ODBC 3 support */
  SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
 
  /* Allocate a connection handle */
  SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
 
  /* Connect to the DSN myodbctest */
  ret = SQLDriverConnect(dbc, NULL, "DSN=myodbctest;", SQL_NTS,
             outstr, sizeof(outstr), &outstrlen,
             SQL_DRIVER_COMPLETE);

  if (!SQL_SUCCEEDED(ret)){
    fprintf(stderr, "Failed to connect\n");
    exit (1);
  }
  printf("Connected\n");
  printf("Returned connection string was:\n\t%s\n", outstr);

  /* disconnect from driver */
  SQLDisconnect(dbc);

  /* free up allocated handles */
  SQLFreeHandle(SQL_HANDLE_DBC, dbc);
  SQLFreeHandle(SQL_HANDLE_ENV, env);
  return 0;
}

 Das C-Programm nun kompilieren mit:
 gcc -g -Wall -I /usr/local/include/ -o test test.c -L /usr/local/lib -liodbc
 
Generell ist wichtig bei der Kompilierung von C-Programmen, dass die Driver Manager Bibliothek nicht vergessen wird. Im obigen Beispiel "-liodbc". Das setzen der Include und Bibliothekspfade ist natürlich ebenfalls wichtig.

Wenn das C-Programm ordnungsgemäß kompiliert hat, kann es ausgeführt werden mit:

$ ./test
Ist die Verbindung in Ordnung, so kommt als Ausgabe etwas wie beispielsweise:
Connected
Returned connection string was:
        DSN=myodbctest;SERVER=127.0.0.1;UID=root; DATABASE=test;PORT=3306
Konnte keine Verbindung aufgebaut werden, so kommt als Ausgabe etwas wie:
 Failed to connect
Konnte die Verbindung nicht aufgebaut werden können, so ist Fehlersuche angesagt. HIer ist die Empfehlung, erstmal die Konfigurationsdateien prüfen. Aus der Trace Datei lassen sich eventuell auch Informationen entnehmen, warum die Verbindung nicht hergestellt werden konnte.
Sicher, dass der Daemon läuft?
Die nächste Möglichkeit wäre mit truss der Sache näher zu kommen oder aber mit gdb.

Aber soweit sollte es nicht kommen.

VIel Spaß beim Basteln mit ODBC und immer daran denken: ODBC ist keine Magie, es ist alles ganz einfach ...