summaryrefslogtreecommitdiff
path: root/project2/sql/sql-modPQ.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2015-04-28 21:02:14 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2015-04-28 21:02:14 +0100
commit8af06d99317d2fdc499eef86d9d5e9c157a052c2 (patch)
treeabae878df2134e562b76ce8ab40860140e70e9f4 /project2/sql/sql-modPQ.cpp
parentPass include dirs to slice tools (diff)
downloadproject2-8af06d99317d2fdc499eef86d9d5e9c157a052c2.tar.bz2
project2-8af06d99317d2fdc499eef86d9d5e9c157a052c2.tar.xz
project2-8af06d99317d2fdc499eef86d9d5e9c157a052c2.zip
Move the mocked PQ db into the PQ module and start the basis of the SQL mod unit tests
Diffstat (limited to 'project2/sql/sql-modPQ.cpp')
-rw-r--r--project2/sql/sql-modPQ.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/project2/sql/sql-modPQ.cpp b/project2/sql/sql-modPQ.cpp
index cb753e0..5267f28 100644
--- a/project2/sql/sql-modPQ.cpp
+++ b/project2/sql/sql-modPQ.cpp
@@ -1,4 +1,64 @@
#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) :
+ master(InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>("postgresql")->create(masterdb)),
+ testDbName(stringbf("test_%d_%d", getpid(), ++MockConnectionLoader::mocked)),
+ mockName(name)
+{
+ Logger()->messagebf(LOG_DEBUG, "Setting up new mocked database %s", testDbName);
+ DropDatabase();
+ CreateNewDatabase();
+ try {
+ for (auto s : ss) {
+ Logger()->messagebf(LOG_DEBUG, "%s << %s", testDbName, s);
+ if (system(("psql -v ON_ERROR_STOP=1 -q -1 -U postgres " + testDbName + " -f " + s.string()).c_str())) {
+ throw std::runtime_error("Failed to execute " + s.string());
+ }
+ }
+ Logger()->messagebf(LOG_DEBUG, "%s initialized", testDbName);
+ MockConnectionLoader::mocks[name] = boost::bind(MockPqDatabase::openConnection, stringbf("user=postgres dbname=%s", testDbName));
+ }
+ catch (...) {
+ DropDatabase();
+ throw;
+ }
+}
+
+DB::Connection *
+MockPqDatabase::openConnection(const std::string & connStr)
+{
+ return InstanceMap<ConnectionLoader, std::string>::Get<std::invalid_argument>("postgresql")->create(connStr);
+}
+
+MockPqDatabase::~MockPqDatabase()
+{
+ Logger()->messagebf(LOG_DEBUG, "Tearing down mocked database %s", testDbName);
+ DropDatabase();
+ delete master;
+ MockConnectionLoader::mocks.erase(mockName);
+ Logger()->messagebf(LOG_DEBUG, "%s torn down", testDbName);
+}
+
+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 + "'");
+ Logger()->messagebf(LOG_INFO, "Dropping (if exists) old database %s", testDbName);
+ master->execute("DROP DATABASE IF EXISTS " + testDbName);
+}
+
+void MockPqDatabase::CreateNewDatabase() const
+{
+ Logger()->messagebf(LOG_INFO, "Creating new database %s", testDbName);
+ master->execute("CREATE DATABASE " + testDbName);
+}
+
+