Mit der C API auf unterschiedliche MySQL Server ?

Mit der C API auf unterschiedliche MySQL Server ?

am 28.02.2006 14:58:56 von Manuel Ems

Guten Tag,
Nachdem ich mich ein Wenig mit der C API fuer MySql befasst habe musste
ich feststellen dass wenn das Programm einmal kompiliert ist man mit
diesem Programm auch nur auf einen MySql Server der Version kommt mit
dessen libs es kompiliert wurde - ich versuche aber ein Programm zu
schreiben mit dem man auf verschiedene Server mit unterschiedliche
versionen connecten kann ohne es jedes mal neu kompilieren zu wollen.

wie kann ich dieses Problem beseitigen ? ich habe mir schon ueberlegt fuer
die neuesten MySql-Versionen jeweils eine DLL zu kompilieren die dann im
programm genutzt werden kann (vom benutzer einfach austauschbar) oder gibt
es noch einen anderen weg den ich gehen koennte?

lg,
Manuel

Re: Mit der C API auf unterschiedliche MySQL Server ?

am 28.02.2006 15:30:14 von Thomas Rachel

Hallo,

> Nachdem ich mich ein Wenig mit der C API fuer MySql befasst habe musste
> ich feststellen dass wenn das Programm einmal kompiliert ist man mit
> diesem Programm auch nur auf einen MySql Server der Version kommt mit
> dessen libs es kompiliert wurde

Das wundert mich.

Ich ging bisher davon aus, daß (von Ausnahmen abgesehen) das Protokoll
zwischen Server und Client kompatibel ist, daß sich evtl. lediglich die API
zur Client-Library ändert.

Hast Du mal versucht, diese mitzunehmen?


Thomas

Re: Mit der C API auf unterschiedliche MySQL Server ?

am 28.02.2006 15:34:40 von Dirk Brosowski

Manuel Ems schrieb:
> Guten Tag,
> Nachdem ich mich ein Wenig mit der C API fuer MySql befasst habe musste
> ich feststellen dass wenn das Programm einmal kompiliert ist man mit
> diesem Programm auch nur auf einen MySql Server der Version kommt mit
> dessen libs es kompiliert wurde - ich versuche aber ein Programm zu
> schreiben mit dem man auf verschiedene Server mit unterschiedliche
> versionen connecten kann ohne es jedes mal neu kompilieren zu wollen.
>
> wie kann ich dieses Problem beseitigen ? ich habe mir schon ueberlegt fuer
> die neuesten MySql-Versionen jeweils eine DLL zu kompilieren die dann im
> programm genutzt werden kann (vom benutzer einfach austauschbar) oder gibt
> es noch einen anderen weg den ich gehen koennte?
>
> lg,
> Manuel


Was heisst draufkommen? Der connect hat nichts mit dem Betriebssystem zu
tun und sollte normalerweise über den Port ohne Unterschied funktionieren.

Ansonsten hört sich das ganze weniger nach einem MySQL-Problem als nach
einem C-Applikationsproblem an.

Grüße

Dirk

Re: Mit der C API auf unterschiedliche MySQL Server ?

am 28.02.2006 16:36:26 von Axel Schwenke

Manuel Ems wrote:

> Nachdem ich mich ein Wenig mit der C API fuer MySql befasst habe musste
> ich feststellen dass wenn das Programm einmal kompiliert ist man mit
> diesem Programm auch nur auf einen MySql Server der Version kommt mit
> dessen libs es kompiliert wurde

Das ist in dieser Allgemeinheit falsch.

> - ich versuche aber ein Programm zu
> schreiben mit dem man auf verschiedene Server mit unterschiedliche
> versionen connecten kann ohne es jedes mal neu kompilieren zu wollen.

Es gibt hier zwei Abstraktionsebenen:

1. Die C-API bestimmt, welche Funktionen dein Programm verwenden kann,
um mit libmysqlclient zu kommunizieren. Dieses API ist relativ
stabil. Größere Änderungen gab es mit Erscheinen von MySQL-4.1 (ab
dieser Version gibt es prepared statements). Prinzipiell ist das
C-API abwärtskompatibel, dein Programm sollte also lauffähig sein,
wenn es zur Laufzeit eine libmysqlclient mit gleicher oder höherer
Versionsnummer als zur Linkzeit sieht.

2. Das Protokoll zwischen MySQL-Server und -Client. Dieser Teil wird
von libmysqlclient gekapselt. Auch das Protokoll ist prinzipiell
abwärtskompatibel, Client und Server tauschen bei der Begrüßung
entsprechende Informationen aus.

Allerdings gibt es ein paar Fallen:

a) ebenfalls mit 4.1 wurde die Nutzer-Identifikation umgestellt und
verlangt jetzt andere Einträge in mysql.user.password. Ein MySQL-
Nutzer mit "neuem" Passwort kann nicht mit einem "alten" Client
connecten. http://dev.mysql.com/doc/refman/5.0/en/old-client.html

b) in 5.0 wurde der DECIMAL Typ geändert. Beim Zugriff auf Daten mit
diesem Typ *muß* ein 5.0 Client verwendet werden.
http://dev.mysql.com/doc/refman/5.0/en/upgrading-from-4-1.ht ml

> wie kann ich dieses Problem beseitigen ? ich habe mir schon ueberlegt fuer
> die neuesten MySql-Versionen jeweils eine DLL zu kompilieren die dann im
> programm genutzt werden kann (vom benutzer einfach austauschbar) oder gibt
> es noch einen anderen weg den ich gehen koennte?

Du solltest dein Programm dynamisch gegen libmysqlclient linken. Auf
diese Weise gibt es gute Chancen, daß du zur Laufzeit die exakt zum
Server passende Library verwendest (zumindest funktioniert das auf
"richtigen" Betriebssystemen, die Versionsnummern für DLLs haben).

Das funktioniert natürlich nicht, wenn dein Programm und der MySQL-
Server auf verschiedenen Maschinen laufen. Dann solltest du gegen die
neueste libmysqlclient linken. Die älteste unterstützte Serverversion
hast du dann selbst in der Hand: so lange du keine (z.B.) 4.1-Features
verwendest (z.B. prepared statements), wird dein Programm auch mit
älteren Servern noch funktionieren. So funktioniert z.B. ein 5.0 Client
ohne Probleme mit einem 3.23er Server. Gerade probiert.


XL

Re: Mit der C API auf unterschiedliche MySQL Server ?

am 28.02.2006 18:13:22 von Hartmut Holzgraefe

Thomas Rachel wrote:
> Ich ging bisher davon aus, daß (von Ausnahmen abgesehen) das Proto=
koll
> zwischen Server und Client kompatibel ist, daß sich evtl. lediglic=
h die API
> zur Client-Library ändert.

mit einer Ausnahme: das Passwort-Format musste in 4.1 geändert werde=
n:

http://dev.mysql.com/doc/refman/4.1/en/old-client.html

was verhindern kann das sich vor-4.1 Clients mit 4.1 oder größe=
r
Servern verbinden können.

Ganz allgemein gilt: nimm die aktuellste Client Library und Du wirst
sowohl mit aktuellen als auch mit älteren Servern sprechen könn=
en
(solange Du keine Features aus neueren Versionen voraussetzt,
Prepared Statements mit 3.23 Servern werden zB nicht funktionieren)

--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/