Compare commits

..

No commits in common. "24842f33130b02890b5af57e65ae7d3512d925d1" and "1fd206694699ab8ed0929b4504accb4e71fd7ae7" have entirely different histories.

17 changed files with 39 additions and 55 deletions

View File

@ -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*/, uint64_t &/*rev*/) {} static void on_revision(const char * /*id*/, unsigned long long &/*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;

View File

@ -4,7 +4,6 @@
#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"
@ -59,11 +58,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*/, uint64_t &/*rev*/) {} static void on_revision(const char * /*id*/, unsigned long long &/*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;
@ -72,7 +71,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>
@ -194,20 +193,18 @@ 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.value().get().definition().primary_key()->name()); const auto col = sql::column(info->get()->prototype().primary_key()->name());
auto res = matador::query::query::update(info->get().name()) auto res = query::query::update(info->get().name())
.set(*obj) .set(*obj)
.where(col == _) .where(col == utils::_)
.prepare(*this); .prepare(*this);
if (!res) { if (!res) {
return utils::failure(res.err()); return utils::failure(res.err());
} }
if (const auto update_result = res->bind(*obj).execute(); !update_result.is_ok()) { if (const auto insert_result = res->bind(*obj).execute(); !insert_result.is_ok()) {
return utils::failure(update_result.err()); return utils::failure(insert_result.err());
} }
return utils::ok(object::object_ptr{obj}); return utils::ok(object::object_ptr{obj});
} }

View File

@ -67,7 +67,7 @@ public:
push(id, x); push(id, x);
} }
void on_revision(const char *id, uint64_t &/*rev*/); void on_revision(const char *id, unsigned long long &/*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) {

View File

@ -98,7 +98,7 @@ public:
} }
} }
void on_revision(const char *id, uint64_t &/*rev*/); void on_revision(const char *id, unsigned long long &/*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)

View File

@ -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*/, uint64_t &/*rev*/) {} static void on_revision(const char * /*id*/, unsigned long long &/*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) {}

View File

@ -15,11 +15,12 @@ class key_value_generator
{ {
private: private:
public: public:
explicit key_value_generator(std::vector<internal::key_value_pair> &result); explicit key_value_generator(std::vector<internal::key_value_pair> &result) : result_(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);
@ -29,28 +30,31 @@ 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, uint64_t &/*rev*/); void on_revision(const char *id, unsigned long long &/*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>
static void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} 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_;
}; };

View File

@ -61,7 +61,7 @@ public:
} }
push(id); push(id);
} }
void on_revision(const char *id, uint64_t &/*rev*/); void on_revision(const char *id, unsigned long long &/*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) {

View File

@ -26,12 +26,10 @@ 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 >
size_t bind_object(Type &obj, parameter_binder& bindings) { void bind_object(Type &obj, parameter_binder& bindings) {
object_parameter_binder object_binder_(query_.command != sql_command::SQL_UPDATE); object_parameter_binder object_binder_;
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 >

View File

@ -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*/, uint64_t &/*rev*/) {} static void on_revision(const char * /*id*/, unsigned long long &/*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) {}

View File

@ -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*/, uint64_t &/*rev*/) { void on_revision(const char * /*id*/, unsigned long long &/*rev*/) {
++column_index_; ++column_index_;
} }

View File

@ -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*/, uint64_t &/*rev*/) { ++column_index_; } void on_revision(const char * /*id*/, unsigned long long &/*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_; }

View File

@ -61,8 +61,6 @@ 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;
@ -71,13 +69,10 @@ 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) {
if (include_primary_key_) { utils::data_type_traits<Type>::bind_value(*binder_, index_++, val, attr.size());
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*/);
@ -114,7 +109,6 @@ 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 {

View File

@ -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, uint64_t& x) { void session_insert_builder::on_revision(const char* id, unsigned long long& x) {
push(id, x); push(id, x);
} }

View File

@ -3,7 +3,7 @@
#include <iostream> #include <iostream>
namespace matador::orm { namespace matador::orm {
void session_query_builder::on_revision(const char *id, uint64_t &/*rev*/) { void session_query_builder::on_revision(const char *id, unsigned long long &/*rev*/) {
push(id); push(id);
} }

View File

@ -3,10 +3,8 @@
#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, uint64_t &x) { void key_value_generator::on_revision(const char *id, unsigned long long int &x) {
result_.emplace_back(id, x); result_.emplace_back(id, x);
} }

View File

@ -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, uint64_t &) void column_generator::on_revision(const char *id, unsigned long long int &)
{ {
if (has_many_to_many_) { if (has_many_to_many_) {
return; return;

View File

@ -2,19 +2,12 @@
#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);