From: sangwan.kwon Date: Tue, 16 Jan 2018 06:13:07 +0000 (+0900) Subject: Add INSERT, UPDATE, DELETE operation on query builder X-Git-Tag: submit/tizen_4.0/20180119.042851^2~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c708deabbb15159156b0f72d8b4d7444bfd150bf;p=platform%2Fcore%2Fsecurity%2Fklay.git Add INSERT, UPDATE, DELETE operation on query builder Change-Id: I2f50b5620cbfe242a1860257778ea874fc71c290 Signed-off-by: sangwan.kwon --- diff --git a/include/klay/db/query-builder/table.hxx b/include/klay/db/query-builder/table.hxx index f54c3c1..8e2829e 100644 --- a/include/klay/db/query-builder/table.hxx +++ b/include/klay/db/query-builder/table.hxx @@ -22,6 +22,15 @@ public: Self selectAll(void); + template + Self update(ColumnTypes&&... cts); + + template + Self insert(ColumnTypes&&... cts); + + template + Self remove(ColumnTypes&&... cts); + template Self where(Expr expr); @@ -97,7 +106,7 @@ Table Table::select(ColumnTypes&&... cts) std::stringstream ss; ss << "SELECT "; - for(const auto& c : columnNames) + for (const auto& c : columnNames) ss << c << " "; ss << "FROM " << this->name; @@ -120,6 +129,78 @@ Table Table::selectAll(void) return *this; } +template +template +Table Table::update(ColumnTypes&&... cts) +{ + this->cache.clear(); + + auto columnTuple = std::make_tuple(std::forward(cts)...); + auto columnNames = this->getColumnNames(std::move(columnTuple)); + + std::stringstream ss; + ss << "UPDATE " << this->name << " "; + ss << "SET"; + + for (const auto& c : columnNames) + ss << " " << c << " = ?"; + + cache.emplace_back(ss.str()); + + return *this; +} + +template +template +Table Table::insert(ColumnTypes&&... cts) +{ + this->cache.clear(); + + auto columnTuple = std::make_tuple(std::forward(cts)...); + auto columnNames = this->getColumnNames(std::move(columnTuple)); + + std::stringstream ss; + ss << "INSERT INTO " << this->name << " ("; + + const int columnCount = columnNames.size(); + for (int i = 0; i < columnCount; i++) { + ss << columnNames[i]; + if (i < columnCount - 1) + ss << ", "; + } + + ss << ") VALUES ("; + + for (int i = 0; i < columnCount; i++) { + ss << "?"; + if (i < columnCount - 1) + ss << ", "; + } + + ss << ")"; + + cache.emplace_back(ss.str()); + + return *this; +} + +template +template +Table Table::remove(ColumnTypes&&... cts) +{ + this->cache.clear(); + + auto columnTuple = std::make_tuple(std::forward(cts)...); + auto columnNames = this->getColumnNames(std::move(columnTuple)); + + std::stringstream ss; + ss << "DELETE FROM " << this->name; + + cache.emplace_back(ss.str()); + + return *this; +} + template template Table Table::where(Expr expr) diff --git a/include/klay/db/query-builder/test-main.cpp b/include/klay/db/query-builder/test-main.cpp index d24c087..b6842e7 100644 --- a/include/klay/db/query-builder/test-main.cpp +++ b/include/klay/db/query-builder/test-main.cpp @@ -23,10 +23,13 @@ int main() { std::string select1 = admin.select(&Admin::id, &Admin::pkg, &Admin::uid, &Admin::key); std::string select2 = admin.select(&Admin::id, &Admin::uid, &Admin::key); - std::string select3 = admin.select(&Admin::uid, &Admin::key).where(expr(&Admin::id) > 3); + std::string select3 = admin.select(&Admin::uid, &Admin::key) + .where(expr(&Admin::id) > 3); std::string select4 = admin.selectAll().where(expr(&Admin::uid) > 3); - std::string select5 = admin.selectAll().where(expr(&Admin::uid) > 3 && expr(&Admin::pkg) == "dpm"); - std::string select6 = admin.selectAll().where(expr(&Admin::uid) > 3 || expr(&Admin::pkg) == "dpm"); + std::string select5 = admin.selectAll().where(expr(&Admin::uid) > 3 && + expr(&Admin::pkg) == "dpm"); + std::string select6 = admin.selectAll().where(expr(&Admin::uid) > 3 || + expr(&Admin::pkg) == "dpm"); std::cout << select1 << '\n'; // SELECT id pkg uid key FROM admin std::cout << select2 << '\n'; // SELECT id uid key FROM admin @@ -35,5 +38,25 @@ int main() { std::cout << select5 << '\n'; // SELECT * FROM admin WHERE uid = ? AND pkg = ? std::cout << select6 << '\n'; // SELECT * FROM admin WHERE uid = ? OR pkg = ? + 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(expr(&Admin::uid) == uid && + expr(&Admin::id) == id); + std::string update3 = admin.update(&Admin::key, &Admin::pkg) + .where(expr(&Admin::uid) == 0 && expr(&Admin::id) == 1); + std::cout << update1 << '\n'; // UPDATE admin SET id = ? pkg = ? uid = ? key = ? + std::cout << update2 << '\n'; // UPDATE admin SET key = ? WHERE uid = ? AND id = ? + std::cout << update3 << '\n'; // UPDATE admin SET key = ? WHERE uid = ? AND id = ? + + std::string delete1 = admin.remove(); + std::string delete2 = admin.where(expr(&Admin::pkg) == "dpm" && expr(&Admin::uid) == 3); + std::cout << delete1 << '\n'; // DELETE FROM admin + std::cout << delete2 << '\n'; // DELETE FROM admin WHERE pkg = ? AND uid = ? + + std::string insert1 = admin.insert(&Admin::id, &Admin::pkg, &Admin::uid, &Admin::key); + std::string insert2 = admin.insert(&Admin::id, &Admin::pkg, &Admin::key); + std::cout << insert1 << '\n'; // INSERT INTO admin (id, pkg, uid, key) VALUES (?, ?, ?, ?) + std::cout << insert2 << '\n'; // INSERT INTO admin (id, pkg, key) VALUES (?, ?, ?) + return 0; }