query-builder: Bind operand to where clause
authorSangwan Kwon <sangwan.kwon@samsung.com>
Mon, 17 Feb 2020 11:46:38 +0000 (20:46 +0900)
committer권상완/Security 2Lab(SR)/Engineer/삼성전자 <sangwan.kwon@samsung.com>
Tue, 18 Feb 2020 09:14:41 +0000 (18:14 +0900)
ex) AdminTable.select(Admin::Uid, Admin::Key).where(Admin::Id > 3);
  - Before: "SELECT uid, key FROM admin WHERE id > ?"
  - After: "SELECT uid, key FROM admin WHERE id > 3"

Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
src/vist/policy/db-schema.hpp
src/vist/query-builder/crud.hpp
src/vist/query-builder/expression.hpp
src/vist/query-builder/tests/expression.cpp
src/vist/query-builder/tests/query-builder.cpp
src/vist/query-builder/util.hpp

index 516a5fe..883d28c 100644 (file)
@@ -49,7 +49,7 @@ struct PolicyDefinition {
        std::string ivalue;
 
        DECLARE_COLUMN(Name, "name", &PolicyDefinition::name);
-       DECLARE_COLUMN(Ivalue, "policy", &PolicyDefinition::ivalue);
+       DECLARE_COLUMN(Ivalue, "ivalue", &PolicyDefinition::ivalue);
 };
 
 DECLARE_TABLE(AdminTable, "ADMIN", Admin::Name, Admin::Activated);
index 80c1b81..616fe03 100644 (file)
@@ -56,7 +56,7 @@ private:
        std::string processWhere(Or<L,R>& expr);
 
        template<typename Expr>
-       std::string processWhere(Expr expr);
+       std::string processWhere(const Expr& expr);
 };
 
 template<typename T>
@@ -234,11 +234,12 @@ std::string Crud<T>::processWhere(Or<L,R>& expr)
 
 template<typename T>
 template<typename Expr>
-std::string Crud<T>::processWhere(Expr expr)
+std::string Crud<T>::processWhere(const Expr& expr)
 {
        std::stringstream ss;
-       ss << static_cast<T*>(this)->getColumnName(expr.l);
-       ss << " " << std::string(expr) << " ?";
+       ss << static_cast<T*>(this)->getColumnName(expr.l) << " ";
+       ss << static_cast<std::string>(expr) << " ";
+       ss << expr.r;
 
        return ss.str();
 }
index 583b41e..a88c4b8 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "column.hpp"
 #include "type.hpp"
+#include "util.hpp"
 
 #include <string>
 #include <type_traits>
