C++ und MariaDB?
Übersicht

CO2ehemals "SirMO"Betreff: C++ und MariaDB? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich drehe so langsam am Rad: Nachdem ich nun meine Verbindung zwischen der App und dem Server (der jetzt übrigens doch in C++ geschrieben wird) mit TLS realisiert habe, versuche ich nun eine Verbindung zwischen dem Server und einer Maria-Datenbank herzustellen. Da MariaDB nur für C eine API bietet, schreibe ich momentan einen Wrapper, der die C-Funktionen ausführt. Meine erste Frage: Warum zur Hölle ist die Funktionsreferenz dermaßen schlecht? Funktionen werden nicht richtig erklärt, Beispiel-Codes haben Fehler, etc.? Ich frage mich, ob die Entwickler überhaupt Lust haben, eine richtige Referenz zu schreiben... Naja, weswegen ich eigentlich schreibe ist: Wie kann ich die Attributnamen und Attributwerte zusammen in eine Map packen? Hier mal der Code, den ich bisher geschrieben habe (Das, was ich aus der Funktionsreferenz entnehmen konnte) Code: [AUSKLAPPEN] DBResult &CMariaDatabase::ExecuteQuery(CString cmd)
{ DBResult retval; if (this->Connected()) { if (mysql_real_query(m_pConnection, cmd, cmd.GetLength()) == 0) { // if != 0, errors occured MYSQL_RES *pResult = mysql_store_result(m_pConnection); if (pResult) { MYSQL_ROW row; MYSQL_FIELD *pField; int inumfields = mysql_num_fields(pResult); while (row = mysql_fetch_row(pResult)) { DBRow *pNewRow = new DBRow(); for (int x = 0; x < inumfields; x++) { // Attributname und Attributwert als Mapentry anlegen char *val = row[x]; } retval.Add(pNewRow); } mysql_free_result(pResult); } } } return retval; } ![]() typedef CMap<CString &, CString &, _variant_t, _variant_t> DBRow;
typedef PtrList<DBRow *> DBResult; (Die PtrList speichert eine Liste von Zeigern) ![]() ![]() Es sei noch gesagt, dass das DBResult extra nicht als MYSQL_RES zurückgegeben wird, da dieser Quellcode in einer DLL liegt, welche die MariaDB-Lib einbindet. Ich möchte nicht, dass ein anderes Projekt diese Lib nutzt, damit Updates der Lib einfacher ausgeführt werden können... P.S.: Hier noch ein paar Links, die ich bereits durchgeguckt habe: http://dev.mysql.com/doc/refma...query.html http://stackoverflow.com/quest...is-it-norm https://dev.mysql.com/doc/refm...rview.html https://dev.mysql.com/doc/refm...esult.html http://stackoverflow.com/quest...-api-and-c |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab das jetzt kurz durchgesehen... Ich schätze du kannst mit mysql_fetch_fields die Namen der Felder bekommen. http://dev.mysql.com/doc/refma...ields.html
Muss aber zugeben, dass ich weder C Erfahrung mit MySQL noch diese Funktion getestet habe.. Aja, CString? CMap? PtrList? Was sind das denn für Datentypen? Da kann ich sowieso schwer helfen, wenn ich die Hälfte der Datentypen nicht kenne. (Aber ich denke wenn ich als erster antworte, ist die Chance das der Thread komplett unbeantwortet bleibt, beseitigt ^^) |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für deine Antwort. Habe mal ein bisschen geguckt und habe jetzt folgenden (noch ungetesteten Code) Code: [AUSKLAPPEN] // ************************************************************************************************
bool CMariaDatabase::ExecuteQuery(CString cmd, DBResult &dbres) { if (this->Connected()) { if (mysql_real_query(m_pConnection, cmd, cmd.GetLength()) == 0) { // if != 0, errors occured MYSQL_RES *pResult = mysql_store_result(m_pConnection); if (pResult) { MYSQL_ROW row; int inumfields = mysql_num_fields(pResult); MYSQL_FIELD *pField = mysql_fetch_fields(pResult); while (row = mysql_fetch_row(pResult)) { DBRow *pNewRow = new DBRow(); for (int x = 0; x < inumfields; x++) { VARIANT var; VariantInit(&var); var.vt = VT_BSTR; var.bstrVal = SysAllocString((OLECHAR *)(row[x])); pNewRow->SetAt(new CString(pField[x].name), var); } dbres.Add(pNewRow); } mysql_free_result(pResult); if (pResult) delete pResult; return true; } else return false; } else return false; } else return false; } Man bemerke: Der Rückgabetyp und die Parameterliste haben sich geändert. Ich teste mal den Code und schicke hier dann ggf. ein Update. P.S.: CString - Die Klasse, die in Visual C++ Strings speichern kann (wenn man ATL nutzt) CMap - eine Hashmapumsetzung; kommt meine ich mit MFC PtrList - Selbstgeschriebene Klasse, die eine Liste von Zeigern darstellt. |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group