AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL-Header

Ein Thema von himitsu · begonnen am 29. Jul 2010 · letzter Beitrag vom 6. Aug 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#1

MySQL-Header

  Alt 29. Jul 2010, 00:33
Datenbank: MySQL • Version: 5.5.3 • Zugriff über: libmysql.dll
Wollte nur mal schnell meine kleinen MySQL-Header vorstellen.
  • theoretisch sollten alle (Client)Versionen von 3.22.24 bis 5.5.3 unterstützt werden
  • die Header stammen direkt aus der/den Referenze(n) auf mysql.com
  • die nötige libmysql.dll kann man sich entweder
    • aus den Quellcodes auf mysql.com kompilieren,
    • aus einigen auf dieser Seite verlinkten Quellen/Webseiten/Projekten runterladen
    • oder man geht auf php.net und holt sich diese Datei aus einem der Serverdownloads raus
    • oder oder oder
  • die Typen der Ganzen parameter entsprechen (falls ich keinen Fehler gemacht hab) auch denen der Originalheader.
    hab mir nur hier und da einige Freiheiten erlaubt
    - einige int sind nun LongBool , da sie eh nur 0 oder <>0 zurückliefern
    - einige andere int/long sind jetzt SETs ... dachte mir, ich binde die zugehörigen Konstanten mal etwas stärker an diese Parameter

  • dieses sind erstmal nur die "direkten" Header
    > über die Konstante MySQLVer kann man die genaue, zu unterstützende (Client)Version der DLL einstellen
    > die möglichen Werte stehen dahinter und das wären grndsätzlich 5.5 5.1 5.0 4.1 4.0 or 3.23
    (wobei auch viele Zwischenversionen möglich wären)
  • wenn diese Code/Header getestet sind und funktionieren, dann wollte ich mir noch eine SpezialVersion davon erstellen, wo dann alles OOP-Ähnlich gekapselt und etwas sortiert sein wird

    Es wäre aso nett, wenn hier noch jemand mit reinsehn/testen könnte.
    Ich hoffe zwar beim Übersetzen sind keine großen Fehler entstanden,
    aber es könnte ja och sein, daß auf den Webseiten der Referenz etwas falsch dastand.



  • rein theoretisch sollten diese Header nicht nur für eine Windows-DLL gelten ... in den Linux-SOs (oder wie auch immer die dort heißen) müßte die
    API eigentlich die Selbe sein

im Anhang liegen auch noch eine libmysql.dll für 5.1 und 5.5 ... fehlt also nur noch ein MySQL-Server
Angehängte Dateien
Dateityp: pas TheMySQL.pas (87,9 KB, 11x aufgerufen)
Dateityp: 7z libmysql.7z (1,20 MB, 8x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jul 2010 um 10:59 Uhr) Grund: neuer Anhang (cdecl durch stdcall ersetzt)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: MySQL-Header

  Alt 29. Jul 2010, 10:49
Mir ist grade was aufgefallen:
Aus einem der anderem Header hatte ich mir das cdecl abgeguckt, aber an anderer Stelle steht plötzlich stdcall.
Aus der Referenz (die Webseite) kann man leider diesbezüglich nichts erfahren (hab jedenfalls nichts gefunden).

Also muß es nun stdcall oder cdecl sein?
würde ja aus Erfahrung eher zu stdcall tendieren

Code:
Direktive  Parameterreihenfolge   Bereinigung  in Registern
cdecl      Von rechts nach links  Aufrufer     Nein
stdcall    Von rechts nach links  Routine      Nein
[edit]
OK, das war'n LinuxCode ... also doch stdcall

heißt also das cdecl im Download muß durch stdcall ersetzt werden

[edit2]
OK, Grund gefunden ... die bei Lazarus/FPC konnten sich nicht einigen und haben ihre Version der libmysql.dll teilweise mit cdecl und teilweise mit extdecl (extdecl entspricht unter Windows dem stdcall) gemischt erstellt
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jul 2010 um 11:15 Uhr)
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: MySQL-Header

  Alt 29. Jul 2010, 11:24
Was soll den der Unterschied zwischen deiner Lib und http://www.delphipraxis.net/6543-mys...mponenten.html sein
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: MySQL-Header

  Alt 29. Jul 2010, 11:29