@@ -38,7 +39,7 @@ struct Binary : public Expression {
        /// L is Column and R is Value
        Binary(L l, R r) : l(l), r(r)
        {
-               /// preventing logical expressions like &&, || and ==
+               /// Prevent logical expressions like &&, || and ==
                if constexpr(!is_expression<L>::value) {
                        using FieldType = typename L::FieldType;
                        type::assert_compare(FieldType(), r);
@@ -51,7 +52,8 @@ struct Binary<L, const char*> : public Expression {
        L l;
        std::string r;
 
-       Binary(L l, const char* r) : l(l), r(r)
+       /// Make r to 'r'
+       Binary(L l, const char* r) : l(l), r("'" + std::string(r) + "'")
        {
                using FieldType = typename L::FieldType;
                type::assert_compare(FieldType(), std::string());
index 558c657..a0489eb 100644 (file)
@@ -25,6 +25,9 @@ TEST(QueryBuilderExpressionTests, equal)
 {
        std::string dump = (Table1::Column1 == 3);
        EXPECT_EQ(dump, "=");
+
+       dump = (Table1::Column2 == "string");
+       EXPECT_EQ(dump, "=");
 }
 
 TEST(QueryBuilderExpressionTests, greater)
@@ -38,3 +41,15 @@ TEST(QueryBuilderExpressionTests, lesser)
        std::string dump = (Table1::Column1 < 3);
        EXPECT_EQ(dump, "<");
 }
+
+TEST(QueryBuilderExpressionTests, and_)
+{
+       std::string dump = (Table1::Column1 < 3) && (Table1::Column1 == 3);
+       EXPECT_EQ(dump, "AND");
+}
+
+TEST(QueryBuilderExpressionTests, or_)
+{
+       std::string dump = (Table1::Column1 < 3) || (Table1::Column2 == "text");
+       EXPECT_EQ(dump, "OR");
+}
index 7f4da4b..41f016a 100644 (file)
@@ -115,10 +115,10 @@ TEST(QueryBuilderTsqbTests, SELECT_WHERE)
        std::string select4 = admin.selectAll().where(Admin::Uid > 3 ||
                                                                                                  Admin::Pkg == "dpm");
 
-       EXPECT_EQ(select1, "SELECT uid, key FROM admin WHERE id > ?");
-       EXPECT_EQ(select2, "SELECT * FROM admin WHERE uid > ?");
-       EXPECT_EQ(select3, "SELECT * FROM admin WHERE uid > ? AND pkg = ?");
-       EXPECT_EQ(select4, "SELECT * FROM admin WHERE uid > ? OR pkg = ?");
+       EXPECT_EQ(select1, "SELECT uid, key FROM admin WHERE id > 3");
+       EXPECT_EQ(select2, "SELECT * FROM admin WHERE uid > 3");
+       EXPECT_EQ(select3, "SELECT * FROM admin WHERE uid > 3 AND pkg = 'dpm'");
+       EXPECT_EQ(select4, "SELECT * FROM admin WHERE uid > 3 OR pkg = 'dpm'");
 }
 
 TEST(QueryBuilderTsqbTests, UPDATE)
@@ -131,8 +131,8 @@ TEST(QueryBuilderTsqbTests, UPDATE)
                                                           .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 = ? AND id = ?");
-       EXPECT_EQ(update3, "UPDATE admin SET key = ?, pkg = ? WHERE uid = ? AND id = ?");
+       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");
 }
 
 TEST(QueryBuilderTsqbTests, DELETE)
@@ -142,7 +142,7 @@ TEST(QueryBuilderTsqbTests, DELETE)
                                                                                           (Admin::Uid == 3));
 
        EXPECT_EQ(delete1, "DELETE FROM admin");
-       EXPECT_EQ(delete2, "DELETE FROM admin WHERE pkg = ? AND uid = ?");
+       EXPECT_EQ(delete2, "DELETE FROM admin WHERE pkg = 'dpm' AND uid = 3");
 }
 
 TEST(QueryBuilderTsqbTests, INSERT)
@@ -181,7 +181,7 @@ TEST(QueryBuilderTsqbTests, MULTI_SELECT)
                                                        "managed_policy.value FROM admin, managed_policy");
        EXPECT_EQ(multiSelect2, "SELECT admin.uid, admin.key, managed_policy.id, "
                                                        "managed_policy.value FROM admin, managed_policy "
-                                                       "WHERE admin.uid > ? AND managed_policy.id = ?");
+                                                       "WHERE admin.uid > 0 AND managed_policy.id = 3");
 }
 
 /*
index 6156a17..d1a92e2 100644 (file)
@@ -19,6 +19,7 @@
 #include <string>
 #include <algorithm>
 #include <cctype>
+#include <sstream>
 
 namespace vist {
 namespace tsqb {
@@ -32,6 +33,14 @@ inline std::string rtrim(std::string&& s)
        return s;
 }
 
+template <typename V>
+std::string concat(const std::string& column, const std::string& op, const V& value)
+{
+       std::stringstream ss;
+       ss << column << " " << op << " " << value;
+       return ss.str();
+}
+
 } // namespace util
 } // namespace tsqb
 } // namespace vist