From: Sangwan Kwon Date: Tue, 18 Feb 2020 03:42:47 +0000 (+0900) Subject: query-builder: Bind operand to update clause X-Git-Tag: submit/tizen/20200810.073515~79 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=36e2ba30306058ce4a416f04a254bec895111675;p=platform%2Fcore%2Fsecurity%2Fvist.git query-builder: Bind operand to update clause ex) AdminTable.update(Admin::Id = id, Admin::Pkg = "pkg"); - Before: "UPDATE admin SET id = ?, pkg = ?" - After: "UPDATE admin SET id = 1, pkg = 'pkg'" Signed-off-by: Sangwan Kwon --- diff --git a/src/vist/policy/policy-storage.cpp b/src/vist/policy/policy-storage.cpp index 6fe7a7c..e4f4f4a 100644 --- a/src/vist/policy/policy-storage.cpp +++ b/src/vist/policy/policy-storage.cpp @@ -193,12 +193,9 @@ void PolicyStorage::activate(const std::string& admin, bool state) THROW(ErrCode::LogicError) << "Not exist admin: " << admin; DEBUG(VIST) << "Activate admin: " << admin; - /// Admin::Activated - std::string query = schema::AdminTable.update(Admin::Activated) + std::string query = schema::AdminTable.update(Admin::Activated = static_cast(state)) .where(Admin::Name == admin); database::Statement stmt(*this->database, query); - stmt.bind(1, static_cast(state)); - stmt.bind(2, admin); if (!stmt.exec()) THROW(ErrCode::RuntimeError) << stmt.getErrorMessage(); @@ -236,13 +233,10 @@ void PolicyStorage::update(const std::string& admin, if (this->definitions.find(policy) == this->definitions.end()) THROW(ErrCode::LogicError) << "Not exist policy: " << policy; - std::string query = schema::PolicyManagedTable.update(PolicyManaged::Value) + std::string query = schema::PolicyManagedTable.update(PolicyManaged::Value = value.dump()) .where(PolicyManaged::Admin == admin && PolicyManaged::Policy == policy); database::Statement stmt(*this->database, query); - stmt.bind(1, value.dump()); - stmt.bind(2, admin); - stmt.bind(3, policy); if (!stmt.exec()) THROW(ErrCode::RuntimeError) << stmt.getErrorMessage(); diff --git a/src/vist/query-builder/column.hpp b/src/vist/query-builder/column.hpp index b37b514..bb3c877 100644 --- a/src/vist/query-builder/column.hpp +++ b/src/vist/query-builder/column.hpp @@ -37,6 +37,8 @@ struct Column final { std::string name; Type type; + template + Assign, Value> operator=(Value value) const; template Equal, Value> operator==(Value value) const; template @@ -45,6 +47,13 @@ struct Column final { Lesser, Value> operator<(Value value) const; }; +template +template +Assign, Value> Column::operator=(Value value) const +{ + return {*this, value}; +} + template template Equal, Value> Column::operator==(Value value) const diff --git a/src/vist/query-builder/crud.hpp b/src/vist/query-builder/crud.hpp index 616fe03..cfdc2a0 100644 --- a/src/vist/query-builder/crud.hpp +++ b/src/vist/query-builder/crud.hpp @@ -21,6 +21,7 @@ #include #include +#include namespace vist { namespace tsqb { @@ -36,8 +37,8 @@ public: T& selectAll(void); - template - T& update(ColumnTypes&&... cts); + template + T& update(AssginExpressions&&... expression); template T& insert(ColumnTypes&&... cts); @@ -123,26 +124,29 @@ T& Crud::selectAll(void) } template -template -T& Crud::update(ColumnTypes&&... cts) +template +T& Crud::update(AssginExpressions&&... expression) { static_cast(this)->cache.clear(); - auto columnNames = static_cast(this)->getColumnNames(std::forward(cts)...); - std::stringstream ss; ss << "UPDATE " << static_cast(this)->name << " "; ss << "SET "; - unsigned int i = 0; - for (const auto& c : columnNames) { - ss << c << " = ?"; + auto closure = [&ss, this](const auto&... iter) { + (static_cast( /// Make fold expression possible + (ss << static_cast(this)->getColumnName(iter.l) /// Column name + << " " << static_cast(iter) << " " /// Assign operator + << iter.r << ", ") /// Value + ), ...); /// Process fold expression + }; + std::apply(closure, std::tuple(expression...)); - if (i++ < columnNames.size() - 1) - ss << ", "; - } + std::string raw = ss.str(); + if (raw.size() > 2) + raw.erase(raw.end() - 2, raw.end()); /// Remove last ", " - static_cast(this)->cache.emplace_back(ss.str()); + static_cast(this)->cache.emplace_back(std::move(raw)); return *(static_cast(this)); } diff --git a/src/vist/query-builder/expression.hpp b/src/vist/query-builder/expression.hpp index a88c4b8..fccf73e 100644 --- a/src/vist/query-builder/expression.hpp +++ b/src/vist/query-builder/expression.hpp @@ -80,6 +80,16 @@ struct Lesser : public Binary { } }; +template +struct Assign : public Binary { + using Binary::Binary; + + operator std::string() const + { + return "="; + } +}; + template struct Equal : public Binary { using Binary::Binary; diff --git a/src/vist/query-builder/tests/query-builder.cpp b/src/vist/query-builder/tests/query-builder.cpp index 41f016a..c1765bb 100644 --- a/src/vist/query-builder/tests/query-builder.cpp +++ b/src/vist/query-builder/tests/query-builder.cpp @@ -124,15 +124,16 @@ TEST(QueryBuilderTsqbTests, SELECT_WHERE) TEST(QueryBuilderTsqbTests, UPDATE) { int uid = 0, id = 1; - std::string update1 = admin.update(Admin::Id, Admin::Pkg, Admin::Uid, Admin::Key); - std::string update2 = admin.update(Admin::Key).where((Admin::Uid == uid) && - (Admin::Id == id)); - std::string update3 = admin.update(Admin::Key, Admin::Pkg) + std::string update1 = admin.update(Admin::Id = id, Admin::Pkg = "pkg", + Admin::Uid = uid, Admin::Key = "key"); + std::string update2 = admin.update(Admin::Key = "key").where((Admin::Uid == uid) && + (Admin::Id == id)); + std::string update3 = admin.update(Admin::Key = "key", Admin::Pkg = "pkg") .where((Admin::Uid == 0) && (Admin::Id == 1)); - EXPECT_EQ(update1, "UPDATE admin SET id = ?, pkg = ?, uid = ?, key = ?"); - EXPECT_EQ(update2, "UPDATE admin SET key = ? WHERE uid = 0 AND id = 1"); - EXPECT_EQ(update3, "UPDATE admin SET key = ?, pkg = ? WHERE uid = 0 AND id = 1"); + EXPECT_EQ(update1, "UPDATE admin SET id = 1, pkg = 'pkg', uid = 0, key = 'key'"); + EXPECT_EQ(update2, "UPDATE admin SET key = 'key' WHERE uid = 0 AND id = 1"); + EXPECT_EQ(update3, "UPDATE admin SET key = 'key', pkg = 'pkg' WHERE uid = 0 AND id = 1"); } TEST(QueryBuilderTsqbTests, DELETE)