Loading CMakeLists.txt +7 −3 Original line number Diff line number Diff line Loading @@ -7,11 +7,14 @@ project(dbpp) set(LIBV "1.0.0") set(Upstream_VERSION 1.0.0) configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h) if(NOT ${CMAKE_CXX_COMPILER} MATCHES "MSVC") set(CMAKE_CXX_FLAGS "-fPIC -Wall") endif() include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ) Loading @@ -19,11 +22,12 @@ add_subdirectory(backends) add_library(dbpp STATIC src/database.cpp src/loader.cpp ) target_link_libraries(dbpp PRIVATE backend) target_link_libraries(dbpp dl) install(TARGETS dbpp backend DESTINATION lib EXPORT dbppTargets) install(TARGETS dbpp DESTINATION lib EXPORT dbppTargets) install( FILES include/database.h Loading README.md +2 −2 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ A small C++ database abtraction library #include <dbpp/database.h> int main(int argc,char **argv){ dbpp::Database db(atoi(argv[1]),argv[2]); dbpp::Database db(argv[1],argv[2]); dbpp::DBResult res; dbpp::SQL sql; Loading Loading @@ -80,5 +80,5 @@ gcc sdbpp.c -o sdbpp -ldbpp ## Usage example ```SH ./sdbpp 1 /tmp/test.sql ./sdbpp sqlite /tmp/test.sql ``` backends/CMakeLists.txt +15 −12 Original line number Diff line number Diff line find_package(PostgreSQL) if(${PostgreSQL_FOUND}) add_library(pgsql SHARED pgsql/pgsql.cpp) include_directories( ${PostgreSQL_INCLUDE_DIRS} ) list(APPEND libs ${PostgreSQL_LIBRARIES}) add_definitions(-DPGSQL) target_link_libraries(pgsql PRIVATE dbpp ${PostgreSQL_LIBRARIES}) list(APPEND srcs pgsql.cpp) set_target_properties(pgsql PROPERTIES PREFIX "") install(TARGETS pgsql DESTINATION lib/dbpp) endif() find_package(SQLite3) if(${SQLite3_FOUND}) include_directories( add_library(sqlite SHARED sqlite/sqlite.cpp) target_include_directories(sqlite PRIVATE ${SQLite3_INCLUDE_DIRS} ) list(APPEND libs ${SQLite3_LIBRARIES}) add_definitions(-DSQLITE) list(APPEND srcs sqlite.cpp) endif() target_link_libraries(sqlite PRIVATE dbpp ${SQLite3_LIBRARIES}) set_target_properties(sqlite PROPERTIES PREFIX "") add_library(backend STATIC backend.cpp ${srcs} ) install(TARGETS sqlite DESTINATION lib/dbpp) endif() target_link_libraries(backend ${libs}) backends/pgsql/pgsql.cpp 0 → 100644 +113 −0 Original line number Diff line number Diff line /******************************************************************************* * Copyright (c) 2023, Jan Koester jan.koester@gmx.net * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <mutex> #include <libpq-fe.h> #include "pgsql.h" namespace dbpp{ std::mutex g_lock_mutex; }; dbpp::Postgresql::Postgresql(const char *constr) { _dbconn = PQconnectdb(constr); if (PQstatus(_dbconn) != CONNECTION_OK){ PQfinish(_dbconn); throw PQerrorMessage(_dbconn); } } dbpp::Postgresql::~Postgresql(){ PQfinish(_dbconn); } int dbpp::Postgresql::exec(const SQL &sql,DBResult &res){ PGresult *pres = PQexec(_dbconn,sql.c_str()); int pstate=PQresultStatus(pres); if(pstate==PGRES_FATAL_ERROR || pstate==PGRES_BAD_RESPONSE) { PQclear(pres); throw PQerrorMessage(_dbconn); } res.clear(); DBResult::Data *lastdat=nullptr; int rcount=PQntuples(pres); for(int i = 0; i < rcount; ++i ){ for(int ii=0; ii < PQnfields(pres); ++ii){ if(!res.firstRow){ res.firstRow = new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=res.firstRow; }else{ lastdat->nextData=new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=lastdat->nextData; } } } PQclear(pres); return rcount; }; const char *dbpp::Postgresql::getDriverName(){ return "pgsql"; }; const dbpp::SQL &dbpp::Postgresql::autoincrement(SQL &sql){ return (sql << "GENERATED BY DEFAULT AS IDENTITY"); } const dbpp::SQL &dbpp::Postgresql::getUUIDType(SQL &sql){ return (sql << "UUID"); } bool dbpp::Postgresql::isConnected(){ const std::lock_guard<std::mutex> lock(g_lock_mutex); if(PQstatus(_dbconn)==CONNECTION_OK) return true; return false; } void dbpp::Postgresql::reset(){ const std::lock_guard<std::mutex> lock(g_lock_mutex); PQreset(_dbconn); } extern "C" dbpp::Postgresql* create(const char *coninfo) { return new dbpp::Postgresql(coninfo); } extern "C" void destroy(dbpp::Postgresql* p) { delete p; } backends/pgsql.cpp→backends/pgsql/pgsql.h +59 −0 Original line number Diff line number Diff line Loading @@ -27,85 +27,33 @@ #include <mutex> #include <libpq-fe.h> #include <database.h> namespace dbpp { #pragma once std::mutex g_lock_mutex; typedef struct pg_conn PGconn; struct pg_conn; namespace dbpp { class Postgresql : public DatabaseApi{ public: Postgresql(const char *constr) { _dbconn = PQconnectdb(constr); if (PQstatus(_dbconn) != CONNECTION_OK){ PQfinish(_dbconn); throw PQerrorMessage(_dbconn); } } ~Postgresql(){ PQfinish(_dbconn); } int exec(const SQL &sql,DBResult &res) override{ PGresult *pres = PQexec(_dbconn,sql.c_str()); int pstate=PQresultStatus(pres); if(pstate==PGRES_FATAL_ERROR || pstate==PGRES_BAD_RESPONSE) { PQclear(pres); throw PQerrorMessage(_dbconn); } Postgresql(const char *constr); ~Postgresql(); res.clear(); int exec(const SQL &sql,DBResult &res) override; DBResult::Data *lastdat=nullptr; const char *getDriverName() override; int rcount=PQntuples(pres); const SQL &autoincrement(SQL &sql) override; const SQL &getUUIDType(SQL &sql) override; for(int i = 0; i < rcount; ++i ){ for(int ii=0; ii < PQnfields(pres); ++ii){ if(!res.firstRow){ res.firstRow = new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=res.firstRow; }else{ lastdat->nextData=new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=lastdat->nextData; } } } bool isConnected() override; PQclear(pres); return rcount; }; const char *getDriverName() override{ return "pgsql"; }; const SQL &autoincrement(SQL &sql) override{ return (sql << "GENERATED BY DEFAULT AS IDENTITY"); } const SQL &getUUIDType(SQL &sql) override { return (sql << "UUID"); } bool isConnected() override{ const std::lock_guard<std::mutex> lock(g_lock_mutex); if(PQstatus(_dbconn)==CONNECTION_OK) return true; return false; } void reset() override{ const std::lock_guard<std::mutex> lock(g_lock_mutex); PQreset(_dbconn); } void reset() override; private: PGconn *_dbconn; }; } Loading
CMakeLists.txt +7 −3 Original line number Diff line number Diff line Loading @@ -7,11 +7,14 @@ project(dbpp) set(LIBV "1.0.0") set(Upstream_VERSION 1.0.0) configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h) if(NOT ${CMAKE_CXX_COMPILER} MATCHES "MSVC") set(CMAKE_CXX_FLAGS "-fPIC -Wall") endif() include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ) Loading @@ -19,11 +22,12 @@ add_subdirectory(backends) add_library(dbpp STATIC src/database.cpp src/loader.cpp ) target_link_libraries(dbpp PRIVATE backend) target_link_libraries(dbpp dl) install(TARGETS dbpp backend DESTINATION lib EXPORT dbppTargets) install(TARGETS dbpp DESTINATION lib EXPORT dbppTargets) install( FILES include/database.h Loading
README.md +2 −2 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ A small C++ database abtraction library #include <dbpp/database.h> int main(int argc,char **argv){ dbpp::Database db(atoi(argv[1]),argv[2]); dbpp::Database db(argv[1],argv[2]); dbpp::DBResult res; dbpp::SQL sql; Loading Loading @@ -80,5 +80,5 @@ gcc sdbpp.c -o sdbpp -ldbpp ## Usage example ```SH ./sdbpp 1 /tmp/test.sql ./sdbpp sqlite /tmp/test.sql ```
backends/CMakeLists.txt +15 −12 Original line number Diff line number Diff line find_package(PostgreSQL) if(${PostgreSQL_FOUND}) add_library(pgsql SHARED pgsql/pgsql.cpp) include_directories( ${PostgreSQL_INCLUDE_DIRS} ) list(APPEND libs ${PostgreSQL_LIBRARIES}) add_definitions(-DPGSQL) target_link_libraries(pgsql PRIVATE dbpp ${PostgreSQL_LIBRARIES}) list(APPEND srcs pgsql.cpp) set_target_properties(pgsql PROPERTIES PREFIX "") install(TARGETS pgsql DESTINATION lib/dbpp) endif() find_package(SQLite3) if(${SQLite3_FOUND}) include_directories( add_library(sqlite SHARED sqlite/sqlite.cpp) target_include_directories(sqlite PRIVATE ${SQLite3_INCLUDE_DIRS} ) list(APPEND libs ${SQLite3_LIBRARIES}) add_definitions(-DSQLITE) list(APPEND srcs sqlite.cpp) endif() target_link_libraries(sqlite PRIVATE dbpp ${SQLite3_LIBRARIES}) set_target_properties(sqlite PROPERTIES PREFIX "") add_library(backend STATIC backend.cpp ${srcs} ) install(TARGETS sqlite DESTINATION lib/dbpp) endif() target_link_libraries(backend ${libs})
backends/pgsql/pgsql.cpp 0 → 100644 +113 −0 Original line number Diff line number Diff line /******************************************************************************* * Copyright (c) 2023, Jan Koester jan.koester@gmx.net * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <mutex> #include <libpq-fe.h> #include "pgsql.h" namespace dbpp{ std::mutex g_lock_mutex; }; dbpp::Postgresql::Postgresql(const char *constr) { _dbconn = PQconnectdb(constr); if (PQstatus(_dbconn) != CONNECTION_OK){ PQfinish(_dbconn); throw PQerrorMessage(_dbconn); } } dbpp::Postgresql::~Postgresql(){ PQfinish(_dbconn); } int dbpp::Postgresql::exec(const SQL &sql,DBResult &res){ PGresult *pres = PQexec(_dbconn,sql.c_str()); int pstate=PQresultStatus(pres); if(pstate==PGRES_FATAL_ERROR || pstate==PGRES_BAD_RESPONSE) { PQclear(pres); throw PQerrorMessage(_dbconn); } res.clear(); DBResult::Data *lastdat=nullptr; int rcount=PQntuples(pres); for(int i = 0; i < rcount; ++i ){ for(int ii=0; ii < PQnfields(pres); ++ii){ if(!res.firstRow){ res.firstRow = new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=res.firstRow; }else{ lastdat->nextData=new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=lastdat->nextData; } } } PQclear(pres); return rcount; }; const char *dbpp::Postgresql::getDriverName(){ return "pgsql"; }; const dbpp::SQL &dbpp::Postgresql::autoincrement(SQL &sql){ return (sql << "GENERATED BY DEFAULT AS IDENTITY"); } const dbpp::SQL &dbpp::Postgresql::getUUIDType(SQL &sql){ return (sql << "UUID"); } bool dbpp::Postgresql::isConnected(){ const std::lock_guard<std::mutex> lock(g_lock_mutex); if(PQstatus(_dbconn)==CONNECTION_OK) return true; return false; } void dbpp::Postgresql::reset(){ const std::lock_guard<std::mutex> lock(g_lock_mutex); PQreset(_dbconn); } extern "C" dbpp::Postgresql* create(const char *coninfo) { return new dbpp::Postgresql(coninfo); } extern "C" void destroy(dbpp::Postgresql* p) { delete p; }
backends/pgsql.cpp→backends/pgsql/pgsql.h +59 −0 Original line number Diff line number Diff line Loading @@ -27,85 +27,33 @@ #include <mutex> #include <libpq-fe.h> #include <database.h> namespace dbpp { #pragma once std::mutex g_lock_mutex; typedef struct pg_conn PGconn; struct pg_conn; namespace dbpp { class Postgresql : public DatabaseApi{ public: Postgresql(const char *constr) { _dbconn = PQconnectdb(constr); if (PQstatus(_dbconn) != CONNECTION_OK){ PQfinish(_dbconn); throw PQerrorMessage(_dbconn); } } ~Postgresql(){ PQfinish(_dbconn); } int exec(const SQL &sql,DBResult &res) override{ PGresult *pres = PQexec(_dbconn,sql.c_str()); int pstate=PQresultStatus(pres); if(pstate==PGRES_FATAL_ERROR || pstate==PGRES_BAD_RESPONSE) { PQclear(pres); throw PQerrorMessage(_dbconn); } Postgresql(const char *constr); ~Postgresql(); res.clear(); int exec(const SQL &sql,DBResult &res) override; DBResult::Data *lastdat=nullptr; const char *getDriverName() override; int rcount=PQntuples(pres); const SQL &autoincrement(SQL &sql) override; const SQL &getUUIDType(SQL &sql) override; for(int i = 0; i < rcount; ++i ){ for(int ii=0; ii < PQnfields(pres); ++ii){ if(!res.firstRow){ res.firstRow = new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=res.firstRow; }else{ lastdat->nextData=new DBResult::Data(i,ii,PQgetvalue(pres,i,ii),PQgetlength(pres,i,ii)); lastdat=lastdat->nextData; } } } bool isConnected() override; PQclear(pres); return rcount; }; const char *getDriverName() override{ return "pgsql"; }; const SQL &autoincrement(SQL &sql) override{ return (sql << "GENERATED BY DEFAULT AS IDENTITY"); } const SQL &getUUIDType(SQL &sql) override { return (sql << "UUID"); } bool isConnected() override{ const std::lock_guard<std::mutex> lock(g_lock_mutex); if(PQstatus(_dbconn)==CONNECTION_OK) return true; return false; } void reset() override{ const std::lock_guard<std::mutex> lock(g_lock_mutex); PQreset(_dbconn); } void reset() override; private: PGconn *_dbconn; }; }