Wrapper MySQL


21 septembre 2007

Classe : MySQL wrapper

Une classe qui utilise dlopen (équivalent de LoadLibrary sous Win32) pour ne pas avoir à lier libmysqlclient à un programme. Comme dans n'importe quel wrapper : il n'y a rien ici de bien compliqué ou de bien intéressant. C'est juste un bout de code utile pour se simplifier la vie.

#include "dlfcn.h"
#include <mysql.h>

class   MySQL
{
    public:
        MySQL()
        {
            handle = NULL;
            LibHandle = dlopen("/usr/local/mysql/lib/mysql/libmysqlclient.so", RTLD_LAZY);
            //Tous les dlsym dont on a besoin
            MySQL_Init = (MYSQL* (*)(MYSQL*))dlsym(LibHandle, "mysql_init");
            MySQL_Close = (void (*)(MYSQL*))dlsym(LibHandle, "mysql_close");
            MySQL_Real_Connect = (MYSQL* (*)(MYSQL *, const char *, const char *, const char *, const char *, unsigned int, const char *, unsigned long))dlsym(LibHandle, "mysql_real_connect");
            MySQL_Error = (const char*(*)(MYSQL*)) dlsym(LibHandle, "mysql_error");
            MySQL_Real_Query = (int (*)(MYSQL *, const char *, unsigned long)) dlsym(LibHandle, "mysql_real_query");
            MySQL_Use_Result = (MYSQL_RES* (*)(MYSQL*)) dlsym(LibHandle, "mysql_use_result");
            MySQL_Store_Result = (MYSQL_RES* (*)(MYSQL*)) dlsym(LibHandle, "mysql_store_result");
            MySQL_Fetch_Row = (MYSQL_ROW (*)(MYSQL_RES *)) dlsym(LibHandle, "mysql_fetch_row");
            MySQL_Free_Result = (void (*)(MYSQL_RES*))dlsym(LibHandle, "mysql_free_result");
            MySQL_End_Library = (void (*)())dlsym(LibHandle, "mysql_library_end");
            MySQL_Server_Init = (void (*)())dlsym(LibHandle, "mysql_server_init");
            MySQL_Server_End = (void (*)())dlsym(LibHandle, "mysql_server_end");
        }
        ~MySQL()
        {
            MySQL_Close(handle);
            MySQL_Server_End();
            dlclose(LibHandle);
        }
        bool    init()
        {
            handle = MySQL_Init(NULL);
            return handle != NULL;
        }
        void    serverInit()                {   MySQL_Server_Init();    }
        bool    connect(char* dbName, char* userName, char* passwd)
        {
            MYSQL*  Handle = MySQL_Real_Connect(handle, NULL, userName, passwd, dbName, 0, NULL, 0);
            return Handle == handle;
        }
        bool    query(const char* query)
        {
            bool    Ret = MySQL_Real_Query(handle, query, strlen(query)) == 0;
            if (!Ret)       return false;
            rows = MySQL_Store_Result(handle);
            return rows != NULL;
        }
        bool    freeResult()                {   MySQL_Free_Result(rows);    }
        bool    fetchRow(MYSQL_ROW& row)
        {
            row = MySQL_Fetch_Row(rows);
            return !(row == NULL);
        }

    protected:
        void*   LibHandle;
        MYSQL*  handle;
        MYSQL_RES*  rows;
        //Les pointeurs vers les fonctions de la lib MySQL
        MYSQL*  (*MySQL_Init)(MYSQL*);
        void    (*MySQL_Close)(MYSQL*);
        MYSQL* (*MySQL_Real_Connect)(MYSQL *, const char *, const char *, const char *, const char *, unsigned int , const char *, unsigned long );
        const char* (*MySQL_Error)(MYSQL*);
        int (*MySQL_Real_Query)(MYSQL *, const char *, unsigned long);
        MYSQL_RES* (*MySQL_Store_Result)(MYSQL*);
        MYSQL_RES* (*MySQL_Use_Result)(MYSQL*);
        MYSQL_ROW (*MySQL_Fetch_Row)(MYSQL_RES *);
        void    (*MySQL_Free_Result)(MYSQL_RES*);
        void    (*MySQL_End_Library)();
        void    (*MySQL_Server_Init)();
        void    (*MySQL_Server_End)();
};
Accueil