Compare commits
3 Commits
1fd2066946
...
24842f3313
| Author | SHA1 | Date |
|---|---|---|
|
|
24842f3313 | |
|
|
1cda78412b | |
|
|
399fa9a157 |
|
|
@ -26,15 +26,15 @@ public:
|
||||||
}
|
}
|
||||||
template < class V >
|
template < class V >
|
||||||
static void on_primary_key(const char * /*id*/, V &, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {}
|
static void on_primary_key(const char * /*id*/, V &, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {}
|
||||||
static void on_revision(const char * /*id*/, unsigned long long &/*rev*/) {}
|
static void on_revision(const char * /*id*/, uint64_t &/*rev*/) {}
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
static void on_attribute(const char * /*id*/, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
static void on_attribute(const char * /*id*/, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
||||||
template<class Pointer>
|
template<class Pointer>
|
||||||
static void on_belongs_to(const char * /*id*/, Pointer &obj, const utils::foreign_attributes &attr) {}
|
static void on_belongs_to(const char * /*id*/, Pointer &/*obj*/, const utils::foreign_attributes &/*attr*/) {}
|
||||||
template<class Pointer>
|
template<class Pointer>
|
||||||
static void on_has_one(const char * /*id*/, Pointer &obj, const utils::foreign_attributes &attr) {}
|
static void on_has_one(const char * /*id*/, Pointer &/*obj*/, const utils::foreign_attributes &/*attr*/) {}
|
||||||
template<class ContainerType>
|
template<class ContainerType>
|
||||||
static void on_has_many(ContainerType &, const char *join_column, const utils::foreign_attributes &attr) {}
|
static void on_has_many(ContainerType &, const char */*join_column*/, const utils::foreign_attributes &/*attr*/) {}
|
||||||
template<class ContainerType>
|
template<class ContainerType>
|
||||||
void on_has_many_to_many(const char * /*id*/, ContainerType &/*c*/, const char *join_column, const char *inverse_join_column, const utils::foreign_attributes &/*attr*/) {
|
void on_has_many_to_many(const char * /*id*/, ContainerType &/*c*/, const char *join_column, const char *inverse_join_column, const utils::foreign_attributes &/*attr*/) {
|
||||||
join_columns_.join_column = join_column;
|
join_columns_.join_column = join_column;
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#include "matador/orm/error_code.hpp"
|
#include "matador/orm/error_code.hpp"
|
||||||
#include "matador/orm/session_query_builder.hpp"
|
#include "matador/orm/session_query_builder.hpp"
|
||||||
|
|
||||||
|
#include "matador/query/condition.hpp"
|
||||||
#include "matador/query/query.hpp"
|
#include "matador/query/query.hpp"
|
||||||
|
|
||||||
#include "matador/sql/column_generator.hpp"
|
#include "matador/sql/column_generator.hpp"
|
||||||
|
|
@ -58,11 +59,11 @@ public:
|
||||||
|
|
||||||
template < class V >
|
template < class V >
|
||||||
static void on_primary_key(const char * /*id*/, V &/*pk*/, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {}
|
static void on_primary_key(const char * /*id*/, V &/*pk*/, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {}
|
||||||
static void on_revision(const char * /*id*/, unsigned long long &/*rev*/) {}
|
static void on_revision(const char * /*id*/, uint64_t &/*rev*/) {}
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
static void on_attribute(const char * /*id*/, Type &/*obj*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
static void on_attribute(const char * /*id*/, Type &/*obj*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
||||||
template<class Pointer>
|
template<class Pointer>
|
||||||
void on_belongs_to(const char *id, Pointer &obj, const utils::foreign_attributes &attr) {
|
void on_belongs_to(const char *id, Pointer &/*obj*/, const utils::foreign_attributes &/*attr*/) {
|
||||||
const auto it = statements_per_column_.find(id);
|
const auto it = statements_per_column_.find(id);
|
||||||
if (it == statements_per_column_.end()) {
|
if (it == statements_per_column_.end()) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -71,7 +72,7 @@ public:
|
||||||
|
|
||||||
}
|
}
|
||||||
template<class Pointer>
|
template<class Pointer>
|
||||||
void on_has_one(const char *id, Pointer &obj, const utils::foreign_attributes &attr) {
|
void on_has_one(const char * /*id*/, Pointer &/*obj*/, const utils::foreign_attributes &/*attr*/) {
|
||||||
|
|
||||||
}
|
}
|
||||||
template<class ContainerType>
|
template<class ContainerType>
|
||||||
|
|
@ -193,18 +194,20 @@ utils::result<object::object_ptr<Type>, utils::error> session::update( const obj
|
||||||
if (!info) {
|
if (!info) {
|
||||||
return utils::failure(info.err());
|
return utils::failure(info.err());
|
||||||
}
|
}
|
||||||
|
using namespace matador::utils;
|
||||||
|
using namespace matador::query;
|
||||||
|
|
||||||
const auto col = sql::column(info->get()->prototype().primary_key()->name());
|
const auto col = sql::column(info.value().get().definition().primary_key()->name());
|
||||||
auto res = query::query::update(info->get().name())
|
auto res = matador::query::query::update(info->get().name())
|
||||||
.set(*obj)
|
.set(*obj)
|
||||||
.where(col == utils::_)
|
.where(col == _)
|
||||||
.prepare(*this);
|
.prepare(*this);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
return utils::failure(res.err());
|
return utils::failure(res.err());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (const auto insert_result = res->bind(*obj).execute(); !insert_result.is_ok()) {
|
if (const auto update_result = res->bind(*obj).execute(); !update_result.is_ok()) {
|
||||||
return utils::failure(insert_result.err());
|
return utils::failure(update_result.err());
|
||||||
}
|
}
|
||||||
return utils::ok(object::object_ptr{obj});
|
return utils::ok(object::object_ptr{obj});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ public:
|
||||||
push(id, x);
|
push(id, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_revision(const char *id, unsigned long long &/*rev*/);
|
void on_revision(const char *id, uint64_t &/*rev*/);
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
void on_attribute(const char *id, Type &x, const utils::field_attributes &/*attr*/ = utils::null_attributes) {
|
void on_attribute(const char *id, Type &x, const utils::field_attributes &/*attr*/ = utils::null_attributes) {
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_revision(const char *id, unsigned long long &/*rev*/);
|
void on_revision(const char *id, uint64_t &/*rev*/);
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
void on_attribute(const char *id, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes)
|
void on_attribute(const char *id, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes)
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public:
|
||||||
void on_primary_key(const char *, ValueType &pk, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {
|
void on_primary_key(const char *, ValueType &pk, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {
|
||||||
value_ = pk;
|
value_ = pk;
|
||||||
}
|
}
|
||||||
static void on_revision(const char * /*id*/, unsigned long long &/*rev*/) {}
|
static void on_revision(const char * /*id*/, uint64_t &/*rev*/) {}
|
||||||
template < class Type >
|
template < class Type >
|
||||||
static void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
static void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
||||||
static void on_attribute(const char * /*id*/, char * /*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
static void on_attribute(const char * /*id*/, char * /*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
||||||
|
|
|
||||||
|
|
@ -15,12 +15,11 @@ class key_value_generator
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
explicit key_value_generator(std::vector<internal::key_value_pair> &result) : result_(result) {}
|
explicit key_value_generator(std::vector<internal::key_value_pair> &result);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template < class Type >
|
template < class Type >
|
||||||
static std::vector<internal::key_value_pair> generate(const Type &obj)
|
static std::vector<internal::key_value_pair> generate(const Type &obj) {
|
||||||
{
|
|
||||||
std::vector<internal::key_value_pair> result;
|
std::vector<internal::key_value_pair> result;
|
||||||
key_value_generator generator(result);
|
key_value_generator generator(result);
|
||||||
access::process(generator, obj);
|
access::process(generator, obj);
|
||||||
|
|
@ -30,31 +29,28 @@ public:
|
||||||
|
|
||||||
template < class V >
|
template < class V >
|
||||||
void on_primary_key(const char *id, V &x, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {
|
void on_primary_key(const char *id, V &x, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {
|
||||||
result_.emplace_back(id, x);
|
// result_.emplace_back(id, x);
|
||||||
}
|
}
|
||||||
void on_revision(const char *id, unsigned long long &/*rev*/);
|
void on_revision(const char *id, uint64_t &/*rev*/);
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
void on_attribute(const char *id, Type &x, const utils::field_attributes &/*attr*/ = utils::null_attributes)
|
void on_attribute(const char *id, Type &x, const utils::field_attributes &/*attr*/ = utils::null_attributes) {
|
||||||
{
|
|
||||||
result_.emplace_back(id, x);
|
result_.emplace_back(id, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Type, template < class ... > class Pointer>
|
template<class Type, template < class ... > class Pointer>
|
||||||
void on_belongs_to(const char *id, Pointer<Type> &x, const utils::foreign_attributes &/*attr*/)
|
void on_belongs_to(const char *id, Pointer<Type> &x, const utils::foreign_attributes &/*attr*/) {
|
||||||
{
|
|
||||||
result_.emplace_back(id, fk_value_extractor_.extract(*x));
|
result_.emplace_back(id, fk_value_extractor_.extract(*x));
|
||||||
}
|
}
|
||||||
template<class Type, template < class ... > class Pointer>
|
template<class Type, template < class ... > class Pointer>
|
||||||
void on_has_one(const char *id, Pointer<Type> &x, const utils::foreign_attributes &/*attr*/)
|
void on_has_one(const char *id, Pointer<Type> &x, const utils::foreign_attributes &/*attr*/) {
|
||||||
{
|
|
||||||
result_.emplace_back(id, fk_value_extractor_.extract(*x));
|
result_.emplace_back(id, fk_value_extractor_.extract(*x));
|
||||||
}
|
}
|
||||||
template<class ContainerType>
|
template<class ContainerType>
|
||||||
void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {}
|
static void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
detail::fk_value_extractor fk_value_extractor_;
|
detail::fk_value_extractor fk_value_extractor_{};
|
||||||
std::vector<internal::key_value_pair> &result_;
|
std::vector<internal::key_value_pair> &result_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ public:
|
||||||
}
|
}
|
||||||
push(id);
|
push(id);
|
||||||
}
|
}
|
||||||
void on_revision(const char *id, unsigned long long &/*rev*/);
|
void on_revision(const char *id, uint64_t &/*rev*/);
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
void on_attribute(const char *id, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes) {
|
void on_attribute(const char *id, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes) {
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,12 @@ public:
|
||||||
virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const parameter_binder& bindings) = 0;
|
virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const parameter_binder& bindings) = 0;
|
||||||
|
|
||||||
template < class Type >
|
template < class Type >
|
||||||
void bind_object(Type &obj, parameter_binder& bindings) {
|
size_t bind_object(Type &obj, parameter_binder& bindings) {
|
||||||
object_parameter_binder object_binder_;
|
object_parameter_binder object_binder_(query_.command != sql_command::SQL_UPDATE);
|
||||||
object_binder_.reset(start_index());
|
object_binder_.reset(start_index());
|
||||||
object_binder_.bind(obj, bindings);
|
object_binder_.bind(obj, bindings);
|
||||||
|
|
||||||
|
return object_binder_.current_index();
|
||||||
}
|
}
|
||||||
|
|
||||||
template < class Type >
|
template < class Type >
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ public:
|
||||||
|
|
||||||
template<typename ValueType>
|
template<typename ValueType>
|
||||||
void on_primary_key(const char *id, ValueType &value, const utils::primary_key_attribute& attr = utils::default_pk_attributes);
|
void on_primary_key(const char *id, ValueType &value, const utils::primary_key_attribute& attr = utils::default_pk_attributes);
|
||||||
static void on_revision(const char * /*id*/, unsigned long long &/*rev*/) {}
|
static void on_revision(const char * /*id*/, uint64_t &/*rev*/) {}
|
||||||
|
|
||||||
template < class Type >
|
template < class Type >
|
||||||
static void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
static void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ public:
|
||||||
|
|
||||||
template<typename ValueType>
|
template<typename ValueType>
|
||||||
void on_primary_key(const char *id, ValueType &value, const utils::primary_key_attribute& attr = utils::default_pk_attributes);
|
void on_primary_key(const char *id, ValueType &value, const utils::primary_key_attribute& attr = utils::default_pk_attributes);
|
||||||
void on_revision(const char * /*id*/, unsigned long long &/*rev*/) {
|
void on_revision(const char * /*id*/, uint64_t &/*rev*/) {
|
||||||
++column_index_;
|
++column_index_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ public:
|
||||||
utils::data_type_traits<ValueType>::read_value(reader_, id, column_index_++, value, attr.size());
|
utils::data_type_traits<ValueType>::read_value(reader_, id, column_index_++, value, attr.size());
|
||||||
pk_ = value;
|
pk_ = value;
|
||||||
}
|
}
|
||||||
void on_revision(const char * /*id*/, unsigned long long &/*rev*/) { ++column_index_; }
|
void on_revision(const char * /*id*/, uint64_t &/*rev*/) { ++column_index_; }
|
||||||
|
|
||||||
template < class Type >
|
template < class Type >
|
||||||
void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) { ++column_index_; }
|
void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) { ++column_index_; }
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,8 @@ private:
|
||||||
|
|
||||||
class object_parameter_binder {
|
class object_parameter_binder {
|
||||||
public:
|
public:
|
||||||
|
explicit object_parameter_binder(bool include_primary_key = true);
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void bind(Type &obj, utils::attribute_writer &binder) {
|
void bind(Type &obj, utils::attribute_writer &binder) {
|
||||||
binder_ = &binder;
|
binder_ = &binder;
|
||||||
|
|
@ -69,10 +71,13 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset(size_t start_index);
|
void reset(size_t start_index);
|
||||||
|
[[nodiscard]] size_t current_index() const;
|
||||||
|
|
||||||
template < class Type >
|
template < class Type >
|
||||||
void on_primary_key(const char * /*id*/, Type &val, const utils::primary_key_attribute& attr = utils::default_pk_attributes) {
|
void on_primary_key(const char * /*id*/, Type &val, const utils::primary_key_attribute& attr = utils::default_pk_attributes) {
|
||||||
utils::data_type_traits<Type>::bind_value(*binder_, index_++, val, attr.size());
|
if (include_primary_key_) {
|
||||||
|
utils::data_type_traits<Type>::bind_value(*binder_, index_++, val, attr.size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void on_revision(const char *id, uint64_t &/*rev*/);
|
void on_revision(const char *id, uint64_t &/*rev*/);
|
||||||
|
|
||||||
|
|
@ -109,6 +114,7 @@ private:
|
||||||
utils::attribute_writer *binder_{};
|
utils::attribute_writer *binder_{};
|
||||||
size_t index_{0};
|
size_t index_{0};
|
||||||
detail::fk_binder fk_binder_;
|
detail::fk_binder fk_binder_;
|
||||||
|
bool include_primary_key_{true};
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#include "matador/orm/session_insert_builder.hpp"
|
#include "matador/orm/session_insert_builder.hpp"
|
||||||
|
|
||||||
namespace matador::orm {
|
namespace matador::orm {
|
||||||
void session_insert_builder::on_revision(const char* id, unsigned long long& x) {
|
void session_insert_builder::on_revision(const char* id, uint64_t& x) {
|
||||||
push(id, x);
|
push(id, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
namespace matador::orm {
|
namespace matador::orm {
|
||||||
void session_query_builder::on_revision(const char *id, unsigned long long &/*rev*/) {
|
void session_query_builder::on_revision(const char *id, uint64_t &/*rev*/) {
|
||||||
push(id);
|
push(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,10 @@
|
||||||
#include "matador/query/value_extractor.hpp"
|
#include "matador/query/value_extractor.hpp"
|
||||||
|
|
||||||
namespace matador::query {
|
namespace matador::query {
|
||||||
|
key_value_generator::key_value_generator(std::vector<internal::key_value_pair> &result)
|
||||||
|
: result_(result) {}
|
||||||
|
|
||||||
void key_value_generator::on_revision(const char *id, unsigned long long int &x) {
|
void key_value_generator::on_revision(const char *id, uint64_t &x) {
|
||||||
result_.emplace_back(id, x);
|
result_.emplace_back(id, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ std::vector<column> column_generator::generate( const object::repository& scm, c
|
||||||
return columns;
|
return columns;
|
||||||
}
|
}
|
||||||
|
|
||||||
void column_generator::on_revision(const char *id, unsigned long long int &)
|
void column_generator::on_revision(const char *id, uint64_t &)
|
||||||
{
|
{
|
||||||
if (has_many_to_many_) {
|
if (has_many_to_many_) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,19 @@
|
||||||
#include "matador/sql/interface/parameter_binder.hpp"
|
#include "matador/sql/interface/parameter_binder.hpp"
|
||||||
|
|
||||||
namespace matador::sql {
|
namespace matador::sql {
|
||||||
|
object_parameter_binder::object_parameter_binder(bool include_primary_key)
|
||||||
|
: include_primary_key_(include_primary_key) {
|
||||||
|
}
|
||||||
|
|
||||||
void object_parameter_binder::reset(const size_t start_index)
|
void object_parameter_binder::reset(const size_t start_index)
|
||||||
{
|
{
|
||||||
index_ = start_index;
|
index_ = start_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t object_parameter_binder::current_index() const {
|
||||||
|
return index_;
|
||||||
|
}
|
||||||
|
|
||||||
void object_parameter_binder::on_revision(const char * /*id*/, uint64_t &rev)
|
void object_parameter_binder::on_revision(const char * /*id*/, uint64_t &rev)
|
||||||
{
|
{
|
||||||
utils::data_type_traits<uint64_t>::bind_value(*binder_, index_++, rev);
|
utils::data_type_traits<uint64_t>::bind_value(*binder_, index_++, rev);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue