Using MySQL Library

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Using MySQL Library

    Hallo,

    derzeit arbeite ich an einem IRC Bot, der bestimmte Inhalte aus einem Channel in einer Datenbank schreiben soll. Da der Bot Platformunabhängig sein soll, habe ich mich für die Sprache C++ entschieden.

    Um aber überhaupt mit C/C++ MySQL nutzen zu können, kann man die MySQL++ API nutzen. Hier habe ich eine kleine Klasse geschrieben, die ein MYSQL Objekt initialisiert, zum Server eine Verbindung aufbaut und einen Query ausführt.
    Wohl angemerkt: Das Ganze ist noch recht unvollständig, Grundfunktionalitäten sind aber implementiert. Außerdem, der Query ist noch nicht geschützt, SQL Injections sind also möglich!

    Um die Klasse nutzen zu können, muss man unter Windows die mysql++ API installieren und die include- und lib Pfade angeben. Außerdem ist es nötig die windows.h, noch bevor man die mysql.h included, einzufügen!

    Unter Linux installiert man sich einfach das Paket mysql und teilt dem Compiler (ich habe g++ genutzt) mit die Verzeichnisse /usr/include/mysql/ und /usr/lib/mysql/ nach den Includes und Librarys zu durchsuchen.


    g++ -c -I/usr/include/mysql main.cpp
    g++ -o main main.o -L/usr/lib/mysql -lmysqlclient -lz



    Desweiteren würde ich um etwas Feedback bitten. Was ist daran schön, was ist weniger schön programmiert? Was ließe sich besser implementieren und vorallem wie?


    Quellcode

    1. /* SQL Klasse zum Zugriff auf mysql Datenbanken mit C++.
    2. *
    3. */
    4. #ifndef SQL_H
    5. #define SQL_H
    6. #define MAX_IRC_TEXT_LENGHT 512
    7. #define STEP 8
    8. #include <iostream>
    9. #include <mysql.h>
    10. #include <string>
    11. using namespace std;
    12. class sql {
    13. private:
    14. char *pHost;
    15. int pHost_sz;
    16. char *pUser;
    17. int pUser_sz;
    18. char *pPw;
    19. int pPw_sz;
    20. char *pDb;
    21. int pDb_sz;
    22. bool connected;
    23. void sql_init();
    24. void sql_error();
    25. bool sql_connect();
    26. void sql_disconnect();
    27. public:
    28. // Das MYSQL Objekt aus der mysql.h
    29. MYSQL *my;
    30. // Konstruktor / Destruktor
    31. sql(char *_host, char *_user, char *_pw, char *_db);
    32. ~sql();
    33. // Methoden
    34. // debugging Methode
    35. void DEBUG();
    36. // Verbindung aufbauen
    37. // Query ausführen
    38. bool sql_query(string query);
    39. };
    40. // Konstruktor
    41. sql::sql(char *_host, char *_user, char *_pw, char *_db) {
    42. this->pHost = NULL;
    43. this->pHost_sz = 0;
    44. this->pUser = NULL;
    45. this->pUser_sz = 0;
    46. this->pPw = NULL;
    47. this->pPw_sz = 0;
    48. this->pDb = NULL;
    49. this->pDb_sz = 0;
    50. for(int i=0; i<=strlen(_host); i++) {
    51. if(i >= pHost_sz) {
    52. char *c = new char[this->pHost_sz+STEP];
    53. for(int j=0; j<pHost_sz; j++) {
    54. c[j] = this->pHost[j];
    55. }
    56. if(this->pHost == NULL)
    57. delete[] this->pHost;
    58. this->pHost = c;
    59. this->pHost_sz += STEP;
    60. }
    61. this->pHost[i] = _host[i];
    62. }
    63. for(int i=0; i<=strlen(_user); i++) {
    64. if(i >= pUser_sz) {
    65. char *c = new char[this->pUser_sz+STEP];
    66. for(int j=0; j<pUser_sz; j++) {
    67. c[j] = this->pUser[j];
    68. }
    69. if(this->pUser == NULL)
    70. delete[] this->pUser;
    71. this->pUser = c;
    72. this->pUser_sz += STEP;
    73. }
    74. this->pUser[i] = _user[i];
    75. }
    76. for(int i=0; i<=strlen(_pw); i++) {
    77. if(i >= pPw_sz) {
    78. char *c = new char[this->pPw_sz+STEP];
    79. for(int j=0; j<pPw_sz; j++) {
    80. c[j] = this->pPw[j];
    81. }
    82. if(this->pPw == NULL)
    83. delete[] this->pPw;
    84. this->pPw = c;
    85. this->pPw_sz += STEP;
    86. }
    87. this->pPw[i] = _pw[i];
    88. }
    89. for(int i=0; i<=strlen(_db); i++) {
    90. if(i >= pDb_sz) {
    91. char *c = new char[this->pDb_sz+STEP];
    92. for(int j=0; j<pDb_sz; j++) {
    93. c[j] = this->pDb[j];
    94. }
    95. if(this->pDb == NULL)
    96. delete[] this->pDb;
    97. this->pDb = c;
    98. this->pDb_sz += STEP;
    99. }
    100. this->pDb[i] = _db[i];
    101. }
    102. // Nachdem die Parameter gesetzt wurden, wird das Objekt initialisiert
    103. this->sql_init();
    104. }
    105. sql::~sql() {
    106. if(this->pHost != NULL) {
    107. delete[] pHost;
    108. }
    109. if(this->pUser != NULL) {
    110. delete[] pUser;
    111. }
    112. if(this->pPw != NULL) {
    113. delete[] pPw;
    114. }
    115. if(this->pDb != NULL) {
    116. delete[] pDb;
    117. }
    118. }
    119. void sql::sql_error() {
    120. // Selbsterklärend
    121. cerr << "Errorcode: " << mysql_errno(my) << "\n" << mysql_error(my);
    122. //exit(EXIT_FAILURE);
    123. }
    124. void sql::DEBUG() {
    125. cout << this->pHost << endl;
    126. cout << this->pUser << endl;
    127. cout << this->pPw << endl;
    128. cout << this->pDb << endl;
    129. }
    130. void sql::sql_init() {
    131. this->connected = false;
    132. if((this->my = mysql_init(NULL)) == NULL) {
    133. cerr << "Fehler beim initialisieren.";
    134. exit(EXIT_FAILURE);
    135. }
    136. }
    137. void sql::sql_disconnect() {
    138. if(this->connected) {
    139. mysql_close(my);
    140. this->connected = false;
    141. }
    142. }
    143. bool sql::sql_connect() {
    144. // Zur Datenbank verbinden:
    145. if(this->connected == false) {
    146. if(mysql_real_connect(
    147. my, /* *MYSQL Handler */
    148. this->pHost, /* Host */
    149. this->pUser, /* User */
    150. this->pPw, /* Passwort */
    151. this->pDb, /* Datenbank */
    152. 0, /* Port */
    153. NULL, /* Socket */
    154. 0) /* Flags */ == NULL) {
    155. // Bei einem Fehler die error Methode ausführen
    156. this->sql_error();
    157. return false;
    158. }
    159. else {
    160. this->connected = true;
    161. return true;
    162. }
    163. }
    164. }
    165. bool sql::sql_query(string query) {
    166. if(this->connected == false) {
    167. if(this->sql_connect() == false) {
    168. return false;
    169. }
    170. }
    171. // in dynamic char casten
    172. char *sql_char = NULL;
    173. int sql_char_sz = 0;
    174. for(int i=0; i<=query.size(); i++) {
    175. // Ist das Query länger als der sql_char?
    176. if(i >= sql_char_sz) {
    177. // Joa, ist er, also ein neues - größeres - Char erzeugen
    178. char *c = new char[sql_char_sz+STEP];
    179. // Daten kopieren
    180. for(int j=0; j<sql_char_sz; j++)
    181. c[j] = sql_char[j];
    182. // Altes Char löschen
    183. if(sql_char != NULL)
    184. delete[] sql_char;
    185. // c zuweisen
    186. sql_char = c;
    187. sql_char_sz += STEP;
    188. }
    189. // Dateneintragen
    190. sql_char[i] = query[i];
    191. }
    192. // Query ausführen
    193. if(mysql_real_query(this->my, sql_char, (unsigned) (long) strlen(sql_char)))
    194. this->sql_error();
    195. if(this->connected == true) {
    196. this->sql_disconnect();
    197. }
    198. return true;
    199. }
    200. #endif
    Alles anzeigen