Spieleplanet Community

Spieleplanet Community (http://www.spieleplanet.eu/forum.php)
-   Internet & Coding (http://www.spieleplanet.eu/forumdisplay.php?f=50)
-   -   [C++] Using mysql library (http://www.spieleplanet.eu/showthread.php?t=43858)

blue 07.07.07 16:51:58

[C++] Using mysql library
 
Hier eine Klasse für C++ für dem Umgang mit mysql mit der mysql library:

Code:

/*        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_stri
ng);


Um sie nutzen zu können, muss man unter Windows die mysql++ API 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.

Zitat:

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:50:56 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Die Betreiber haften nicht für die Inhalte der User. Die Beiträge spiegeln ausschließlich persönliche Meinungen wider, und nicht die der Seitenbetreiber.