summaryrefslogtreecommitdiff
path: root/project2/sql
diff options
context:
space:
mode:
Diffstat (limited to 'project2/sql')
-rw-r--r--project2/sql/Jamfile.jam71
-rw-r--r--project2/sql/connectionLoader.cpp5
-rw-r--r--project2/sql/connectionLoader.h10
-rw-r--r--project2/sql/mockDatabase.cpp119
-rw-r--r--project2/sql/mockDatabase.h44
-rw-r--r--project2/sql/mockDatasource.cpp13
-rw-r--r--project2/sql/mockDatasource.h10
-rw-r--r--project2/sql/pch.hpp29
-rw-r--r--project2/sql/rdbmsDataSource.cpp27
-rw-r--r--project2/sql/rdbmsDataSource.h21
-rw-r--r--project2/sql/sql-modMySQL.cpp30
-rw-r--r--project2/sql/sql-modMySQL.h17
-rw-r--r--project2/sql/sql-modODBC.cpp36
-rw-r--r--project2/sql/sql-modODBC.h21
-rw-r--r--project2/sql/sql-modPQ.cpp36
-rw-r--r--project2/sql/sql-modPQ.h20
-rw-r--r--project2/sql/sql-modSQLite.cpp45
-rw-r--r--project2/sql/sql-modSQLite.h24
-rw-r--r--project2/sql/sql.ll123
-rw-r--r--project2/sql/sqlBase.cpp24
-rw-r--r--project2/sql/sqlBase.h23
-rw-r--r--project2/sql/sqlBulkLoad.cpp29
-rw-r--r--project2/sql/sqlCache.cpp65
-rw-r--r--project2/sql/sqlFlexLexer.cpp37
-rw-r--r--project2/sql/sqlFlexLexer.h24
-rw-r--r--project2/sql/sqlHandleAsVariableType.cpp4
-rw-r--r--project2/sql/sqlHandleAsVariableType.h4
-rw-r--r--project2/sql/sqlMergeTask.cpp123
-rw-r--r--project2/sql/sqlMergeTask.h14
-rw-r--r--project2/sql/sqlRows.cpp23
-rw-r--r--project2/sql/sqlRows.h14
-rw-r--r--project2/sql/sqlTask.cpp27
-rw-r--r--project2/sql/sqlTask.h16
-rw-r--r--project2/sql/sqlTest.cpp23
-rw-r--r--project2/sql/sqlTest.h11
-rw-r--r--project2/sql/sqlVariableBinder.h2
-rw-r--r--project2/sql/sqlWriter.cpp134
-rw-r--r--project2/sql/sqlWriter.h69
-rw-r--r--project2/sql/sqlWriters.cpp188
-rw-r--r--project2/sql/sqlWriters.h86
-rw-r--r--project2/sql/tablepatch.cpp506
-rw-r--r--project2/sql/tablepatch.h48
-rw-r--r--project2/sql/unittests/Jamfile.jam62
-rw-r--r--project2/sql/unittests/bulk.sample800
-rw-r--r--project2/sql/unittests/mysqlschema.sql14
-rw-r--r--project2/sql/unittests/odbcschema.sql8
-rw-r--r--project2/sql/unittests/pqschema.sql37
-rw-r--r--project2/sql/unittests/sqliteschema.sql6
-rw-r--r--project2/sql/unittests/testCore.cpp17
-rw-r--r--project2/sql/unittests/testCore.h21
-rw-r--r--project2/sql/unittests/testmysql.cpp171
-rw-r--r--project2/sql/unittests/testodbc.cpp116
-rw-r--r--project2/sql/unittests/testpq.cpp187
-rw-r--r--project2/sql/unittests/testsqlite.cpp89
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();
-