Compare commits
No commits in common. "95cd3630972736e1f0c5250848dacb94b008b5a2" and "e7523e2bbad6aeee02992b816cef7a710c92165c" have entirely different histories.
95cd363097
...
e7523e2bba
|
|
@ -1,8 +1,6 @@
|
||||||
#ifndef MATADOR_INSERT_QUERY_BUILDER_HPP
|
#ifndef MATADOR_INSERT_QUERY_BUILDER_HPP
|
||||||
#define MATADOR_INSERT_QUERY_BUILDER_HPP
|
#define MATADOR_INSERT_QUERY_BUILDER_HPP
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "matador/object/collection.hpp"
|
#include "matador/object/collection.hpp"
|
||||||
|
|
||||||
#include "matador/query/basic_schema.hpp"
|
#include "matador/query/basic_schema.hpp"
|
||||||
|
|
@ -71,93 +69,6 @@ struct insert_step {
|
||||||
std::function<void()> make_object_persistent{};
|
std::function<void()> make_object_persistent{};
|
||||||
};
|
};
|
||||||
|
|
||||||
class insert_step2 {
|
|
||||||
public:
|
|
||||||
explicit insert_step2(sql::query_context ctx)
|
|
||||||
: ctx_(std::move(ctx)) {}
|
|
||||||
virtual ~insert_step2() = default;
|
|
||||||
|
|
||||||
virtual utils::result<void, utils::error> prepare(sql::executor &conn) const = 0;
|
|
||||||
virtual utils::result<void, utils::error> insert(sql::statement &stmt) const = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
utils::primary_key_accessor pk_accessor_;
|
|
||||||
sql::query_context ctx_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename ObjectType>
|
|
||||||
class insert_step_sequence : public insert_step2 {
|
|
||||||
public:
|
|
||||||
insert_step_sequence(sql::query_context ctx, const object::object_ptr<ObjectType>& ptr, abstract_pk_generator& pk_generator)
|
|
||||||
: insert_step2(std::move(ctx))
|
|
||||||
, ptr_(ptr)
|
|
||||||
, pk_generator_(pk_generator){}
|
|
||||||
|
|
||||||
utils::result<void, utils::error> prepare(sql::executor& conn) const override {
|
|
||||||
auto result = pk_generator_.next_id(conn);
|
|
||||||
if (!result.is_ok()) {
|
|
||||||
return utils::failure(result.err());
|
|
||||||
}
|
|
||||||
pk_accessor_.set(*ptr_, *result);
|
|
||||||
|
|
||||||
return utils::ok<void>();
|
|
||||||
}
|
|
||||||
|
|
||||||
utils::result<void, utils::error> insert(sql::statement& stmt) const override {
|
|
||||||
stmt.bind(*ptr_);
|
|
||||||
|
|
||||||
if (const auto exec_result = stmt.execute(); !exec_result.is_ok()) {
|
|
||||||
return utils::failure(exec_result.err());
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr_.change_state(object::object_state::Persistent);
|
|
||||||
return utils::ok<void>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
object::object_ptr<ObjectType> ptr_;
|
|
||||||
abstract_pk_generator& pk_generator_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename ObjectType>
|
|
||||||
class insert_step_identity : public insert_step2 {
|
|
||||||
public:
|
|
||||||
insert_step_identity(sql::query_context ctx, const object::object_ptr<ObjectType>& ptr)
|
|
||||||
: insert_step2(std::move(ctx))
|
|
||||||
, ptr_(ptr) {}
|
|
||||||
|
|
||||||
utils::result<void, utils::error> prepare(sql::executor& conn) const override {
|
|
||||||
return utils::ok<void>();
|
|
||||||
}
|
|
||||||
|
|
||||||
utils::result<void, utils::error> insert(sql::statement& stmt) const override {
|
|
||||||
stmt.bind(*ptr_);
|
|
||||||
|
|
||||||
auto record = stmt.fetch_one();
|
|
||||||
if (!record.is_ok()) {
|
|
||||||
return utils::failure(record.err());
|
|
||||||
}
|
|
||||||
if (!record.value().has_value()) {
|
|
||||||
return utils::failure(utils::error(error_code::FailedToFindObject, "Failed to insert object and retrieve identity."));
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto pk_name = info.primary_key_attribute()->name();
|
|
||||||
const table_column pk_col(&it->second.table(), pk_name);
|
|
||||||
step.apply_returning = [ptr, &step, pk_name = pk_name](const sql::record &rec) {
|
|
||||||
const auto& f = rec.at(pk_name);
|
|
||||||
utils::identifier id;
|
|
||||||
id.assign(f.value());
|
|
||||||
step.pk_accessor.set(*ptr, id);
|
|
||||||
};
|
|
||||||
|
|
||||||
ptr_.change_state(object::object_state::Persistent);
|
|
||||||
return utils::ok<void>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
object::object_ptr<ObjectType> ptr_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class ObjectType>
|
template<class ObjectType>
|
||||||
class insert_query_builder {
|
class insert_query_builder {
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue