Commit e1360c7f authored by jan.koester's avatar jan.koester
Browse files

better api

parent 9f07820c
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -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
)

@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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;

@@ -80,5 +80,5 @@ gcc sdbpp.c -o sdbpp -ldbpp

## Usage example
```SH
./sdbpp 1 /tmp/test.sql
./sdbpp sqlite /tmp/test.sql
```
+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})
+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;
}
+59 −0
Original line number Diff line number Diff line
@@ -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