MySQLQuery++ - a C++ MySQL Query Class

11/26/2013 22:40 nico_w#1
EN:
Hey,

as I'm currently developing FoxBot, I was in need for a small class which is able to create prepared MySQL statements and execute them, preferably using C++ data types like std::string. As I was unable to get the MySQL C++ Connector running, I instead coded my own MySQL query class which is able to create a connection to a MySQL server and execute queries just like I wanted it to do.
It still needs the MySQL C headers and libs though which you can find in MySQL server installations and on the official MySQL website.

The most recent version can be found on my GitHub account in this repository: [Only registered and activated users can see links. Click Here To Register...]
Documentation (pdf): [Only registered and activated users can see links. Click Here To Register...] (although it should be self-explaining :p)

Best regards,
Nico

DE:
Hey,

da ich momentan am FoxBot arbeite brauchte ich die Möglichkeit, MySQL-Queries effizient und mit C++-Datentypen wie std::string ausführen zu können. Den offiziellen MySQL C++-Connector konnte ich leider mit MingW nicht zum Laufen bekommen, daher hab' ich mir kurzerhand eine eigene kleine Klasse geschrieben, die Prepared MySQL-Statements erstellen und ausführen kann.
Ihr benötigt dafür trotzalledem die MySQL Includes und Libraries, die sind für gewöhnlich bei einer MySQL-Server-Installation vorhanden oder man kann sie sich auf der MySQL-Webseite runterladen.

Die aktuellste Version findet ihr auf meinem GitHub-Account in diesem Repository: [Only registered and activated users can see links. Click Here To Register...]
Dokumentation (pdf, nur Englisch): [Only registered and activated users can see links. Click Here To Register...] (sollte aber eigentlich recht selbsterklärend sein :p)

Gruß,
Nico
11/27/2013 01:12 Requi#2
Darf ich dich küssen?

Das kommt gerade passend für mein PServer Projekt.

:***
11/27/2013 09:19 Delinquenz#3
Kann dir da nur [Only registered and activated users can see links. Click Here To Register...] empfehlen, eine meines Erachtens nach sehr ordentliche Bibliothek, die außerdem nicht auf MySQL beschränkt ist, sondern auch PostgreSQL, SQLite3 etc. unterstützt.

Wenn man allerdings nicht zu viel Overload möchte, würde ich deine Bibliothek empfehlen, da sie auch ziemlich ordentlich aussieht.
11/27/2013 09:23 nico_w#4
Dass es da noch nen paar Libraries gibt ist klar, nur wollte ich etwas kleines, auf MySQL beschränktes - da kommt mir meine Klasse hier nun recht gelegen, denn sie unterstützt eigentlich alles was ich brauche, ist nicht überladen und übersichtlich gehalten. :p
11/27/2013 11:16 Schlüsselbein#5
3 Dinge sind mir beim groben drüberschauen aufgefallen:
1. Keine const correctness.
2. Warum die ganzen std::string Objekte nicht als const ref übergeben?
3. Deine escapeStr-Funktion allokiert dynamischen Speicher ohne dieses freizugeben. Das ist schlechter Stil. Das Objekt, welches Speicher anfordert, sollte dafür verantwortlich sein, diesen wieder freizugeben. Außerdem gibt die Methode einen char* statt std::string zurück.
11/27/2013 11:19 nico_w#6
Quote:
Originally Posted by Schlüsselbein View Post
3 Dinge sind mir beim groben drüberschauen aufgefallen:
1. Keine const correctness.
2. Warum die ganzen std::string Objekte nicht als const ref übergeben?
3. Deine escapeStr-Funktion allokiert dynamischen Speicher ohne dieses freizugeben. Das ist schlechter Stil. Das Objekt, welches Speicher anfordert, sollte dafür verantwortlich sein, diesen wieder freizugeben. Außerdem gibt die Methode einen char* statt std::string zurück.
Danke, ich werd' mich drum kümmern, das zu berichtigen. Hatte das alles nach Feierabend schnell hingeschrieben und werde den Code nochmal dementsprechend verbessern. :)
11/28/2013 14:58 Ende!#7
Quote:
Originally Posted by Schlüsselbein View Post
3 Dinge sind mir beim groben drüberschauen aufgefallen:
1. Keine const correctness.
2. Warum die ganzen std::string Objekte nicht als const ref übergeben?
3. Deine escapeStr-Funktion allokiert dynamischen Speicher ohne dieses freizugeben. Das ist schlechter Stil. Das Objekt, welches Speicher anfordert, sollte dafür verantwortlich sein, diesen wieder freizugeben. Außerdem gibt die Methode einen char* statt std::string zurück.
^dies, plus:
  • Die Initialisierung der std::strings in Konstruktor macht keinen Sinn, da der Default-Constructor sie bereits so initialisiert. Weiterhin würde ich da wohl 'ne Initialisierungsliste bevorzugen.
  • MySQLConnection::EscapeString: Bösartiger Heap-Overflow, Output von mysql_real_escape_string kann bis zu doppelt so lang sein, wie der Input Buffer
  • Schrecklich viel redundanter Code bei den gettern .. fauler Hund, kapseln! :P
  • Keine einheitliche Konvention für Benamung von Methoden (oder erkenne ich sie nur nicht?)
Sind noch 'n paar kleinere Dinge drin .. schreib mich dafür einfach mal aufm Jabber an, wenn du Bock hast. ;)
11/28/2013 16:10 Schlüsselbein#8
Es gibt n Jabber? :D
11/28/2013 16:38 Ende!#9
Quote:
Originally Posted by Schlüsselbein View Post
Es gibt n Jabber? :D
Für Lv2+ :P Überlegen momentan noch, den auch für andere Leute zu öffnen, mal sehen.
11/29/2013 12:44 .Marcel'#10
Sehr schön, danke.
11/29/2013 21:20 nico_w#11
So, ist alles behoben :3
11/30/2013 00:53 Schlüsselbein#12
Paar Methoden sollten noch als const gekennzeichnet werden und primitive Datentypen übergibt man besser by value. Als Referenz bringt dir keinen Vorteil (sollte sogar noch langsamer sein als by value, auch wenns Nanooptimization ist und demnach gar keine Rolle spielt) - es sieht einfach unnatürlich aus :D

Sieht sonst ganz okay aus.
12/07/2013 19:20 th0rex#13
Hey kannst du mir sagen warum, wenn ich <mysql.h> include, sehr viele Fehler von wegen Neudefinition bekommen ? (123 IntelliSense: Mindestens eine Instanz der überladenen Funktion ""WSAStartup"" weist eine "C"-Verknüpfung auf. Ungefähr 110 Stück davon)
Habe schon gegoogelt aber nicht wirklich was brauchbares gefunden ...

Edit : Habs gelöst ...