Add INSERT, UPDATE, DELETE operation on query builder 94/167194/3
authorsangwan.kwon <sangwan.kwon@samsung.com>
Tue, 16 Jan 2018 06:13:07 +0000 (15:13 +0900)
committersangwan kwon <sangwan.kwon@samsung.com>
Thu, 18 Jan 2018 07:37:23 +0000 (07:37 +0000)
Change-Id: I2f50b5620cbfe242a1860257778ea874fc71c290
Signed-off-by: sangwan.kwon <sangwan.kwon@samsung.com>
include/klay/db/query-builder/table.hxx
include/klay/db/query-builder/test-main.cpp

index f54c3c1c7ce6a79d3a05632a257fd1e221635af9..8e2829e71c2eae5e84795a0e8fec4e3cec264d18 100644 (file)
@@ -22,6 +22,15 @@ public:
 
        Self selectAll(void);
 
+       template<typename... ColumnTypes>
+       Self update(ColumnTypes&&... cts);
+
+       template<typename... ColumnTypes>
+       Self insert(ColumnTypes&&... cts);
+
+       template<typename... ColumnTypes>
+       Self remove(ColumnTypes&&... cts);
+
        template<typename Expr>
        Self where(Expr expr);
 
@@ -97,7 +106,7 @@ Table<Columns...> Table<Columns...>::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<Columns...> Table<Columns...>::selectAll(void)
        return *this;
 }
 
+template<typename... Columns>
+template<typename... ColumnTypes>
+Table<Columns...> Table<Columns...>::update(ColumnTypes&&... cts)
+{
+       this->cache.clear();
+
+       auto columnTuple = std::make_tuple(std::forward<ColumnTypes>(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<typename... Columns>
+template<typename... ColumnTypes>
+Table<Columns...> Table<Columns...>::insert(ColumnTypes&&... cts)
+{
+       this->cache.clear();
+
+       auto columnTuple = std::make_tuple(std::forward<ColumnTypes>(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<typename... Columns>
+template<typename... ColumnTypes>
+Table<Columns...> Table<Columns...>::remove(ColumnTypes&&... cts)
+{
+       this->cache.clear();
+
+       auto columnTuple = std::make_tuple(std::forward<ColumnTypes>(cts)...);
+       auto columnNames = this->getColumnNames(std::move(columnTuple));
+
+       std::stringstream ss;
+       ss << "DELETE FROM " << this->name;
+
+       cache.emplace_back(ss.str());
+
+       return *this;
+}
+
 template<typename... Columns>
 template<typename Expr>
 Table<Columns...> Table<Columns...>::where(Expr expr)
index d24c087fd7997592927c8673a33702e342ceca86..b6842e74a65bad8ffe6a16c42aa88b632eb84500 100644 (file)
@@ -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;
 }