C++ und MariaDB?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: C++ und MariaDB?

BeitragSo, Jun 19, 2016 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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;
}


Arrow DBResult ist ein Typedef und sieht folgendermaßen aus Code: [AUSKLAPPEN]
typedef CMap<CString &, CString &, _variant_t, _variant_t>  DBRow;
typedef PtrList<DBRow *>                                    DBResult;

(Die PtrList speichert eine Liste von Zeigern)
Arrow this->Connected() prüft, ob eine valide Verbindung besteht
Arrow this->m_pConnection ist eine MYSQL *-Connection

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

BeitragMo, Jun 20, 2016 2:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

CO2

ehemals "SirMO"

BeitragMo, Jun 20, 2016 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group