diff options
| -rw-r--r-- | libdbpp/Jamfile.jam | 4 | ||||
| -rw-r--r-- | libdbpp/column.h | 12 | ||||
| -rw-r--r-- | libdbpp/command.h | 4 | ||||
| -rw-r--r-- | libdbpp/command_fwd.h | 8 | ||||
| -rw-r--r-- | libdbpp/connection.cpp | 26 | ||||
| -rw-r--r-- | libdbpp/connection.h | 22 | ||||
| -rw-r--r-- | libdbpp/connectionPool.cpp | 6 | ||||
| -rw-r--r-- | libdbpp/connectionPool.h | 10 | ||||
| -rw-r--r-- | libdbpp/connection_fwd.h | 5 | ||||
| -rw-r--r-- | libdbpp/createMockDb.cpp | 2 | ||||
| -rw-r--r-- | libdbpp/mockDatabase.cpp | 23 | ||||
| -rw-r--r-- | libdbpp/mockDatabase.h | 34 | ||||
| -rw-r--r-- | libdbpp/modifycommand.h | 1 | ||||
| -rw-r--r-- | libdbpp/selectcommand.h | 5 | ||||
| -rw-r--r-- | libdbpp/tablepatch.cpp | 16 | ||||
| -rw-r--r-- | libdbpp/tablepatch.h | 4 | ||||
| -rw-r--r-- | libdbpp/unittests/Jamfile.jam | 4 | ||||
| -rw-r--r-- | libdbpp/unittests/mockdb.cpp | 16 | ||||
| -rw-r--r-- | libdbpp/unittests/mockdb.h | 6 | ||||
| -rw-r--r-- | libdbpp/unittests/testConnection.cpp | 14 | ||||
| -rw-r--r-- | libdbpp/unittests/testConnectionPool.cpp | 4 | ||||
| -rw-r--r-- | libdbpp/unittests/testPatch.cpp | 4 | ||||
| -rw-r--r-- | libdbpp/unittests/testUtils.cpp | 56 | 
23 files changed, 134 insertions, 152 deletions
diff --git a/libdbpp/Jamfile.jam b/libdbpp/Jamfile.jam index 8152a3a..4ea9c44 100644 --- a/libdbpp/Jamfile.jam +++ b/libdbpp/Jamfile.jam @@ -4,7 +4,7 @@ import lex ;  lib boost_date_time : : <name>boost_date_time ;  lib boost_filesystem ;  lib boost_system ; -lib boost_thread ; +lib pthread ;  lib boost_program_options ;  lib adhocutil : : : : <include>/usr/include/adhocutil ;  lib boost_utf : : <name>boost_unit_test_framework ; @@ -14,7 +14,7 @@ lib dbppcore :  	<library>..//glibmm  	<library>adhocutil  	<library>boost_system -	<library>boost_thread +	<library>pthread  	<library>boost_filesystem  	<include>.  	: : diff --git a/libdbpp/column.h b/libdbpp/column.h index cfe5ab5..393736a 100644 --- a/libdbpp/column.h +++ b/libdbpp/column.h @@ -3,8 +3,8 @@  #include <glibmm/ustring.h>  #include <boost/date_time/posix_time/posix_time_types.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/optional.hpp> +#include <memory> +#include <optional>  #include <visibility.h>  #include <exception.h>  #include "dbTypes.h" @@ -61,13 +61,13 @@ namespace DB {  			void operator>>(Blob &) const;  			/// STL like wrapper for optional types.  			template <typename T> -			void operator>>(boost::optional<T> & v) const { +			void operator>>(std::optional<T> & v) const {  				if (!isNull()) {  					v = T(); -					operator>>(v.get()); +					operator>>(*v);  				}  				else { -					v = boost::none; +					v = {};  				}  			} @@ -76,7 +76,7 @@ namespace DB {  			/// This column's name.  			const std::string		name;  	}; -	typedef boost::shared_ptr<Column> ColumnPtr; +	typedef std::shared_ptr<Column> ColumnPtr;  }  #endif diff --git a/libdbpp/command.h b/libdbpp/command.h index aa91282..eed0561 100644 --- a/libdbpp/command.h +++ b/libdbpp/command.h @@ -4,7 +4,7 @@  #include "command_fwd.h"  #include <glibmm/ustring.h>  #include <boost/date_time/posix_time/posix_time_types.hpp> -#include <boost/shared_ptr.hpp> +#include <memory>  #include <boost/lexical_cast.hpp>  #include <visibility.h>  #include <factory.h> @@ -34,7 +34,7 @@ namespace DB {  			virtual ~CommandOptions() = default;  			/// An (optional) hash of the SQL statement. -			boost::optional<std::size_t> hash; +			std::optional<std::size_t> hash;  		protected:  			/// Helper function to extract values from a CommandOptionsMap diff --git a/libdbpp/command_fwd.h b/libdbpp/command_fwd.h index 0a35b18..36776d2 100644 --- a/libdbpp/command_fwd.h +++ b/libdbpp/command_fwd.h @@ -3,17 +3,17 @@  #include <string>  #include <map> -#include <boost/shared_ptr.hpp> +#include <memory>  namespace DB {  	typedef std::map<std::string, std::string> CommandOptionsMap;  	class CommandOptions;  	class Command; -	typedef boost::shared_ptr<Command> CommandPtr; +	typedef std::shared_ptr<Command> CommandPtr;  	class ModifyCommand; -	typedef boost::shared_ptr<ModifyCommand> ModifyCommandPtr; +	typedef std::shared_ptr<ModifyCommand> ModifyCommandPtr;  	class SelectCommand; -	typedef boost::shared_ptr<SelectCommand> SelectCommandPtr; +	typedef std::shared_ptr<SelectCommand> SelectCommandPtr;  } diff --git a/libdbpp/connection.cpp b/libdbpp/connection.cpp index 3d954a6..e771854 100644 --- a/libdbpp/connection.cpp +++ b/libdbpp/connection.cpp @@ -5,7 +5,6 @@  #include <factory.impl.h>  #include <compileTimeFormatter.h>  #include <sqlParse.h> -#include <boost/shared_ptr.hpp>  #include <system_error>  DB::ConnectionError::ConnectionError() : @@ -34,19 +33,6 @@ DB::Connection::execute(const std::string & sql, const CommandOptions * opts)  	modify(sql, opts)->execute(true);  } - -DB::SelectCommandPtr -DB::Connection::select(const std::string & sql, const CommandOptions * opts) -{ -	return DB::SelectCommandPtr(newSelectCommand(sql, opts)); -} - -DB::ModifyCommandPtr -DB::Connection::modify(const std::string & sql, const CommandOptions * opts) -{ -	return DB::ModifyCommandPtr(newModifyCommand(sql, opts)); -} -  void  DB::Connection::finish() const  { @@ -181,7 +167,7 @@ DB::Connection::bulkUploadData(FILE * in) const  }  AdHocFormatter(PluginLibraryFormat, "libdbpp-%?.so"); -boost::optional<std::string> +std::optional<std::string>  DB::Connection::resolvePlugin(const std::type_info &, const std::string & name)  {  	return PluginLibraryFormat::get(name); @@ -199,19 +185,21 @@ DB::TransactionRequired::message() const throw()  	return "A transaction must be opened before performing this operation";  } -DB::TransactionScope::TransactionScope(DB::Connection * c) : +DB::TransactionScope::TransactionScope(std::weak_ptr<DB::Connection> c) :  	conn(c)  { -	conn->beginTx(); +	conn.lock()->beginTx();  }  DB::TransactionScope::~TransactionScope()  { +	if (conn.expired()) return; +  	if (std::uncaught_exception()) { -		conn->rollbackTx(); +		conn.lock()->rollbackTx();  	}  	else { -		conn->commitTx(); +		conn.lock()->commitTx();  	}  } diff --git a/libdbpp/connection.h b/libdbpp/connection.h index f3cd014..7d27a22 100644 --- a/libdbpp/connection.h +++ b/libdbpp/connection.h @@ -8,7 +8,8 @@  #include <exception.h>  #include <visibility.h>  #include <boost/filesystem/path.hpp> -#include <boost/shared_ptr.hpp> +#include <memory> +#include <optional>  #include "error.h"  namespace AdHoc { @@ -19,7 +20,9 @@ namespace DB {  	class Command;  	class CommandOptions;  	class SelectCommand; +	typedef std::shared_ptr<SelectCommand> SelectCommandPtr;  	class ModifyCommand; +	typedef std::shared_ptr<ModifyCommand> ModifyCommandPtr;  	class TablePatch;  	enum BulkDeleteStyle { @@ -84,7 +87,7 @@ namespace DB {  	};  	/// Base class for connections to a database. -	class DLL_PUBLIC Connection { +	class DLL_PUBLIC Connection : public std::enable_shared_from_this<Connection> {  		public:  			virtual ~Connection(); @@ -118,13 +121,9 @@ namespace DB {  			/// @param s the location of the script.  			virtual void executeScript(std::istream & f, const boost::filesystem::path & s);  			/// Create a new select command with the given SQL. -			virtual SelectCommand * newSelectCommand(const std::string & sql, const CommandOptions * = nullptr) = 0; -			/// Create a new select command with the given SQL [smart pointer]. -			virtual boost::shared_ptr<SelectCommand> select(const std::string & sql, const CommandOptions * = nullptr); +			virtual SelectCommandPtr select(const std::string & sql, const CommandOptions * = nullptr) = 0;  			/// Create a new modify command with the given SQL. -			virtual ModifyCommand * newModifyCommand(const std::string & sql, const CommandOptions * = nullptr) = 0; -			/// Create a new modify command with the given SQL [smart pointer]. -			virtual boost::shared_ptr<ModifyCommand> modify(const std::string & sql, const CommandOptions * = nullptr); +			virtual ModifyCommandPtr modify(const std::string & sql, const CommandOptions * = nullptr) = 0;  			/// Begin a bulk upload operation.  			/// @param table the target table. @@ -146,7 +145,7 @@ namespace DB {  			PatchResult patchTable(TablePatch * tp);  			/// AdHoc plugin resolver helper for database connectors. -			static boost::optional<std::string> resolvePlugin(const std::type_info &, const std::string &); +			static std::optional<std::string> resolvePlugin(const std::type_info &, const std::string &);  		protected:  			/// Create a new connection. @@ -174,17 +173,18 @@ namespace DB {  	class DLL_PUBLIC TransactionScope {  		public:  			/// Create a new helper and associated transaction on the given connection. -			TransactionScope(DB::Connection *); +			TransactionScope(std::weak_ptr<DB::Connection>);  			~TransactionScope();  		private:  			TransactionScope(const TransactionScope &) = delete;  			void operator=(const TransactionScope &) = delete; -			Connection * conn; +			std::weak_ptr<Connection> conn;  	};  	typedef AdHoc::Factory<Connection, std::string> ConnectionFactory; +	typedef std::shared_ptr<const ConnectionFactory> ConnectionFactoryCPtr;  }  #endif diff --git a/libdbpp/connectionPool.cpp b/libdbpp/connectionPool.cpp index 9dc3a1c..67ea3ca 100644 --- a/libdbpp/connectionPool.cpp +++ b/libdbpp/connectionPool.cpp @@ -12,20 +12,20 @@ namespace DB {  	{  	} -	Connection * +	ConnectionPtr  	ConnectionPool::createResource() const  	{  		return factory->create(connectionString);  	}  	void -	ConnectionPool::returnTestResource(const Connection * c) const +	ConnectionPool::returnTestResource(const ConnectionCPtr & c) const  	{  		c->finish();  	}  	void -	ConnectionPool::testResource(const Connection * c) const +	ConnectionPool::testResource(const ConnectionCPtr & c) const  	{  		c->ping();  	} diff --git a/libdbpp/connectionPool.h b/libdbpp/connectionPool.h index 859c269..2300abb 100644 --- a/libdbpp/connectionPool.h +++ b/libdbpp/connectionPool.h @@ -3,6 +3,7 @@  #include <resourcePool.h>  #include <visibility.h> +#include <memory>  #include "connection.h"  namespace DB { @@ -18,16 +19,17 @@ namespace DB {  		protected:  			/// Create a new connection. -			Connection * createResource() const override; +			ConnectionPtr createResource() const override;  			/// Ping a connection. -			void returnTestResource(const Connection *) const override; +			void returnTestResource(const ConnectionCPtr &) const override;  			/// Ping a connection. -			void testResource(const Connection *) const override; +			void testResource(const ConnectionCPtr &) const override;  		private: -			const ConnectionFactory * factory; +			const ConnectionFactoryCPtr factory;  			const std::string connectionString;  	}; +	typedef std::shared_ptr<ConnectionPool> ConnectionPoolPtr;  }  #endif diff --git a/libdbpp/connection_fwd.h b/libdbpp/connection_fwd.h index 0594490..616c6b8 100644 --- a/libdbpp/connection_fwd.h +++ b/libdbpp/connection_fwd.h @@ -1,11 +1,12 @@  #ifndef DB_CONNECTION_FWD_H  #define DB_CONNECTION_FWD_H -#include <boost/shared_ptr.hpp> +#include <memory>  namespace DB {  	class Connection; -	typedef boost::shared_ptr<Connection> ConnectionPtr; +	typedef std::shared_ptr<Connection> ConnectionPtr; +	typedef std::shared_ptr<const Connection> ConnectionCPtr;  }  #endif diff --git a/libdbpp/createMockDb.cpp b/libdbpp/createMockDb.cpp index 8e2dffe..006e30e 100644 --- a/libdbpp/createMockDb.cpp +++ b/libdbpp/createMockDb.cpp @@ -67,7 +67,7 @@ main(int argc, char ** argv)  	}  	std::cout << "Tearing down database..." << std::endl; -	delete mock; +	mock.reset();  	std::cout << " done." << std::endl;  	return 0;  } diff --git a/libdbpp/mockDatabase.cpp b/libdbpp/mockDatabase.cpp index 5e78ca1..80d4732 100644 --- a/libdbpp/mockDatabase.cpp +++ b/libdbpp/mockDatabase.cpp @@ -7,15 +7,6 @@  #include <plugins.impl.h>  #include <factory.impl.h> -namespace AdHoc { -	template <> -	PluginOf<DB::MockDatabase>::~PluginOf() -	{ -		// This implementation doesn't delete .implementation as -		// mock databases simply unregister themselves (via destructor) -		// when the mock framework tears them down. -	} -}  INSTANTIATEPLUGINOF(DB::MockDatabase);  INSTANTIATEFACTORY(DB::MockDatabase, const std::string &, const std::string &, const std::vector<boost::filesystem::path> &);  PLUGINRESOLVER(DB::MockDatabaseFactory, DB::Connection::resolvePlugin); @@ -24,18 +15,8 @@ namespace DB {  unsigned int MockDatabase::mocked = 0; -MockDatabase::MockDatabase(const std::string & name) : -	mockName(name) -{ -	AdHoc::PluginManager::getDefault()->add(AdHoc::PluginPtr(new AdHoc::PluginOf<MockDatabase>(this, mockName, __FILE__, __LINE__))); -} - -MockDatabase::~MockDatabase() -{ -	AdHoc::PluginManager::getDefault()->remove<MockDatabase>(mockName); -} -Connection * +ConnectionPtr  MockDatabase::openConnectionTo(const std::string & mockName)  {  	return AdHoc::PluginManager::getDefault()->get<DB::MockDatabase>(mockName)->implementation()->openConnection(); @@ -75,7 +56,6 @@ MockDatabase::PlaySchemaScript(DB::Connection * conn, const boost::filesystem::p  AdHocFormatter(MockServerDatabaseName, "libdbpp_mock_%?_%?_%?");  MockServerDatabase::MockServerDatabase(const std::string & masterdb, const std::string & name, const std::string & type) : -	MockDatabase(name),  	master(DB::ConnectionFactory::createNew(type, masterdb)),  	testDbName(MockServerDatabaseName::get(name, getpid(), ++mocked))  { @@ -83,7 +63,6 @@ MockServerDatabase::MockServerDatabase(const std::string & masterdb, const std::  MockServerDatabase::~MockServerDatabase()  { -	delete master;  }  const std::string & diff --git a/libdbpp/mockDatabase.h b/libdbpp/mockDatabase.h index 5d3ee52..2510c73 100644 --- a/libdbpp/mockDatabase.h +++ b/libdbpp/mockDatabase.h @@ -14,14 +14,13 @@ class DLL_PUBLIC MockDatabase : public AdHoc::AbstractPluginImplementation {  	public:  		/// Creates and registers a new database.  		/// @param mockName the name the database will register as. -		MockDatabase(const std::string & mockName); -		virtual ~MockDatabase(); +		virtual ~MockDatabase() = default;  		/// Open a connection to this database instance. -		virtual DB::Connection * openConnection() const = 0; +		virtual ConnectionPtr openConnection() const = 0;  		/// Open a connection to a named mock database. -		static Connection * openConnectionTo(const std::string &); +		static ConnectionPtr openConnectionTo(const std::string &);  	protected:  		/// Implementation specific method to create a new database. @@ -33,8 +32,6 @@ class DLL_PUBLIC MockDatabase : public AdHoc::AbstractPluginImplementation {  		/// Implementation specific method to drop a database.  		virtual void DropDatabase() const = 0; -		/// The name of this mocked database. -		const std::string mockName;  		/// Internal counter of mocked databases (for unique name generation)  		static unsigned int mocked;  }; @@ -45,7 +42,7 @@ class DLL_PUBLIC MockServerDatabase : public MockDatabase {  	public:  		/// Create and register a new database.  		/// @param masterdb connection to server with permissions to create a new database. -		/// @param name the name of the mock to register as. +		/// @param name the prefix to use when creating databases.  		/// @param type the database type.  		MockServerDatabase(const std::string & masterdb, const std::string & name, const std::string & type);  		virtual ~MockServerDatabase(); @@ -58,11 +55,32 @@ class DLL_PUBLIC MockServerDatabase : public MockDatabase {  		virtual void DropDatabase() const override;  		/// Connection to the master database. -		DB::Connection * master; +		DB::ConnectionPtr master;  		/// The name of the database that was created on the server.  		const std::string testDbName;  }; +template<typename T> +class PluginMock { +	public: +		PluginMock(const std::string & m, const std::string & name, const std::vector<boost::filesystem::path> & s) : +			mockName(name) +		{ +			AdHoc::PluginManager::getDefault()->create<MockDatabase, T>(mockName, __FILE__, __LINE__, m, name, s); +		} +		~PluginMock() +		{ +			AdHoc::PluginManager::getDefault()->remove<MockDatabase>(mockName); +		} +		const std::string & databaseName() const +		{ +			return std::dynamic_pointer_cast<MockServerDatabase>(AdHoc::PluginManager::getDefault()->get<MockDatabase>(mockName)->implementation())->databaseName(); +		} + +		/// The name of this mocked database. +		const std::string mockName; +}; +  typedef AdHoc::Factory<MockDatabase, const std::string &, const std::string &, const std::vector<boost::filesystem::path> &> MockDatabaseFactory;  } diff --git a/libdbpp/modifycommand.h b/libdbpp/modifycommand.h index 53152aa..e0aa42f 100644 --- a/libdbpp/modifycommand.h +++ b/libdbpp/modifycommand.h @@ -4,7 +4,6 @@  #include "command.h"  #include "error.h"  #include <visibility.h> -#include <boost/shared_ptr.hpp>  namespace DB {  	/// Exception thrown when an update affected no rows when some were expected. diff --git a/libdbpp/selectcommand.h b/libdbpp/selectcommand.h index 32b5cbe..0d2a4ca 100644 --- a/libdbpp/selectcommand.h +++ b/libdbpp/selectcommand.h @@ -9,8 +9,7 @@  #include <boost/multi_index/ordered_index_fwd.hpp>  #include <boost/multi_index/member.hpp>  #include <boost/multi_index/mem_fun.hpp> -#include <boost/function/function_fwd.hpp> -#include <boost/shared_ptr.hpp> +#include <functional>  #include <visibility.h>  #include <exception.h> @@ -117,7 +116,7 @@ namespace DB {  			/// Get the index of a column by name.  			unsigned int getOrdinal(const Glib::ustring &) const;  			/// Push each row through a function accepting one value per column -			template<typename ... Fn, typename Func = boost::function<void(Fn...)>> +			template<typename ... Fn, typename Func = std::function<void(Fn...)>>  			void forEachRow(const Func & func);  			/// Support for a C++ row range for  			template<typename ... Fn> diff --git a/libdbpp/tablepatch.cpp b/libdbpp/tablepatch.cpp index 40a1b41..c7b5597 100644 --- a/libdbpp/tablepatch.cpp +++ b/libdbpp/tablepatch.cpp @@ -27,7 +27,7 @@ DB::Connection::patchTable(TablePatch * tp)  	if (!inTx()) {  		throw TransactionRequired();  	} -	TransactionScope tx(this); +	TransactionScope tx(shared_from_this());  	bool ownedExpr = false;  	if (!tp->srcExpr && !tp->src.empty()) {  		tp->srcExpr = new DB::StaticSqlWriter(tp->src); @@ -61,7 +61,7 @@ push(boost::format & f, typename Container::const_iterator & i, const Value & v,  template<typename Separator, typename Container, typename ... Ps>  static inline unsigned int -appendIf(AdHoc::Buffer & buf, const Container & c, const boost::function<bool(const typename Container::const_iterator)> & sel, const Separator & sep, const std::string & fmts, const Ps & ... ps) +appendIf(AdHoc::Buffer & buf, const Container & c, const std::function<bool(const typename Container::const_iterator)> & sel, const Separator & sep, const std::string & fmts, const Ps & ... ps)  {  	auto fmt = AdHoc::Buffer::getFormat(fmts);  	unsigned int x = 0; @@ -70,8 +70,8 @@ appendIf(AdHoc::Buffer & buf, const Container & c, const boost::function<bool(co  			if (x > 0) {  				buf.appendbf("%s", sep);  			} -			push<Container>(*fmt, i, ps...); -			buf.append(fmt->str()); +			push<Container>(fmt, i, ps...); +			buf.append(fmt.str());  			x += 1;  		}  	} @@ -189,7 +189,7 @@ DB::Connection::patchDeletes(TablePatch * tp)  				break;  			}  	} -	auto del = ModifyCommandPtr(newModifyCommand(toDelSql)); +	auto del = modify(toDelSql);  	unsigned int offset = 0;  	tp->srcExpr->bindParams(del.get(), offset);  	if (tp->insteadOfDelete) { @@ -271,7 +271,7 @@ DB::Connection::patchUpdates(TablePatch * tp)  				// -----------------------------------------------------------------  				// Execute the bulk update command ---------------------------------  				// ----------------------------------------------------------------- -				auto upd = ModifyCommandPtr(newModifyCommand(updSql)); +				auto upd = modify(updSql);  				unsigned int offset = 0;  				tp->srcExpr->bindParams(upd.get(), offset);  				if (tp->where) { @@ -299,7 +299,7 @@ DB::Connection::patchUpdates(TablePatch * tp)  				// -----------------------------------------------------------------  				// Execute the bulk update command ---------------------------------  				// ----------------------------------------------------------------- -				auto upd = ModifyCommandPtr(newModifyCommand(updSql)); +				auto upd = modify(updSql);  				unsigned int offset = 0;  				tp->where->bindParams(upd.get(), offset);  				if (tp->where) { @@ -357,7 +357,7 @@ DB::Connection::patchInserts(TablePatch * tp)  	append(toInsSql, tp->cols, ", ", "%s", selfCols);  	toInsSql.append(")\n");  	patchInsertsSelect(toInsSql, tp); -	auto ins = ModifyCommandPtr(newModifyCommand(toInsSql)); +	auto ins = modify(toInsSql);  	unsigned int offset = 0;  	tp->srcExpr->bindParams(ins.get(), offset);  	if (tp->order) { diff --git a/libdbpp/tablepatch.h b/libdbpp/tablepatch.h index 84fada1..f942401 100644 --- a/libdbpp/tablepatch.h +++ b/libdbpp/tablepatch.h @@ -7,7 +7,7 @@  #include <connection.h>  #include <modifycommand.h>  #include <selectcommand.h> -#include <boost/function.hpp> +#include <functional>  namespace DB {  	class SqlWriter; @@ -20,7 +20,7 @@ namespace DB {  			typedef std::set<ColumnName> ColumnNames;  			typedef ColumnNames PrimaryKey;  			typedef PrimaryKey::const_iterator PKI; -			typedef boost::function<void(DB::SelectCommandPtr)> AuditFunction; +			typedef std::function<void(DB::SelectCommandPtr)> AuditFunction;  		public:  			/// Default constructor diff --git a/libdbpp/unittests/Jamfile.jam b/libdbpp/unittests/Jamfile.jam index 83e1ad4..69b25e9 100644 --- a/libdbpp/unittests/Jamfile.jam +++ b/libdbpp/unittests/Jamfile.jam @@ -6,7 +6,7 @@ lib pq ;  lib boost_date_time ;  lib boost_system ;  lib boost_utf : : <name>boost_unit_test_framework ; -lib IceUtil ; +lib Ice++11 ;  run  	testConnection.cpp mockdb.cpp @@ -105,7 +105,7 @@ run  	<library>..//adhocutil  	<library>dbpp-local-postgresql  	<library>boost_utf -	<library>IceUtil +	<library>Ice++11  	<dependency>util.sql  	:  	testUtils diff --git a/libdbpp/unittests/mockdb.cpp b/libdbpp/unittests/mockdb.cpp index cf29e01..6b5a7cc 100644 --- a/libdbpp/unittests/mockdb.cpp +++ b/libdbpp/unittests/mockdb.cpp @@ -46,29 +46,29 @@ MockDb::execute(const std::string & sql, const DB::CommandOptions *)  	executed.push_back(sql);  } -DB::SelectCommand * -MockDb::newSelectCommand(const std::string &, const DB::CommandOptions *) +DB::SelectCommandPtr +MockDb::select(const std::string &, const DB::CommandOptions *)  {  	return nullptr;  } -DB::ModifyCommand * -MockDb::newModifyCommand(const std::string &, const DB::CommandOptions *) +DB::ModifyCommandPtr +MockDb::modify(const std::string &, const DB::CommandOptions *)  {  	return nullptr;  } -MockMock::MockMock(const std::string &, const std::string & name, const std::vector<boost::filesystem::path> & ss) : -	DB::MockDatabase(name) +MockMock::MockMock(const std::string &, const std::string &, const std::vector<boost::filesystem::path> & ss) : +	DB::MockDatabase()  {  	CreateNewDatabase();  	PlaySchemaScripts(ss);  } -DB::Connection * +DB::ConnectionPtr  MockMock::openConnection() const  { -	return new MockDb(""); +	return std::make_shared<MockDb>("");  }  void diff --git a/libdbpp/unittests/mockdb.h b/libdbpp/unittests/mockdb.h index b67dfe4..53fd451 100644 --- a/libdbpp/unittests/mockdb.h +++ b/libdbpp/unittests/mockdb.h @@ -16,8 +16,8 @@ class MockDb : public DB::Connection {  		DB::BulkUpdateStyle bulkUpdateStyle() const override;  		void execute(const std::string & sql, const DB::CommandOptions *) override; -		DB::SelectCommand * newSelectCommand(const std::string &, const DB::CommandOptions *) override; -		DB::ModifyCommand * newModifyCommand(const std::string &, const DB::CommandOptions *) override; +		DB::SelectCommandPtr select(const std::string &, const DB::CommandOptions *) override; +		DB::ModifyCommandPtr modify(const std::string &, const DB::CommandOptions *) override;  		mutable std::vector<std::string> executed;  }; @@ -25,7 +25,7 @@ class MockDb : public DB::Connection {  class MockMock : public DB::MockDatabase {  	public:  		MockMock(const std::string &, const std::string &, const std::vector<boost::filesystem::path> &); -		DB::Connection * openConnection() const override; +		DB::ConnectionPtr openConnection() const override;  		void CreateNewDatabase() const override;  		void DropDatabase() const override;  }; diff --git a/libdbpp/unittests/testConnection.cpp b/libdbpp/unittests/testConnection.cpp index e738511..7229f6e 100644 --- a/libdbpp/unittests/testConnection.cpp +++ b/libdbpp/unittests/testConnection.cpp @@ -16,9 +16,8 @@ BOOST_AUTO_TEST_CASE( create )  	auto mock = DB::ConnectionFactory::createNew("MockDb", "doesn't matter");  	BOOST_REQUIRE(mock);  	// MockDb is fake, just returns nullptr, but the call should otherwise succeed. -	BOOST_REQUIRE(!mock->newModifyCommand("")); -	BOOST_REQUIRE(!mock->newSelectCommand("")); -	delete mock; +	BOOST_REQUIRE(!mock->modify("")); +	BOOST_REQUIRE(!mock->select(""));  }  BOOST_AUTO_TEST_CASE( resolve ) @@ -42,7 +41,6 @@ BOOST_AUTO_TEST_CASE( finish )  	BOOST_REQUIRE_THROW(mock->finish(), DB::TransactionStillOpen);  	mock->commitTx();  	mock->finish(); -	delete mock;  }  BOOST_AUTO_TEST_CASE( tx ) @@ -62,7 +60,6 @@ BOOST_AUTO_TEST_CASE( tx )  	BOOST_REQUIRE_EQUAL(true, mock->inTx());  	mock->rollbackTx(); // 0  	BOOST_REQUIRE_EQUAL(false, mock->inTx()); -	delete mock;  }  BOOST_AUTO_TEST_CASE( txscope ) @@ -88,7 +85,7 @@ BOOST_AUTO_TEST_CASE( txscope )  BOOST_AUTO_TEST_CASE( savepoints )  {  	auto mock = DB::ConnectionFactory::createNew("MockDb", "doesn't matter"); -	MockDb * mockdb = dynamic_cast<MockDb *>(mock); +	auto mockdb = std::dynamic_pointer_cast<MockDb>(mock);  	BOOST_REQUIRE(mockdb);  	mock->savepoint("sp");  	BOOST_REQUIRE_EQUAL("SAVEPOINT sp", *mockdb->executed.rbegin()); @@ -100,7 +97,6 @@ BOOST_AUTO_TEST_CASE( savepoints )  	BOOST_REQUIRE_EQUAL("SAVEPOINT sp2", *mockdb->executed.rbegin());  	mock->rollbackToSavepoint("sp1");  	BOOST_REQUIRE_EQUAL("ROLLBACK TO SAVEPOINT sp1", *mockdb->executed.rbegin()); -	delete mock;  }  BOOST_AUTO_TEST_CASE( commandOptions ) @@ -118,7 +114,7 @@ BOOST_AUTO_TEST_CASE( commandOptionsPq1 )  		{"page-size", "5"}  	});  	BOOST_REQUIRE(optsBase); -	auto optsPq = dynamic_cast<PQ::CommandOptions *>(optsBase); +	auto optsPq = std::dynamic_pointer_cast<PQ::CommandOptions>(optsBase);  	BOOST_REQUIRE(optsPq);  	BOOST_REQUIRE(optsBase->hash);  	BOOST_REQUIRE_EQUAL(12345, *optsBase->hash); @@ -132,7 +128,7 @@ BOOST_AUTO_TEST_CASE( commandOptionsPq2 )  		{"page-size", "50"}  	});  	BOOST_REQUIRE(optsBase); -	auto optsPq = dynamic_cast<PQ::CommandOptions *>(optsBase); +	auto optsPq = std::dynamic_pointer_cast<PQ::CommandOptions>(optsBase);  	BOOST_REQUIRE(optsPq);  	BOOST_REQUIRE(optsBase->hash);  	BOOST_REQUIRE_EQUAL(123456, *optsBase->hash); diff --git a/libdbpp/unittests/testConnectionPool.cpp b/libdbpp/unittests/testConnectionPool.cpp index 5c73f1e..124df5b 100644 --- a/libdbpp/unittests/testConnectionPool.cpp +++ b/libdbpp/unittests/testConnectionPool.cpp @@ -5,10 +5,10 @@  #include <pq-mock.h>  #include <buffer.h> -class MockPool : public PQ::Mock, public DB::ConnectionPool { +class MockPool : public DB::PluginMock<PQ::Mock>, public DB::ConnectionPool {  	public:  		MockPool() : -			PQ::Mock("user=postgres dbname=postgres", "pqmock", { }), +			PluginMock<PQ::Mock>("user=postgres dbname=postgres", "pqmock", { }),  			DB::ConnectionPool(4, 2, "postgresql", stringbf("user=postgres dbname=%s", databaseName()))  		{  		} diff --git a/libdbpp/unittests/testPatch.cpp b/libdbpp/unittests/testPatch.cpp index 39ad5e3..b9ede04 100644 --- a/libdbpp/unittests/testPatch.cpp +++ b/libdbpp/unittests/testPatch.cpp @@ -10,10 +10,10 @@  #include <buffer.h>  #include <selectcommandUtil.impl.h> -class Mock : public PQ::Mock { +class Mock : public DB::PluginMock<PQ::Mock> {  	public:  		Mock() : -			PQ::Mock("user=postgres dbname=postgres", "pqmock", { rootDir / "patch.sql" }) +			DB::PluginMock<PQ::Mock>("user=postgres dbname=postgres", "pqmock", { rootDir / "patch.sql" })  		{  		}  }; diff --git a/libdbpp/unittests/testUtils.cpp b/libdbpp/unittests/testUtils.cpp index 2dca88e..c926a47 100644 --- a/libdbpp/unittests/testUtils.cpp +++ b/libdbpp/unittests/testUtils.cpp @@ -13,9 +13,9 @@  #include <IceUtil/Optional.h>  #include <testCore.h> -class StandardMockDatabase : public PQ::Mock { +class StandardMockDatabase : public DB::PluginMock<PQ::Mock> {  	public: -		StandardMockDatabase() : PQ::Mock("user=postgres dbname=postgres", "pqmock", { +		StandardMockDatabase() : DB::PluginMock<PQ::Mock>("user=postgres dbname=postgres", "pqmock", {  				rootDir / "util.sql" })  		{  		} @@ -25,8 +25,8 @@ BOOST_GLOBAL_FIXTURE( StandardMockDatabase );  BOOST_AUTO_TEST_CASE( forEachRow )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c, d, e, f FROM forEachRow ORDER BY a LIMIT 1")); +	auto db = DB::MockDatabase::openConnectionTo("pqmock"); +	auto sel = db->select("SELECT a, b, c, d, e, f FROM forEachRow ORDER BY a LIMIT 1");  	sel->forEachRow<int64_t, double, std::string, boost::posix_time::ptime, boost::posix_time::time_duration, bool>(  			[](auto a, auto b, auto c, auto d, auto e, auto f) {  				BOOST_REQUIRE_EQUAL(1, a); @@ -40,9 +40,9 @@ BOOST_AUTO_TEST_CASE( forEachRow )  BOOST_AUTO_TEST_CASE( forEachRowNulls )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c, d, e, f FROM forEachRow ORDER BY a DESC LIMIT 1")); -	sel->forEachRow<int64_t, boost::optional<double>, std::string, boost::optional<boost::posix_time::ptime>, boost::optional<boost::posix_time::time_duration>, bool>( +	auto db = DB::MockDatabase::openConnectionTo("pqmock"); +	auto sel = db->select("SELECT a, b, c, d, e, f FROM forEachRow ORDER BY a DESC LIMIT 1"); +	sel->forEachRow<int64_t, std::optional<double>, std::string, std::optional<boost::posix_time::ptime>, std::optional<boost::posix_time::time_duration>, bool>(  			[](auto a, auto b, auto c, auto d, auto e, auto f) {  				BOOST_REQUIRE_EQUAL(2, a);  				BOOST_REQUIRE(b); @@ -56,7 +56,7 @@ BOOST_AUTO_TEST_CASE( forEachRowNulls )  BOOST_AUTO_TEST_CASE( stdforOverRows )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); +	auto db = DB::MockDatabase::openConnectionTo("pqmock");  	unsigned int count = 0;  	int64_t totalOfa = 0;  	std::string totalOfc; @@ -82,8 +82,8 @@ BOOST_AUTO_TEST_CASE( execute )  BOOST_AUTO_TEST_CASE( columns )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c, d, e FROM forEachRow ORDER BY a LIMIT 1")); +	auto db = DB::MockDatabase::openConnectionTo("pqmock"); +	auto sel = db->select("SELECT a, b, c, d, e FROM forEachRow ORDER BY a LIMIT 1");  	sel->execute();  	BOOST_REQUIRE_THROW((*sel)[5], DB::ColumnIndexOutOfRange);  	BOOST_REQUIRE_THROW((*sel)[-1], DB::ColumnIndexOutOfRange); @@ -101,8 +101,8 @@ BOOST_AUTO_TEST_CASE( columns )  BOOST_AUTO_TEST_CASE( extract )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c FROM forEachRow WHERE f")); +	auto db = DB::MockDatabase::openConnectionTo("pqmock"); +	auto sel = db->select("SELECT a, b, c FROM forEachRow WHERE f");  	BOOST_REQUIRE(sel->fetch());  	int64_t lint;  	double ldouble; @@ -154,16 +154,16 @@ BOOST_AUTO_TEST_CASE( bulkLoadFile )  BOOST_AUTO_TEST_CASE( nullBind )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); +	auto db = DB::MockDatabase::openConnectionTo("pqmock");  	auto ins = db->modify("INSERT INTO forEachRow VALUES(?, ?, ?, ?, ?, ?)"); -	ins->bindParamI(0, boost::optional<int>()); -	ins->bindParamF(1, boost::optional<double>()); -	ins->bindParamS(2, boost::optional<Glib::ustring>()); -	ins->bindParamT(3, boost::optional<boost::posix_time::ptime>()); -	ins->bindParamT(4, boost::optional<boost::posix_time::time_duration>()); -	ins->bindParamB(5, boost::optional<bool>()); +	ins->bindParamI(0, std::optional<int>()); +	ins->bindParamF(1, std::optional<double>()); +	ins->bindParamS(2, std::optional<Glib::ustring>()); +	ins->bindParamT(3, std::optional<boost::posix_time::ptime>()); +	ins->bindParamT(4, std::optional<boost::posix_time::time_duration>()); +	ins->bindParamB(5, std::optional<bool>());  	ins->execute(); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c, d, e, f FROM forEachRow WHERE a IS NULL AND b IS NULL AND c IS NULL AND d IS NULL AND e IS NULL AND f IS NULL")); +	auto sel = db->select("SELECT a, b, c, d, e, f FROM forEachRow WHERE a IS NULL AND b IS NULL AND c IS NULL AND d IS NULL AND e IS NULL AND f IS NULL");  	unsigned int count = 0;  	for (const auto & row : sel->as<>()) {  		(void)row; @@ -183,7 +183,7 @@ BOOST_AUTO_TEST_CASE( iceNullBind )  	ins->bindParamT(4, IceUtil::Optional<boost::posix_time::time_duration>());  	ins->bindParamB(5, IceUtil::Optional<bool>());  	ins->execute(); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c, d, e, f FROM forEachRow WHERE a IS NULL AND b IS NULL AND c IS NULL AND d IS NULL AND e IS NULL AND f IS NULL")); +	auto sel = db->select("SELECT a, b, c, d, e, f FROM forEachRow WHERE a IS NULL AND b IS NULL AND c IS NULL AND d IS NULL AND e IS NULL AND f IS NULL");  	unsigned int count = 0;  	for (const auto & row : sel->as<>()) {  		(void)row; @@ -213,8 +213,8 @@ BOOST_AUTO_TEST_CASE( charStarBindNull )  	ins->bindParamS(1, ccsc2);  	ins->execute();  	free(cs2); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, c FROM forEachRow")); -	for (const auto & row : sel->as<boost::optional<int64_t>, boost::optional<std::string>>()) { +	auto sel = db->select("SELECT a, c FROM forEachRow"); +	for (const auto & row : sel->as<std::optional<int64_t>, std::optional<std::string>>()) {  		BOOST_REQUIRE(row[0].isNull());  		BOOST_REQUIRE(!row[1].isNull());  	} @@ -250,9 +250,9 @@ BOOST_AUTO_TEST_CASE( bindIntPtr )  	ins->bindParamI(1, cisc2);  	ins->execute();  	delete is2; -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b FROM forEachRow")); +	auto sel = db->select("SELECT a, b FROM forEachRow");  	unsigned int total = 0; -	for (const auto & row : sel->as<boost::optional<int64_t>, boost::optional<double>>()) { +	for (const auto & row : sel->as<std::optional<int64_t>, std::optional<double>>()) {  		BOOST_REQUIRE(row[0].isNull());  		BOOST_REQUIRE(!row[1].isNull());  		total += *row.value<1>(); @@ -336,13 +336,13 @@ testExtractT(DB::SelectCommandPtr sel) {  	T test;  	(void)test;  	for (const auto & row : sel->as<T>()) { testExtractT(row); } -	for (const auto & row : sel->as<boost::optional<T>>()) { testExtractT(row); } +	for (const auto & row : sel->as<std::optional<T>>()) { testExtractT(row); }  }  BOOST_AUTO_TEST_CASE( testExtractTypes )  { -	auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock")); -	auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT 1 FROM forEachRow LIMIT 0")); +	auto db = DB::MockDatabase::openConnectionTo("pqmock"); +	auto sel = db->select("SELECT 1 FROM forEachRow LIMIT 0");  	// testExtractT<int8_t>(sel);  	// testExtractT<int16_t>(sel);  	// testExtractT<int32_t>(sel);  | 
