PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Using mysql library


blue
07.07.07, 16:51:58
Hier eine Klasse für C++ für dem Umgang mit mysql mit der mysql library:

/* SQL Klasse zum Zugriff auf mysql Datenbanken mit C++.
*
*/

#ifndef SQL_H
#define SQL_H

#define MAX_IRC_TEXT_LENGHT 512
#define STEP 8

#include <iostream>
#include <mysql.h>
#include <string>

using namespace std;

class sql {
private:
char *pHost;
int pHost_sz;

char *pUser;
int pUser_sz;

char *pPw;
int pPw_sz;

char *pDb;
int pDb_sz;

bool connected;

void sql_init();
void sql_error();
bool sql_connect();
void sql_disconnect();

public:
// Das MYSQL Objekt aus der mysql.h
MYSQL *my;

// Konstruktor / Destruktor
sql(char *_host, char *_user, char *_pw, char *_db);
~sql();

// Methoden

// debugging Methode
void DEBUG();

// Verbindung aufbauen

// Query ausführen
bool sql_query(string query);
};

// Konstruktor
sql::sql(char *_host, char *_user, char *_pw, char *_db) {
this->pHost = NULL;
this->pHost_sz = 0;

this->pUser = NULL;
this->pUser_sz = 0;

this->pPw = NULL;
this->pPw_sz = 0;

this->pDb = NULL;
this->pDb_sz = 0;

for(int i=0; i<=strlen(_host); i++) {
if(i >= pHost_sz) {
char *c = new char[this->pHost_sz+STEP];

for(int j=0; j<pHost_sz; j++) {
c[j] = this->pHost[j];
}

if(this->pHost == NULL)
delete[] this->pHost;

this->pHost = c;
this->pHost_sz += STEP;

}
this->pHost[i] = _host[i];
}


for(int i=0; i<=strlen(_user); i++) {
if(i >= pUser_sz) {
char *c = new char[this->pUser_sz+STEP];

for(int j=0; j<pUser_sz; j++) {
c[j] = this->pUser[j];
}

if(this->pUser == NULL)
delete[] this->pUser;

this->pUser = c;
this->pUser_sz += STEP;
}
this->pUser[i] = _user[i];
}


for(int i=0; i<=strlen(_pw); i++) {
if(i >= pPw_sz) {
char *c = new char[this->pPw_sz+STEP];

for(int j=0; j<pPw_sz; j++) {
c[j] = this->pPw[j];
}

if(this->pPw == NULL)
delete[] this->pPw;

this->pPw = c;
this->pPw_sz += STEP;
}
this->pPw[i] = _pw[i];
}


for(int i=0; i<=strlen(_db); i++) {
if(i >= pDb_sz) {
char *c = new char[this->pDb_sz+STEP];

for(int j=0; j<pDb_sz; j++) {
c[j] = this->pDb[j];
}

if(this->pDb == NULL)
delete[] this->pDb;

this->pDb = c;
this->pDb_sz += STEP;
}
this->pDb[i] = _db[i];
}

// Nachdem die Parameter gesetzt wurden, wird das Objekt initialisiert
this->sql_init();
}

sql::~sql() {
if(this->pHost != NULL) {
delete[] pHost;
}
if(this->pUser != NULL) {
delete[] pUser;
}
if(this->pPw != NULL) {
delete[] pPw;
}
if(this->pDb != NULL) {
delete[] pDb;
}
}

void sql::sql_error() {
// Selbsterklärend
cerr << "Errorcode: " << mysql_errno(my) << "\n" << mysql_error(my);
//exit(EXIT_FAILURE);
}

void sql::DEBUG() {
cout << this->pHost << endl;
cout << this->pUser << endl;
cout << this->pPw << endl;
cout << this->pDb << endl;
}

void sql::sql_init() {
this->connected = false;

if((this->my = mysql_init(NULL)) == NULL) {
cerr << "Fehler beim initialisieren.";
exit(EXIT_FAILURE);
}
}

void sql::sql_disconnect() {
if(this->connected) {
mysql_close(my);
this->connected = false;
}
}

bool sql::sql_connect() {
// Zur Datenbank verbinden:
if(this->connected == false) {
if(mysql_real_connect(
my, /* *MYSQL Handler */
this->pHost, /* Host */
this->pUser, /* User */
this->pPw, /* Passwort */
this->pDb, /* Datenbank */
0, /* Port */
NULL, /* Socket */
0) /* Flags */ == NULL) {
// Bei einem Fehler die error Methode ausführen
this->sql_error();
return false;
}
else {
this->connected = true;
return true;
}
}

}

bool sql::sql_query(string query) {

if(this->connected == false) {
if(this->sql_connect() == false) {
return false;
}
}

// in dynamic char casten
char *sql_char = NULL;
int sql_char_sz = 0;
for(int i=0; i<=query.size(); i++) {
// Ist das Query länger als der sql_char?
if(i >= sql_char_sz) {
// Joa, ist er, also ein neues - größeres - Char erzeugen
char *c = new char[sql_char_sz+STEP];
// Daten kopieren
for(int j=0; j<sql_char_sz; j++)
c[j] = sql_char[j];
// Altes Char löschen
if(sql_char != NULL)
delete[] sql_char;
// c zuweisen
sql_char = c;
sql_char_sz += STEP;
}
// Dateneintragen
sql_char[i] = query[i];
}

// Query ausführen
if(mysql_real_query(this->my, sql_char, (unsigned) (long) strlen(sql_char)))
this->sql_error();

if(this->connected == true) {
this->sql_disconnect();
}

return true;
}

#endif


Die Klasse auf der main.cpp includen und initiieren mit
sql sc("HOST","USER","PASSWORD","DATENBANK");.

Anschließend zum Server verbinden mit:
sc.connect()

und schließlich ein Query ausführen mti:
string sql_query_string = "INSERT INTO table (PARAMS) VALUES (PARAMS)";
sc.sql_query(sql_query_string);


Um sie nutzen zu können, muss man unter Windows die mysql++ API (http://tangentsoft.net/mysql++/) installieren. und die include- und lib Pfade hinzufügen. 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




Gruß,
Blue


/€1:
Update: Dynamische Speicherreseverierung der Variablen Host, User, Passwort und Datenbank eingefügt und weitere Änderungen vorgenommen.