mirror of
https://github.com/rbock/sqlpp11.git
synced 2026-01-05 20:50:34 -06:00
Added prepared statement support to insert, update and remove (untested yet)
This commit is contained in:
@@ -39,6 +39,7 @@ namespace sqlpp
|
||||
{
|
||||
using _is_assignment_list = std::true_type;
|
||||
using _is_dynamic = typename std::conditional<std::is_same<Database, void>::value, std::false_type, std::true_type>::type;
|
||||
using _parameter_tuple_t = std::tuple<Assignments...>;
|
||||
|
||||
// check for at least one order expression
|
||||
static_assert(_is_dynamic::value or sizeof...(Assignments), "at least one assignment expression required in set()");
|
||||
@@ -70,7 +71,13 @@ namespace sqlpp
|
||||
_dynamic_assignments.serialize(os, db, sizeof...(Assignments) == 0);
|
||||
}
|
||||
|
||||
std::tuple<typename std::decay<Assignments>::type...> _assignments;
|
||||
size_t _set_parameter_index(size_t index)
|
||||
{
|
||||
index = set_parameter_index(_assignments, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
_parameter_tuple_t _assignments;
|
||||
typename detail::serializable_list<Database> _dynamic_assignments;
|
||||
};
|
||||
|
||||
|
||||
@@ -111,11 +111,6 @@ namespace sqlpp
|
||||
return *this;
|
||||
}
|
||||
|
||||
static constexpr size_t _get_static_no_of_parameters()
|
||||
{
|
||||
return _parameter_list_t::size::value;
|
||||
}
|
||||
|
||||
template<typename Db>
|
||||
insert_t& serialize(std::ostream& os, Db& db)
|
||||
{
|
||||
@@ -123,6 +118,11 @@ namespace sqlpp
|
||||
return *this;
|
||||
}
|
||||
|
||||
static constexpr size_t _get_static_no_of_parameters()
|
||||
{
|
||||
return _parameter_list_t::size::value;
|
||||
}
|
||||
|
||||
template<typename Db>
|
||||
std::size_t run(Db& db) const
|
||||
{
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
namespace sqlpp
|
||||
{
|
||||
template<typename Db, typename Remove>
|
||||
struct prepared_select_t
|
||||
struct prepared_remove_t
|
||||
{
|
||||
using _parameter_list_t = typename Remove::_parameter_list_t;
|
||||
using _prepared_query_t = typename Db::_prepared_query_t;
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
namespace sqlpp
|
||||
{
|
||||
template<typename Db, typename Update>
|
||||
struct prepared_select_t
|
||||
struct prepared_update_t
|
||||
{
|
||||
using _parameter_list_t = typename Update::_parameter_list_t;
|
||||
using _prepared_query_t = typename Db::_prepared_query_t;
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
#include <sqlpp11/using.h>
|
||||
#include <sqlpp11/where.h>
|
||||
#include <sqlpp11/type_traits.h>
|
||||
#include <sqlpp11/parameter_list.h>
|
||||
#include <sqlpp11/prepared_remove.h>
|
||||
|
||||
namespace sqlpp
|
||||
{
|
||||
@@ -60,6 +62,9 @@ namespace sqlpp
|
||||
template<typename WhereT>
|
||||
using set_where_t = remove_t<Database, Table, Using, WhereT>;
|
||||
|
||||
using _parameter_tuple_t = std::tuple<Table, Using, Where>;
|
||||
using _parameter_list_t = typename make_parameter_list_t<remove_t>::type;
|
||||
|
||||
template<typename... Tab>
|
||||
auto using_(Tab&&... tab)
|
||||
-> set_using_t<using_t<void, typename std::decay<Tab>::type...>>
|
||||
@@ -147,14 +152,35 @@ namespace sqlpp
|
||||
return *this;
|
||||
}
|
||||
|
||||
static constexpr size_t _get_static_no_of_parameters()
|
||||
{
|
||||
return _parameter_list_t::size::value;
|
||||
}
|
||||
|
||||
template<typename Db>
|
||||
std::size_t run(Db& db) const
|
||||
{
|
||||
std::ostringstream oss;
|
||||
serialize(oss, db);
|
||||
return db.remove(oss.str());
|
||||
static_assert(_get_static_no_of_parameters() == 0, "cannot run remove directly with parameters, use prepare instead");
|
||||
return db.remove(*this);
|
||||
}
|
||||
|
||||
template<typename Db>
|
||||
auto prepare(Db& db)
|
||||
-> prepared_remove_t<typename std::decay<Db>::type, remove_t>
|
||||
{
|
||||
_set_parameter_index(0);
|
||||
return {{}, db.prepare_remove(*this)};
|
||||
}
|
||||
|
||||
size_t _set_parameter_index(size_t index)
|
||||
{
|
||||
index = set_parameter_index(_table, index);
|
||||
index = set_parameter_index(_using, index);
|
||||
index = set_parameter_index(_where, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
Table _table;
|
||||
Using _using;
|
||||
Where _where;
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
#include <sqlpp11/assignment_list.h>
|
||||
#include <sqlpp11/where.h>
|
||||
#include <sqlpp11/type_traits.h>
|
||||
#include <sqlpp11/parameter_list.h>
|
||||
#include <sqlpp11/prepared_update.h>
|
||||
|
||||
namespace sqlpp
|
||||
{
|
||||
@@ -60,6 +62,9 @@ namespace sqlpp
|
||||
template<typename WhereT>
|
||||
using set_where_t = update_t<Database, Table, Assignments, WhereT>;
|
||||
|
||||
using _parameter_tuple_t = std::tuple<Table, Assignments, Where>;
|
||||
using _parameter_list_t = typename make_parameter_list_t<update_t>::type;
|
||||
|
||||
template<typename... Assignment>
|
||||
auto set(Assignment&&... assignment)
|
||||
-> set_assignments_t<assignment_list_t<void, must_not_update_t, typename std::decay<Assignment>::type...>>
|
||||
@@ -147,14 +152,36 @@ namespace sqlpp
|
||||
return *this;
|
||||
}
|
||||
|
||||
static constexpr size_t _get_static_no_of_parameters()
|
||||
{
|
||||
return _parameter_list_t::size::value;
|
||||
}
|
||||
|
||||
template<typename Db>
|
||||
std::size_t run(Db& db) const
|
||||
{
|
||||
std::ostringstream oss;
|
||||
serialize(oss, db);
|
||||
return db.update(oss.str());
|
||||
static_assert(not is_noop<Assignments>::value, "calling set() required before running update");
|
||||
static_assert(_get_static_no_of_parameters() == 0, "cannot run update directly with parameters, use prepare instead");
|
||||
return db.update(*this);
|
||||
}
|
||||
|
||||
template<typename Db>
|
||||
auto prepare(Db& db)
|
||||
-> prepared_update_t<typename std::decay<Db>::type, update_t>
|
||||
{
|
||||
static_assert(not is_noop<Assignments>::value, "calling set() required before running update");
|
||||
|
||||
_set_parameter_index(0);
|
||||
return {{}, db.prepare_update(*this)};
|
||||
}
|
||||
|
||||
size_t _set_parameter_index(size_t index)
|
||||
{
|
||||
index = set_parameter_index(_table, index);
|
||||
index = set_parameter_index(_assignments, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
Table _table;
|
||||
Assignments _assignments;
|
||||
Where _where;
|
||||
|
||||
@@ -40,6 +40,7 @@ namespace sqlpp
|
||||
{
|
||||
using _is_using = std::true_type;
|
||||
using _is_dynamic = typename std::conditional<std::is_same<Database, void>::value, std::false_type, std::true_type>::type;
|
||||
using _parameter_tuple_t = std::tuple<Table...>;
|
||||
|
||||
static_assert(_is_dynamic::value or sizeof...(Table), "at least one table argument required in using()");
|
||||
|
||||
@@ -68,7 +69,13 @@ namespace sqlpp
|
||||
_dynamic_tables.serialize(os, db, sizeof...(Table) == 0);
|
||||
}
|
||||
|
||||
std::tuple<Table...> _tables;
|
||||
size_t _set_parameter_index(size_t index)
|
||||
{
|
||||
index = set_parameter_index(_tables, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
_parameter_tuple_t _tables;
|
||||
detail::serializable_list<Database> _dynamic_tables;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user