diff options
Diffstat (limited to 'project2/sql')
54 files changed, 524 insertions, 3199 deletions
diff --git a/project2/sql/Jamfile.jam b/project2/sql/Jamfile.jam index 8a3661b..dfe578f 100644 --- a/project2/sql/Jamfile.jam +++ b/project2/sql/Jamfile.jam @@ -1,84 +1,31 @@ -import lex ; - alias glibmm : : : : <cflags>"`pkg-config --cflags glibmm-2.4`" <linkflags>"`pkg-config --libs glibmm-2.4`" ; -lib boost_filesystem ; -lib fl ; +lib stdc++fs ; +lib dbppcore : : : : <include>/usr/include/dbpp ; build-project unittests ; -explicit library p2sqlmodMySQL ; -lib p2sqlmodMySQL : - sql-modMySQL.cpp : - <library>../../libmysqlpp//mysqlpp - <library>glibmm - <include>../../libmisc - <library>../common//p2common - <library>p2sql - : : - <library>../../libmysqlpp//mysqlpp - ; - -explicit library p2sqlmodSQLite ; -lib p2sqlmodSQLite : - sql-modSQLite.cpp : - <library>../../libsqlitepp//sqlitepp - <library>glibmm - <include>../../libmisc - <library>../common//p2common - <library>p2sql - <library>boost_filesystem - : : - <library>../../libsqlitepp//sqlitepp - ; - -explicit library p2sqlmodODBC ; -lib p2sqlmodODBC : - sql-modODBC.cpp : - <library>../../libodbcpp//odbcpp - <library>glibmm - <include>../../libmisc - <library>../common//p2common - <library>p2sql - : : - <library>../../libodbcpp//odbcpp - ; - -explicit library p2sqlmodPQ ; -lib p2sqlmodPQ : - sql-modPQ.cpp : - <library>../../libpqpp//pqpp - <library>glibmm - <include>../../libmisc - <library>../common//p2common - <library>p2sql - : : - <library>../../libpqpp//pqpp - ; - cpp-pch pch : pch.hpp : - <include>../../libmisc - <include>../../libdbpp + <library>dbppcore <library>glibmm <library>../common//p2common ; lib p2sql : pch - sql.ll - [ glob *.cpp : sql-mod*.cpp ] - ../../libdbpp//dbpp + [ glob *.cpp ] : <include>. + <library>dbppcore <library>glibmm - <library>boost_filesystem + <library>stdc++fs <library>../common//p2common - <library>../lib//p2lib - <include>../../libmisc - <library>fl + <library>../basics//p2basics + <library>..//adhocutil : : <include>. + <library>dbppcore ; diff --git a/project2/sql/connectionLoader.cpp b/project2/sql/connectionLoader.cpp deleted file mode 100644 index 671fafc..0000000 --- a/project2/sql/connectionLoader.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "connectionLoader.h" -#include "instanceStore.impl.h" - -INSTANTIATESTORE(std::string, ConnectionLoader); - diff --git a/project2/sql/connectionLoader.h b/project2/sql/connectionLoader.h deleted file mode 100644 index 3a8714c..0000000 --- a/project2/sql/connectionLoader.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef CONNECTIONLOADER_H -#define CONNECTIONLOADER_H - -#include "genLoader.h" -#include <connection.h> - -typedef GenLoader<DB::Connection, std::string, std::string> ConnectionLoader; - -#endif - diff --git a/project2/sql/mockDatabase.cpp b/project2/sql/mockDatabase.cpp deleted file mode 100644 index b73001a..0000000 --- a/project2/sql/mockDatabase.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include "mockDatabase.h" -#include "mockDatasource.h" -#include <misc.h> -#include <logger.h> -#include <fstream> -#include <modifycommand.h> -#include <FlexLexer.h> -#include "sqlFlexLexer.h" - -MockDatabase::MockDatabase(const std::string & name) : - mockName(name) -{ -} - -MockDatabase::~MockDatabase() -{ -} - -void -MockDatabase::PlaySchemaScripts(const std::vector<boost::filesystem::path> & ss) const -{ - DB::Connection * conn = openConnection(); - try { - CreateStatusTable(conn); - for (auto s : ss) { - conn->beginTx(); - PlaySchemaScript(conn, s); - conn->commitTx(); - } - DropStatusTable(conn); - delete conn; - Logger()->messagebf(LOG_DEBUG, "%s initialized", mockName); - MockConnectionLoader::mocks[mockName] = this; - } - catch (...) { - if (conn->inTx()) { - conn->rollbackTx(); - } - delete conn; - DropDatabase(); - throw; - } -} - -void -MockDatabase::PlaySchemaScript(DB::Connection * conn, const boost::filesystem::path & s) const -{ - UpdateStatusTable(conn, s); - Logger()->messagebf(LOG_DEBUG, "%s << %s", mockName, s); - std::ifstream f; - f.open(s.string()); - if (!f.good()) { - throw std::runtime_error("Failed to open mock script: " + s.string()); - } - auto lexer = boost::shared_ptr<FlexLexer>(new sqlFlexLexer(s.parent_path(), f, conn)); - while(lexer->yylex() != 0) ; - f.close(); -} - -void -MockDatabase::CreateStatusTable(DB::Connection * conn) const -{ - conn->execute( - "CREATE TABLE _p2_teststatus( \ - pid int, \ - script varchar(256), \ - scriptdir varchar(256))"); - auto ins = conn->newModifyCommand( - "INSERT INTO _p2_teststatus(pid) VALUES(?)"); - ins->bindParamI(0, getpid()); - ins->execute(); - delete ins; -} - -void -MockDatabase::DropStatusTable(DB::Connection * conn) const -{ - conn->execute("DROP TABLE _p2_teststatus"); -} - -void -MockDatabase::UpdateStatusTable(DB::Connection * conn, const boost::filesystem::path & script) const -{ - auto upd = conn->newModifyCommand( - "UPDATE _p2_teststatus SET script = ?, scriptdir = ?"); - upd->bindParamS(0, script.string()); - upd->bindParamS(1, script.parent_path().string()); - upd->execute(); - delete upd; -} - -MockServerDatabase::MockServerDatabase(const std::string & masterdb, const std::string & name, const std::string & type) : - MockDatabase(name), - master(InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>(type)->create(masterdb)), - testDbName(stringbf("test_%d_%d", getpid(), ++MockConnectionLoader::mocked)) -{ -} - -MockServerDatabase::~MockServerDatabase() -{ - delete master; -} - -void -MockServerDatabase::CreateNewDatabase() const -{ - DropDatabase(); - Logger()->messagebf(LOG_INFO, "Creating new database %s", testDbName); - master->execute("CREATE DATABASE " + testDbName); -} - -void -MockServerDatabase::DropDatabase() const -{ - Logger()->messagebf(LOG_INFO, "Droping database %s", testDbName); - master->execute("DROP DATABASE IF EXISTS " + testDbName); - MockConnectionLoader::mocks.erase(mockName); -} - diff --git a/project2/sql/mockDatabase.h b/project2/sql/mockDatabase.h deleted file mode 100644 index 9c00420..0000000 --- a/project2/sql/mockDatabase.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef MOCKDATABASE_H -#define MOCKDATABASE_H - -#include <string> -#include <vector> -#include <boost/filesystem/path.hpp> -#include <connection.h> - -class MockDatabase { - public: - MockDatabase(const std::string & mockName); - virtual ~MockDatabase(); - - virtual DB::Connection * openConnection() const = 0; - - protected: - virtual void CreateNewDatabase() const = 0; - virtual void PlaySchemaScripts(const std::vector<boost::filesystem::path> & ss) const; - virtual void PlaySchemaScript(DB::Connection *, const boost::filesystem::path & s) const; - virtual void DropDatabase() const = 0; - virtual void UpdateStatusTable(DB::Connection *, const boost::filesystem::path &) const; - - const std::string mockName; - - private: - void CreateStatusTable(DB::Connection *) const; - void DropStatusTable(DB::Connection *) const; -}; - -class MockServerDatabase : public MockDatabase { - public: - MockServerDatabase(const std::string & masterdb, const std::string & name, const std::string & type); - virtual ~MockServerDatabase(); - - protected: - virtual void CreateNewDatabase() const override; - virtual void DropDatabase() const override; - - DB::Connection * master; - const std::string testDbName; -}; - -#endif - diff --git a/project2/sql/mockDatasource.cpp b/project2/sql/mockDatasource.cpp index df5d325..8246f9b 100644 --- a/project2/sql/mockDatasource.cpp +++ b/project2/sql/mockDatasource.cpp @@ -1,15 +1,12 @@ #include "mockDatasource.h" #include <connection.h> -#include <safeMapFind.h> +#include <mockDatabase.h> -DECLARE_CUSTOM_COMPONENT_LOADER("mock", T, MockConnectionLoader, ConnectionLoader); +NAMEDPLUGIN("mock", MockConnectionFactory, DB::ConnectionFactory); -std::map<std::string, const MockDatabase *> MockConnectionLoader::mocks; -unsigned int MockConnectionLoader::mocked = 0; - -DB::Connection * -MockConnectionLoader::create(const std::string & n) const +DB::ConnectionPtr +MockConnectionFactory::create(const std::string & n) const { - return safeMapFind<std::runtime_error>(mocks, n)->second->openConnection(); + return DB::MockDatabase::openConnectionTo(n); } diff --git a/project2/sql/mockDatasource.h b/project2/sql/mockDatasource.h index ee1e976..b97af9b 100644 --- a/project2/sql/mockDatasource.h +++ b/project2/sql/mockDatasource.h @@ -1,15 +1,11 @@ #ifndef MOCKDATASOURCE_H #define MOCKDATASOURCE_H -#include <rdbmsDataSource.h> -#include "mockDatabase.h" +#include <connection.h> -class MockConnectionLoader : public ConnectionLoader { +class MockConnectionFactory : public DB::ConnectionFactory { public: - DB::Connection * create(const std::string &) const; - - static unsigned int mocked; - static std::map<std::string, const MockDatabase *> mocks; + DB::ConnectionPtr create(const std::string &) const; }; #endif diff --git a/project2/sql/pch.hpp b/project2/sql/pch.hpp index 2d8e99b..857eb5b 100644 --- a/project2/sql/pch.hpp +++ b/project2/sql/pch.hpp @@ -2,32 +2,11 @@ #ifndef SQL_PCH #define SQL_PCH -#include "cache.h" -#include "column.h" -#include "columns.h" -#include "command.h" -#include "commonObjects.h" -#include "connectionLoader.h" -#include "exceptions.h" -#include "iHaveParameters.h" -#include "logger.h" -#include "modifycommand.h" -#include "rdbmsDataSource.h" -#include "rowProcessor.h" -#include "rowSet.h" -#include "selectcommand.h" -#include "sqlHandleAsVariableType.h" -#include "sqlVariableBinder.h" -#include "sqlWriter.h" -#include "variables.h" -#include "scriptLoader.h" -#include "scripts.h" -#include <boost/bind.hpp> -#include "options.h" -#include <buffer.h> -#include <column.h> -#include <errno.h> #include <stdexcept> +#include <string> +#include <glibmm/ustring.h> +#include <boost/variant/variant_fwd.hpp> +#include <connection.h> #endif #endif diff --git a/project2/sql/rdbmsDataSource.cpp b/project2/sql/rdbmsDataSource.cpp index b0989b9..15ae638 100644 --- a/project2/sql/rdbmsDataSource.cpp +++ b/project2/sql/rdbmsDataSource.cpp @@ -1,16 +1,14 @@ #include <pch.hpp> #include "rdbmsDataSource.h" -#include "connectionLoader.h" #include <sys/utsname.h> #include "logger.h" #include "scripts.h" #include <errno.h> -SimpleMessageException(UnknownConnectionProvider); #define LOCK(l) std::lock_guard<std::mutex> _lock##l(l) -/// Specialized ElementLoader for instances of RdbmsDataSource; handles persistent DB connections -class RdbmsDataSourceLoader : public ElementLoader::For<RdbmsDataSource> { +/// Life cycle component for handling closure of persistent DB connections +class RdbmsDataSourceFactory : public LifeCycle { public: void onIdle() override { @@ -34,7 +32,7 @@ class RdbmsDataSourceLoader : public ElementLoader::For<RdbmsDataSource> { RdbmsDataSource::changedDSNs.clear(); } }; -DECLARE_CUSTOM_LOADER("rdbmsdatasource", RdbmsDataSourceLoader); +NAMEDFACTORY("rdbmsdatasource", RdbmsDataSource, DataSourceFactory); RdbmsDataSource::DBHosts RdbmsDataSource::dbhosts; RdbmsDataSource::FailedHosts RdbmsDataSource::failedhosts; @@ -202,7 +200,7 @@ RdbmsDataSource::connectTo(const ConnectionInfo & dsn) } } -RdbmsDataSource::RdbmsConnection::RdbmsConnection(const DB::Connection * con, time_t kat) : +RdbmsDataSource::RdbmsConnection::RdbmsConnection(DB::ConnectionPtr const con, time_t kat) : connection(con), txOpen(false), lastUsedTime(0), @@ -214,7 +212,6 @@ RdbmsDataSource::RdbmsConnection::RdbmsConnection(const DB::Connection * con, ti RdbmsDataSource::RdbmsConnection::~RdbmsConnection() { connection->finish(); - delete connection; } void @@ -246,14 +243,14 @@ RdbmsDataSource::RdbmsConnection::isExpired() const RdbmsDataSource::ConnectionInfo::ConnectionInfo(ScriptNodePtr node) : dsn(node->value("dsn", NULL).as<std::string>()), - typeId(InstanceMap<ConnectionLoader, std::string>::Get<UnknownConnectionProvider>(node->value("provider", NULL))) + typeId(node->value("provider", NULL).as<std::string>()) { } -DB::Connection * +DB::ConnectionPtr RdbmsDataSource::ConnectionInfo::connect() const { - return typeId->create(dsn); + return DB::ConnectionFactory::createNew(typeId, dsn); } bool @@ -290,21 +287,21 @@ RdbmsDataSource::ConnectionRef::operator=(const RdbmsDataSource::ConnectionRef & return *this; } -const DB::Connection * +DB::Connection * RdbmsDataSource::ConnectionRef::operator->() const { - return conn->connection; + return conn->connection.get(); } -const DB::Connection & +DB::Connection & RdbmsDataSource::ConnectionRef::operator*() const { return *conn->connection; } -const DB::Connection * +DB::Connection * RdbmsDataSource::ConnectionRef::get() const { - return conn->connection; + return conn->connection.get(); } diff --git a/project2/sql/rdbmsDataSource.h b/project2/sql/rdbmsDataSource.h index e347961..b1cb74c 100644 --- a/project2/sql/rdbmsDataSource.h +++ b/project2/sql/rdbmsDataSource.h @@ -10,23 +10,22 @@ #include <connection.h> #include <error.h> #include "scriptLoader.h" -#include "connectionLoader.h" /// Project2 component to provide access to transactional RDBMS data sources -class RdbmsDataSource : public DataSource { +class DLL_PUBLIC RdbmsDataSource : public DataSource { public: class ConnectionRef; class RdbmsConnection { public: - RdbmsConnection(const DB::Connection * connection, time_t kat); + RdbmsConnection(DB::ConnectionPtr const connection, time_t kat); ~RdbmsConnection(); void touch() const; bool isExpired() const; - const DB::Connection * const connection; + DB::ConnectionPtr const connection; bool txOpen; - boost::optional<std::thread::id> threadId; + std::optional<std::thread::id> threadId; private: friend class ConnectionRef; @@ -46,9 +45,9 @@ class RdbmsDataSource : public DataSource { ~ConnectionRef(); ConnectionRef & operator=(const ConnectionRef &); - const DB::Connection * operator->() const; - const DB::Connection & operator*() const; - const DB::Connection * get() const; + DB::Connection * operator->() const; + DB::Connection & operator*() const; + DB::Connection * get() const; private: ConnectionPtr conn; }; @@ -57,12 +56,12 @@ class RdbmsDataSource : public DataSource { public: ConnectionInfo(ScriptNodePtr); - DB::Connection * connect() const; + DB::ConnectionPtr connect() const; bool operator<(const ConnectionInfo & o) const; const std::string dsn; - const boost::shared_ptr<ConnectionLoader> typeId; + const std::string typeId; }; typedef std::map<std::string, ConnectionInfo> ReadonlyDSNs; // Map hostname to DSN string @@ -95,7 +94,7 @@ class RdbmsDataSource : public DataSource { typedef std::set<ChangedDSN> ChangedDSNs; static ChangedDSNs changedDSNs; - friend class RdbmsDataSourceLoader; + friend class RdbmsDataSourceFactory; }; #endif diff --git a/project2/sql/sql-modMySQL.cpp b/project2/sql/sql-modMySQL.cpp deleted file mode 100644 index 0466cbc..0000000 --- a/project2/sql/sql-modMySQL.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "connectionLoader.h" -#include "../libmysqlpp/connection.h" -#include "sql-modMySQL.h" -#include <misc.h> -#include <scripts.h> -#include <logger.h> -#include <fstream> - -typedef MySQL::Connection MySQLConnection; -DECLARE_GENERIC_LOADER("mysql", ConnectionLoader, MySQLConnection) - -MockMySQLDatabase::MockMySQLDatabase(const std::string & name, const std::vector<boost::filesystem::path> & ss) : - MockServerDatabase("options=p2testmysql", name, "mysql") -{ - CreateNewDatabase(); - PlaySchemaScripts(ss); -} - -DB::Connection * -MockMySQLDatabase::openConnection() const -{ - return InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>("mysql")->create( - stringbf("options=p2testmysql;database=%s", testDbName)); -} - -MockMySQLDatabase::~MockMySQLDatabase() -{ - DropDatabase(); -} - diff --git a/project2/sql/sql-modMySQL.h b/project2/sql/sql-modMySQL.h deleted file mode 100644 index b303e71..0000000 --- a/project2/sql/sql-modMySQL.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef MOCKMYSQLDATASOURCE_H -#define MOCKMYSQLDATASOURCE_H - -#include "mockDatabase.h" -#include <boost/filesystem/path.hpp> - -class MockMySQLDatabase : public MockServerDatabase { - public: - MockMySQLDatabase(const std::string & name, const std::vector<boost::filesystem::path> & ss); - ~MockMySQLDatabase(); - - private: - DB::Connection * openConnection() const override; -}; - -#endif - diff --git a/project2/sql/sql-modODBC.cpp b/project2/sql/sql-modODBC.cpp deleted file mode 100644 index 29d2441..0000000 --- a/project2/sql/sql-modODBC.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "connectionLoader.h" -#include "../libodbcpp/connection.h" -#include "sql-modODBC.h" -#include <misc.h> -#include <scripts.h> -#include <logger.h> - -typedef ODBC::Connection ODBCConnection; -DECLARE_GENERIC_LOADER("odbc", ConnectionLoader, ODBCConnection) - -MockODBCDatabase::MockODBCDatabase(const std::string & masterdb, const std::string & name, const std::vector<boost::filesystem::path> & ss) : - MockServerDatabase(masterdb, name, "odbc") -{ - CreateNewDatabase(); - PlaySchemaScripts(ss); -} - -DB::Connection * -MockODBCDatabase::openConnection() const -{ - return InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>("odbc")->create( - stringbf("Driver=postgresql;Database=%s;uid=postgres;servername=/run/postgresql", testDbName)); -} - -MockODBCDatabase::~MockODBCDatabase() -{ - DropDatabase(); -} - -void MockODBCDatabase::DropDatabase() const -{ - Logger()->messagebf(LOG_INFO, "Killing any active connections to database %s", testDbName); - master->execute("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '" + testDbName + "'"); - MockServerDatabase::DropDatabase(); -} - diff --git a/project2/sql/sql-modODBC.h b/project2/sql/sql-modODBC.h deleted file mode 100644 index e7d7bdb..0000000 --- a/project2/sql/sql-modODBC.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef MOCKODBCDATASOURCE_H -#define MOCKODBCDATASOURCE_H - -#include "mockDatabase.h" -#include <boost/filesystem/path.hpp> - -class MockODBCDatabase : public MockServerDatabase { - public: - MockODBCDatabase(const std::string & master, const std::string & name, const std::vector<boost::filesystem::path> & ss); - ~MockODBCDatabase(); - - protected: - void DropDatabase() const override; - - private: - DB::Connection * openConnection() const override; -}; - -#endif - - diff --git a/project2/sql/sql-modPQ.cpp b/project2/sql/sql-modPQ.cpp deleted file mode 100644 index ec2fcf3..0000000 --- a/project2/sql/sql-modPQ.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "connectionLoader.h" -#include "../libpqpp/connection.h" -#include "sql-modPQ.h" -#include <misc.h> -#include <scripts.h> -#include <logger.h> - -typedef PQ::Connection PQConnection; -DECLARE_GENERIC_LOADER("postgresql", ConnectionLoader, PQConnection) - -MockPqDatabase::MockPqDatabase(const std::string & masterdb, const std::string & name, const std::vector<boost::filesystem::path> & ss) : - MockServerDatabase(masterdb, name, "postgresql") -{ - CreateNewDatabase(); - PlaySchemaScripts(ss); -} - -DB::Connection * -MockPqDatabase::openConnection() const -{ - return InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>("postgresql")->create( - stringbf("user=postgres dbname=%s", testDbName)); -} - -MockPqDatabase::~MockPqDatabase() -{ - DropDatabase(); -} - -void MockPqDatabase::DropDatabase() const -{ - Logger()->messagebf(LOG_INFO, "Killing any active connections to database %s", testDbName); - master->execute("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '" + testDbName + "'"); - MockServerDatabase::DropDatabase(); -} - diff --git a/project2/sql/sql-modPQ.h b/project2/sql/sql-modPQ.h deleted file mode 100644 index 43ef1ee..0000000 --- a/project2/sql/sql-modPQ.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef MOCKPQDATASOURCE_H -#define MOCKPQDATASOURCE_H - -#include "mockDatabase.h" -#include <boost/filesystem/path.hpp> - -class MockPqDatabase : public MockServerDatabase { - public: - MockPqDatabase(const std::string & master, const std::string & name, const std::vector<boost::filesystem::path> & ss); - ~MockPqDatabase(); - - protected: - void DropDatabase() const override; - - private: - DB::Connection * openConnection() const override; -}; - -#endif - diff --git a/project2/sql/sql-modSQLite.cpp b/project2/sql/sql-modSQLite.cpp deleted file mode 100644 index ef8e133..0000000 --- a/project2/sql/sql-modSQLite.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "connectionLoader.h" -#include "../libsqlitepp/connection.h" -#include "sql-modSQLite.h" -#include <misc.h> -#include <scripts.h> -#include <logger.h> -#include <boost/filesystem/operations.hpp> -#include "mockDatasource.h" - -typedef SQLite::Connection SQLiteConnection; -DECLARE_GENERIC_LOADER("sqlite", ConnectionLoader, SQLiteConnection) - -MockSQLiteDatabase::MockSQLiteDatabase(const std::string & name, const std::vector<boost::filesystem::path> & ss) : - MockDatabase(name), - testDbPath(boost::filesystem::path("/tmp") / "sqliteut" / stringbf("%d", getpid()) / stringbf("%d", ++MockConnectionLoader::mocked)) -{ - CreateNewDatabase(); - PlaySchemaScripts(ss); -} - -DB::Connection * -MockSQLiteDatabase::openConnection() const -{ - return InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>("sqlite")->create(testDbPath.string()); -} - -MockSQLiteDatabase::~MockSQLiteDatabase() -{ - DropDatabase(); -} - -void MockSQLiteDatabase::DropDatabase() const -{ - Logger()->messagebf(LOG_INFO, "Deleting database %s", testDbPath); - boost::filesystem::remove(testDbPath); -} - -void MockSQLiteDatabase::CreateNewDatabase() const -{ - Logger()->messagebf(LOG_INFO, "Creating new database at %s", testDbPath); - boost::filesystem::create_directories(testDbPath.parent_path()); - delete openConnection(); -} - - diff --git a/project2/sql/sql-modSQLite.h b/project2/sql/sql-modSQLite.h deleted file mode 100644 index 36bca22..0000000 --- a/project2/sql/sql-modSQLite.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MOCKSQLITEDATASOURCE_H -#define MOCKSQLITEDATASOURCE_H - -#include "mockDatabase.h" -#include <boost/filesystem/path.hpp> - -class MockSQLiteDatabase : public MockDatabase { - public: - MockSQLiteDatabase(const std::string & name, const std::vector<boost::filesystem::path> & ss); - ~MockSQLiteDatabase(); - - protected: - void DropDatabase() const override; - void CreateNewDatabase() const override; - - DB::Connection * openConnection() const override; - - private: - const boost::filesystem::path testDbPath; -}; - -#endif - - diff --git a/project2/sql/sql.ll b/project2/sql/sql.ll deleted file mode 100644 index ab40642..0000000 --- a/project2/sql/sql.ll +++ /dev/null @@ -1,123 +0,0 @@ -%option batch -%option c++ -%option noyywrap -%option 8bit -%option stack -%option yylineno -%option yyclass="sqlFlexLexer" -%option prefix="sqlBase" - -%{ -#include <stdexcept> -#include "sqlFlexLexer.h" -#pragma GCC diagnostic ignored "-Wsign-compare" -%} - -space [ \t\n\r\f] -non_newline [^\r\n] -mcomment_start "/*" -mcomment_stop "*/" -comment ("--"{non_newline}*) -other . -term ; -any ({other}|{space}) -quote ' -quote_apos '' -dolq_start [A-Za-z\200-\377_] -dolq_cont [A-Za-z\200-\377_0-9] -dollarquote \$({dolq_start}{dolq_cont}*)?\$ - -p2mockscriptdir "$P2MOCKSCRIPTDIR" - -%x COMMENT -%x STATEMENT -%x QUOTE -%x DOLLARQUOTE - -%% -{mcomment_start} { - comment += YYText(); - yy_push_state(COMMENT); -} - -<COMMENT>{mcomment_stop} { - comment += YYText(); - Comment(comment); - comment.clear(); - yy_pop_state(); -} - -<COMMENT>{any} { - comment += YYText(); -} - -<COMMENT><<EOF>> { - throw std::runtime_error("Unterminated comment"); -} - -{comment} { - Comment(YYText()); -} - -{other} { - statement += YYText(); - yy_push_state(STATEMENT); -} - -<STATEMENT>{quote} { - statement += YYText(); - yy_push_state(QUOTE); -} - -<STATEMENT>{dollarquote} { - statement += YYText(); - yy_push_state(DOLLARQUOTE); -} - -<QUOTE>{quote} { - statement += YYText(); - yy_pop_state(); -} - -<QUOTE>{p2mockscriptdir} { - statement += MockScriptDir(); -} - -<QUOTE>{quote_apos} { - statement += YYText(); -} - -<DOLLARQUOTE>{any} { - statement += YYText(); -} - -<DOLLARQUOTE>{dollarquote} { - statement += YYText(); - yy_pop_state(); -} - -<DOLLARQUOTE><<EOF>> { - throw std::runtime_error("Unterminated dollar quoted string"); -} - -<QUOTE>{any} { - statement += YYText(); -} - -<QUOTE><<EOF>> { - throw std::runtime_error("Unterminated quoted string"); -} - -<STATEMENT>{term} { - Statement(statement); - statement.clear(); - yy_pop_state(); -} - -<STATEMENT>{any} { - statement += YYText(); -} - -<*>[ \t\r\n\f] { -} - diff --git a/project2/sql/sqlBase.cpp b/project2/sql/sqlBase.cpp new file mode 100644 index 0000000..dd1e90d --- /dev/null +++ b/project2/sql/sqlBase.cpp @@ -0,0 +1,24 @@ +#include "sqlBase.h" +#include <commonObjects.h> +#include "rdbmsDataSource.h" + +SqlBase::SqlBase(ScriptNodePtr p) : + SourceObject(p), + dataSource(p, "datasource"), + db(NULL) +{ +} + +SqlBase::SqlBase(const std::string & datasource) : + SourceObject(ScriptNodePtr()), + dataSource(datasource), + db(NULL) +{ +} + +void +SqlBase::loadComplete(const CommonObjects * co) +{ + db = co->dataSource<RdbmsDataSource>(dataSource(NULL)); +} + diff --git a/project2/sql/sqlBase.h b/project2/sql/sqlBase.h new file mode 100644 index 0000000..7e906c3 --- /dev/null +++ b/project2/sql/sqlBase.h @@ -0,0 +1,23 @@ +#ifndef SQLBASE_H +#define SQLBASE_H + +#include <sourceObject.h> +#include <variables.h> + +class RdbmsDataSource; + +class DLL_PUBLIC SqlBase : public virtual SourceObject { + public: + SqlBase(ScriptNodePtr); + SqlBase(const std::string &); + + virtual void loadComplete(const CommonObjects *) override; + + const Variable dataSource; + + protected: + const RdbmsDataSource * db; +}; + +#endif + diff --git a/project2/sql/sqlBulkLoad.cpp b/project2/sql/sqlBulkLoad.cpp index 813323c..fc7e7e1 100644 --- a/project2/sql/sqlBulkLoad.cpp +++ b/project2/sql/sqlBulkLoad.cpp @@ -2,43 +2,38 @@ #include "task.h" #include <commonObjects.h> #include "rdbmsDataSource.h" -#include "scopeObject.h" +#include <scopeExit.h> #include "stream.h" +#include "sqlBase.h" -class SqlBulkLoad : public Task { +class SqlBulkLoad : public Task, SqlBase { public: SqlBulkLoad(ScriptNodePtr p) : SourceObject(p), Task(p), - dataSource(p, "datasource"), + SqlBase(p), targetTable(p, "targettable"), - extras(p, "extras"), - db(NULL) + extras(p, "extras") { - p->script->loader.addLoadTarget(p, Storer::into<ElementLoader>(&stream)); - } - - void loadComplete(const CommonObjects * co) - { - db = co->dataSource<RdbmsDataSource>(dataSource(NULL)); + p->script.lock()->loader.addLoadTarget(p, Storer::into<StreamFactory>(&stream)); } void execute(ExecContext * ec) const { auto wdb = db->getWritable(); - wdb->beginBulkUpload(targetTable(ec), extras(ec)); - ScopeObject tidy([]{}, + const std::string tt(targetTable(ec)); + const std::string x(extras(ec)); + wdb->beginBulkUpload(tt.c_str(), x.c_str()); + AdHoc::ScopeExit tidy([]{}, [&]{ wdb->endBulkUpload(NULL); }, [&]{ wdb->endBulkUpload("Stack unwind in progress"); }); stream->runStream(boost::bind(&DB::Connection::bulkUploadData, wdb.get(), _1, _2), ec); } - const Variable dataSource; const Variable targetTable; const Variable extras; StreamPtr stream; - protected: - const RdbmsDataSource * db; }; -DECLARE_LOADER("sqlbulkload", SqlBulkLoad); +NAMEDFACTORY("sqlbulkload", SqlBulkLoad, TaskFactory); + diff --git a/project2/sql/sqlCache.cpp b/project2/sql/sqlCache.cpp index 142bf6f..79e2e83 100644 --- a/project2/sql/sqlCache.cpp +++ b/project2/sql/sqlCache.cpp @@ -16,12 +16,10 @@ #include <boost/algorithm/string/predicate.hpp> #include <boost/date_time/posix_time/posix_time.hpp> -typedef boost::shared_ptr<DB::SelectCommand> SelectPtr; -typedef boost::shared_ptr<DB::ModifyCommand> ModifyPtr; - class SqlCache : public RowSetCache { public: SqlCache(ScriptNodePtr p) : + SourceObject(p), RowSetCache(p), db(NULL) { @@ -32,7 +30,7 @@ class SqlCache : public RowSetCache { db = co->dataSource<RdbmsDataSource>(DataSource); } - static void appendKeyCols(Buffer * sql, unsigned int * off, const Glib::ustring & col) + static void appendKeyCols(AdHoc::Buffer * sql, unsigned int * off, const Glib::ustring & col) { if ((*off)++) { sql->append(", "); @@ -40,7 +38,7 @@ class SqlCache : public RowSetCache { sql->append(col.c_str()); } - static void appendKeyBinds(Buffer * sql, unsigned int * off) + static void appendKeyBinds(AdHoc::Buffer * sql, unsigned int * off) { if ((*off)++) { sql->append(", "); @@ -48,19 +46,20 @@ class SqlCache : public RowSetCache { sql->append("?"); } - static void appendKeyAnds(Buffer * sql, const Glib::ustring & col) + static void appendKeyAnds(AdHoc::Buffer * sql, const Glib::ustring & col) { sql->appendf(" AND h.%s = ?", col.c_str()); } static void bindKeyValues(DB::Command * cmd, unsigned int * offset, const VariableType & v) { - boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(cmd, (*offset)++), v); + boost::apply_visitor(SqlVariableBinder(cmd, (*offset)++), v); } class SqlCacheRowSet : public RowSet { public: - SqlCacheRowSet(SelectPtr r) : + SqlCacheRowSet(DB::SelectCommandPtr r) : + SourceObject(ScriptNodePtr()), RowSet(NULL), s(r) { } @@ -98,7 +97,7 @@ class SqlCache : public RowSetCache { const DB::Column & col = (*s)[c]; if (!boost::algorithm::starts_with(col.name, "p2attr_") && !boost::algorithm::starts_with(col.name, "p2_")) { - ss.columns.insert(new Column(colNo++, col.name)); + ss.columns.insert(std::make_shared<Column>(colNo++, col.name)); colCols.push_back(c); } } @@ -120,14 +119,14 @@ class SqlCache : public RowSetCache { } while (s->fetch()); } private: - SelectPtr s; + DB::SelectCommandPtr s; mutable std::vector<unsigned int> colCols; mutable int64_t cacheId; }; RowSetCPtr getCachedRowSet(ExecContext * ec, const Glib::ustring & n, const Glib::ustring & f, const IHaveParameters * ps) const { - Buffer sql; + AdHoc::Buffer sql; sql.appendf("SELECT r.* \ FROM %s p, %s_%s_%s h LEFT OUTER JOIN %s_%s_%s_rows r \ ON h.p2_cacheid = r.p2_cacheid \ @@ -139,12 +138,12 @@ class SqlCache : public RowSetCache { applyKeys(ec, boost::bind(appendKeyAnds, &sql, _1), ps); sql.appendf(" ORDER BY r.p2_cacheid DESC, r.p2_row"); auto con = db->getReadonly(); - SelectPtr gh(con->newSelectCommand(sql)); + auto gh = con->select(sql); unsigned int offset = 0; gh->bindParamT(offset++, boost::posix_time::microsec_clock::universal_time() - boost::posix_time::seconds(CacheLife)); applyKeys(ec, boost::bind(bindKeyValues, gh.get(), &offset, _2), ps); if (gh->fetch()) { - return new SqlCacheRowSet(gh); + return std::make_shared<SqlCacheRowSet>(gh); } return NULL; } @@ -166,7 +165,7 @@ class SqlCache : public RowSetCache { cols[name] = value; } void finishRow() const { - Buffer sql; + AdHoc::Buffer sql; sql.appendf("INSERT INTO %s_%s_%s_rows(p2_row", HeaderTable.c_str(), n.c_str(), f.c_str()); for (const Values::value_type & a : attrs) { sql.appendf(", p2attr_%s", a.first.c_str()); @@ -183,14 +182,14 @@ class SqlCache : public RowSetCache { } sql.appendf(")"); auto con = db->getWritable(); - ModifyPtr m(con->newModifyCommand(sql)); + auto m = con->modify(sql); unsigned int offset = 0; m->bindParamI(offset++, row++); for (const Values::value_type & a : attrs) { - boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(m.get(), offset++), a.second); + boost::apply_visitor(SqlVariableBinder(m.get(), offset++), a.second); } for (const Values::value_type & v : cols) { - boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(m.get(), offset++), v.second); + boost::apply_visitor(SqlVariableBinder(m.get(), offset++), v.second); } m->execute(); cols.clear(); @@ -206,19 +205,19 @@ class SqlCache : public RowSetCache { RowSetPresenterPtr openFor(ExecContext * ec, const Glib::ustring & n, const Glib::ustring & f, const IHaveParameters * ps) { - Buffer sp; + AdHoc::Buffer sp; sp.appendf("SAVEPOINT sp%p", this); auto con = db->getWritable(); - ModifyPtr s = ModifyPtr(con->newModifyCommand(sp)); + auto s = con->modify(sp); s->execute(); // Header - Buffer del; + AdHoc::Buffer del; del.appendf("INSERT INTO %s(p2_time) VALUES(?)", HeaderTable.c_str()); - ModifyPtr h = ModifyPtr(con->newModifyCommand(del)); + auto h = con->modify(del); h->bindParamT(0, boost::posix_time::microsec_clock::universal_time()); h->execute(); // Record set header - Buffer sql; + AdHoc::Buffer sql; sql.appendf("INSERT INTO %s_%s_%s(", HeaderTable.c_str(), n.c_str(), f.c_str()); unsigned int offset = 0; applyKeys(ec, boost::bind(appendKeyCols, &sql, &offset, _1), ps); @@ -226,34 +225,34 @@ class SqlCache : public RowSetCache { offset = 0; applyKeys(ec, boost::bind(appendKeyBinds, &sql, &offset), ps); sql.appendf(")"); - ModifyPtr m(con->newModifyCommand(sql)); + auto m = con->modify(sql); offset = 0; applyKeys(ec, boost::bind(bindKeyValues, m.get(), &offset, _2), ps); m->execute(); - return new SqlCachePresenter(n, f, db); + return std::make_shared<SqlCachePresenter>(n, f, db); } void save(ExecContext *, const Glib::ustring & , const Glib::ustring & , const IHaveParameters * ) { - Buffer sp; + AdHoc::Buffer sp; sp.appendf("RELEASE SAVEPOINT sp%p", this); auto con = db->getWritable(); - ModifyPtr s = ModifyPtr(con->newModifyCommand(sp)); + auto s = con->modify(sp); s->execute(); } void discard(ExecContext *, const Glib::ustring & , const Glib::ustring & , const IHaveParameters * ) { - Buffer sp; + AdHoc::Buffer sp; sp.appendf("ROLLBACK TO SAVEPOINT sp%p", this); auto con = db->getWritable(); - ModifyPtr s = ModifyPtr(con->newModifyCommand(sp)); + auto s = con->modify(sp); s->execute(); } INITOPTIONS; private: - friend class CustomSqlCacheLoader; + friend class CustomSqlCacheFactory; const RdbmsDataSource * db; static std::string DataSource; static std::string HeaderTable; @@ -264,16 +263,16 @@ std::string SqlCache::DataSource; std::string SqlCache::HeaderTable; time_t SqlCache::CacheLife; -class CustomSqlCacheLoader : public ElementLoader::For<SqlCache> { +class CustomSqlCacheFactory : public RowSetCacheFactory::For<SqlCache>, public LifeCycle { public: void onIdle() override { try { if (!SqlCache::DataSource.empty()) { - boost::intrusive_ptr<CommonObjects> co = new CommonObjects(); + std::shared_ptr<CommonObjects> co = std::make_shared<CommonObjects>(); RdbmsDataSource * db = co->dataSource<RdbmsDataSource>(SqlCache::DataSource); auto con = db->getWritable(); - ModifyPtr m(con->newModifyCommand(stringbf("DELETE FROM %s WHERE p2_time < ?", SqlCache::HeaderTable))); + auto m = con->modify(stringbf("DELETE FROM %s WHERE p2_time < ?", SqlCache::HeaderTable)); m->bindParamT(0, boost::posix_time::microsec_clock::universal_time() - boost::posix_time::seconds(SqlCache::CacheLife)); m->execute(); db->commit(); @@ -284,7 +283,7 @@ class CustomSqlCacheLoader : public ElementLoader::For<SqlCache> { } } }; -DECLARE_CUSTOM_LOADER("sqlcache", CustomSqlCacheLoader); +NAMEDPLUGIN("sqlcache", CustomSqlCacheFactory, RowSetCacheFactory); DECLARE_OPTIONS(SqlCache, "SQL Cache options") ("cache.sql.dataSource", Options::value(&DataSource), diff --git a/project2/sql/sqlFlexLexer.cpp b/project2/sql/sqlFlexLexer.cpp deleted file mode 100644 index eaacd50..0000000 --- a/project2/sql/sqlFlexLexer.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#define yyFlexLexer sqlBaseFlexLexer -#include <FlexLexer.h> -#include "sqlFlexLexer.h" -#include <logger.h> - -sqlFlexLexer::sqlFlexLexer(const boost::filesystem::path & s, std::istream & f, DB::Connection * c) : - yyFlexLexer(&f, NULL), - conn(c), - script(s) -{ -} - -void -sqlFlexLexer::LexerError(const char * msg) -{ - throw std::runtime_error(msg); -} - -void -sqlFlexLexer::Comment(const std::string & text) -{ - Logger()->messagebf(LOG_DEBUG, "Got comment: %s", text); -} - -void -sqlFlexLexer::Statement(const std::string & text) -{ - Logger()->messagebf(LOG_DEBUG, "Got statement: %s", text); - conn->execute(text); -} - -std::string -sqlFlexLexer::MockScriptDir() const -{ - return script.string(); -} - diff --git a/project2/sql/sqlFlexLexer.h b/project2/sql/sqlFlexLexer.h deleted file mode 100644 index 55019e5..0000000 --- a/project2/sql/sqlFlexLexer.h +++ /dev/null @@ -1,24 +0,0 @@ -#include <istream> -#include <string> -#include <connection.h> -#include <boost/filesystem/path.hpp> - -class sqlFlexLexer : public yyFlexLexer { - public: - sqlFlexLexer(const boost::filesystem::path &, std::istream &, DB::Connection *); - int yylex(); - - void Comment(const std::string &); - void Statement(const std::string &); - std::string MockScriptDir() const; - - protected: - void LexerError(const char *) override; - - private: - DB::Connection * conn; - const boost::filesystem::path script; - std::string comment; - std::string statement; -}; - diff --git a/project2/sql/sqlHandleAsVariableType.cpp b/project2/sql/sqlHandleAsVariableType.cpp index ac1ea3b..a692a40 100644 --- a/project2/sql/sqlHandleAsVariableType.cpp +++ b/project2/sql/sqlHandleAsVariableType.cpp @@ -5,8 +5,8 @@ void HandleAsVariableType::null() { variable = Null(); } -void HandleAsVariableType::string(const char * c, size_t l) { - variable = Glib::ustring(c, c + l); +void HandleAsVariableType::string(const std::string_view s) { + variable = Glib::ustring(s.begin(), s.end()); } void HandleAsVariableType::integer(int64_t i) { variable = i; diff --git a/project2/sql/sqlHandleAsVariableType.h b/project2/sql/sqlHandleAsVariableType.h index d843c4e..5bf38c3 100644 --- a/project2/sql/sqlHandleAsVariableType.h +++ b/project2/sql/sqlHandleAsVariableType.h @@ -4,10 +4,10 @@ #include "column.h" #include "variables.h" -class HandleAsVariableType : public DB::HandleField { +class DLL_PUBLIC HandleAsVariableType : public DB::HandleField { public: void null(); - void string(const char * c, size_t l); + void string(const std::string_view l); void integer(int64_t i); void boolean(bool i); void floatingpoint(double d); diff --git a/project2/sql/sqlMergeTask.cpp b/project2/sql/sqlMergeTask.cpp index 91bf3e0..f78862f 100644 --- a/project2/sql/sqlMergeTask.cpp +++ b/project2/sql/sqlMergeTask.cpp @@ -6,19 +6,21 @@ #include "exceptions.h" #include "sqlVariableBinder.h" #include "scriptLoader.h" -#include "scopeObject.h" +#include <scopeExit.h> #include "execContext.h" -#include <misc.h> +#include <buffer.h> #include <stdio.h> #include <stdexcept> #include <boost/algorithm/string/join.hpp> #include <boost/bind.hpp> bool SqlMergeTask::defaultUseTempTable = true; -static void attach(boost::intrusive_ptr<IHaveSubTasks> i, DB::ModifyCommand * insert); +static void attach(std::shared_ptr<IHaveSubTasks> i, DB::ModifyCommandPtr insert); + +#define foreach(_type, _con, _it) for (_type _it = ((_con).begin()); _it != ((_con).end()); _it++) class SqlMergeInsert; -typedef boost::intrusive_ptr<SqlMergeInsert> SqlMergeInsertPtr; +typedef std::shared_ptr<SqlMergeInsert> SqlMergeInsertPtr; /// Project2 component insert custom constructed records during an SQL Merge task class SqlMergeInsert : IHaveParameters, public Task { public: @@ -31,22 +33,22 @@ class SqlMergeInsert : IHaveParameters, public Task { void execute(ExecContext * ec) const { unsigned int col = 0; for (const Parameters::value_type & v : parameters) { - boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(insert, col++), v.second(ec)); + boost::apply_visitor(SqlVariableBinder(insert.get(), col++), v.second(ec)); } insert->execute(); } private: - friend void attach(SqlMergeInsertPtr i, DB::ModifyCommand * insert); - DB::ModifyCommand * insert; + friend void attach(SqlMergeInsertPtr i, DB::ModifyCommandPtr insert); + DB::ModifyCommandPtr insert; }; -DECLARE_LOADER("sqlmerge", SqlMergeTask); -DECLARE_LOADER("sqlmergeinsert", SqlMergeInsert); +NAMEDFACTORY("sqlmerge", SqlMergeTask, TaskFactory); +NAMEDFACTORY("sqlmergeinsert", SqlMergeInsert, TaskFactory); // Conversion logic SqlMergeTask::SqlMergeTask(const std::string & datasource, const std::string & target) : SourceObject(__PRETTY_FUNCTION__), - Task(NULL), + Task(__PRETTY_FUNCTION__), insteadOfDelete(NULL), updateWhere(NULL), patchOrder(NULL), @@ -85,7 +87,7 @@ SqlMergeTask::SqlMergeTask(ScriptNodePtr p) : dtable(p->value("targettable", NULL).as<std::string>()), dtablet(stringf("tmp_%s_%d", dtable.c_str(), getpid())) { - p->script->loader.addLoadTarget(p, Storer::into<ElementLoader>(&sources)); + p->script.lock()->loader.addLoadTarget(p, Storer::into<TaskFactory>(&sources)); if (!sources.empty() && useView(NULL)) { throw NotSupported("useview not supported with iterate fillers"); @@ -113,7 +115,6 @@ SqlMergeTask::SqlMergeTask(ScriptNodePtr p) : SqlMergeTask::~SqlMergeTask() { - delete insCmd; delete sqlCommand; } @@ -145,7 +146,7 @@ SqlMergeTask::execute(ExecContext * ec) const { auto savepoint(stringf("sqlmerge_savepoint_%p", this)); destdb->savepoint(savepoint); - ScopeObject SPHandler(NULL, + AdHoc::ScopeExit SPHandler(NULL, boost::bind(&DB::Connection::releaseSavepoint, destdb.get(), savepoint), boost::bind(&DB::Connection::rollbackToSavepoint, destdb.get(), savepoint)); createTempTable(); @@ -161,14 +162,23 @@ SqlMergeTask::execute(ExecContext * ec) const for (const TargetColumnPtr & c : cols) { colNames.insert(c->column); } - TablePatch tp(*destdb, dtablet, dtable, colNames); - tp.doDelete = doDelete(NULL); - tp.doUpdate = doUpdate(NULL); - tp.doInsert = doInsert(NULL); + DB::TablePatch tp; + tp.src = dtablet; + tp.dest = dtable; + tp.cols = colNames; + tp.doDeletes = doDelete(ec); + tp.doUpdates = doUpdate(ec); + tp.doInserts = doInsert(ec); for (const Keys::value_type & k : keys) { - tp.addKey(k); + tp.pk.insert(k); } - tp.patch(ec, insteadOfDelete, updateWhere, patchOrder); + DynamicSql::SqlWriterWrapper iod(ec, insteadOfDelete.get()); + tp.insteadOfDelete = insteadOfDelete ? &iod : nullptr; + DynamicSql::SqlWriterWrapper uw(ec, updateWhere.get()); + tp.where = updateWhere ? &uw : nullptr; + DynamicSql::SqlWriterWrapper po(ec, patchOrder.get()); + tp.order = patchOrder ? &po : nullptr; + destdb->patchTable(&tp); dropTempTable(); } @@ -176,28 +186,25 @@ void SqlMergeTask::createTempTable() const { if (useView(NULL)) { - DB::ModifyCommand * cv = destdb->newModifyCommand(stringf( - "CREATE VIEW %s AS %s", - dtablet.c_str(), - sqlCommand->getSqlFor("").c_str())); - cv->execute(); - delete cv; + AdHoc::Buffer b; + b.appendf( "CREATE VIEW %s AS ", dtablet.c_str()); + sqlCommand->setFilter(Glib::ustring()); + sqlCommand->writeSql(b); + destdb->modify(b)->execute(); } else { - DB::ModifyCommand * ctt = destdb->newModifyCommand(stringf( + auto ctt = destdb->modify(stringf( "CREATE TEMPORARY TABLE %s AS SELECT * FROM %s WHERE 0=1", dtablet.c_str(), dtable.c_str())); ctt->execute(); - delete ctt; for (Columns::value_type c : cols) { if (!c->maptable.empty()) { - DB::ModifyCommand * at = destdb->newModifyCommand(stringf( + auto at = destdb->modify(stringf( "ALTER TABLE %s ADD COLUMN %s VARCHAR(1000)", dtablet.c_str(), c->mapcolumn.c_str())); at->execute(); - delete at; } } } @@ -207,15 +214,14 @@ void SqlMergeTask::dropTempTable() const { if (tempTableCreated) { - DB::ModifyCommand * d; + DB::ModifyCommandPtr d; if (useView(NULL)) { - d = destdb->newModifyCommand("DROP VIEW " + dtablet); + d = destdb->modify("DROP VIEW " + dtablet); } else { - d = destdb->newModifyCommand("DROP TABLE " + dtablet); + d = destdb->modify("DROP TABLE " + dtablet); } d->execute(); - delete d; } } void @@ -223,28 +229,26 @@ SqlMergeTask::createTempKey() const { if (useView(NULL)) return; /* Primary key */ - Buffer idx; + AdHoc::Buffer idx; idx.appendf("ALTER TABLE %s ADD CONSTRAINT pk_%s PRIMARY KEY(%s)", dtablet.c_str(), dtablet.c_str(), boost::algorithm::join(keys, ", ").c_str()); - DB::ModifyCommand * at = destdb->newModifyCommand(idx); + DB::ModifyCommandPtr at = destdb->modify(idx); at->execute(); - delete at; /* Indexes */ int n = 0; for (const Keys::value_type & i : indexes) { - DB::ModifyCommand * ci = destdb->newModifyCommand(stringf( + DB::ModifyCommandPtr ci = destdb->modify(stringf( "CREATE INDEX idx_%s_%d ON %s(%s)", dtablet.c_str(), n, dtablet.c_str(), i.c_str())); ci->execute(); - delete ci; n += 1; } } -DB::ModifyCommand * +DB::ModifyCommandPtr SqlMergeTask::insertCommand() const { - Buffer ins; + AdHoc::Buffer ins; ins.appendf("INSERT INTO %s(", dtablet.c_str()); foreach(Columns::const_iterator, cols, c) { if (c != cols.begin()) { @@ -262,14 +266,14 @@ SqlMergeTask::insertCommand() const } } ins.append(")"); - return destdb->newModifyCommand(ins); + return destdb->modify(ins); } -class Populate : public NoOutputExecute { +class Populate : public Task { public: - Populate(DB::ModifyCommand * c) : + Populate(DB::ModifyCommandPtr c) : SourceObject(__FUNCTION__), - NoOutputExecute(__FUNCTION__), + Task(__FUNCTION__), cmd(c) { } @@ -282,14 +286,14 @@ class Populate : public NoOutputExecute { private: void bind(unsigned int & idx, const VariableType & value) const { - boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(cmd, idx++), value); + boost::apply_visitor(SqlVariableBinder(cmd.get(), idx++), value); } - DB::ModifyCommand * cmd; + DB::ModifyCommandPtr cmd; }; -typedef boost::intrusive_ptr<Populate> PopulatePtr; +typedef std::shared_ptr<Populate> PopulatePtr; void -attach(SqlMergeInsertPtr i, DB::ModifyCommand * insert) +attach(SqlMergeInsertPtr i, DB::ModifyCommandPtr insert) { if (i) { i->insert = insert; @@ -297,18 +301,18 @@ attach(SqlMergeInsertPtr i, DB::ModifyCommand * insert) } static void -attach(boost::intrusive_ptr<IHaveSubTasks> i, DB::ModifyCommand * insert) +attach(std::shared_ptr<IHaveSubTasks> i, DB::ModifyCommandPtr insert) { if (!i) { return; } if (i->normal.empty()) { - i->normal.push_back(new Populate(insert)); + i->normal.push_back(std::make_shared<Populate>(insert)); } else { for (const IHaveSubTasks::Tasks::value_type & n : i->normal) { - attach(boost::dynamic_pointer_cast<IHaveSubTasks>(n), insert); - attach(boost::dynamic_pointer_cast<SqlMergeInsert>(n), insert); + attach(std::dynamic_pointer_cast<IHaveSubTasks>(n), insert); + attach(std::dynamic_pointer_cast<SqlMergeInsert>(n), insert); } } } @@ -323,7 +327,7 @@ SqlMergeTask::copyToTempTable(ExecContext * ec) const i->execute(ec); } if (sqlCommand) { - Buffer ins; + AdHoc::Buffer ins; ins.appendf("INSERT INTO %s(", dtablet.c_str()); foreach(Columns::const_iterator, cols, c) { if (c != cols.begin()) { @@ -338,16 +342,18 @@ SqlMergeTask::copyToTempTable(ExecContext * ec) const } ins.append((*c)->column); } - ins.appendf(" FROM (%s) tmp_src", sqlCommand->getSqlFor("").c_str()); - DB::ModifyCommand * cttt = destdb->newModifyCommand(ins); + ins.appendf(" FROM ("); + sqlCommand->setFilter(Glib::ustring()); + sqlCommand->writeSql(ins); + ins.appendf(") tmp_src"); + auto cttt = destdb->modify(ins); unsigned int off = 0; - sqlCommand->bindParams(ec, cttt, off); + sqlCommand->bindParams(ec, cttt.get(), off); cttt->execute(); - delete cttt; } for (Columns::value_type c : cols) { if (!c->maptable.empty()) { - DB::ModifyCommand * utt = destdb->newModifyCommand( + auto utt = destdb->modify( stringf( "UPDATE %s d SET %s = (SELECT m.%s FROM %s m WHERE m.%s = d.%s) WHERE %s IS NULL", dtablet.c_str(), @@ -358,7 +364,6 @@ SqlMergeTask::copyToTempTable(ExecContext * ec) const c->mapcolumn.c_str(), c->column.c_str())); utt->execute(); - delete utt; } } } diff --git a/project2/sql/sqlMergeTask.h b/project2/sql/sqlMergeTask.h index eec98cd..f2a825a 100644 --- a/project2/sql/sqlMergeTask.h +++ b/project2/sql/sqlMergeTask.h @@ -7,9 +7,9 @@ #include <buffer.h> #include "tablepatch.h" #include "task.h" -#include "iterate.h" +#include <tasks/iterate.h> #include "variables.h" -#include "sqlWriter.h" +#include "sqlWriters.h" #include "rdbmsDataSource.h" #include <string> #include <set> @@ -17,13 +17,13 @@ #include <list> /// Project2 component merge arbitrary data into an RDBMS table -class SqlMergeTask : public Task { +class DLL_PUBLIC SqlMergeTask : public Task { public: typedef std::string Table; typedef std::string Column; class TargetColumn; - typedef boost::intrusive_ptr<TargetColumn> TargetColumnPtr; - class TargetColumn : public virtual IntrusivePtrBase { + typedef std::shared_ptr<TargetColumn> TargetColumnPtr; + class TargetColumn { public: class Sort { public: @@ -69,8 +69,8 @@ class SqlMergeTask : public Task { typedef ANONSTORAGEOF(IHaveSubTasks) Sources; DynamicSql::SqlCommand * sqlCommand; protected: - DB::ModifyCommand * insertCommand() const; - DB::ModifyCommand * insCmd; + DB::ModifyCommandPtr insertCommand() const; + DB::ModifyCommandPtr insCmd; public: Sources sources; diff --git a/project2/sql/sqlRows.cpp b/project2/sql/sqlRows.cpp index f8a16e1..3a65c9b 100644 --- a/project2/sql/sqlRows.cpp +++ b/project2/sql/sqlRows.cpp @@ -10,13 +10,13 @@ #include "commonObjects.h" #include <boost/date_time/gregorian/gregorian_types.hpp> -DECLARE_LOADER("sqlrows", SqlRows); +NAMEDFACTORY("sqlrows", SqlRows, RowSetFactory); SqlRows::SqlRows(ScriptNodePtr p) : + SourceObject(p), RowSet(p), - dataSource(p, "datasource"), - sqlCommand(p->child("sql")), - db(NULL) + SqlBase(p), + sqlCommand(p->child("sql")) { } @@ -24,19 +24,13 @@ SqlRows::~SqlRows() { } -void -SqlRows::loadComplete(const CommonObjects * co) -{ - db = co->dataSource<RdbmsDataSource>(dataSource(NULL)); -} - -SqlRows::SqlState::SqlState(SelectPtr s) : +SqlRows::SqlState::SqlState(DB::SelectCommandPtr s) : query(s) { query->execute(); fields.resize(query->columnCount()); for (unsigned int c = 0; c < query->columnCount(); c++) { - columns.insert(new Column(c, (*query)[c].name)); + columns.insert(std::make_shared<Column>(c, (*query)[c].name)); } } @@ -49,10 +43,9 @@ SqlRows::SqlState::getColumns() const void SqlRows::execute(const Glib::ustring & filter, const RowProcessorCallback & rp, ExecContext * ec) const { - unsigned int offset = 0; auto con = db->getReadonly(); - auto select = SelectPtr(con->newSelectCommand(sqlCommand.getSqlFor(filter))); - sqlCommand.bindParams(ec, select.get(), offset); + DynamicSql::SqlWriterWrapper sww(ec, &sqlCommand); + auto select = sww.getCommandFor<DB::SelectCommand>(con.get(), filter); SqlState ss(select); while (ss.query->fetch()) { HandleAsVariableType h; diff --git a/project2/sql/sqlRows.h b/project2/sql/sqlRows.h index 46f3972..25f63f8 100644 --- a/project2/sql/sqlRows.h +++ b/project2/sql/sqlRows.h @@ -6,33 +6,29 @@ #include "selectcommand.h" #include "iHaveParameters.h" #include "rowSet.h" -#include "sqlWriter.h" +#include "sqlWriters.h" +#include "sqlBase.h" class RdbmsDataSource; /// Project2 component to create a row set based on an SQL SELECT statement issued against an RDBMS data source -class SqlRows : public RowSet { +class DLL_PUBLIC SqlRows : public RowSet, SqlBase { public: SqlRows(ScriptNodePtr p); ~SqlRows(); void execute(const Glib::ustring &, const RowProcessorCallback &, ExecContext *) const; - virtual void loadComplete(const CommonObjects *); - - const Variable dataSource; private: const DynamicSql::SqlCommand sqlCommand; - typedef boost::shared_ptr<DB::SelectCommand> SelectPtr; class SqlState : public RowState { public: - SqlState(SelectPtr query); + SqlState(DB::SelectCommandPtr query); const Columns & getColumns() const; - SelectPtr query; + DB::SelectCommandPtr query; Columns columns; friend class SqlRows; }; - const RdbmsDataSource * db; }; #endif diff --git a/project2/sql/sqlTask.cpp b/project2/sql/sqlTask.cpp index a98748f..d62d150 100644 --- a/project2/sql/sqlTask.cpp +++ b/project2/sql/sqlTask.cpp @@ -6,19 +6,18 @@ #include "commonObjects.h" #include "sqlVariableBinder.h" -DECLARE_LOADER("sqltask", SqlTask); +NAMEDFACTORY("sqltask", SqlTask, TaskFactory); StaticMessageException(RunOnNotSpecified, "runon attribute must be specified"); SqlTask::SqlTask(ScriptNodePtr p) : SourceObject(p), Task(p), - dataSource(p, "datasource"), + SqlBase(p), filter(p, "filter", ""), - sqlCommand(p->child("sql")), - db(NULL) + sqlCommand(p->child("sql")) { - p->script->loader.addLoadTargetSub(p, "changes", false, Storer::into<ElementLoader>(&changesNOEs)); - p->script->loader.addLoadTargetSub(p, "nochanges", false, Storer::into<ElementLoader>(&noChangesNOEs)); + p->script.lock()->loader.addLoadTargetSub(p, "changes", false, Storer::into<TaskFactory>(&changesTasks)); + p->script.lock()->loader.addLoadTargetSub(p, "nochanges", false, Storer::into<TaskFactory>(&noChangesTasks)); } SqlTask::~SqlTask() @@ -26,26 +25,18 @@ SqlTask::~SqlTask() } void -SqlTask::loadComplete(const CommonObjects * co) -{ - db = co->dataSource<RdbmsDataSource>(dataSource(NULL)); -} - -void SqlTask::execute(ExecContext * ec) const { auto con = db->getWritable(); - boost::shared_ptr<DB::ModifyCommand> modify = boost::shared_ptr<DB::ModifyCommand>( - con->newModifyCommand(sqlCommand.getSqlFor(filter(NULL)))); - unsigned int offset = 0; - sqlCommand.bindParams(ec, modify.get(), offset); + DynamicSql::SqlWriterWrapper sww(ec, &sqlCommand); + auto modify = sww.getCommandFor<DB::ModifyCommand>(con.get(), filter(ec)); if (modify->execute() == 0) { - for (const SubNOEs::value_type & sq : noChangesNOEs) { + for (const auto & sq : noChangesTasks) { sq->execute(ec); } } else { - for (const SubNOEs::value_type & sq : changesNOEs) { + for (const auto & sq : changesTasks) { sq->execute(ec); } } diff --git a/project2/sql/sqlTask.h b/project2/sql/sqlTask.h index 94901a9..cb22173 100644 --- a/project2/sql/sqlTask.h +++ b/project2/sql/sqlTask.h @@ -4,30 +4,28 @@ #include <boost/intrusive_ptr.hpp> #include <map> #include "task.h" +#include "sqlBase.h" #include "variables.h" -#include "sqlWriter.h" +#include "sqlWriters.h" +#include <scriptStorage.h> namespace DB { class ModifyCommand; } -class RdbmsDataSource; /// Project2 component to execute a modifying SQL statement against an RDBMS data source -class SqlTask : public Task { +class DLL_PUBLIC SqlTask : public Task, SqlBase { public: SqlTask(ScriptNodePtr p); virtual ~SqlTask(); - virtual void loadComplete(const CommonObjects *); virtual void execute(ExecContext * ec) const; - const Variable dataSource; const Variable filter; - typedef ANONORDEREDSTORAGEOF(NoOutputExecute) SubNOEs; - SubNOEs changesNOEs; - SubNOEs noChangesNOEs; + typedef ANONORDEREDSTORAGEOF(Task) SubTasks; + SubTasks changesTasks; + SubTasks noChangesTasks; protected: const DynamicSql::SqlCommand sqlCommand; - const RdbmsDataSource * db; }; #endif diff --git a/project2/sql/sqlTest.cpp b/project2/sql/sqlTest.cpp index fedc2a0..1eac20e 100644 --- a/project2/sql/sqlTest.cpp +++ b/project2/sql/sqlTest.cpp @@ -8,19 +8,18 @@ #include "sqlVariableBinder.h" #include <boost/date_time/posix_time/posix_time.hpp> -DECLARE_LOADER("sqltest", SqlTest); +NAMEDFACTORY("sqltest", SqlTest, TestFactory); class CantCompareNulls : public std::exception { }; SqlTest::SqlTest(ScriptNodePtr p) : SourceObject(p), Test(p), - dataSource(p, "datasource"), + SqlBase(p), filter(p, "filter", ""), testOp(p, "testOp", "=="), testValue(p, "testValue"), - sqlCommand(p->child("sql")), - db(NULL) + sqlCommand(p->child("sql")) { } @@ -28,12 +27,6 @@ SqlTest::~SqlTest() { } -void -SqlTest::loadComplete(const CommonObjects * co) -{ - db = co->dataSource<RdbmsDataSource>(dataSource(NULL)); -} - class HandleDoCompare : public DB::HandleField { public: HandleDoCompare(const VariableType & tV, const std::string & tO) : @@ -44,8 +37,8 @@ class HandleDoCompare : public DB::HandleField { void null() { throw CantCompareNulls(); } - void string(const char *c , size_t l) { - doTest(Glib::ustring(c, c + l)); + void string(const std::string_view s) { + doTest(Glib::ustring(s.begin(), s.end())); } void integer(int64_t val) { doTest(val); @@ -96,10 +89,8 @@ bool SqlTest::passes(ExecContext * ec) const { auto con = db->getReadonly(); - boost::shared_ptr<DB::SelectCommand> query = boost::shared_ptr<DB::SelectCommand>( - con->newSelectCommand(sqlCommand.getSqlFor(filter(NULL)))); - unsigned int offset = 0; - sqlCommand.bindParams(ec, query.get(), offset); + DynamicSql::SqlWriterWrapper sww(ec, &sqlCommand); + auto query = sww.getCommandFor<DB::SelectCommand>(con.get(), filter(ec)); HandleDoCompare h(testValue(ec), testOp(ec)); while (query->fetch()) { (*query)[0].apply(h); diff --git a/project2/sql/sqlTest.h b/project2/sql/sqlTest.h index af843d1..04a5570 100644 --- a/project2/sql/sqlTest.h +++ b/project2/sql/sqlTest.h @@ -2,28 +2,25 @@ #define SQLTEST_H #include "test.h" -#include "sqlWriter.h" +#include "sqlWriters.h" +#include "sqlBase.h" namespace DB { class SelectCommand; } -class RdbmsDataSource; /// Project2 component to test the value of a variable against an RDBMS data source -class SqlTest : public Test { +class DLL_PUBLIC SqlTest : public Test, SqlBase { public: SqlTest(ScriptNodePtr p); virtual ~SqlTest(); - virtual void loadComplete(const CommonObjects *); bool passes(ExecContext *) const; - const Variable dataSource; const Variable filter; const Variable testOp; const Variable testValue; private: - DynamicSql::SqlCommand sqlCommand; - const RdbmsDataSource * db; + const DynamicSql::SqlCommand sqlCommand; }; #endif diff --git a/project2/sql/sqlVariableBinder.h b/project2/sql/sqlVariableBinder.h index 9f351e4..2ab202f 100644 --- a/project2/sql/sqlVariableBinder.h +++ b/project2/sql/sqlVariableBinder.h @@ -6,7 +6,7 @@ namespace DB { class Command; } -class SqlVariableBinder : public boost::static_visitor<> { +class DLL_PUBLIC SqlVariableBinder : public boost::static_visitor<> { public: SqlVariableBinder(DB::Command * c, unsigned int i); void operator()(const Null & i) const; diff --git a/project2/sql/sqlWriter.cpp b/project2/sql/sqlWriter.cpp deleted file mode 100644 index f654636..0000000 --- a/project2/sql/sqlWriter.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include <pch.hpp> -#include "sqlWriter.h" -#include "scripts.h" -#include <boost/bind.hpp> -#include "sqlVariableBinder.h" - -DynamicSql::SqlWriter::SqlWriter() -{ -} - -DynamicSql::SqlWriter::~SqlWriter() -{ -} - -template <typename Type, typename Cons> -static -void -appendNew(DynamicSql::Writers * w, const Cons & cons) -{ - w->push_back(new Type(cons)); -} - -static -void -appendNewFromNode(DynamicSql::Writers * w, DynamicSql::SqlCommand::Filters * fs, ScriptNodePtr p) -{ - if (fs && p->get_name() == "filter") { - DynamicSql::SqlFilterPtr f = new DynamicSql::SqlFilter(p); - w->push_back(f); - fs->insert(DynamicSql::SqlCommand::Filters::value_type(f->name, f)); - } - else if (p->get_name() == "param") { - w->push_back(new DynamicSql::SqlParameter(p)); - } -} - -DynamicSql::SqlCommand::SqlCommand(ScriptNodePtr s) -{ - if (s) { - s->composeWithCallbacks( - boost::bind(&appendNew<SqlText, Glib::ustring>, &writers, _1), - boost::bind(&appendNewFromNode, &writers, &filters, _1)); - } -} - -Glib::ustring -DynamicSql::SqlCommand::getSqlFor(const Glib::ustring & f) const -{ - for (const SqlCommand::Filters::value_type & filter : filters) { - filter.second->active = (filter.second->name == f); - } - Buffer sql; - writeSql(sql); - return Glib::ustring(sql.str()); -} - -void -DynamicSql::SqlCommand::writeSql(Buffer & sql) const -{ - for (const SqlWriterPtr & w : writers) { - w->writeSql(sql); - } -} - -void -DynamicSql::SqlCommand::bindParams(ExecContext * ec, DB::Command * cmd, unsigned int & offset) const -{ - for (const SqlWriterPtr & w : writers) { - w->bindParams(ec, cmd, offset); - } -} - -DynamicSql::SqlFilter::SqlFilter(ScriptNodePtr p) : - name(p->value("name", NULL).as<Glib::ustring>()), - active(false) -{ - p->composeWithCallbacks( - boost::bind(&appendNew<SqlText, Glib::ustring>, &writers, _1), - boost::bind(&appendNewFromNode, &writers, (DynamicSql::SqlCommand::Filters *)NULL, _1)); -} - -void -DynamicSql::SqlFilter::writeSql(Buffer & sql) const -{ - if (active) { - for (const SqlWriterPtr & w : writers) { - w->writeSql(sql); - } - } -} - -void -DynamicSql::SqlFilter::bindParams(ExecContext * ec, DB::Command * cmd, unsigned int & offset) const -{ - if (active) { - for (const SqlWriterPtr & w : writers) { - w->bindParams(ec, cmd, offset); - } - } -} - -DynamicSql::SqlParameter::SqlParameter(ScriptNodePtr n) : - Variable(n, boost::optional<Glib::ustring>("local")) -{ -} - -void -DynamicSql::SqlParameter::writeSql(Buffer & sql) const -{ - sql.append("?"); -} - -void -DynamicSql::SqlParameter::bindParams(ExecContext * ec, DB::Command * cmd, unsigned int & offset) const -{ - boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(cmd, offset++), (*this)(ec)); -} - -DynamicSql::SqlText::SqlText(const Glib::ustring & n) : - text(n) -{ -} - -void -DynamicSql::SqlText::writeSql(Buffer & sql) const -{ - sql.append(text); -} - -void -DynamicSql::SqlText::bindParams(ExecContext *, DB::Command *, unsigned int &) const -{ -} - diff --git a/project2/sql/sqlWriter.h b/project2/sql/sqlWriter.h deleted file mode 100644 index 33a57fb..0000000 --- a/project2/sql/sqlWriter.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef SQLWRITER_H -#define SQLWRITER_H - -#include <intrusivePtrBase.h> -#include <command.h> -#include <glibmm/ustring.h> -#include <buffer.h> -#include <list> -#include <map> -#include "variables.h" - -namespace DynamicSql { - class SqlWriter; - typedef boost::intrusive_ptr<SqlWriter> SqlWriterPtr; - typedef std::list<SqlWriterPtr> Writers; - - class SqlWriter : public IntrusivePtrBase { - public: - SqlWriter(); - virtual ~SqlWriter(); - virtual void writeSql(Buffer & sql) const = 0; - virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const = 0; - }; - - class SqlText : public SqlWriter { - public: - SqlText(const Glib::ustring &); - virtual void writeSql(Buffer & sql) const; - virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const; - - const Glib::ustring text; - }; - - class SqlParameter : public SqlWriter, Variable { - public: - SqlParameter(ScriptNodePtr); - virtual void writeSql(Buffer & sql) const; - virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const; - }; - - class SqlFilter : public SqlWriter { - public: - SqlFilter(ScriptNodePtr); - virtual void writeSql(Buffer & sql) const; - virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const; - - const Glib::ustring name; - bool active; - private: - Writers writers; - }; - - typedef boost::intrusive_ptr<SqlFilter> SqlFilterPtr; - - class SqlCommand : public SqlWriter { - public: - SqlCommand(ScriptNodePtr); - virtual void writeSql(Buffer & sql) const; - virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const; - typedef std::multimap<Glib::ustring, SqlFilterPtr> Filters; - Glib::ustring getSqlFor(const Glib::ustring & f) const; - private: - Filters filters; - Writers writers; - }; -} - -#endif - diff --git a/project2/sql/sqlWriters.cpp b/project2/sql/sqlWriters.cpp new file mode 100644 index 0000000..88e0fc6 --- /dev/null +++ b/project2/sql/sqlWriters.cpp @@ -0,0 +1,188 @@ +#include <pch.hpp> +#include <selectcommand.h> +#include <modifycommand.h> +#include "sqlWriters.h" +#include "scripts.h" +#include <boost/bind.hpp> +#include "sqlVariableBinder.h" + +void +DynamicSql::SqlWriter::setFilter(const Glib::ustring &) const +{ +} + +template <typename Type, typename Cons> +static +void +appendNew(DynamicSql::Writers * w, const Cons & cons) +{ + w->push_back(std::make_shared<Type>(cons)); +} + +static +void +appendNewFromNode(DynamicSql::Writers * w, ScriptNodePtr p) +{ + if (p->get_name() == "filter") { + w->push_back(std::make_shared<DynamicSql::SqlFilter>(p)); + } + else if (p->get_name() == "param") { + w->push_back(std::make_shared<DynamicSql::SqlParameter>(p)); + } +} + +static +void +compose(ScriptNodePtr s, DynamicSql::Writers * writers) +{ + s->composeWithCallbacks( + boost::bind(&appendNew<DynamicSql::SqlText, Glib::ustring>, writers, _1), + boost::bind(&appendNewFromNode, writers, _1)); +} + +DynamicSql::SqlCommand::SqlCommand(ScriptNodePtr s) +{ + if (s) { + compose(s, &writers); + } +} + +void +DynamicSql::SqlCommand::setFilter(const Glib::ustring & f) const +{ + for (auto & w : writers) { + w->setFilter(f); + } +} + +void +DynamicSql::SqlFilter::setFilter(const Glib::ustring & f) const +{ + active = (name == f); + for (auto & w : writers) { + w->setFilter(f); + } +} + +void +DynamicSql::SqlCommand::writeSql(AdHoc::Buffer & sql) const +{ + for (const SqlWriterPtr & w : writers) { + w->writeSql(sql); + } +} + +void +DynamicSql::SqlCommand::bindParams(ExecContext * ec, DB::Command * cmd, unsigned int & offset) const +{ + for (const SqlWriterPtr & w : writers) { + w->bindParams(ec, cmd, offset); + } +} + +DynamicSql::SqlFilter::SqlFilter(ScriptNodePtr p) : + name(p->value("name", NULL).as<Glib::ustring>()), + active(false) +{ + compose(p, &writers); +} + +void +DynamicSql::SqlFilter::writeSql(AdHoc::Buffer & sql) const +{ + if (active) { + for (const SqlWriterPtr & w : writers) { + w->writeSql(sql); + } + } +} + +void +DynamicSql::SqlFilter::bindParams(ExecContext * ec, DB::Command * cmd, unsigned int & offset) const +{ + if (active) { + for (const SqlWriterPtr & w : writers) { + w->bindParams(ec, cmd, offset); + } + } +} + +DynamicSql::SqlParameter::SqlParameter(ScriptNodePtr n) : + Variable(n, boost::optional<Glib::ustring>("local")) +{ +} + +void +DynamicSql::SqlParameter::writeSql(AdHoc::Buffer & sql) const +{ + sql.append("?"); +} + +void +DynamicSql::SqlParameter::bindParams(ExecContext * ec, DB::Command * cmd, unsigned int & offset) const +{ + boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(cmd, offset++), (*this)(ec)); +} + +DynamicSql::SqlText::SqlText(const Glib::ustring & n) : + text(n) +{ +} + +void +DynamicSql::SqlText::writeSql(AdHoc::Buffer & sql) const +{ + sql.append(text); +} + +void +DynamicSql::SqlText::bindParams(ExecContext *, DB::Command *, unsigned int &) const +{ +} + +namespace DynamicSql { + template <> + std::shared_ptr<DB::SelectCommand> + SqlWriterWrapper::getCommandFor<DB::SelectCommand>(DB::Connection * db, const Glib::ustring & f) const + { + AdHoc::Buffer sql; + w->setFilter(f); + w->writeSql(sql); + auto cmd = db->select(sql); + unsigned int offset = 0; + w->bindParams(ec, cmd.get(), offset); + return cmd; + } + + template <> + std::shared_ptr<DB::ModifyCommand> + SqlWriterWrapper::getCommandFor<DB::ModifyCommand>(DB::Connection * db, const Glib::ustring & f) const + { + AdHoc::Buffer sql; + w->setFilter(f); + w->writeSql(sql); + auto cmd = db->modify(sql); + unsigned int offset = 0; + w->bindParams(ec, cmd.get(), offset); + return cmd; + } + + SqlWriterWrapper::SqlWriterWrapper(ExecContext * e, const DynamicSql::SqlWriter * sw) : + ec(e), + w(sw) + { + } + + void + SqlWriterWrapper::writeSql(AdHoc::Buffer & sql) + { + w->writeSql(sql); + } + + void + SqlWriterWrapper::bindParams(DB::Command * cmd, unsigned int & offset) + { + w->bindParams(ec, cmd, offset); + } +} + diff --git a/project2/sql/sqlWriters.h b/project2/sql/sqlWriters.h new file mode 100644 index 0000000..0ef7115 --- /dev/null +++ b/project2/sql/sqlWriters.h @@ -0,0 +1,86 @@ +#ifndef SQLWRITER_H +#define SQLWRITER_H + +#include <boost/enable_shared_from_this.hpp> +#include <boost/shared_ptr.hpp> +#include <command.h> +#include <connection.h> +#include <sqlWriter.h> +#include <glibmm/ustring.h> +#include <buffer.h> +#include <list> +#include <map> +#include "variables.h" + +namespace DynamicSql { + class SqlWriter; + typedef std::shared_ptr<SqlWriter> SqlWriterPtr; + typedef std::list<SqlWriterPtr> Writers; + + class DLL_PUBLIC SqlWriter { + public: + virtual ~SqlWriter() = default; + virtual void writeSql(AdHoc::Buffer & sql) const = 0; + virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const = 0; + virtual void setFilter(const Glib::ustring &) const; + }; + + class DLL_PUBLIC SqlText : public SqlWriter { + public: + SqlText(const Glib::ustring &); + virtual void writeSql(AdHoc::Buffer & sql) const override; + virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const override; + + const Glib::ustring text; + }; + + class DLL_PUBLIC SqlParameter : public SqlWriter, Variable { + public: + SqlParameter(ScriptNodePtr); + virtual void writeSql(AdHoc::Buffer & sql) const override; + virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const override; + }; + + class DLL_PUBLIC SqlFilter : public SqlWriter { + public: + SqlFilter(ScriptNodePtr); + virtual void writeSql(AdHoc::Buffer & sql) const override; + virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const override; + void setFilter(const Glib::ustring &) const override; + + const Glib::ustring name; + mutable bool active; + + private: + Writers writers; + }; + + class DLL_PUBLIC SqlCommand : public SqlWriter { + public: + SqlCommand(ScriptNodePtr); + + virtual void writeSql(AdHoc::Buffer & sql) const override; + virtual void bindParams(ExecContext *, DB::Command *, unsigned int & offset) const override; + void setFilter(const Glib::ustring &) const override; + + private: + Writers writers; + }; + + class DLL_PUBLIC SqlWriterWrapper : public DB::SqlWriter { + public: + SqlWriterWrapper(ExecContext *, const DynamicSql::SqlWriter *); + + virtual void writeSql(AdHoc::Buffer & sql) override; + virtual void bindParams(DB::Command *, unsigned int & offset) override; + + template <typename CommandType> std::shared_ptr<CommandType> getCommandFor(DB::Connection *, const Glib::ustring & f) const; + + private: + ExecContext * ec; + const DynamicSql::SqlWriter * w; + }; +} + +#endif + diff --git a/project2/sql/tablepatch.cpp b/project2/sql/tablepatch.cpp deleted file mode 100644 index f49c4ee..0000000 --- a/project2/sql/tablepatch.cpp +++ /dev/null @@ -1,506 +0,0 @@ -#include <pch.hpp> -#include "tablepatch.h" -#include <stdio.h> -#include <misc.h> -#include <selectcommand.h> -#include <column.h> -#include <buffer.h> -#include <boost/algorithm/string/join.hpp> - -using namespace DB; - -TablePatch::TablePatch(const Connection & wdb, const TablePatch::Table & s, const TablePatch::Table & d, - const TablePatch::Columns & c) : - doDelete(true), - doUpdate(true), - doInsert(true), - src(s), - dest(d), - cols(c), - db(wdb) -{ - if (!src.length()) { - throw PatchCheckFailure(); - } - if (!dest.length()) { - throw PatchCheckFailure(); - } - if (!db.inTx()) { - throw PatchCheckFailure(); - } -} - -void -TablePatch::addKey(const TablePatch::Column & c) -{ - pk.insert(c); -} - -void -TablePatch::patch(ExecContext * ec, DynamicSql::SqlWriterPtr insteadOfDelete, DynamicSql::SqlWriterPtr where, DynamicSql::SqlWriterPtr order) -{ - if (pk.empty()) { - throw PatchCheckFailure(); - } - if (doDelete) { - doDeletes(ec, insteadOfDelete, where, order); - } - if (doUpdate) { - doUpdates(ec, where, order); - } - if (doInsert) { - doInserts(ec, order); - } -} - -void -TablePatch::doDeletes(ExecContext * ec, DynamicSql::SqlWriterPtr insteadOfDelete, DynamicSql::SqlWriterPtr where, DynamicSql::SqlWriterPtr order) -{ - Buffer toDelSql; - switch (db.bulkDeleteStyle()) { - case BulkDeleteUsingSubSelect: - { - // ----------------------------------------------------------------- - // Build SQL to delete keys ---------------------------------------- - // ----------------------------------------------------------------- - if (insteadOfDelete) { - toDelSql.appendf("UPDATE %s ", - dest.c_str()); - insteadOfDelete->writeSql(toDelSql); - toDelSql.append(" WHERE ("); - } - else { - toDelSql.appendf("DELETE FROM %s WHERE (", - dest.c_str()); - } - foreach (PKI, pk, pki) { - if (pki != pk.begin()) { - toDelSql.append(", "); - } - toDelSql.appendf("%s.%s", - dest.c_str(), - pki->c_str()); - } - // ----------------------------------------------------------------- - // Build SQL to select keys to delete ------------------------------ - // ----------------------------------------------------------------- - toDelSql.append(") IN (SELECT "); - foreach (PKI, pk, pki) { - if (pki != pk.begin()) { - toDelSql.append(", "); - } - toDelSql.appendf("a.%s", - pki->c_str()); - } - toDelSql.appendf(" FROM %s a LEFT OUTER JOIN %s b ON ", - dest.c_str(), src.c_str()); - foreach (PKI, pk, pki) { - if (pki != pk.begin()) { - toDelSql.append(" AND "); - } - toDelSql.appendf(" a.%s = b.%s", - pki->c_str(), pki->c_str()); - } - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - toDelSql.append(" WHERE "); - } - else { - toDelSql.append(" AND "); - } - toDelSql.appendf(" b.%s IS NULL", - pki->c_str()); - } - if (where) { - toDelSql.append(" AND "); - where->writeSql(toDelSql); - } - if (order) { - toDelSql.append(" ORDER BY "); - order->writeSql(toDelSql); - } - toDelSql.append(")"); - break; - } - case BulkDeleteUsingUsingAlias: - case BulkDeleteUsingUsing: - { - if (insteadOfDelete) { - toDelSql.appendf("UPDATE %s a ", - dest.c_str()); - } - else { - toDelSql.appendf("DELETE FROM %s USING %s a ", - (db.bulkDeleteStyle() == BulkDeleteUsingUsingAlias ? "a" : dest.c_str()), - dest.c_str()); - } - toDelSql.appendf(" LEFT OUTER JOIN %s b ", - src.c_str()); - foreach (PKI, pk, pki) { - if (pki != pk.begin()) { - toDelSql.append(" AND "); - } - else { - toDelSql.append(" ON "); - } - toDelSql.appendf(" a.%s = b.%s ", - pki->c_str(), pki->c_str()); - } - if (insteadOfDelete) { - insteadOfDelete->writeSql(toDelSql); - } - foreach (PKI, pk, pki) { - if (pki != pk.begin()) { - toDelSql.append(" AND "); - } - else { - toDelSql.append(" WHERE "); - } - toDelSql.appendf(" b.%s IS NULL", - pki->c_str()); - } - if (where) { - toDelSql.append(" AND "); - where->writeSql(toDelSql); - } - if (order) { - toDelSql.append(" ORDER BY "); - order->writeSql(toDelSql); - } - break; - } - } - ModifyCommand * del = db.newModifyCommand(toDelSql); - unsigned int offset = 0; - if (where) { - where->bindParams(ec, del, offset); - } - if (order) { - order->bindParams(ec, del, offset); - } - del->execute(); - delete del; -} - -void -TablePatch::doUpdates(ExecContext * ec, DynamicSql::SqlWriterPtr where, DynamicSql::SqlWriterPtr order) -{ - if (cols.size() == pk.size()) { - // Can't "change" anything... it's all part of the key - return; - } - switch (db.bulkUpdateStyle()) { - case BulkUpdateByIteration: - { - // ----------------------------------------------------------------- - // Build SQL for list of updates to perform ------------------------ - // ----------------------------------------------------------------- - Buffer toUpdSel; - toUpdSel.append("SELECT "); - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - toUpdSel.appendf("b.%s, ", - col->c_str()); - } - } - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) != pk.end()) { - toUpdSel.appendf("b.%s, ", - col->c_str()); - } - } - toUpdSel.appendf("0 FROM %s a, %s b", - dest.c_str(), src.c_str()); - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - toUpdSel.append(" WHERE "); - } - else { - toUpdSel.append(" AND "); - } - toUpdSel.appendf(" a.%s = b.%s", - pki->c_str(), pki->c_str()); - } - if (where) { - toUpdSel.append(" AND "); - where->writeSql(toUpdSel); - } - toUpdSel.append(" AND ("); - bool first = true; - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - if (!first) { - toUpdSel.append(" OR "); - } - first = false; - toUpdSel.appendf( - " (((CASE WHEN (a.%s IS NULL AND b.%s IS NULL) THEN 1 ELSE 0 END) \ - + (CASE WHEN(a.%s = b.%s) THEN 1 ELSE 0 END)) = 0)", - col->c_str(), col->c_str(), col->c_str(), col->c_str()); - } - } - toUpdSel.append(")"); - if (order) { - toUpdSel.append(" ORDER BY "); - order->writeSql(toUpdSel); - } - // ----------------------------------------------------------------- - // Build SQL to perform updates ------------------------------------ - // ----------------------------------------------------------------- - Buffer updSql; - updSql.appendf("UPDATE %s SET ", - dest.c_str()); - first = true; - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - if (!first) { - updSql.append(", "); - } - first = false; - updSql.appendf(" %s = ?", - col->c_str()); - } - } - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - updSql.append(" WHERE "); - } - else { - updSql.append(" AND "); - } - updSql.appendf(" %s = ?", - pki->c_str()); - } - // ----------------------------------------------------------------- - // Iterator over update list make changes -------------------------- - // ----------------------------------------------------------------- - SelectCommand * toUpd = db.newSelectCommand(toUpdSel); - unsigned int offset = 0; - if (where) { - where->bindParams(ec, toUpd, offset); - } - if (order) { - order->bindParams(ec, toUpd, offset); - } - ModifyCommand * upd = db.newModifyCommand(updSql); - int cs = cols.size(); - toUpd->execute(); - for (int c = 0; c < cs; c += 1) { - (*toUpd)[c].rebind(upd, c); - } - while (toUpd->fetch()) { - upd->execute(false); - } - delete toUpd; - delete upd; - } - break; - case BulkUpdateUsingFromSrc: - { - // ----------------------------------------------------------------- - // Build SQL for list of updates to perform ------------------------ - // ----------------------------------------------------------------- - Buffer updSql; - updSql.appendf("UPDATE %s a SET ", - dest.c_str()); - bool first = true; - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - if (!first) { - updSql.append(", "); - } - first = false; - updSql.appendf(" %s = b.%s ", - col->c_str(), col->c_str()); - } - } - updSql.appendf(" FROM %s b ", - src.c_str()); - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - updSql.append(" WHERE "); - } - else { - updSql.append(" AND "); - } - updSql.appendf(" a.%s = b.%s ", - pki->c_str(), pki->c_str()); - } - updSql.append(" AND ("); - first = true; - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - if (!first) { - updSql.append(" OR "); - } - first = false; - updSql.appendf( - " (((CASE WHEN (a.%s IS NULL AND b.%s IS NULL) THEN 1 ELSE 0 END) \ - + (CASE WHEN(a.%s = b.%s) THEN 1 ELSE 0 END)) = 0)", - col->c_str(), col->c_str(), - col->c_str(), col->c_str()); - } - } - updSql.append(")"); - if (where) { - updSql.append(" AND "); - where->writeSql(updSql); - } - if (order) { - updSql.append(" ORDER BY "); - order->writeSql(updSql); - } - // ----------------------------------------------------------------- - // Execute the bulk update command --------------------------------- - // ----------------------------------------------------------------- - ModifyCommand * upd = db.newModifyCommand(updSql); - unsigned int offset = 0; - if (where) { - where->bindParams(ec, upd, offset); - } - if (order) { - order->bindParams(ec, upd, offset); - } - upd->execute(true); - delete upd; - break; - } - case BulkUpdateUsingJoin: - { - // ----------------------------------------------------------------- - // Build SQL for list of updates to perform ------------------------ - // ----------------------------------------------------------------- - Buffer updSql; - updSql.appendf("UPDATE %s a, %s b SET ", - dest.c_str(), src.c_str()); - bool first = true; - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - if (!first) { - updSql.append(", "); - } - first = false; - updSql.appendf(" a.%s = b.%s ", - col->c_str(), col->c_str()); - } - } - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - updSql.append(" WHERE "); - } - else { - updSql.append(" AND "); - } - updSql.appendf(" a.%s = b.%s ", - pki->c_str(), pki->c_str()); - } - updSql.append(" AND ("); - first = true; - foreach (Columns::const_iterator, cols, col) { - if (pk.find(*col) == pk.end()) { - if (!first) { - updSql.append(" OR "); - } - first = false; - updSql.appendf( - " (((CASE WHEN (a.%s IS NULL AND b.%s IS NULL) THEN 1 ELSE 0 END) \ - + (CASE WHEN(a.%s = b.%s) THEN 1 ELSE 0 END)) = 0)", - col->c_str(), col->c_str(), - col->c_str(), col->c_str()); - } - } - updSql.append(")"); - if (where) { - updSql.append(" AND "); - where->writeSql(updSql); - } - if (order) { - updSql.append(" ORDER BY "); - order->writeSql(updSql); - } - // ----------------------------------------------------------------- - // Execute the bulk update command --------------------------------- - // ----------------------------------------------------------------- - ModifyCommand * upd = db.newModifyCommand(updSql); - unsigned int offset = 0; - if (where) { - where->bindParams(ec, upd, offset); - } - if (order) { - order->bindParams(ec, upd, offset); - } - upd->execute(true); - delete upd; - break; - } - } -} - -void -TablePatch::doInserts(ExecContext * ec, DynamicSql::SqlWriterPtr order) -{ - // ----------------------------------------------------------------- - // Build SQL for copying new records ------------------------------- - // ----------------------------------------------------------------- - Buffer toInsSql; - toInsSql.appendf("INSERT INTO %s", - dest.c_str()); - foreach (Columns::const_iterator, cols, col) { - if (col == cols.begin()) { - toInsSql.append("("); - } - else { - toInsSql.append(", "); - } - toInsSql.appendf("%s", - col->c_str()); - } - toInsSql.append(") SELECT "); - foreach (Columns::const_iterator, cols, col) { - if (col != cols.begin()) { - toInsSql.append(", "); - } - toInsSql.appendf("b.%s", - col->c_str()); - } - toInsSql.appendf(" FROM %s b LEFT OUTER JOIN %s a", - src.c_str(), dest.c_str()); - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - toInsSql.append(" ON "); - } - else { - toInsSql.append(" AND "); - } - toInsSql.appendf(" a.%s = b.%s", - pki->c_str(), pki->c_str()); - } - foreach (PKI, pk, pki) { - if (pki == pk.begin()) { - toInsSql.append(" WHERE "); - } - else { - toInsSql.append(" AND "); - } - toInsSql.appendf(" a.%s IS NULL", - pki->c_str()); - } - if (order) { - toInsSql.appendf(" ORDER BY "); - order->writeSql(toInsSql); - } - ModifyCommand * ins = db.newModifyCommand(toInsSql); - unsigned int offset = 0; - if (order) { - order->bindParams(ec, ins, offset); - } - ins->execute(); - delete ins; -} - -const char * -TablePatch::PatchCheckFailure::what() const throw() -{ - return "Santiy checks failed: check table names and keys"; -} - diff --git a/project2/sql/tablepatch.h b/project2/sql/tablepatch.h deleted file mode 100644 index df574bf..0000000 --- a/project2/sql/tablepatch.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef TABLEPATCH_H -#define TABLEPATCH_H - -#include <string> -#include <set> -#include <map> -#include <connection.h> -#include <modifycommand.h> -#include <selectcommand.h> -#include <buffer.h> -#include "sqlWriter.h" - -class TablePatch { - public: - typedef std::string Table; - typedef std::string Column; - typedef std::set<Column> Columns; - typedef Columns PrimaryKey; - typedef PrimaryKey::const_iterator PKI; - - class PatchCheckFailure : public std::exception { - public: - const char * what() const throw(); - }; - - TablePatch(const DB::Connection & db, const Table & src, const Table & dest, const Columns & cols); - - void addKey(const Column & col); - void patch(ExecContext *, DynamicSql::SqlWriterPtr insteadOfDelete, DynamicSql::SqlWriterPtr where, DynamicSql::SqlWriterPtr order); - - bool doDelete; - bool doUpdate; - bool doInsert; - - private: - void doDeletes(ExecContext *, DynamicSql::SqlWriterPtr insteadOfDelete, DynamicSql::SqlWriterPtr where, DynamicSql::SqlWriterPtr order); - void doUpdates(ExecContext *, DynamicSql::SqlWriterPtr where, DynamicSql::SqlWriterPtr order); - void doInserts(ExecContext *, DynamicSql::SqlWriterPtr order); - - Table src; - Table dest; - PrimaryKey pk; - Columns cols; - const DB::Connection &db; -}; - -#endif - diff --git a/project2/sql/unittests/Jamfile.jam b/project2/sql/unittests/Jamfile.jam deleted file mode 100644 index 8fb6918..0000000 --- a/project2/sql/unittests/Jamfile.jam +++ /dev/null @@ -1,62 +0,0 @@ -import testing ; - -lib boost_system ; -lib boost_filesystem ; -lib IceUtil ; -lib Ice ; - -path-constant me : . ; - -lib sqlTestCore : - testCore.cpp - : - <library>../../ut//p2ut - <library>../../common//p2common - <library>boost_filesystem - <define>ROOT=\"$(me)\" - : : - <library>../../common//p2common - <library>../../basics//p2basics - <library>../../ut//p2ut - <library>../../lib//p2lib - <library>../../xml//p2xml - <library>..//p2sql - <library>boost_system - <library>boost_filesystem - <library>../../ut//boost_utf - <define>ROOT=\"$(me)\" - <define>BOOST_TEST_DYN_LINK - ; - -run - testpq.cpp - : : : - <library>sqlTestCore - <library>..//p2sqlmodPQ - <dependency>pqschema.sql - : testpq ; - -run - testsqlite.cpp - : : : - <library>sqlTestCore - <library>..//p2sqlmodSQLite - <dependency>sqliteschema.sql - : testsqlite ; - -run - testmysql.cpp - : : : - <library>sqlTestCore - <library>..//p2sqlmodMySQL - <dependency>mysqlschema.sql - : testmysql ; - -run - testodbc.cpp - : : : - <library>sqlTestCore - <library>..//p2sqlmodODBC - <dependency>odbcschema.sql - : testodbc ; - diff --git a/project2/sql/unittests/bulk.sample b/project2/sql/unittests/bulk.sample deleted file mode 100644 index ae81633..0000000 --- a/project2/sql/unittests/bulk.sample +++ /dev/null @@ -1,800 +0,0 @@ -1 /usr/portage/ -2 /usr/portage/games-rpg -3 /usr/portage/games-rpg/penumbra-collection -4 /usr/portage/games-rpg/penumbra-collection/ChangeLog -5 /usr/portage/games-rpg/penumbra-collection/Manifest -6 /usr/portage/games-rpg/penumbra-collection/metadata.xml -7 /usr/portage/games-rpg/penumbra-collection/penumbra-collection-1.1.ebuild -8 /usr/portage/games-rpg/arx-fatalis-data -9 /usr/portage/games-rpg/arx-fatalis-data/ChangeLog -10 /usr/portage/games-rpg/arx-fatalis-data/Manifest -11 /usr/portage/games-rpg/arx-fatalis-data/metadata.xml -12 /usr/portage/games-rpg/arx-fatalis-data/arx-fatalis-data-1.21-r2.ebuild -13 /usr/portage/games-rpg/arx-fatalis-data/arx-fatalis-data-1.21-r1.ebuild -14 /usr/portage/games-rpg/nwmouse -15 /usr/portage/games-rpg/nwmouse/ChangeLog -16 /usr/portage/games-rpg/nwmouse/Manifest -17 /usr/portage/games-rpg/nwmouse/metadata.xml -18 /usr/portage/games-rpg/nwmouse/nwmouse-20090906.183839.ebuild -19 /usr/portage/games-rpg/bass -20 /usr/portage/games-rpg/bass/ChangeLog -21 /usr/portage/games-rpg/bass/Manifest -22 /usr/portage/games-rpg/bass/metadata.xml -23 /usr/portage/games-rpg/bass/bass-1.2-r1.ebuild -24 /usr/portage/games-rpg/bass/files -25 /usr/portage/games-rpg/bass/files/scummvmGetLang.sh -26 /usr/portage/games-rpg/a-bird-story -27 /usr/portage/games-rpg/a-bird-story/ChangeLog -28 /usr/portage/games-rpg/a-bird-story/Manifest -29 /usr/portage/games-rpg/a-bird-story/metadata.xml -30 /usr/portage/games-rpg/a-bird-story/a-bird-story-20141106.ebuild -31 /usr/portage/games-rpg/nwn-shadowlordsdreamcatcherdemon -32 /usr/portage/games-rpg/nwn-shadowlordsdreamcatcherdemon/ChangeLog -33 /usr/portage/games-rpg/nwn-shadowlordsdreamcatcherdemon/Manifest -34 /usr/portage/games-rpg/nwn-shadowlordsdreamcatcherdemon/metadata.xml -35 /usr/portage/games-rpg/nwn-shadowlordsdreamcatcherdemon/nwn-shadowlordsdreamcatcherdemon-1.ebuild -36 /usr/portage/games-rpg/eschalon-book-1-demo -37 /usr/portage/games-rpg/eschalon-book-1-demo/ChangeLog -38 /usr/portage/games-rpg/eschalon-book-1-demo/eschalon-book-1-demo-106.ebuild -39 /usr/portage/games-rpg/eschalon-book-1-demo/Manifest -40 /usr/portage/games-rpg/eschalon-book-1-demo/metadata.xml -41 /usr/portage/games-rpg/openglad -42 /usr/portage/games-rpg/openglad/ChangeLog -43 /usr/portage/games-rpg/openglad/Manifest -44 /usr/portage/games-rpg/openglad/metadata.xml -45 /usr/portage/games-rpg/openglad/files -46 /usr/portage/games-rpg/openglad/files/openglad-0.98-gcc43.patch -47 /usr/portage/games-rpg/openglad/files/0.98-gladpack.c.patch -48 /usr/portage/games-rpg/openglad/files/openglad-0.98-ovfl.patch -49 /usr/portage/games-rpg/openglad/openglad-0.98.ebuild -50 /usr/portage/games-rpg/dungeon-defenders -51 /usr/portage/games-rpg/dungeon-defenders/ChangeLog -52 /usr/portage/games-rpg/dungeon-defenders/dungeon-defenders-20130305.ebuild -53 /usr/portage/games-rpg/dungeon-defenders/Manifest -54 /usr/portage/games-rpg/dungeon-defenders/metadata.xml -55 /usr/portage/games-rpg/xu4 -56 /usr/portage/games-rpg/xu4/ChangeLog -57 /usr/portage/games-rpg/xu4/Manifest -58 /usr/portage/games-rpg/xu4/xu4-0.9.ebuild -59 /usr/portage/games-rpg/xu4/metadata.xml -60 /usr/portage/games-rpg/xu4/files -61 /usr/portage/games-rpg/xu4/files/xu4-0.9-ldflags.patch -62 /usr/portage/games-rpg/xu4/files/xu4-0.9-zip.patch -63 /usr/portage/games-rpg/xu4/files/xu4-0.9-warnings.patch -64 /usr/portage/games-rpg/xu4/files/0.9-savegame.patch -65 /usr/portage/games-rpg/eternal-lands-data -66 /usr/portage/games-rpg/eternal-lands-data/ChangeLog -67 /usr/portage/games-rpg/eternal-lands-data/eternal-lands-data-1.9.3.ebuild -68 /usr/portage/games-rpg/eternal-lands-data/Manifest -69 /usr/portage/games-rpg/eternal-lands-data/metadata.xml -70 /usr/portage/games-rpg/eternal-lands-data/eternal-lands-data-1.9.3-r1.ebuild -71 /usr/portage/games-rpg/eternal-lands-data/eternal-lands-data-1.9.2-r1.ebuild -72 /usr/portage/games-rpg/nwn-data -73 /usr/portage/games-rpg/nwn-data/ChangeLog -74 /usr/portage/games-rpg/nwn-data/Manifest -75 /usr/portage/games-rpg/nwn-data/metadata.xml -76 /usr/portage/games-rpg/nwn-data/nwn-data-1.29-r5.ebuild -77 /usr/portage/games-rpg/eternal-lands -78 /usr/portage/games-rpg/eternal-lands/ChangeLog -79 /usr/portage/games-rpg/eternal-lands/Manifest -80 /usr/portage/games-rpg/eternal-lands/eternal-lands-1.9.3-r2.ebuild -81 /usr/portage/games-rpg/eternal-lands/eternal-lands-1.9.2-r1.ebuild -82 /usr/portage/games-rpg/eternal-lands/metadata.xml -83 /usr/portage/games-rpg/eternal-lands/eternal-lands-1.9.2.ebuild -84 /usr/portage/games-rpg/eternal-lands/eternal-lands-1.9.3-r1.ebuild -85 /usr/portage/games-rpg/eternal-lands/eternal-lands-1.9.3.ebuild -86 /usr/portage/games-rpg/eternal-lands/files -87 /usr/portage/games-rpg/eternal-lands/files/eternal-lands-1.9.1-libpng.patch -88 /usr/portage/games-rpg/eternal-lands/files/eternal-lands-1.9.3-minizip.patch -89 /usr/portage/games-rpg/eternal-lands/files/eternal-lands-1.9.2-glext.patch -90 /usr/portage/games-rpg/eternal-lands/files/eternal-lands-1.9.3-build.patch -91 /usr/portage/games-rpg/eternal-lands/files/eternal-lands-1.9.3-glbuild.patch -92 /usr/portage/games-rpg/eternal-lands/files/eternal-lands-1.9.0-glext.patch -93 /usr/portage/games-rpg/freedink-data -94 /usr/portage/games-rpg/freedink-data/ChangeLog -95 /usr/portage/games-rpg/freedink-data/Manifest -96 /usr/portage/games-rpg/freedink-data/metadata.xml -97 /usr/portage/games-rpg/freedink-data/freedink-data-1.08.20140901.ebuild -98 /usr/portage/games-rpg/nwmovies -99 /usr/portage/games-rpg/nwmovies/ChangeLog -100 /usr/portage/games-rpg/nwmovies/nwmovies-20090223.080954.ebuild -101 /usr/portage/games-rpg/nwmovies/Manifest -102 /usr/portage/games-rpg/nwmovies/metadata.xml -103 /usr/portage/games-rpg/arx-libertatis -104 /usr/portage/games-rpg/arx-libertatis/ChangeLog -105 /usr/portage/games-rpg/arx-libertatis/arx-libertatis-1.1.2.ebuild -106 /usr/portage/games-rpg/arx-libertatis/Manifest -107 /usr/portage/games-rpg/arx-libertatis/metadata.xml -108 /usr/portage/games-rpg/arx-libertatis/arx-libertatis-1.1.1.ebuild -109 /usr/portage/games-rpg/arx-libertatis/arx-libertatis-1.0.3.ebuild -110 /usr/portage/games-rpg/arx-libertatis/files -111 /usr/portage/games-rpg/arx-libertatis/files/arx-data-copy -112 /usr/portage/games-rpg/arx-libertatis/files/arx-libertatis-1.0.3-gentoo.patch -113 /usr/portage/games-rpg/arx-libertatis/files/arx-libertatis-1.0.3-cmake2.8.patch -114 /usr/portage/games-rpg/lure -115 /usr/portage/games-rpg/lure/ChangeLog -116 /usr/portage/games-rpg/lure/Manifest -117 /usr/portage/games-rpg/lure/metadata.xml -118 /usr/portage/games-rpg/lure/lure-1.1.ebuild -119 /usr/portage/games-rpg/to-the-moon -120 /usr/portage/games-rpg/to-the-moon/ChangeLog -121 /usr/portage/games-rpg/to-the-moon/Manifest -122 /usr/portage/games-rpg/to-the-moon/metadata.xml -123 /usr/portage/games-rpg/to-the-moon/to-the-moon-0.ebuild -124 /usr/portage/games-rpg/drascula -125 /usr/portage/games-rpg/drascula/ChangeLog -126 /usr/portage/games-rpg/drascula/Manifest -127 /usr/portage/games-rpg/drascula/metadata.xml -128 /usr/portage/games-rpg/drascula/drascula-1.0-r2.ebuild -129 /usr/portage/games-rpg/coe2 -130 /usr/portage/games-rpg/coe2/ChangeLog -131 /usr/portage/games-rpg/coe2/Manifest -132 /usr/portage/games-rpg/coe2/metadata.xml -133 /usr/portage/games-rpg/coe2/coe2-2007-r1.ebuild -134 /usr/portage/games-rpg/queen -135 /usr/portage/games-rpg/queen/ChangeLog -136 /usr/portage/games-rpg/queen/Manifest -137 /usr/portage/games-rpg/queen/metadata.xml -138 /usr/portage/games-rpg/queen/queen-1.ebuild -139 /usr/portage/games-rpg/tmw -140 /usr/portage/games-rpg/tmw/ChangeLog -141 /usr/portage/games-rpg/tmw/Manifest -142 /usr/portage/games-rpg/tmw/tmw-20130201.ebuild -143 /usr/portage/games-rpg/tmw/metadata.xml -144 /usr/portage/games-rpg/tmw/files -145 /usr/portage/games-rpg/tmw/files/tmw-branding-20130201-gentoo.patch -146 /usr/portage/games-rpg/freedroid -147 /usr/portage/games-rpg/freedroid/ChangeLog -148 /usr/portage/games-rpg/freedroid/Manifest -149 /usr/portage/games-rpg/freedroid/freedroid-1.0.2.ebuild -150 /usr/portage/games-rpg/freedroid/metadata.xml -151 /usr/portage/games-rpg/nwn-penultimarerolled -152 /usr/portage/games-rpg/nwn-penultimarerolled/ChangeLog -153 /usr/portage/games-rpg/nwn-penultimarerolled/Manifest -154 /usr/portage/games-rpg/nwn-penultimarerolled/nwn-penultimarerolled-1.ebuild -155 /usr/portage/games-rpg/nwn-penultimarerolled/metadata.xml -156 /usr/portage/games-rpg/vendetta-online-bin -157 /usr/portage/games-rpg/vendetta-online-bin/ChangeLog -158 /usr/portage/games-rpg/vendetta-online-bin/Manifest -159 /usr/portage/games-rpg/vendetta-online-bin/metadata.xml -160 /usr/portage/games-rpg/vendetta-online-bin/files -161 /usr/portage/games-rpg/vendetta-online-bin/files/vendetta -162 /usr/portage/games-rpg/vendetta-online-bin/vendetta-online-bin-1.8.296.ebuild -163 /usr/portage/games-rpg/metadata.xml -164 /usr/portage/games-rpg/adonthell -165 /usr/portage/games-rpg/adonthell/ChangeLog -166 /usr/portage/games-rpg/adonthell/Manifest -167 /usr/portage/games-rpg/adonthell/metadata.xml -168 /usr/portage/games-rpg/adonthell/files -169 /usr/portage/games-rpg/adonthell/files/adonthell-0.3.5-gcc46.patch -170 /usr/portage/games-rpg/adonthell/files/adonthell-0.3.5-glibc-2.10.patch -171 /usr/portage/games-rpg/adonthell/files/adonthell-0.3.5-format.patch -172 /usr/portage/games-rpg/adonthell/files/adonthell-0.3.5-configure.in.patch -173 /usr/portage/games-rpg/adonthell/adonthell-0.3.5-r1.ebuild -174 /usr/portage/games-rpg/soltys -175 /usr/portage/games-rpg/soltys/ChangeLog -176 /usr/portage/games-rpg/soltys/Manifest -177 /usr/portage/games-rpg/soltys/metadata.xml -178 /usr/portage/games-rpg/soltys/soltys-1.0-r1.ebuild -179 /usr/portage/games-rpg/sumwars -180 /usr/portage/games-rpg/sumwars/ChangeLog -181 /usr/portage/games-rpg/sumwars/Manifest -182 /usr/portage/games-rpg/sumwars/metadata.xml -183 /usr/portage/games-rpg/sumwars/sumwars-0.5.8.ebuild -184 /usr/portage/games-rpg/bastion -185 /usr/portage/games-rpg/bastion/ChangeLog -186 /usr/portage/games-rpg/bastion/Manifest -187 /usr/portage/games-rpg/bastion/bastion-20120620-r1.ebuild -188 /usr/portage/games-rpg/bastion/metadata.xml -189 /usr/portage/games-rpg/manaplus -190 /usr/portage/games-rpg/manaplus/ChangeLog -191 /usr/portage/games-rpg/manaplus/manaplus-1.3.9.29.ebuild -192 /usr/portage/games-rpg/manaplus/Manifest -193 /usr/portage/games-rpg/manaplus/metadata.xml -194 /usr/portage/games-rpg/manaplus/manaplus-1.5.5.9.ebuild -195 /usr/portage/games-rpg/mana -196 /usr/portage/games-rpg/mana/ChangeLog -197 /usr/portage/games-rpg/mana/mana-0.6.1.ebuild -198 /usr/portage/games-rpg/mana/Manifest -199 /usr/portage/games-rpg/mana/metadata.xml -200 /usr/portage/games-rpg/mana/files -201 /usr/portage/games-rpg/mana/files/mana-0.6.1-Import-cstdint-for-int64_t.patch -202 /usr/portage/games-rpg/mana/files/mana-0.6.1-Trick-gcc-into-importing-C99-stdint.h-when-C-11-is-n.patch -203 /usr/portage/games-rpg/mana/files/mana-0.6.1-gentoo.patch -204 /usr/portage/games-rpg/mana/files/mana-0.6.1-Fix-missing-virtual-destructors-and-guichan-use.patch -205 /usr/portage/games-rpg/kqlives -206 /usr/portage/games-rpg/kqlives/ChangeLog -207 /usr/portage/games-rpg/kqlives/Manifest -208 /usr/portage/games-rpg/kqlives/metadata.xml -209 /usr/portage/games-rpg/kqlives/kqlives-0.99.ebuild -210 /usr/portage/games-rpg/kqlives/files -211 /usr/portage/games-rpg/kqlives/files/kqlives.xpm -212 /usr/portage/games-rpg/eternal-lands-bloodsucker -213 /usr/portage/games-rpg/eternal-lands-bloodsucker/ChangeLog -214 /usr/portage/games-rpg/eternal-lands-bloodsucker/eternal-lands-bloodsucker-3.0.ebuild -215 /usr/portage/games-rpg/eternal-lands-bloodsucker/Manifest -216 /usr/portage/games-rpg/eternal-lands-bloodsucker/eternal-lands-bloodsucker-3.0_p20110618.ebuild -217 /usr/portage/games-rpg/eternal-lands-bloodsucker/metadata.xml -218 /usr/portage/games-rpg/zsdx -219 /usr/portage/games-rpg/zsdx/ChangeLog -220 /usr/portage/games-rpg/zsdx/Manifest -221 /usr/portage/games-rpg/zsdx/zsdx-1.9.0.ebuild -222 /usr/portage/games-rpg/zsdx/metadata.xml -223 /usr/portage/games-rpg/arx-fatalis-demo -224 /usr/portage/games-rpg/arx-fatalis-demo/ChangeLog -225 /usr/portage/games-rpg/arx-fatalis-demo/Manifest -226 /usr/portage/games-rpg/arx-fatalis-demo/metadata.xml -227 /usr/portage/games-rpg/arx-fatalis-demo/arx-fatalis-demo-0.ebuild -228 /usr/portage/games-rpg/avadon -229 /usr/portage/games-rpg/avadon/ChangeLog -230 /usr/portage/games-rpg/avadon/Manifest -231 /usr/portage/games-rpg/avadon/avadon-1.0.4.ebuild -232 /usr/portage/games-rpg/avadon/metadata.xml -233 /usr/portage/games-rpg/wastesedge -234 /usr/portage/games-rpg/wastesedge/ChangeLog -235 /usr/portage/games-rpg/wastesedge/Manifest -236 /usr/portage/games-rpg/wastesedge/metadata.xml -237 /usr/portage/games-rpg/wastesedge/wastesedge-0.3.5.ebuild -238 /usr/portage/games-rpg/daimonin-client -239 /usr/portage/games-rpg/daimonin-client/ChangeLog -240 /usr/portage/games-rpg/daimonin-client/Manifest -241 /usr/portage/games-rpg/daimonin-client/metadata.xml -242 /usr/portage/games-rpg/daimonin-client/daimonin-client-0.10.5.ebuild -243 /usr/portage/games-rpg/daimonin-client/files -244 /usr/portage/games-rpg/daimonin-client/files/daimonin-client-0.10.5-nozlib.patch -245 /usr/portage/games-rpg/daimonin-client/files/daimonin-client-0.10.5-datadir.patch -246 /usr/portage/games-rpg/nwn-cep -247 /usr/portage/games-rpg/nwn-cep/ChangeLog -248 /usr/portage/games-rpg/nwn-cep/Manifest -249 /usr/portage/games-rpg/nwn-cep/nwn-cep-2.0.ebuild -250 /usr/portage/games-rpg/nwn-cep/metadata.xml -251 /usr/portage/games-rpg/nwn-cep/nwn-cep-1.68-r1.ebuild -252 /usr/portage/games-rpg/dear-esther -253 /usr/portage/games-rpg/dear-esther/ChangeLog -254 /usr/portage/games-rpg/dear-esther/Manifest -255 /usr/portage/games-rpg/dear-esther/metadata.xml -256 /usr/portage/games-rpg/dear-esther/dear-esther-20130608.ebuild -257 /usr/portage/games-rpg/wasteland2 -258 /usr/portage/games-rpg/wasteland2/ChangeLog -259 /usr/portage/games-rpg/wasteland2/Manifest -260 /usr/portage/games-rpg/wasteland2/metadata.xml -261 /usr/portage/games-rpg/wasteland2/wasteland2-1.3.0.7.ebuild -262 /usr/portage/games-rpg/sacred-gold -263 /usr/portage/games-rpg/sacred-gold/ChangeLog -264 /usr/portage/games-rpg/sacred-gold/Manifest -265 /usr/portage/games-rpg/sacred-gold/metadata.xml -266 /usr/portage/games-rpg/sacred-gold/sacred-gold-1.0.ebuild -267 /usr/portage/games-rpg/sacred-gold/sacred-gold-1.0.01.ebuild -268 /usr/portage/games-rpg/freedink -269 /usr/portage/games-rpg/freedink/ChangeLog -270 /usr/portage/games-rpg/freedink/Manifest -271 /usr/portage/games-rpg/freedink/metadata.xml -272 /usr/portage/games-rpg/freedink/freedink-108.4.ebuild -273 /usr/portage/games-rpg/pcgen -274 /usr/portage/games-rpg/pcgen/ChangeLog -275 /usr/portage/games-rpg/pcgen/Manifest -276 /usr/portage/games-rpg/pcgen/pcgen-6.04.01.ebuild -277 /usr/portage/games-rpg/pcgen/metadata.xml -278 /usr/portage/games-rpg/nwn-penultima -279 /usr/portage/games-rpg/nwn-penultima/ChangeLog -280 /usr/portage/games-rpg/nwn-penultima/Manifest -281 /usr/portage/games-rpg/nwn-penultima/metadata.xml -282 /usr/portage/games-rpg/nwn-penultima/nwn-penultima-1.ebuild -283 /usr/portage/games-rpg/nwn-penultima/nwn-penultima-1-r1.ebuild -284 /usr/portage/games-rpg/egoboo -285 /usr/portage/games-rpg/egoboo/ChangeLog -286 /usr/portage/games-rpg/egoboo/Manifest -287 /usr/portage/games-rpg/egoboo/egoboo-2.8.1.ebuild -288 /usr/portage/games-rpg/egoboo/metadata.xml -289 /usr/portage/games-rpg/egoboo/files -290 /usr/portage/games-rpg/egoboo/files/egoboo-2.8.1-gentoo.patch -291 /usr/portage/games-rpg/freedroidrpg -292 /usr/portage/games-rpg/freedroidrpg/ChangeLog -293 /usr/portage/games-rpg/freedroidrpg/Manifest -294 /usr/portage/games-rpg/freedroidrpg/freedroidrpg-0.15.1.ebuild -295 /usr/portage/games-rpg/freedroidrpg/metadata.xml -296 /usr/portage/games-rpg/gwiz -297 /usr/portage/games-rpg/gwiz/ChangeLog -298 /usr/portage/games-rpg/gwiz/Manifest -299 /usr/portage/games-rpg/gwiz/metadata.xml -300 /usr/portage/games-rpg/gwiz/gwiz-0.8.ebuild -301 /usr/portage/games-rpg/gwiz/files -302 /usr/portage/games-rpg/gwiz/files/gwiz-0.8-buffer.patch -303 /usr/portage/games-rpg/dragonhunt -304 /usr/portage/games-rpg/dragonhunt/ChangeLog -305 /usr/portage/games-rpg/dragonhunt/Manifest -306 /usr/portage/games-rpg/dragonhunt/dragonhunt-3.56-r1.ebuild -307 /usr/portage/games-rpg/dragonhunt/metadata.xml -308 /usr/portage/games-rpg/draci-historie -309 /usr/portage/games-rpg/draci-historie/ChangeLog -310 /usr/portage/games-rpg/draci-historie/draci-historie-2012.ebuild -311 /usr/portage/games-rpg/draci-historie/Manifest -312 /usr/portage/games-rpg/draci-historie/metadata.xml -313 /usr/portage/games-rpg/dreamweb -314 /usr/portage/games-rpg/dreamweb/ChangeLog -315 /usr/portage/games-rpg/dreamweb/Manifest -316 /usr/portage/games-rpg/dreamweb/dreamweb-1.1.ebuild -317 /usr/portage/games-rpg/dreamweb/metadata.xml -318 /usr/portage/games-rpg/valyriatear -319 /usr/portage/games-rpg/valyriatear/ChangeLog -320 /usr/portage/games-rpg/valyriatear/Manifest -321 /usr/portage/games-rpg/valyriatear/metadata.xml -322 /usr/portage/games-rpg/valyriatear/valyriatear-1.0.0.ebuild -323 /usr/portage/games-rpg/nwn -324 /usr/portage/games-rpg/nwn/ChangeLog -325 /usr/portage/games-rpg/nwn/Manifest -326 /usr/portage/games-rpg/nwn/nwn-1.69-r1.ebuild -327 /usr/portage/games-rpg/nwn/metadata.xml -328 /usr/portage/games-rpg/nwn/nwn-1.68-r5.ebuild -329 /usr/portage/games-rpg/nwn/files -330 /usr/portage/games-rpg/nwn/files/fixinstall -331 /usr/portage/games-rpg/nwn/nwn-1.68-r6.ebuild -332 /usr/portage/games-rpg/twclone -333 /usr/portage/games-rpg/twclone/ChangeLog -334 /usr/portage/games-rpg/twclone/Manifest -335 /usr/portage/games-rpg/twclone/metadata.xml -336 /usr/portage/games-rpg/twclone/twclone-0.14.ebuild -337 /usr/portage/games-rpg/zsxd -338 /usr/portage/games-rpg/zsxd/ChangeLog -339 /usr/portage/games-rpg/zsxd/Manifest -340 /usr/portage/games-rpg/zsxd/metadata.xml -341 /usr/portage/games-rpg/zsxd/zsxd-1.9.0.ebuild -342 /usr/portage/games-rpg/grimrock -343 /usr/portage/games-rpg/grimrock/ChangeLog -344 /usr/portage/games-rpg/grimrock/Manifest -345 /usr/portage/games-rpg/grimrock/metadata.xml -346 /usr/portage/games-rpg/grimrock/grimrock-20130515.ebuild -347 /usr/portage/games-arcade -348 /usr/portage/games-arcade/ascii-invaders -349 /usr/portage/games-arcade/ascii-invaders/ChangeLog -350 /usr/portage/games-arcade/ascii-invaders/Manifest -351 /usr/portage/games-arcade/ascii-invaders/metadata.xml -352 /usr/portage/games-arcade/ascii-invaders/ascii-invaders-0.1b.ebuild -353 /usr/portage/games-arcade/notpacman -354 /usr/portage/games-arcade/notpacman/ChangeLog -355 /usr/portage/games-arcade/notpacman/Manifest -356 /usr/portage/games-arcade/notpacman/metadata.xml -357 /usr/portage/games-arcade/notpacman/notpacman-1.0.4.ebuild -358 /usr/portage/games-arcade/gnake -359 /usr/portage/games-arcade/gnake/ChangeLog -360 /usr/portage/games-arcade/gnake/Manifest -361 /usr/portage/games-arcade/gnake/metadata.xml -362 /usr/portage/games-arcade/gnake/gnake-0.94b.ebuild -363 /usr/portage/games-arcade/xbubble -364 /usr/portage/games-arcade/xbubble/ChangeLog -365 /usr/portage/games-arcade/xbubble/Manifest -366 /usr/portage/games-arcade/xbubble/metadata.xml -367 /usr/portage/games-arcade/xbubble/xbubble-0.5.8.ebuild -368 /usr/portage/games-arcade/xbubble/files -369 /usr/portage/games-arcade/xbubble/files/xbubble-0.5.8-libpng14.patch -370 /usr/portage/games-arcade/xbubble/files/xbubble-0.5.8-png15.patch -371 /usr/portage/games-arcade/xbubble/files/xbubble-0.5.8-locale.patch -372 /usr/portage/games-arcade/xbubble/files/xbubble-0.5.8-xpaths.patch -373 /usr/portage/games-arcade/stardork -374 /usr/portage/games-arcade/stardork/ChangeLog -375 /usr/portage/games-arcade/stardork/Manifest -376 /usr/portage/games-arcade/stardork/stardork-0.7.ebuild -377 /usr/portage/games-arcade/stardork/metadata.xml -378 /usr/portage/games-arcade/blobby -379 /usr/portage/games-arcade/blobby/ChangeLog -380 /usr/portage/games-arcade/blobby/Manifest -381 /usr/portage/games-arcade/blobby/blobby-0.9c.ebuild -382 /usr/portage/games-arcade/blobby/metadata.xml -383 /usr/portage/games-arcade/blobby/files -384 /usr/portage/games-arcade/blobby/files/blobby-0.9c-gcc47.patch -385 /usr/portage/games-arcade/jumpnbump -386 /usr/portage/games-arcade/jumpnbump/ChangeLog -387 /usr/portage/games-arcade/jumpnbump/Manifest -388 /usr/portage/games-arcade/jumpnbump/jumpnbump-1.50-r1.ebuild -389 /usr/portage/games-arcade/jumpnbump/metadata.xml -390 /usr/portage/games-arcade/xtux -391 /usr/portage/games-arcade/xtux/ChangeLog -392 /usr/portage/games-arcade/xtux/xtux-20030306.ebuild -393 /usr/portage/games-arcade/xtux/Manifest -394 /usr/portage/games-arcade/xtux/metadata.xml -395 /usr/portage/games-arcade/xtux/files -396 /usr/portage/games-arcade/xtux/files/xtux-20030306-particles.patch -397 /usr/portage/games-arcade/xtux/files/xtux-20030306-ldflags.patch -398 /usr/portage/games-arcade/rockdodger -399 /usr/portage/games-arcade/rockdodger/ChangeLog -400 /usr/portage/games-arcade/rockdodger/Manifest -401 /usr/portage/games-arcade/rockdodger/rockdodger-0.6.0a-r1.ebuild -402 /usr/portage/games-arcade/rockdodger/metadata.xml -403 /usr/portage/games-arcade/rockdodger/files -404 /usr/portage/games-arcade/rockdodger/files/rockdodger-0.6.0a-gcc41.patch -405 /usr/portage/games-arcade/rockdodger/files/rockdodger-0.6.0a-underlink.patch -406 /usr/portage/games-arcade/rockdodger/files/0.6.0a-sec.patch -407 /usr/portage/games-arcade/supertux -408 /usr/portage/games-arcade/supertux/ChangeLog -409 /usr/portage/games-arcade/supertux/Manifest -410 /usr/portage/games-arcade/supertux/metadata.xml -411 /usr/portage/games-arcade/supertux/supertux-0.1.3.ebuild -412 /usr/portage/games-arcade/supertux/files -413 /usr/portage/games-arcade/supertux/files/supertux-0.1.3-desktop.patch -414 /usr/portage/games-arcade/supertux/files/supertux-0.1.3-ndebug.patch -415 /usr/portage/games-arcade/supertux/files/supertux-0.1.3-gcc41.patch -416 /usr/portage/games-arcade/dynamitejack -417 /usr/portage/games-arcade/dynamitejack/ChangeLog -418 /usr/portage/games-arcade/dynamitejack/Manifest -419 /usr/portage/games-arcade/dynamitejack/metadata.xml -420 /usr/portage/games-arcade/dynamitejack/dynamitejack-1.0.23-r1.ebuild -421 /usr/portage/games-arcade/smc -422 /usr/portage/games-arcade/smc/ChangeLog -423 /usr/portage/games-arcade/smc/Manifest -424 /usr/portage/games-arcade/smc/smc-1.9.ebuild -425 /usr/portage/games-arcade/smc/metadata.xml -426 /usr/portage/games-arcade/smc/files -427 /usr/portage/games-arcade/smc/files/smc-1.9-underlink.patch -428 /usr/portage/games-arcade/smc/files/smc-1.9-boost150.patch -429 /usr/portage/games-arcade/marbleblast-demo -430 /usr/portage/games-arcade/marbleblast-demo/ChangeLog -431 /usr/portage/games-arcade/marbleblast-demo/Manifest -432 /usr/portage/games-arcade/marbleblast-demo/metadata.xml -433 /usr/portage/games-arcade/marbleblast-demo/marbleblast-demo-1.3.ebuild -434 /usr/portage/games-arcade/epiar -435 /usr/portage/games-arcade/epiar/ChangeLog -436 /usr/portage/games-arcade/epiar/Manifest -437 /usr/portage/games-arcade/epiar/metadata.xml -438 /usr/portage/games-arcade/epiar/files -439 /usr/portage/games-arcade/epiar/files/epiar-0.5-paths.patch -440 /usr/portage/games-arcade/epiar/files/epiar-0.5-gcc41.patch -441 /usr/portage/games-arcade/epiar/files/epiar-0.5-Makefile.linux.patch -442 /usr/portage/games-arcade/epiar/files/epiar-0.5-underlink.patch -443 /usr/portage/games-arcade/epiar/files/0.5-gentoo-paths.patch -444 /usr/portage/games-arcade/epiar/epiar-0.5-r1.ebuild -445 /usr/portage/games-arcade/circuslinux -446 /usr/portage/games-arcade/circuslinux/ChangeLog -447 /usr/portage/games-arcade/circuslinux/Manifest -448 /usr/portage/games-arcade/circuslinux/metadata.xml -449 /usr/portage/games-arcade/circuslinux/circuslinux-1.0.3.ebuild -450 /usr/portage/games-arcade/sdl-sopwith -451 /usr/portage/games-arcade/sdl-sopwith/ChangeLog -452 /usr/portage/games-arcade/sdl-sopwith/Manifest -453 /usr/portage/games-arcade/sdl-sopwith/sdl-sopwith-1.7.5-r1.ebuild -454 /usr/portage/games-arcade/sdl-sopwith/metadata.xml -455 /usr/portage/games-arcade/sdl-sopwith/files -456 /usr/portage/games-arcade/sdl-sopwith/files/sdl-sopwith-1.7.5-nogtk.patch -457 /usr/portage/games-arcade/sdl-sopwith/files/sdl-sopwith-1.7.5-video-fix.patch -458 /usr/portage/games-arcade/moleinvasion -459 /usr/portage/games-arcade/moleinvasion/ChangeLog -460 /usr/portage/games-arcade/moleinvasion/Manifest -461 /usr/portage/games-arcade/moleinvasion/metadata.xml -462 /usr/portage/games-arcade/moleinvasion/moleinvasion-0.4-r1.ebuild -463 /usr/portage/games-arcade/moleinvasion/files -464 /usr/portage/games-arcade/moleinvasion/files/moleinvasion-0.4-opengl.patch -465 /usr/portage/games-arcade/moleinvasion/files/moleinvasion-0.4-underlink.patch -466 /usr/portage/games-arcade/aquaria -467 /usr/portage/games-arcade/aquaria/ChangeLog -468 /usr/portage/games-arcade/aquaria/Manifest -469 /usr/portage/games-arcade/aquaria/aquaria-1.1.3-r1.ebuild -470 /usr/portage/games-arcade/aquaria/metadata.xml -471 /usr/portage/games-arcade/pycadia -472 /usr/portage/games-arcade/pycadia/ChangeLog -473 /usr/portage/games-arcade/pycadia/Manifest -474 /usr/portage/games-arcade/pycadia/metadata.xml -475 /usr/portage/games-arcade/pycadia/pycadia-0.5.1.ebuild -476 /usr/portage/games-arcade/sable -477 /usr/portage/games-arcade/sable/ChangeLog -478 /usr/portage/games-arcade/sable/Manifest -479 /usr/portage/games-arcade/sable/sable-1.0.ebuild -480 /usr/portage/games-arcade/sable/metadata.xml -481 /usr/portage/games-arcade/sable/files -482 /usr/portage/games-arcade/sable/files/sable-1.0-gentoo.patch -483 /usr/portage/games-arcade/cdogs-sdl -484 /usr/portage/games-arcade/cdogs-sdl/ChangeLog -485 /usr/portage/games-arcade/cdogs-sdl/Manifest -486 /usr/portage/games-arcade/cdogs-sdl/cdogs-sdl-0.4-r1.ebuild -487 /usr/portage/games-arcade/cdogs-sdl/metadata.xml -488 /usr/portage/games-arcade/cdogs-sdl/files -489 /usr/portage/games-arcade/cdogs-sdl/files/cdogs-sdl-0.4-64bit.patch -490 /usr/portage/games-arcade/digger -491 /usr/portage/games-arcade/digger/ChangeLog -492 /usr/portage/games-arcade/digger/Manifest -493 /usr/portage/games-arcade/digger/digger-20140423.ebuild -494 /usr/portage/games-arcade/digger/metadata.xml -495 /usr/portage/games-arcade/digger/files -496 /usr/portage/games-arcade/digger/files/digger-20140423-ldflags.patch -497 /usr/portage/games-arcade/afternoonstalker -498 /usr/portage/games-arcade/afternoonstalker/ChangeLog -499 /usr/portage/games-arcade/afternoonstalker/Manifest -500 /usr/portage/games-arcade/afternoonstalker/metadata.xml -501 /usr/portage/games-arcade/afternoonstalker/afternoonstalker-1.1.5.ebuild -502 /usr/portage/games-arcade/pacmanarena -503 /usr/portage/games-arcade/pacmanarena/ChangeLog -504 /usr/portage/games-arcade/pacmanarena/Manifest -505 /usr/portage/games-arcade/pacmanarena/metadata.xml -506 /usr/portage/games-arcade/pacmanarena/pacmanarena-0.15.ebuild -507 /usr/portage/games-arcade/pacmanarena/files -508 /usr/portage/games-arcade/pacmanarena/files/pacmanarena-0.15-underlink.patch -509 /usr/portage/games-arcade/holotz-castle -510 /usr/portage/games-arcade/holotz-castle/ChangeLog -511 /usr/portage/games-arcade/holotz-castle/Manifest -512 /usr/portage/games-arcade/holotz-castle/holotz-castle-1.3.14.ebuild -513 /usr/portage/games-arcade/holotz-castle/metadata.xml -514 /usr/portage/games-arcade/holotz-castle/files -515 /usr/portage/games-arcade/holotz-castle/files/holotz-castle-1.3.14-gcc44.patch -516 /usr/portage/games-arcade/holotz-castle/files/holotz-castle-1.3.14-build.patch -517 /usr/portage/games-arcade/holotz-castle/files/holotz-castle-1.3.14-underlink.patch -518 /usr/portage/games-arcade/bloboats -519 /usr/portage/games-arcade/bloboats/ChangeLog -520 /usr/portage/games-arcade/bloboats/Manifest -521 /usr/portage/games-arcade/bloboats/bloboats-1.0.2.ebuild -522 /usr/portage/games-arcade/bloboats/metadata.xml -523 /usr/portage/games-arcade/bloboats/files -524 /usr/portage/games-arcade/bloboats/files/bloboats-1.0.2-warnings.patch -525 /usr/portage/games-arcade/berusky -526 /usr/portage/games-arcade/berusky/ChangeLog -527 /usr/portage/games-arcade/berusky/Manifest -528 /usr/portage/games-arcade/berusky/berusky-1.7.1.ebuild -529 /usr/portage/games-arcade/berusky/metadata.xml -530 /usr/portage/games-arcade/berusky/files -531 /usr/portage/games-arcade/berusky/files/berusky-1.7.1-gentoo.patch -532 /usr/portage/games-arcade/conveysdl -533 /usr/portage/games-arcade/conveysdl/ChangeLog -534 /usr/portage/games-arcade/conveysdl/Manifest -535 /usr/portage/games-arcade/conveysdl/metadata.xml -536 /usr/portage/games-arcade/conveysdl/conveysdl-1.3.ebuild -537 /usr/portage/games-arcade/conveysdl/files -538 /usr/portage/games-arcade/conveysdl/files/conveysdl-1.3-arrays.patch -539 /usr/portage/games-arcade/conveysdl/files/conveysdl-1.3-speed.patch -540 /usr/portage/games-arcade/openbubbles -541 /usr/portage/games-arcade/openbubbles/ChangeLog -542 /usr/portage/games-arcade/openbubbles/Manifest -543 /usr/portage/games-arcade/openbubbles/metadata.xml -544 /usr/portage/games-arcade/openbubbles/openbubbles-1.2.ebuild -545 /usr/portage/games-arcade/openbubbles/files -546 /usr/portage/games-arcade/openbubbles/files/openbubbles-1.2-glibc2.10.patch -547 /usr/portage/games-arcade/vor -548 /usr/portage/games-arcade/vor/ChangeLog -549 /usr/portage/games-arcade/vor/Manifest -550 /usr/portage/games-arcade/vor/metadata.xml -551 /usr/portage/games-arcade/vor/vor-0.5.5.ebuild -552 /usr/portage/games-arcade/vor/files -553 /usr/portage/games-arcade/vor/files/vor-0.5.5-underlink.patch -554 /usr/portage/games-arcade/wop -555 /usr/portage/games-arcade/wop/ChangeLog -556 /usr/portage/games-arcade/wop/Manifest -557 /usr/portage/games-arcade/wop/wop-0.4.3-r1.ebuild -558 /usr/portage/games-arcade/wop/metadata.xml -559 /usr/portage/games-arcade/wop/files -560 /usr/portage/games-arcade/wop/files/wop-0.4.3-gcc43.patch -561 /usr/portage/games-arcade/wop/files/wop-0.4.3-Makefile.patch -562 /usr/portage/games-arcade/supertransball2 -563 /usr/portage/games-arcade/supertransball2/ChangeLog -564 /usr/portage/games-arcade/supertransball2/supertransball2-1.5.ebuild -565 /usr/portage/games-arcade/supertransball2/Manifest -566 /usr/portage/games-arcade/supertransball2/metadata.xml -567 /usr/portage/games-arcade/supertransball2/files -568 /usr/portage/games-arcade/supertransball2/files/supertransball2-1.5-ldflags.patch -569 /usr/portage/games-arcade/grande-KXL -570 /usr/portage/games-arcade/grande-KXL/ChangeLog -571 /usr/portage/games-arcade/grande-KXL/Manifest -572 /usr/portage/games-arcade/grande-KXL/metadata.xml -573 /usr/portage/games-arcade/grande-KXL/grande-KXL-0.6.ebuild -574 /usr/portage/games-arcade/grande-KXL/files -575 /usr/portage/games-arcade/grande-KXL/files/grande-KXL-0.6-configure.in.patch -576 /usr/portage/games-arcade/grande-KXL/files/grande-KXL-0.6-cflags.patch -577 /usr/portage/games-arcade/cavezofphear -578 /usr/portage/games-arcade/cavezofphear/ChangeLog -579 /usr/portage/games-arcade/cavezofphear/Manifest -580 /usr/portage/games-arcade/cavezofphear/metadata.xml -581 /usr/portage/games-arcade/cavezofphear/cavezofphear-0.5.1.ebuild -582 /usr/portage/games-arcade/cavezofphear/files -583 /usr/portage/games-arcade/cavezofphear/files/cavezofphear-0.5.1-gentoo.patch -584 /usr/portage/games-arcade/defendguin -585 /usr/portage/games-arcade/defendguin/ChangeLog -586 /usr/portage/games-arcade/defendguin/Manifest -587 /usr/portage/games-arcade/defendguin/metadata.xml -588 /usr/portage/games-arcade/defendguin/defendguin-0.0.12.ebuild -589 /usr/portage/games-arcade/missile -590 /usr/portage/games-arcade/missile/ChangeLog -591 /usr/portage/games-arcade/missile/Manifest -592 /usr/portage/games-arcade/missile/metadata.xml -593 /usr/portage/games-arcade/missile/missile-1.0.1.ebuild -594 /usr/portage/games-arcade/missile/files -595 /usr/portage/games-arcade/missile/files/missile-1.0.1-ldflags.patch -596 /usr/portage/games-arcade/retrobattle -597 /usr/portage/games-arcade/retrobattle/ChangeLog -598 /usr/portage/games-arcade/retrobattle/Manifest -599 /usr/portage/games-arcade/retrobattle/retrobattle-1.0.0.ebuild -600 /usr/portage/games-arcade/retrobattle/metadata.xml -601 /usr/portage/games-arcade/retrobattle/files -602 /usr/portage/games-arcade/retrobattle/files/retrobattle-1.0.0-sound.patch -603 /usr/portage/games-arcade/retrobattle/files/retrobattle-1.0.0-build.patch -604 /usr/portage/games-arcade/asteroid -605 /usr/portage/games-arcade/asteroid/ChangeLog -606 /usr/portage/games-arcade/asteroid/Manifest -607 /usr/portage/games-arcade/asteroid/metadata.xml -608 /usr/portage/games-arcade/asteroid/asteroid-1.1.ebuild -609 /usr/portage/games-arcade/asteroid/files -610 /usr/portage/games-arcade/asteroid/files/asteroid-1.1-include.patch -611 /usr/portage/games-arcade/sdb -612 /usr/portage/games-arcade/sdb/ChangeLog -613 /usr/portage/games-arcade/sdb/Manifest -614 /usr/portage/games-arcade/sdb/metadata.xml -615 /usr/portage/games-arcade/sdb/files -616 /usr/portage/games-arcade/sdb/files/sdb-1.0.2-endian.patch -617 /usr/portage/games-arcade/sdb/files/sdb-1.0.2-gcc43.patch -618 /usr/portage/games-arcade/sdb/files/sdb-1.0.2-ldflags.patch -619 /usr/portage/games-arcade/sdb/sdb-1.0.2.ebuild -620 /usr/portage/games-arcade/lbreakout -621 /usr/portage/games-arcade/lbreakout/ChangeLog -622 /usr/portage/games-arcade/lbreakout/Manifest -623 /usr/portage/games-arcade/lbreakout/metadata.xml -624 /usr/portage/games-arcade/lbreakout/lbreakout-010315.ebuild -625 /usr/portage/games-arcade/xscavenger -626 /usr/portage/games-arcade/xscavenger/ChangeLog -627 /usr/portage/games-arcade/xscavenger/Manifest -628 /usr/portage/games-arcade/xscavenger/metadata.xml -629 /usr/portage/games-arcade/xscavenger/files -630 /usr/portage/games-arcade/xscavenger/files/1.4.4-gentoo.patch -631 /usr/portage/games-arcade/xscavenger/xscavenger-1.4.4.ebuild -632 /usr/portage/games-arcade/bomns -633 /usr/portage/games-arcade/bomns/ChangeLog -634 /usr/portage/games-arcade/bomns/Manifest -635 /usr/portage/games-arcade/bomns/metadata.xml -636 /usr/portage/games-arcade/bomns/bomns-0.99.2.ebuild -637 /usr/portage/games-arcade/bomns/files -638 /usr/portage/games-arcade/bomns/files/bomns-0.99.2-fpe.patch -639 /usr/portage/games-arcade/openmortal -640 /usr/portage/games-arcade/openmortal/ChangeLog -641 /usr/portage/games-arcade/openmortal/Manifest -642 /usr/portage/games-arcade/openmortal/metadata.xml -643 /usr/portage/games-arcade/openmortal/openmortal-0.7-r1.ebuild -644 /usr/portage/games-arcade/openmortal/files -645 /usr/portage/games-arcade/openmortal/files/openmortal-0.7-freetype.patch -646 /usr/portage/games-arcade/openmortal/files/openmortal-0.7-gcc41.patch -647 /usr/portage/games-arcade/syobon -648 /usr/portage/games-arcade/syobon/ChangeLog -649 /usr/portage/games-arcade/syobon/Manifest -650 /usr/portage/games-arcade/syobon/metadata.xml -651 /usr/portage/games-arcade/syobon/syobon-1.0.1.ebuild -652 /usr/portage/games-arcade/aop -653 /usr/portage/games-arcade/aop/ChangeLog -654 /usr/portage/games-arcade/aop/Manifest -655 /usr/portage/games-arcade/aop/aop-0.6.ebuild -656 /usr/portage/games-arcade/aop/metadata.xml -657 /usr/portage/games-arcade/aop/files -658 /usr/portage/games-arcade/aop/files/aop-0.6-as-needed.patch -659 /usr/portage/games-arcade/commandergenius -660 /usr/portage/games-arcade/commandergenius/ChangeLog -661 /usr/portage/games-arcade/commandergenius/Manifest -662 /usr/portage/games-arcade/commandergenius/metadata.xml -663 /usr/portage/games-arcade/commandergenius/commandergenius-1.8.0.0.ebuild -664 /usr/portage/games-arcade/commandergenius/files -665 /usr/portage/games-arcade/commandergenius/files/commandergenius-1.8.0.0-install.patch -666 /usr/portage/games-arcade/commandergenius/files/commandergenius-wrapper -667 /usr/portage/games-arcade/thinktanks-demo -668 /usr/portage/games-arcade/thinktanks-demo/ChangeLog -669 /usr/portage/games-arcade/thinktanks-demo/Manifest -670 /usr/portage/games-arcade/thinktanks-demo/thinktanks-demo-1.1-r2.ebuild -671 /usr/portage/games-arcade/thinktanks-demo/metadata.xml -672 /usr/portage/games-arcade/gunocide2ex -673 /usr/portage/games-arcade/gunocide2ex/ChangeLog -674 /usr/portage/games-arcade/gunocide2ex/Manifest -675 /usr/portage/games-arcade/gunocide2ex/metadata.xml -676 /usr/portage/games-arcade/gunocide2ex/gunocide2ex-1.0.ebuild -677 /usr/portage/games-arcade/gunocide2ex/files -678 /usr/portage/games-arcade/gunocide2ex/files/gunocide2ex-1.0-build.patch -679 /usr/portage/games-arcade/gunocide2ex/files/gunocide2ex-1.0-glibc2.10.patch -680 /usr/portage/games-arcade/excido -681 /usr/portage/games-arcade/excido/ChangeLog -682 /usr/portage/games-arcade/excido/Manifest -683 /usr/portage/games-arcade/excido/metadata.xml -684 /usr/portage/games-arcade/excido/excido-0.1.5c-r2.ebuild -685 /usr/portage/games-arcade/excido/files -686 /usr/portage/games-arcade/excido/files/excido-0.1.5c-build.patch -687 /usr/portage/games-arcade/excido/files/excido-0.1.5c-freealut.patch -688 /usr/portage/games-arcade/apricots -689 /usr/portage/games-arcade/apricots/ChangeLog -690 /usr/portage/games-arcade/apricots/apricots-0.2.6-r1.ebuild -691 /usr/portage/games-arcade/apricots/Manifest -692 /usr/portage/games-arcade/apricots/metadata.xml -693 /usr/portage/games-arcade/apricots/files -694 /usr/portage/games-arcade/apricots/files/apricots-0.2.6-freealut.patch -695 /usr/portage/games-arcade/apricots/files/apricots-0.2.6-ldflags.patch -696 /usr/portage/games-arcade/primateplunge -697 /usr/portage/games-arcade/primateplunge/ChangeLog -698 /usr/portage/games-arcade/primateplunge/Manifest -699 /usr/portage/games-arcade/primateplunge/primateplunge-1.1-r1.ebuild -700 /usr/portage/games-arcade/primateplunge/metadata.xml -701 /usr/portage/games-arcade/primateplunge/files -702 /usr/portage/games-arcade/primateplunge/files/primateplunge-1.1-AC_SUBST.patch -703 /usr/portage/games-arcade/xsfcave -704 /usr/portage/games-arcade/xsfcave/ChangeLog -705 /usr/portage/games-arcade/xsfcave/Manifest -706 /usr/portage/games-arcade/xsfcave/metadata.xml -707 /usr/portage/games-arcade/xsfcave/xsfcave-0.5.ebuild -708 /usr/portage/games-arcade/triplexinvaders -709 /usr/portage/games-arcade/triplexinvaders/ChangeLog -710 /usr/portage/games-arcade/triplexinvaders/Manifest -711 /usr/portage/games-arcade/triplexinvaders/metadata.xml -712 /usr/portage/games-arcade/triplexinvaders/triplexinvaders-1.08.ebuild -713 /usr/portage/games-arcade/triplexinvaders/files -714 /usr/portage/games-arcade/triplexinvaders/files/triplexinvaders-1.08-gentoo.patch -715 /usr/portage/games-arcade/pachi -716 /usr/portage/games-arcade/pachi/ChangeLog -717 /usr/portage/games-arcade/pachi/Manifest -718 /usr/portage/games-arcade/pachi/metadata.xml -719 /usr/portage/games-arcade/pachi/pachi-1.0.ebuild -720 /usr/portage/games-arcade/pachi/files -721 /usr/portage/games-arcade/pachi/files/1.0-autotools.patch -722 /usr/portage/games-arcade/marbleblastgold-demo -723 /usr/portage/games-arcade/marbleblastgold-demo/ChangeLog -724 /usr/portage/games-arcade/marbleblastgold-demo/Manifest -725 /usr/portage/games-arcade/marbleblastgold-demo/metadata.xml -726 /usr/portage/games-arcade/marbleblastgold-demo/marbleblastgold-demo-1.4.1.ebuild -727 /usr/portage/games-arcade/blockrage -728 /usr/portage/games-arcade/blockrage/ChangeLog -729 /usr/portage/games-arcade/blockrage/Manifest -730 /usr/portage/games-arcade/blockrage/metadata.xml -731 /usr/portage/games-arcade/blockrage/blockrage-0.2.3.ebuild -732 /usr/portage/games-arcade/blockrage/files -733 /usr/portage/games-arcade/blockrage/files/blockrage-0.2.3-config.patch -734 /usr/portage/games-arcade/solarwolf -735 /usr/portage/games-arcade/solarwolf/solarwolf-1.5.ebuild -736 /usr/portage/games-arcade/solarwolf/ChangeLog -737 /usr/portage/games-arcade/solarwolf/Manifest -738 /usr/portage/games-arcade/solarwolf/metadata.xml -739 /usr/portage/games-arcade/xboing -740 /usr/portage/games-arcade/xboing/ChangeLog -741 /usr/portage/games-arcade/xboing/Manifest -742 /usr/portage/games-arcade/xboing/metadata.xml -743 /usr/portage/games-arcade/xboing/xboing-2.4-r2.ebuild -744 /usr/portage/games-arcade/xboing/files -745 /usr/portage/games-arcade/xboing/files/xboing-2.4-buffer.patch -746 /usr/portage/games-arcade/xboing/files/xboing-2.4-sleep.patch -747 /usr/portage/games-arcade/komi -748 /usr/portage/games-arcade/komi/ChangeLog -749 /usr/portage/games-arcade/komi/Manifest -750 /usr/portage/games-arcade/komi/metadata.xml -751 /usr/portage/games-arcade/komi/komi-1.04.ebuild -752 /usr/portage/games-arcade/komi/files -753 /usr/portage/games-arcade/komi/files/1.04-DESTDIR.patch -754 /usr/portage/games-arcade/komi/files/komi-1.04-install.patch -755 /usr/portage/games-arcade/metadata.xml -756 /usr/portage/games-arcade/briquolo -757 /usr/portage/games-arcade/briquolo/ChangeLog -758 /usr/portage/games-arcade/briquolo/Manifest -759 /usr/portage/games-arcade/briquolo/briquolo-0.5.7.ebuild -760 /usr/portage/games-arcade/briquolo/metadata.xml -761 /usr/portage/games-arcade/briquolo/files -762 /usr/portage/games-arcade/briquolo/files/briquolo-0.5.7-gcc43.patch -763 /usr/portage/games-arcade/briquolo/files/briquolo-0.5.7-libpng14.patch -764 /usr/portage/games-arcade/spout -765 /usr/portage/games-arcade/spout/ChangeLog -766 /usr/portage/games-arcade/spout/Manifest -767 /usr/portage/games-arcade/spout/metadata.xml -768 /usr/portage/games-arcade/spout/spout-1.3.ebuild -769 /usr/portage/games-arcade/mrrescue -770 /usr/portage/games-arcade/mrrescue/ChangeLog -771 /usr/portage/games-arcade/mrrescue/Manifest -772 /usr/portage/games-arcade/mrrescue/metadata.xml -773 /usr/portage/games-arcade/mrrescue/mrrescue-1.02b.ebuild -774 /usr/portage/games-arcade/insaneodyssey -775 /usr/portage/games-arcade/insaneodyssey/ChangeLog -776 /usr/portage/games-arcade/insaneodyssey/Manifest -777 /usr/portage/games-arcade/insaneodyssey/metadata.xml -778 /usr/portage/games-arcade/insaneodyssey/insaneodyssey-000311.ebuild -779 /usr/portage/games-arcade/insaneodyssey/files -780 /usr/portage/games-arcade/insaneodyssey/files/insaneodyssey-000311-datafiles.patch -781 /usr/portage/games-arcade/trailblazer -782 /usr/portage/games-arcade/trailblazer/ChangeLog -783 /usr/portage/games-arcade/trailblazer/Manifest -784 /usr/portage/games-arcade/trailblazer/metadata.xml -785 /usr/portage/games-arcade/trailblazer/trailblazer-0.9.ebuild -786 /usr/portage/games-arcade/trailblazer/files -787 /usr/portage/games-arcade/trailblazer/files/trailblazer-0.9-underlink.patch -788 /usr/portage/games-arcade/trailblazer/files/trailblazer-0.9-ldflags.patch -789 /usr/portage/games-arcade/monkey-bubble -790 /usr/portage/games-arcade/monkey-bubble/ChangeLog -791 /usr/portage/games-arcade/monkey-bubble/monkey-bubble-0.4.0.ebuild -792 /usr/portage/games-arcade/monkey-bubble/Manifest -793 /usr/portage/games-arcade/monkey-bubble/metadata.xml -794 /usr/portage/games-arcade/monkey-bubble/files -795 /usr/portage/games-arcade/monkey-bubble/files/monkey-bubble-0.4.0-glib-single-include.patch -796 /usr/portage/games-arcade/monkey-bubble/files/monkey-bubble-0.4.0-gnome-doc.patch -797 /usr/portage/games-arcade/monkey-bubble/files/monkey-bubble-0.4.0-asneeded.patch -798 /usr/portage/games-arcade/monkey-bubble/files/monkey-bubble-0.4.0-noesound.patch -799 /usr/portage/games-arcade/whichwayisup -800 /usr/portage/games-arcade/whichwayisup/ChangeLog diff --git a/project2/sql/unittests/mysqlschema.sql b/project2/sql/unittests/mysqlschema.sql deleted file mode 100644 index 58724c8..0000000 --- a/project2/sql/unittests/mysqlschema.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE test( - id int, - fl numeric(5,2), - string varchar(30), - boolean bool, - dt timestamp, - ts time); - -INSERT INTO test VALUES(4, 123.45, 'some text', true, '2015-04-27 23:06:03', '38:13:12'); - -CREATE TABLE bulktest( - intcol int, - stringcol varchar(3000)); - diff --git a/project2/sql/unittests/odbcschema.sql b/project2/sql/unittests/odbcschema.sql deleted file mode 100644 index 96848eb..0000000 --- a/project2/sql/unittests/odbcschema.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE test( - id int, - fl numeric(5,2), - string text, - boolean bool, - dt timestamp without time zone, - ts interval); -INSERT INTO test VALUES(4, 123.45, 'some text', true, '2015-04-27 23:06:03', '1 day 14:13:12'); diff --git a/project2/sql/unittests/pqschema.sql b/project2/sql/unittests/pqschema.sql deleted file mode 100644 index 2c7e94a..0000000 --- a/project2/sql/unittests/pqschema.sql +++ /dev/null @@ -1,37 +0,0 @@ --- --- pg_dump style comment --- Table: test; owner: comment: ; --- - -/* - This is - a - multiline comment */ - -CREATE TABLE test( - id int, - fl numeric(5,2), - string text, - boolean bool, - dt timestamp without time zone, - ts interval); - -INSERT INTO test VALUES(4, 123.45, 'some text with a ; in it and a '' too', true, '2015-04-27 23:06:03', '1 day 14:13:12'); - -CREATE TABLE test2( - path text not null); - -INSERT INTO test2 VALUES('$P2MOCKSCRIPTDIR/pqschema.sql'); - -CREATE FUNCTION event_tsvector() RETURNS int -LANGUAGE sql STABLE -AS $tag$ - SELECT max(id) - FROM test - WHERE string != 'complex '' string;'; -$tag$; - -CREATE TABLE bulktest( - id int, - string text); - diff --git a/project2/sql/unittests/sqliteschema.sql b/project2/sql/unittests/sqliteschema.sql deleted file mode 100644 index 393d21a..0000000 --- a/project2/sql/unittests/sqliteschema.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE test( - id int, - fl numeric(5,2), - string text); -INSERT INTO test VALUES(4, 123.45, 'some text'); - diff --git a/project2/sql/unittests/testCore.cpp b/project2/sql/unittests/testCore.cpp deleted file mode 100644 index 440d676..0000000 --- a/project2/sql/unittests/testCore.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "testCore.h" -#include <testOptionsSource.h> -#include <definedDirs.h> - -TestCore::TestCore() : - testInt(43), - testDouble(3.14), - testString("Some C String"), - testBool(false), - testDateTime(boost::posix_time::from_time_t(1430530593)), - testInterval(boost::posix_time::time_duration(1, 2, 3)) -{ - TestOptionsSource::LoadTestOptions({ - { "common.datasourceRoot", (RootDir / "datasources").string() }, - }); -} - diff --git a/project2/sql/unittests/testCore.h b/project2/sql/unittests/testCore.h deleted file mode 100644 index 0a667d6..0000000 --- a/project2/sql/unittests/testCore.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef PROJECT2_SQL_UNITTEST_CORE -#define PROJECT2_SQL_UNITTEST_CORE - -#include <commonObjects.h> -#include <variableType.h> -#include <appInstance.h> - -class TestCore : public CommonObjects, AppInstance { - public: - TestCore(); - - int testInt; - double testDouble; - std::string testString; - bool testBool; - boost::posix_time::ptime testDateTime; - boost::posix_time::time_duration testInterval; -}; - -#endif - diff --git a/project2/sql/unittests/testmysql.cpp b/project2/sql/unittests/testmysql.cpp deleted file mode 100644 index 546199c..0000000 --- a/project2/sql/unittests/testmysql.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#define BOOST_TEST_MODULE TestMySQL -#include <boost/test/unit_test.hpp> - -#include <mockDatasource.h> -#include <definedDirs.h> -#include <modifycommand.h> -#include <selectcommand.h> -#include <column.h> -#include <sql-modMySQL.h> -#include "testCore.h" -#include <sqlHandleAsVariableType.h> -#include <fstream> - -class StandardMockDatabase : public MockMySQLDatabase { - public: - StandardMockDatabase() : MockMySQLDatabase("mysqlmock", { - RootDir / "mysqlschema.sql" }) - { - } -}; - -BOOST_GLOBAL_FIXTURE( StandardMockDatabase ); - -BOOST_FIXTURE_TEST_SUITE( Core, TestCore ); - -BOOST_AUTO_TEST_CASE( transactions ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("mysqlmock"); - auto ro = ds->getReadonly(); - - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->rollbackTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->commitTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSend ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("mysqlmock"); - auto rw = ds->getWritable(); - - auto mod = rw->newModifyCommand("INSERT INTO test VALUES(?, ?, ?, ?, ?, ?)"); - mod->bindParamI(0, testInt); - mod->bindParamF(1, testDouble); - mod->bindParamS(2, testString); - mod->bindParamB(3, testBool); - mod->bindParamT(4, testDateTime); - mod->bindParamT(5, testInterval); - mod->execute(); - delete mod; - ds->commit(); - ds->close(); -} - -template<typename T> -void -assertColumnValueHelper(DB::SelectCommand & sel, const T & t) -{ - while (sel.fetch()) { - HandleAsVariableType h; - sel[0].apply(h); - BOOST_REQUIRE_EQUAL(t, h.variable.as<T>()); - } -} - -template<typename T> -void -assertColumnValueHelper(DB::SelectCommand & sel, unsigned int col, const T & t) -{ - HandleAsVariableType h; - sel[col].apply(h); - BOOST_REQUIRE_EQUAL(t, h.variable.as<T>()); -} - -BOOST_AUTO_TEST_CASE( bindAndSelect ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("mysqlmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id = ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, testInt); - assertColumnValueHelper(*select, 1, testDouble); - assertColumnValueHelper(*select, 2, testString); - assertColumnValueHelper(*select, 3, testBool); - assertColumnValueHelper(*select, 4, testDateTime); - assertColumnValueHelper(*select, 5, testInterval); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSelectOther ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("mysqlmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id != ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, 4); - assertColumnValueHelper(*select, 1, 123.45); - assertColumnValueHelper(*select, 2, std::string("some text")); - assertColumnValueHelper(*select, 3, true); - assertColumnValueHelper(*select, 4, boost::posix_time::ptime_from_tm({ 3, 6, 23, 27, 3, 115, 0, 0, 0, 0, 0})); - assertColumnValueHelper(*select, 5, boost::posix_time::time_duration(38, 13, 12)); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bulkload ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("mysqlmock"); - auto ro = ds->getReadonly(); - - auto count = ro->newSelectCommand("SELECT COUNT(*) FROM bulktest"); - // Test empty - ro->beginBulkUpload("bulktest", ""); - ro->endBulkUpload(NULL); - assertColumnValueHelper(*count, 0); - // Test sample file - ro->beginBulkUpload("bulktest", ""); - std::ifstream in((RootDir / "bulk.sample").string()); - if (!in.good()) throw std::runtime_error("Couldn't open bulk.sample"); - char buf[BUFSIZ]; - for (std::streamsize r; (r = in.readsome(buf, sizeof(buf))) > 0; ) { - ro->bulkUploadData(buf, r); - } - ro->endBulkUpload(NULL); - assertColumnValueHelper(*count, 800); - - delete count; - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bigIterate ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("mysqlmock"); - auto ro = ds->getReadonly(); - - auto count = ro->newSelectCommand("SELECT * FROM bulktest"); - unsigned int rows = 0; - while (count->fetch()) { - rows += 1; - } - BOOST_REQUIRE_EQUAL(800, rows); - - delete count; - ds->close(); -} - -BOOST_AUTO_TEST_SUITE_END(); - diff --git a/project2/sql/unittests/testodbc.cpp b/project2/sql/unittests/testodbc.cpp deleted file mode 100644 index 60db6ce..0000000 --- a/project2/sql/unittests/testodbc.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#define BOOST_TEST_MODULE TestODBC -#include <boost/test/unit_test.hpp> - -#include <mockDatasource.h> -#include <definedDirs.h> -#include <modifycommand.h> -#include <selectcommand.h> -#include <column.h> -#include <sql-modODBC.h> -#include "testCore.h" -#include <sqlHandleAsVariableType.h> -#include <definedDirs.h> - -class StandardMockDatabase : public MockODBCDatabase { - public: - StandardMockDatabase() : MockODBCDatabase("Driver=postgresql;Database=postgres;uid=postgres;servername=/run/postgresql", "odbcmock", { - RootDir / "odbcschema.sql" }) - { - } -}; - -BOOST_GLOBAL_FIXTURE( StandardMockDatabase ); - -BOOST_FIXTURE_TEST_SUITE( Core, TestCore ); - -BOOST_AUTO_TEST_CASE( transactions ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("odbcmock"); - auto ro = ds->getReadonly(); - - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->rollbackTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->commitTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSend ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("odbcmock"); - auto rw = ds->getWritable(); - - auto mod = rw->newModifyCommand("INSERT INTO test VALUES(?, ?, ?, ?, ?)"); - mod->bindParamI(0, testInt); - mod->bindParamF(1, testDouble); - mod->bindParamS(2, testString); - mod->bindParamB(3, testBool); - mod->bindParamT(4, testDateTime); - mod->execute(); - delete mod; - ds->commit(); - ds->close(); -} - -template<typename T> -void -assertColumnValueHelper(DB::SelectCommand & sel, unsigned int col, const T & t) -{ - HandleAsVariableType h; - sel[col].apply(h); - BOOST_REQUIRE_EQUAL(t, h.variable.as<T>()); -} - -BOOST_AUTO_TEST_CASE( bindAndSelect ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("odbcmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id = ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, testInt); - assertColumnValueHelper(*select, 1, testDouble); - assertColumnValueHelper(*select, 2, testString); - assertColumnValueHelper(*select, 3, testBool); - assertColumnValueHelper(*select, 4, testDateTime); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSelectOther ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("odbcmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id != ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, 4); - assertColumnValueHelper(*select, 1, 123.45); - assertColumnValueHelper(*select, 2, std::string("some text")); - assertColumnValueHelper(*select, 3, true); - assertColumnValueHelper(*select, 4, boost::posix_time::ptime_from_tm({ 3, 6, 23, 27, 3, 115, 0, 0, 0, 0, 0})); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_SUITE_END(); - diff --git a/project2/sql/unittests/testpq.cpp b/project2/sql/unittests/testpq.cpp deleted file mode 100644 index da38a34..0000000 --- a/project2/sql/unittests/testpq.cpp +++ /dev/null @@ -1,187 +0,0 @@ -#define BOOST_TEST_MODULE TestPQ -#include <boost/test/unit_test.hpp> - -#include <mockDatasource.h> -#include <definedDirs.h> -#include <modifycommand.h> -#include <selectcommand.h> -#include <column.h> -#include <sql-modPQ.h> -#include "testCore.h" -#include <sqlHandleAsVariableType.h> -#include <fstream> - -class StandardMockDatabase : public MockPqDatabase { - public: - StandardMockDatabase() : MockPqDatabase("user=postgres dbname=postgres", "pqmock", { - RootDir / "pqschema.sql" }) - { - } -}; - -BOOST_GLOBAL_FIXTURE( StandardMockDatabase ); - -BOOST_FIXTURE_TEST_SUITE( Core, TestCore ); - -BOOST_AUTO_TEST_CASE( transactions ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto ro = ds->getReadonly(); - - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->rollbackTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->commitTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSend ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto rw = ds->getWritable(); - - auto mod = rw->newModifyCommand("INSERT INTO test VALUES(?, ?, ?, ?, ?, ?)"); - mod->bindParamI(0, testInt); - mod->bindParamF(1, testDouble); - mod->bindParamS(2, testString); - mod->bindParamB(3, testBool); - mod->bindParamT(4, testDateTime); - mod->bindParamT(5, testInterval); - mod->execute(); - delete mod; - ds->commit(); - ds->close(); -} - -template<typename T> -void -assertColumnValueHelper(DB::SelectCommand & sel, const T & t) -{ - while (sel.fetch()) { - HandleAsVariableType h; - sel[0].apply(h); - BOOST_REQUIRE_EQUAL(t, h.variable.as<T>()); - } -} - -template<typename T> -void -assertColumnValueHelper(DB::SelectCommand & sel, unsigned int col, const T & t) -{ - HandleAsVariableType h; - sel[col].apply(h); - BOOST_REQUIRE_EQUAL(t, h.variable.as<T>()); -} - -BOOST_AUTO_TEST_CASE( bindAndSelect ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id = ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, testInt); - assertColumnValueHelper(*select, 1, testDouble); - assertColumnValueHelper(*select, 2, testString); - assertColumnValueHelper(*select, 3, testBool); - assertColumnValueHelper(*select, 4, testDateTime); - assertColumnValueHelper(*select, 5, testInterval); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSelectOther ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id != ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, 4); - assertColumnValueHelper(*select, 1, 123.45); - assertColumnValueHelper(*select, 2, std::string("some text with a ; in it and a ' too")); - assertColumnValueHelper(*select, 3, true); - assertColumnValueHelper(*select, 4, boost::posix_time::ptime_from_tm({ 3, 6, 23, 27, 3, 115, 0, 0, 0, 0, 0})); - assertColumnValueHelper(*select, 5, boost::posix_time::time_duration(38, 13, 12)); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_CASE( testP2MockScriptDir ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT path FROM test2"); - select->execute(); - while (select->fetch()) { - HandleAsVariableType h; - (*select)[0].apply(h); - BOOST_REQUIRE(boost::filesystem::exists(h.variable.as<std::string>())); - } - delete select; - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bulkload ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto ro = ds->getReadonly(); - - auto count = ro->newSelectCommand("SELECT COUNT(*) FROM bulktest"); - // Test empty - ro->beginBulkUpload("bulktest", ""); - ro->endBulkUpload(NULL); - assertColumnValueHelper(*count, 0); - // Test sample file - ro->beginBulkUpload("bulktest", ""); - std::ifstream in((RootDir / "bulk.sample").string()); - if (!in.good()) throw std::runtime_error("Couldn't open bulk.sample"); - char buf[BUFSIZ]; - for (std::streamsize r; (r = in.readsome(buf, sizeof(buf))) > 0; ) { - ro->bulkUploadData(buf, r); - } - ro->endBulkUpload(NULL); - assertColumnValueHelper(*count, 800); - - delete count; - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bigIterate ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("pqmock"); - auto ro = ds->getReadonly(); - - auto count = ro->newSelectCommand("SELECT * FROM bulktest"); - unsigned int rows = 0; - while (count->fetch()) { - rows += 1; - } - BOOST_REQUIRE_EQUAL(800, rows); - - delete count; - ds->close(); -} - -BOOST_AUTO_TEST_SUITE_END(); - diff --git a/project2/sql/unittests/testsqlite.cpp b/project2/sql/unittests/testsqlite.cpp deleted file mode 100644 index 89a1f77..0000000 --- a/project2/sql/unittests/testsqlite.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#define BOOST_TEST_MODULE TestSQLite -#include <boost/test/unit_test.hpp> - -#include <mockDatasource.h> -#include <definedDirs.h> -#include <modifycommand.h> -#include <selectcommand.h> -#include <column.h> -#include <sql-modSQLite.h> -#include "testCore.h" -#include <sqlHandleAsVariableType.h> - -class StandardMockDatabase : public MockSQLiteDatabase { - public: - StandardMockDatabase() : MockSQLiteDatabase("sqlitemock", { - RootDir / "sqliteschema.sql" }) - { - } -}; - -BOOST_GLOBAL_FIXTURE( StandardMockDatabase ); - -BOOST_FIXTURE_TEST_SUITE( Core, TestCore ); - -BOOST_AUTO_TEST_CASE( transactions ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("sqlitemock"); - auto ro = ds->getReadonly(); - - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->rollbackTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ro->beginTx(); - BOOST_REQUIRE_EQUAL(true, ro->inTx()); - ro->commitTx(); - BOOST_REQUIRE_EQUAL(false, ro->inTx()); - - ds->close(); -} - -BOOST_AUTO_TEST_CASE( bindAndSend ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("sqlitemock"); - auto rw = ds->getWritable(); - - auto mod = rw->newModifyCommand("INSERT INTO test VALUES(?, ?, ?)"); - mod->bindParamI(0, testInt); - mod->bindParamF(1, testDouble); - mod->bindParamS(2, testString); - mod->execute(); - delete mod; - ds->commit(); - ds->close(); -} - -template<typename T> -void -assertColumnValueHelper(DB::SelectCommand & sel, unsigned int col, const T & t) -{ - HandleAsVariableType h; - sel[col].apply(h); - BOOST_REQUIRE_EQUAL(t, h.variable.as<T>()); -} - -BOOST_AUTO_TEST_CASE( bindAndSelect ) -{ - RdbmsDataSource * ds = CommonObjects::dataSource<RdbmsDataSource>("sqlitemock"); - auto ro = ds->getReadonly(); - - auto select = ro->newSelectCommand("SELECT * FROM test WHERE id = ?"); - select->bindParamI(0, testInt); - select->execute(); - int rows = 0; - while (select->fetch()) { - assertColumnValueHelper(*select, 0, testInt); - assertColumnValueHelper(*select, 1, testDouble); - assertColumnValueHelper(*select, 2, testString); - rows += 1; - } - delete select; - BOOST_REQUIRE_EQUAL(1, rows); - ds->close(); -} - -BOOST_AUTO_TEST_SUITE_END(); - |
