Loading include/database.h +3 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <algorithm> #include <cstring> #include <vector> #include <string> #ifdef Windows #include <wtypes.h> Loading Loading @@ -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; Loading src/loader.cpp +25 −18 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 } Loading @@ -133,8 +134,14 @@ dbpp::Database::~Database(){ _handle = nullptr; } #else if (_destroy_dbdriver && _DBApi) { _destroy_dbdriver(_DBApi); } if (_handle) { dlclose(_handle); _handle = nullptr; } #endif } Loading Loading
include/database.h +3 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <algorithm> #include <cstring> #include <vector> #include <string> #ifdef Windows #include <wtypes.h> Loading Loading @@ -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; Loading
src/loader.cpp +25 −18 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 } Loading @@ -133,8 +134,14 @@ dbpp::Database::~Database(){ _handle = nullptr; } #else if (_destroy_dbdriver && _DBApi) { _destroy_dbdriver(_DBApi); } if (_handle) { dlclose(_handle); _handle = nullptr; } #endif } Loading