Embedded MYSQL-Server



  • Hallo,

    hab ewig lang gesucht, bis ich teils hier im Forum, teils auch anderweitig im Netz
    endlich fündig geworden bin (wo ich überall gesucht hab, weiss ich leider auch
    nicht mehr, drum kann ich jetzt keine Quellen nennen)

    Aber ich halt's ned für toll, dass ich hier im Forum nix gescheites gefunden
    hab. Drum will ich euch meine bisherigen Ergebnisse nicht vorenthalten und
    vielleicht hilft's ja irgendwem 🙂

    mfg
    Martin

    ----------------------------------------------------------------------

    1. runterladen:
      http://dev.mysql.com/downloads/mysql/4.1.html
      -> Windows (x86) runterladen (35.6 MB)
      (hab keine Ahung, ob in den Essentials auch die ganzen libs usw. dabei sind)

    2. erstellen der implib

    ins mysql-Installationsverzeichnis wechseln
    -> da liegt der Ordner "Embedded" dort nach "libmysqld.dll" suchen

    Diese am besten ins gleiche Verzeichnis kopieren, in dem sich auch das Programm
    befindet (bzw. befinden wird), das den embedded Server verwenden soll.
    (Alternativ dürfte vermutlich auch ein Verzeichnis aus %PATH% funktionieren, aber nicht getestet)

    -> Auf der Kommandozeile in das Verzeichnis wechseln, in dem sich jetzt die "libmysqld.dll" befindet.
    dann mit
    "implib embedded.lib libmysqld.dll"
    eine import-library erstellen

    -> Dann im CPP-Builder ein neues Project erstellen (oder hald ein bestehendes verwenden).
    Menü "Projekt" -> "Dem Projekt hinzufügen..." und dann die gerade erstellte embedded.lib hinzufügen.

    -> unter "Projekt" -> "Optionen" auf "Verzeichnisse wechseln.
    Im Installationsverzeichnis von MYSQL befindet sich ein Ordner "include".
    Diesen hier an entsprechender Stelle hinzufügen hinzufügen.

    Das selbe gilt für den Bibliothekspfad (im Installationsorder der Order "lib\debug" )

    1. Fehlermeldungen
      befinden sich in der Datei errmsg.sys (zu finden unter "Mysql-Installationsverzeichnis\share\!SPRACHE!\")

    Diese ins Programmverzeichnis kopieren.
    (oder in das bei "static char *server_args[]" angegebene Verzeichnis)

    1. Verwendung

    ein kleines Beispielprog:

    #include <winsock.h> // !! wichtig: erst winsock.h, dann mysql.h
    #include <mysql.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    // einige Einstellungen
    static char *server_args[] = {
      "this_program",       
      "--datadir=.",
      "--key_buffer_size=32M",
      "--language=."
    };
    static char *server_groups[] = {
      "embedded",
      "server",
      "this_program_SERVER",
      (char *)NULL
    };
    
    int main(void) 
    {
    using namespace std;
    
    	// Server initialisieren
    	 if (mysql_server_init(sizeof(server_args) / sizeof(char *),  server_args, server_groups))
    	 {exit(1);}
    
    	// ein Datenbank-Handle erzeugen
    	MYSQL *db = mysql_init(NULL);
    		if (!db)
    		{cerr<"shit"; exit(1);};
    
    	// Verbindung zur Datenbank herstellen
    	if (!mysql_real_connect(db, NULL, NULL, NULL, NULL, 0, NULL, 0))
        {cerr<"keine Verbindung"; exit(1);};
    
    // die folgenden Anfragen liefern keine Treffer aus der Datenbank zurück
    
    	// Datenbank erzeugen
    	if (mysql_query(db,"create database TEST;"))
    	{cout<<"Create: "<<mysql_error(db)<<endl;}
    
    	// gerade erstellte Datenbank verwenden
    	if (mysql_query(db,"use test;"))
    	{cout<<"Use: "<<mysql_error(db)<<endl<<endl;}
    
    	// Tabelle erstellen
    	if (mysql_query(db,"create table x (id int);"))
    	{cout<<"Create: "<<mysql_error(db)<<endl<<endl;}
    
    	// Wert einfügen
    	if (mysql_query(db,"insert into x values (2);"))
    	{cout<<"Insert: "<<mysql_error(db)<<endl<<endl;}
    
    // Anfragen, die Werte zurückliefern
    
    	// Alle Werte aus der Tabelle auslesen
    	if ( mysql_query(db,"select * from x;"))
    	{cout<<" Select: "<<mysql_error(db)<<endl;}
    
    	MYSQL_RES * result = mysql_store_result(db);
    
    		if (! result)
    		{
    		cout<<"keine Daten"<<endl;
    		return 1;
    		}
    
    	// Anzahl der Spalten im Ergebnis
    	int num_fields = mysql_num_fields(result);
    
    	// Alle Zeilen des ergebnisses Zeilenweise durchlaufen
    	while (MYSQL_ROW row = mysql_fetch_row(result))
    	{
    	// ein Array von long's, enthält die Größe der einzelnen Daten
    	unsigned long * lengths = mysql_fetch_lengths(result);
    
    		// Alle Spalten der aktuellen Zeile durchlaufen
    		for(int i = 0; i < num_fields; i++)
    		{
    		// Werte ausgeben
    		printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
    		}
    	printf("\n");
    	}
    
    // Server beenden
     mysql_server_end();
    
      return EXIT_SUCCESS;
    }
    

    PS:
    hier steht auch noch was:
    http://dev.mysql.com/doc/mysql/de/Clients.html



  • Das klingt doch mal sehr gut und genau nach dem, was ich schon lange mal suchen wollte 👍

    Danke 🙂



  • Kann mir mal jemand verraten, was jetzt genau der Unterschied dazu ist, wenn ich nur die libmysql.dll verwende?



  • F98 schrieb:

    Kann mir mal jemand verraten, was jetzt genau der Unterschied dazu ist, wenn ich nur die libmysql.dll verwende?

    das die libmysql.dll eine client lib ist mit der du auf einen server connectest und keinen server in der anwendung hast.



  • Wie? Bloß weil ich implib mache habe ich gleich einen ganzen MySQL-Server in meine Anwendung integriert? 😕



  • F98 schrieb:

    Wie? Bloß weil ich implib mache habe ich gleich einen ganzen MySQL-Server in meine Anwendung integriert? 😕

    jop ... das ist richtig genial kannst du dann deine ... anwendungen optimieren du baust noch ne scriptengine ein ... und hast nen server der direkt auf deine Anwendung spezifiziert noch .. z.B. optimierungen etc macht ...

    find ich eigentlich relativ genial damit kannste einiges schneller und effizienter machen hast aber den nachteil das du das ding bei jedem server update halt dann auch neu übersetzen musst und wieder verteilen musst aber eigentlich richtig geil die idee 😉



  • Man lernt nie aus. Wie stehts mit den Lizenzbedingungen?



  • F98 schrieb:

    Man lernt nie aus. Wie stehts mit den Lizenzbedingungen?

    http://dev.mysql.com/doc/mysql/de/libmysqld_licensing.html


Anmelden zum Antworten