Was soll den der Unterschied zwischen deiner Lib und http://www.delphipraxis.net/6543-mys...mponenten.html sein
Das dort nur anscheinend nur die MySQL 3.1-Header verwendet wurden?
(siehe ab Beitrag #327)
ok, die 5.x upgrades waren nur versteckt im Changelog
wer weiß, was da also schief läuft

Mal sehn, was ein Vergleich beider Header erbringt.
Meiner ist jetzt zumindestens auf dem aktuellsten Stand, welchen die mysql.com-Webseite offiziell bietet.


Dieses hier soll praktisch ein Upgrade werden.
Abgesehn davon sind das hier nur die reinen Header ohne alles Andere, was drüben noch mit verbaut wurde. (ohne Komponenten ist da übertrieben)


[add]
na wenn das so ist, dann kann ich mich ja doch hemmungslos auf neuere Compilerfeatures stürzen (wollte mich erst zurückhalten )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jul 2010 um 12:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

AW: MySQL-Header

  Alt 2. Aug 2010, 21:37
Es läuft endlich

anscheinend muß man urplötzlich

mysql_server_init/mysql_library_init und mysql_thread_init aufrufen

wobei angeglich das Server_Init doch nur für den Embedded-Server nötig sein sollte und irgendwie läßt dieses sich auch nicht parameterlos aufrufen, so wie man es überall sieht.

Ansonsten soll mysql_server_init eigentlich (laut Dokumentation) intern von mysql_init aufgerufen werden, wenn es noch nicht wurde ... schon komisch das alles.

Wenn ich es parameterlos versuche, so wie z.B. hier
Code:
(mysql_library_init(0, NULL, NULL))
Quelle: http://dev.mysql.com/doc/refman/5.5/...rary-init.html
dann läuft dieses in eine Assert-Exception, ala Parameter erwartet


im Anhang 3 Versionen, welche nun endlich lauffähig sind
- die normalen Header, wie man sie auf mysql.com findet (statisch verlinkt)
- dann alles in Klassen (Records) verpackt, statisch verlinkt und Vieles als direkte Verbindung von der Record-Methode zur DLL-Funktion
- und dann nochmal alles komplett mit UTF8Strings/AnsiStrings dynamisch verlinkt und ebenfalls mit möglichst direkten Verknüpfungen.

> bei Input-Parametern als Ansi/UTF8 wird direkt weitergeleitet (das ist intern ja kompatibel zu PAnsiChar)
> bei Ausgabeparametern und bei Results als Ansi/UTF8 wurde nur noch eine Kopieroperation PChar->String eingefügt.

die nötigen libmysql(d).dll's sind oben ja schonmal verlinkt

und jetzt muß ich nur noch rausbekommen, was beim Embedded-Server schiefläuft ... Initialisieren läßt er sich aber schonmal

PS: sind hier C++-Profies?
Aktuell hab ich nur den Embedded-Server als DLL, aber man kann ihn auch direkt in die EXE verlinken ... leider nur bei C++.

Drum wäre die Frage: Könnte man das eigentlich auch irgendwie als OBJ kompilieren und dann doch direkt einbinden?
(so wie z.B. die ZLib)

Man benötigt ja eigentlich nur den "MySQL Community Server" und linke/kompiliere dann den Code statt gegen die mysql.h gegen die mysqld.h (oder irgendwie so).

Und bevor nochmal einer meint, das würde gegen die MySQL-Lizenzpolitik verstoßen:
die nutzen es auch > http://www.mysql.com/customers/embedded/
Angehängte Dateien
Dateityp: 7z MySQL.7z (43,3 KB, 6x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Aug 2010 um 21:48 Uhr)
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: MySQL-Header

  Alt 4. Aug 2010, 10:27
Hallo Himitsu,

wenn man jetzt noch einen Mechanismus für die Memory-loaded-DLL einbaut, ist's doch schon fast perfekt.

Bei mysql.pas habe ich es so reinoperiert...

Delphi-Quellcode:
var
  libmysql_handle: HMODULE = 0;
  libmysql_mem_handle: PBTMemoryModule = nil;
  libmysql_mem_buffer : Pointer;
  libmysql_in_memory : Boolean;

.
.
.

// Load library from Ressource into Memory. Internal Resname = libmysql
procedure libmysql_mem_load(name : PChar);

.
.
.

procedure libmysql_mem_load(name : PChar);
var
  ms : TMemoryStream;
  rs : TResourceStream;
  m_DllDataSize : Int64;
begin
  if libmysql_mem_handle = nil then
  begin
    if 0 <> FindResource(hInstance, 'libmysql', RT_RCDATA) then
    begin
      rs := TResourceStream.Create(hInstance, 'libmysql', RT_RCDATA);
      ms := TMemoryStream.Create;
      try
        ms.LoadFromStream(rs);
        ms.Position := 0;
        m_DllDataSize := ms.Size;
        libmysql_mem_buffer := GetMemory(m_DllDataSize);
        ms.Read(libmysql_mem_buffer^, m_DllDataSize);
      finally
        ms.Free;
        rs.Free;
      end;
      if libmysql_mem_buffer <> nil then
      begin
        libmysql_mem_handle := BTMemoryLoadLibary(libmysql_mem_buffer, m_DllDataSize);
        if libmysql_mem_handle = nil then
        begin
          internal_libmysql_status := LIBMYSQL_MISSING;
          raise Exception.CreateFmt(ELibraryNotFound, [name]);
        end
        else
        begin
          libmysql_in_memory := True;
          internal_libmysql_ClientVersion := mysql_get_client_version;
          if internal_libmysql_ClientVersion >= mysql_not_compatible_version then
          begin
            internal_libmysql_status := LIBMYSQL_INCOMPATIBLE;
            raise Exception.CreateFmt(sLibMySql_Version_Incompatible, [mysql_get_client_info]);
          end
          else
            internal_libmysql_status := LIBMYSQL_READY;
        end;
      end;
    end;
  end;
end;

procedure libmysql_free;
begin
  if libmysql_handle <> 0 then
    FreeLibrary(libmysql_handle);
  libmysql_handle := 0;
  if libmysql_mem_handle <> nil then
  begin
    BTMemoryFreeLibrary(libmysql_mem_handle);
    FreeMemory(libmysql_mem_buffer);
  end;
  libmysql_mem_handle := nil;
  libmysql_in_memory := False;
  internal_libmysql_status := LIBMYSQL_UNDEFINED;
  FinalizeLibmysql;
end;

procedure LoadProcAddress(var proc: FARPROC; name: PAnsiChar);
var
  ModulPath: String;
begin
  if proc = nil then
  begin
    if (libmysql_handle = 0) and (libmysql_mem_handle = nil) then
      raise Exception.Create(sLibMySql_Undefined);
    proc := GetProcAddress(name);
    if proc = nil then
    begin
      internal_libmysql_status := LIBMYSQL_INCOMPATIBLE;
      SetLength(ModulPath, MAX_PATH);
      SetLength(ModulPath, GetModuleFileName(libmysql_handle,
          Pointer(ModulPath), MAX_PATH));
      raise Exception.CreateFmt(EProcNotFound, [name, ModulPath])
    end;
    PushProc(@proc);
  end;
end;

function GetProcAddress(lpProcName: LPCSTR): FARPROC; overload;
begin
  if libmysql_in_memory then
    result := BTMemoryGetProcAddress(libmysql_mem_handle, lpProcName)
  else
    result := GetProcAddress(libmysql_handle, lpProcName);
end;
Dann habe ich noch die alten Aufrufe von GetProcAddress durch die neuen ersetzt. Das war's.

Verwendet habe ich die Unit BTMemoryModule von Martin Offenwanger. Hier!



Grüße,
Uwe
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: MySQL-Header

  Alt 6. Aug 2010, 08:40
Ich bin jetzt erstmal das ganze MySQL 5.4 durch und hab da nochmal nach Änderungen geschaut.
MySQL 6.0 kann man nicht schon jetzt einbauen, da sie die API zurückgezogen haben, da sich dort, in der Alpha- oder Betaphase (k.A. wo die genau waren), schon längere Zeit nichts mehr getan hat sie sich aktuell wieder mehr auf MySQL 5.5+ konzentrieren (seit MySQL 5.3 sind ja auch schon viele ehemals für die 6.0er gedachte Teile enthalten.) (MySQL 6.0 ist also erstmal tot)

Nun werd ich nochmal die Units etwas aufräumen, die statische Variante wird vernichtet, da zuviele DLLs im Umlauf schon, wo schon grundlegende Funktionen fehlen oder fehlerhaft sind

siehe da:
http://www.delphipraxis.net/148076-m...ml#post1039788
in der Clientversion heißt es 0.0.0, in der ClientInfo steht zumindestens was von 5.0 (als String) und einige solcher DLLs besitzen nichtmal 'nen Expor für die ClientVersion (ich brauch also nur noch meine Ersatzfunktion/Umleitung etwas ausbauen)

und danach wende ich mich mal an die DLL-Sache ran, mit 'ner kleinen Erweiterung, damit man die DLL auch leichter austauschen kann, um weniger Probleme mit dieser blöden GPL-Variante zu bekommen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: MySQL-Header

  Alt 6. Aug 2010, 22:53
Hallo Himitsu,

ich habe mit der 5.1.49 getestet. Die hat das auch so mit mysql_get_client_info ausgespuckt (also 50149). Die DLL habe ich mir von einer aktuellen Serverversion genommen.

Ich hänge mal die mysql_wrapper.pas an, die ich derzeit verwende. Da habe ich die Funktionalität für die RES-DLL schon drin. Die enthaltene DLL (in libmysql.res) ist mit UPX gepackt, also nicht wundern, dass die so klein ist.


Grüße,
Uwe
Angehängte Dateien
Dateityp: zip MySQL.zip (1,45 MB, 15x aufgerufen)
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: MySQL-Header

  Alt 6. Aug 2010, 23:47
Einen ganzen Satz an libmysql's hatte ich hier schonmal irgendwo verlinkt (in 'nem anderem Thread).
hier nochmal der Link www.FNSE.de/DL/libmysql.7z (sind ~33 MB)

Dort ist auch eine generierte RTF, bzw eine XLS, mit den Exporten der ganzen DLLs.


so, genug PHP für heute, deinen Anhang schau ich mir morgen an
und jetzt schlaft schön
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz