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<int>(state))
.where(Admin::Name == admin);
database::Statement stmt(*this->database, query);
- stmt.bind(1, static_cast<int>(state));
- stmt.bind(2, admin);
if (!stmt.exec())
THROW(ErrCode::RuntimeError) << stmt.getErrorMessage();
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();
std::string name;
Type type;
+ template<typename Value>
+ Assign<Column<Object, Field>, Value> operator=(Value value) const;
template<typename Value>
Equal<Column<Object, Field>, Value> operator==(Value value) const;
template<typename Value>
Lesser<Column<Object, Field>, Value> operator<(Value value) const;
};
+template<typename Object, typename Field>
+template<typename Value>
+Assign<Column<Object, Field>, Value> Column<Object, Field>::operator=(Value value) const
+{
+ return {*this, value};
+}
+
template<typename Object, typename Field>
template<typename Value>
Equal<Column<Object, Field>, Value> Column<Object, Field>::operator==(Value value) const
#include <string>
#include <sstream>
+#include <tuple>
namespace vist {
namespace tsqb {
T& selectAll(void);
- template<typename... ColumnTypes>
- T& update(ColumnTypes&&... cts);
+ template<typename... AssginExpressions>
+ T& update(AssginExpressions&&... expression);
template<typename... ColumnTypes>
T& insert(ColumnTypes&&... cts);
}
template<typename T>
-template<typename... ColumnTypes>
-T& Crud<T>::update(ColumnTypes&&... cts)
+template<typename... AssginExpressions>
+T& Crud<T>::update(AssginExpressions&&... expression)
{
static_cast<T*>(this)->cache.clear();
- auto columnNames = static_cast<T*>(this)->getColumnNames(std::forward<ColumnTypes>(cts)...);
-
std::stringstream ss;
ss << "UPDATE " << static_cast<T*>(this)->name << " ";
ss << "SET ";
- unsigned int i = 0;
- for (const auto& c : columnNames) {
- ss << c << " = ?";
+ auto closure = [&ss, this](const auto&... iter) {
+ (static_cast<void>( /// Make fold expression possible
+ (ss << static_cast<T*>(this)->getColumnName(iter.l) /// Column name
+ << " " << static_cast<std::string>(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<T*>(this)->cache.emplace_back(ss.str());
+ static_cast<T*>(this)->cache.emplace_back(std::move(raw));
return *(static_cast<T*>(this));
}
}
};
+template<typename L, typename R>
+struct Assign : public Binary<L, R> {
+ using Binary<L, R>::Binary;
+
+ operator std::string() const
+ {
+ return "=";
+ }
+};
+
template<typename L, typename R>
struct Equal : public Binary<L, R> {
using Binary<L, R>::Binary;
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)