Added prepared statement support to insert, update and remove (untested yet)

This commit is contained in:
rbock
2014-01-08 22:14:16 +01:00
parent 3f519d6fce
commit 121f56549b
7 changed files with 82 additions and 15 deletions

View File

@@ -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;
};

View File

@@ -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
{

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
};