Commit 0c7d7084 authored by jan.koester's avatar jan.koester
Browse files

fixed

parent 01c39489
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>

#ifdef  Windows
#include <wtypes.h>
@@ -121,7 +122,7 @@ namespace dbpp {

    class Database {
    public:
        Database(const char *dbdriver,const char *connstr);
        Database(const std::string &dbdriver,const std::string &connstr);
        ~Database();
        int exec(const SQL &sql,DBResult &res) const;
        const char *getDriverName() const;
+25 −18
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@

#include <config.h>

dbpp::Database::Database(const char *dbdriver,const char* connstr){
dbpp::Database::Database(const std::string &dbdriver,const std::string &connstr){
#ifdef Windows
    wchar_t bufExePath[MAX_PATH + 1] = { 0 };
    DWORD dwNumCharacters = ::GetCurrentDirectoryW(MAX_PATH, bufExePath);
@@ -91,35 +91,36 @@ dbpp::Database::Database(const char *dbdriver,const char* connstr){
    _DBApi = create_dbdriver(connstr);
#else
    char path[512];
    snprintf(path, 512, "%s/%s.so", PLGPATH, dbdriver);
    snprintf(path, 512, "%s/%s.so", PLGPATH, dbdriver.c_str());

    std::cerr << path << std::endl;

    const char * dlsym_error=nullptr;

    _handle=dlopen(path,RTLD_LAZY);

    if (!_handle && (dlsym_error=dlerror()) ){
        throw;
    if (!_handle) {
       throw std::runtime_error("Failed to dlopen: " + std::string(dlerror()));
    }

    // load the symbols
    create_t* create_dbdriver= (create_t*) dlsym(_handle, "create");
    auto cleanup_on_fail = [&]() {
        dlclose(_handle);
        _handle = nullptr;
    };

    dlsym_error=dlerror();
    if (!create_dbdriver && dlsym_error) {
        throw "error create";

    create_t* create_dbdriver= (create_t*) dlsym(_handle, "create");
    if (!create_dbdriver || dlerror()) {
        cleanup_on_fail();
        throw std::runtime_error("Failed to find 'create' function: " + std::string(dlerror() ? dlerror() : "Unknown error"));
    }

    dlerror();

    _destroy_dbdriver = (destroy_t*) dlsym(_handle, "destroy");
    dlsym_error = dlerror();
    if (dlsym_error) {
        throw "error load";;
    if (!_destroy_dbdriver || dlerror()) {
        cleanup_on_fail();
        throw std::runtime_error("Failed to find 'destroy' function: " + std::string(dlerror() ? dlerror() : "Unknown error"));
    }

    _DBApi = create_dbdriver(connstr);
    _DBApi = create_dbdriver(connstr.c_str());
#endif
}

@@ -133,8 +134,14 @@ dbpp::Database::~Database(){
        _handle = nullptr;
    }
#else
    if (_destroy_dbdriver && _DBApi) {
        _destroy_dbdriver(_DBApi);
    }

    if (_handle) {
        dlclose(_handle);
        _handle = nullptr;
    }
#endif
}