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); } |