diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-07-19 21:08:59 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-07-19 21:24:12 +0100 | 
| commit | 03dc5e48d45a3de83e23342fd7422983fdb48e6b (patch) | |
| tree | d37a731f1960accc210e2de9d3b3918e83e48faa | |
| parent | Always pass the model part to the child handler, the handler should decide wh... (diff) | |
| download | slicer-03dc5e48d45a3de83e23342fd7422983fdb48e6b.tar.bz2 slicer-03dc5e48d45a3de83e23342fd7422983fdb48e6b.tar.xz slicer-03dc5e48d45a3de83e23342fd7422983fdb48e6b.zip  | |
Fix and tidy the checking of metadata in SQL serializers
| -rw-r--r-- | slicer/db/sqlCommon.cpp | 34 | ||||
| -rw-r--r-- | slicer/db/sqlCommon.h | 16 | ||||
| -rw-r--r-- | slicer/db/sqlInsertSerializer.cpp | 39 | ||||
| -rw-r--r-- | slicer/db/sqlTablePatchSerializer.cpp | 8 | ||||
| -rw-r--r-- | slicer/db/sqlUpdateSerializer.cpp | 51 | ||||
| -rw-r--r-- | slicer/db/testPatch.cpp | 7 | 
6 files changed, 106 insertions, 49 deletions
diff --git a/slicer/db/sqlCommon.cpp b/slicer/db/sqlCommon.cpp index d484967..5618b29 100644 --- a/slicer/db/sqlCommon.cpp +++ b/slicer/db/sqlCommon.cpp @@ -1,7 +1,41 @@  #include <sqlExceptions.h>  #include <compileTimeFormatter.h> +#include "sqlCommon.h" +#include <metadata.h>  namespace Slicer { +	const std::string md_pkey = "db:pkey"; +	const std::string md_auto = "db:auto"; +	const std::string md_ignore = "db:ignore"; +	const std::string md_global_ignore = "ignore"; + +	bool isPKey(HookCommonPtr h) +	{ +		return metaDataFlagSet(h->GetMetadata(), md_pkey) && isBind(h); +	} + +	bool isAuto(HookCommonPtr h) +	{ +		return metaDataFlagSet(h->GetMetadata(), md_auto) && isBind(h); +	} + +	bool isNotAuto(HookCommonPtr h) +	{ +		return metaDataFlagNotSet(h->GetMetadata(), md_auto) && isBind(h); +	} + +	bool isBind(HookCommonPtr h) +	{ +		return metaDataFlagNotSet(h->GetMetadata(), md_global_ignore) && +			metaDataFlagNotSet(h->GetMetadata(), md_ignore); +	} + +	bool isValue(HookCommonPtr h) +	{ +		return metaDataFlagNotSet(h->GetMetadata(), md_auto) && +			metaDataFlagNotSet(h->GetMetadata(), md_pkey) && isBind(h); +	} +  	void TooManyRowsReturned::ice_print(std::ostream & s) const  	{  		s << "Too many rows returned"; diff --git a/slicer/db/sqlCommon.h b/slicer/db/sqlCommon.h new file mode 100644 index 0000000..2471d4c --- /dev/null +++ b/slicer/db/sqlCommon.h @@ -0,0 +1,16 @@ +#ifndef SLICER_DB_SQLCOMMON_H +#define SLICER_DB_SQLCOMMON_H + +#include <string> +#include <modelParts.h> + +namespace Slicer { +	bool isPKey(HookCommonPtr); +	bool isAuto(HookCommonPtr); +	bool isNotAuto(HookCommonPtr); +	bool isBind(HookCommonPtr); +	bool isValue(HookCommonPtr); +} + +#endif + diff --git a/slicer/db/sqlInsertSerializer.cpp b/slicer/db/sqlInsertSerializer.cpp index 39925cd..04eae93 100644 --- a/slicer/db/sqlInsertSerializer.cpp +++ b/slicer/db/sqlInsertSerializer.cpp @@ -2,14 +2,13 @@  #include <common.h>  #include <sqlExceptions.h>  #include "sqlBinder.h" +#include "sqlCommon.h"  #include <buffer.h>  #include <modifycommand.h>  #include <slicer/metadata.h>  #include <boost/numeric/conversion/cast.hpp>  namespace Slicer { -	const std::string md_auto = "db:auto"; -  	SqlInsertSerializer::SqlInsertSerializer(DB::Connection * const c, const std::string & t) :  		connection(c),  		tableName(t) @@ -87,27 +86,29 @@ namespace Slicer {  	{  		SqlAutoIdInsertSerializer::bindObjectAndExecute(cmp, ins);  		cmp->OnEachChild([&ins, this](const std::string &, ModelPartPtr cmp, HookCommonPtr h) { -				if (metaDataFlagSet(h->GetMetadata(), md_auto)) { -					cmp->SetValue(new IdSave(connection)); -				} -			}); +			if (isAuto(h)) { +				cmp->SetValue(new IdSave(connection)); +			} +		});  	}  	void -	SqlInsertSerializer::bindObjectAndExecuteField(int & paramNo, DB::ModifyCommand * ins, Slicer::ModelPartPtr cmp, HookCommonPtr) const +	SqlInsertSerializer::bindObjectAndExecuteField(int & paramNo, DB::ModifyCommand * ins, Slicer::ModelPartPtr cmp, HookCommonPtr h) const  	{ -		if (cmp->HasValue()) { -			cmp->GetValue(new SqlBinder(*ins, paramNo++)); -		} -		else { -			ins->bindNull(paramNo++); +		if (isBind(h)) { +			if (cmp->HasValue()) { +				cmp->GetValue(new SqlBinder(*ins, paramNo++)); +			} +			else { +				ins->bindNull(paramNo++); +			}  		}  	}  	void  	SqlAutoIdInsertSerializer::bindObjectAndExecuteField(int & paramNo, DB::ModifyCommand * ins, Slicer::ModelPartPtr cmp, HookCommonPtr h) const  	{ -		if (metaDataFlagNotSet(h->GetMetadata(), md_auto)) { +		if (isNotAuto(h)) {  			SqlInsertSerializer::bindObjectAndExecuteField(paramNo, ins, cmp, h);  		}  	} @@ -128,18 +129,20 @@ namespace Slicer {  	}  	void -	SqlInsertSerializer::createInsertField(int & fieldNo, AdHoc::Buffer & insert, const std::string & name, HookCommonPtr) const +	SqlInsertSerializer::createInsertField(int & fieldNo, AdHoc::Buffer & insert, const std::string & name, HookCommonPtr h) const  	{ -		if (fieldNo++) { -			insert.append(", "); +		if (isBind(h)) { +			if (fieldNo++) { +				insert.append(", "); +			} +			insert.append(name);  		} -		insert.append(name);  	}  	void  	SqlAutoIdInsertSerializer::createInsertField(int & fieldNo, AdHoc::Buffer & insert, const std::string & name, HookCommonPtr h) const  	{ -		if (metaDataFlagNotSet(h->GetMetadata(), md_auto)) { +		if (isNotAuto(h)) {  			if (fieldNo++) {  				insert.append(", ");  			} diff --git a/slicer/db/sqlTablePatchSerializer.cpp b/slicer/db/sqlTablePatchSerializer.cpp index 20b0d82..50505cb 100644 --- a/slicer/db/sqlTablePatchSerializer.cpp +++ b/slicer/db/sqlTablePatchSerializer.cpp @@ -1,13 +1,11 @@  #include "sqlTablePatchSerializer.h"  #include "sqlInsertSerializer.h" +#include "sqlCommon.h"  #include <slicer/metadata.h>  #include <compileTimeFormatter.h>  #include <scopeExit.h>  namespace Slicer { -	const std::string md_pkey = "db:pkey"; -	const std::string ignore = "ignore"; -  	AdHocFormatter(ttname, "slicer_tmp_%?");  	SqlTablePatchSerializer::SqlTablePatchSerializer(DB::Connection * db, DB::TablePatch & tp) :  		db(db), @@ -34,12 +32,12 @@ namespace Slicer {  		auto mp = mpr->GetContainedModelPart();  		mp->OnEachChild([this](const auto & name, const auto &, const auto & h) { -			if (metaDataFlagSet(h->GetMetadata(), md_pkey)) { +			if (isPKey(h)) {  				tablePatch.pk.insert(name);  			}  		});  		mp->OnEachChild([this](const auto & name, const auto &, const auto & h) { -			if (metaDataFlagNotSet(h->GetMetadata(), ignore)) { +			if (isBind(h)) {  				tablePatch.cols.insert(name);  			}  		}); diff --git a/slicer/db/sqlUpdateSerializer.cpp b/slicer/db/sqlUpdateSerializer.cpp index 0289a90..f07c421 100644 --- a/slicer/db/sqlUpdateSerializer.cpp +++ b/slicer/db/sqlUpdateSerializer.cpp @@ -2,13 +2,12 @@  #include <sqlExceptions.h>  #include <common.h>  #include "sqlBinder.h" +#include "sqlCommon.h"  #include <buffer.h>  #include <modifycommand.h>  #include <slicer/metadata.h>  namespace Slicer { -	const std::string md_pkey = "db:pkey"; -  	SqlUpdateSerializer::SqlUpdateSerializer(DB::Connection * const c, const std::string & t) :  		connection(c),  		tableName(t) @@ -51,20 +50,20 @@ namespace Slicer {  	{  		int paramNo = 0;  		cmp->OnEachChild([&upd, ¶mNo](const std::string &, ModelPartPtr cmp, HookCommonPtr h) { -				if (metaDataFlagNotSet(h->GetMetadata(), md_pkey)) { -					if (cmp->HasValue()) { -						cmp->GetValue(new SqlBinder(*upd, paramNo++)); -					} -					else { -						upd->bindNull(paramNo++); -					} -				} -			}); -		cmp->OnEachChild([&upd, ¶mNo](const std::string &, ModelPartPtr cmp, HookCommonPtr h) { -				if (metaDataFlagSet(h->GetMetadata(), md_pkey)) { +			if (isValue(h)) { +				if (cmp->HasValue()) {  					cmp->GetValue(new SqlBinder(*upd, paramNo++));  				} -			}); +				else { +					upd->bindNull(paramNo++); +				} +			} +		}); +		cmp->OnEachChild([&upd, ¶mNo](const std::string &, ModelPartPtr cmp, HookCommonPtr h) { +			if (isPKey(h)) { +				cmp->GetValue(new SqlBinder(*upd, paramNo++)); +			} +		});  		if (upd->execute() == 0) {  			throw NoRowsFound();  		} @@ -77,23 +76,23 @@ namespace Slicer {  		update.appendbf("UPDATE %s SET ", tableName);  		int fieldNo = 0;  		mp->OnEachChild([&update, &fieldNo]( const std::string & name, ModelPartPtr, HookCommonPtr h) { -				if (metaDataFlagNotSet(h->GetMetadata(), md_pkey)) { -					if (fieldNo++) { -						update.append(", "); -					} -					update.appendbf("%s = ?", name); +			if (isValue(h)) { +				if (fieldNo++) { +					update.append(", ");  				} -			}); +				update.appendbf("%s = ?", name); +			} +		});  		update.append(" WHERE ", AdHoc::Buffer::Use);  		fieldNo = 0;  		mp->OnEachChild([&update, &fieldNo]( const std::string & name, ModelPartPtr, HookCommonPtr h) { -				if (metaDataFlagSet(h->GetMetadata(), md_pkey)) { -					if (fieldNo++) { -						update.append(" AND "); -					} -					update.appendbf("%s = ?", name); +			if (isPKey(h)) { +				if (fieldNo++) { +					update.append(" AND ");  				} -			}); +				update.appendbf("%s = ?", name); +			} +		});  		return ModifyPtr(connection->newModifyCommand(update));  	}  } diff --git a/slicer/db/testPatch.cpp b/slicer/db/testPatch.cpp index bb7979b..333b806 100644 --- a/slicer/db/testPatch.cpp +++ b/slicer/db/testPatch.cpp @@ -14,6 +14,7 @@  BOOST_TEST_DONT_PRINT_LOG_VALUE(TestModule::DateTime);  BOOST_TEST_DONT_PRINT_LOG_VALUE(TestModule::IsoDate);  BOOST_TEST_DONT_PRINT_LOG_VALUE(TestDatabase::Timespan); +BOOST_TEST_DONT_PRINT_LOG_VALUE(DB::PrimaryKey);  // LCOV_EXCL_STOP  class StandardMockDatabase : public PQ::Mock { @@ -43,5 +44,11 @@ BOOST_AUTO_TEST_CASE( insert_builtins )  	auto cmd = db->select("SELECT COUNT(*) FROM builtins");  	auto c = Slicer::DeserializeAny<Slicer::SqlSelectDeserializer, int>(*cmd);  	BOOST_REQUIRE_EQUAL(2, c); +	BOOST_REQUIRE_EQUAL(2, tp.pk.size()); +	DB::PrimaryKey pk = {"mint", "mlong"}; +	BOOST_REQUIRE_EQUAL(pk, tp.pk); +	BOOST_REQUIRE_EQUAL(8, tp.cols.size()); +	DB::ColumnNames cols = {"mbool", "mbyte", "mdouble", "mfloat", "mint", "mlong", "mshort", "mstring"}; +	BOOST_REQUIRE_EQUAL(cols, tp.cols);  }  | 
