session progress
This commit is contained in:
@@ -85,4 +85,12 @@ basic_schema::const_iterator basic_schema::find(const std::string &name) const {
|
||||
bool basic_schema::contains(const std::type_index &index) const {
|
||||
return schema_nodes_.count(index) == 1;
|
||||
}
|
||||
}
|
||||
|
||||
const std::unordered_map<std::type_index, std::unique_ptr<sql::object_resolver_producer>> & basic_schema::resolver_producers() const {
|
||||
return resolver_producers_;
|
||||
}
|
||||
|
||||
const std::unordered_map<object::collection_composite_key, std::unique_ptr<sql::collection_resolver_producer>, object::collection_composite_key_hash> & basic_schema::collection_resolver_producers() const {
|
||||
return collection_resolver_producers_;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,9 @@ template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
|
||||
template<class... Ts> overload(Ts...) -> overload<Ts...>;
|
||||
|
||||
void criteria_evaluator::visit(const binary_criteria &node) {
|
||||
query_.bind_vars.emplace_back(node.col().name());
|
||||
if (std::holds_alternative<utils::placeholder>(node.value())) {
|
||||
query_.bind_vars.emplace_back(node.col().name());
|
||||
}
|
||||
clause_ += prepare_criteria(dialect_, node.col()) + " " + detail::BinaryOperatorEnum.to_string(node.operand()) + " ";
|
||||
|
||||
evaluate_value(node.value());
|
||||
|
||||
@@ -23,6 +23,8 @@ std::string query_category_impl::message(int ev) const {
|
||||
return "Invalid constraint";
|
||||
case error_code::InvalidDataType:
|
||||
return "Invalid data type";
|
||||
case error_code::InvalidObject:
|
||||
return "Invalid object";
|
||||
case error_code::InvalidValue:
|
||||
return "Invalid value";
|
||||
case error_code::InvalidRelationType:
|
||||
|
||||
@@ -8,10 +8,10 @@ manual_pk_generator::manual_pk_generator()
|
||||
}
|
||||
|
||||
utils::result<int64_t, utils::error> manual_pk_generator::next_id(const sql::executor &/*exec*/) {
|
||||
return utils::failure(utils::error(sql::error_code::FAILURE, "Manual PK generator not implemented"));
|
||||
return utils::failure(utils::error(sql::error_code::Failure, "Manual PK generator not implemented"));
|
||||
}
|
||||
|
||||
utils::result<int64_t, utils::error> manual_pk_generator::current_id(const sql::executor& /*exec*/) {
|
||||
return utils::failure(utils::error(sql::error_code::FAILURE, "Manual PK generator not implemented"));
|
||||
return utils::failure(utils::error(sql::error_code::Failure, "Manual PK generator not implemented"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,7 +357,7 @@ void query_builder::visit(internal::query_set_part& part) {
|
||||
if (!first) {
|
||||
query_.sql.append(", ");
|
||||
}
|
||||
query_.sql.append(dialect_->prepare_identifier_string(column_value.col().name()) + "=");
|
||||
query_.sql.append(dialect_->prepare_identifier_string(column_value.col().column_name()) + "=");
|
||||
query_.sql.append(determine_value(*dialect_, query_, column_value.expression()));
|
||||
first = false;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ sequence_pk_generator::sequence_pk_generator(const std::string& sequence_name)
|
||||
utils::result<int64_t, utils::error> sequence_pk_generator::next_id(const sql::executor& exec) {
|
||||
return next_id_query_.fetch_value<int64_t>(exec).and_then([](const std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
||||
if (!id) {
|
||||
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
||||
return utils::failure(utils::error(sql::error_code::RetrieveDataFailed, "Sequence returned no value"));
|
||||
}
|
||||
return utils::ok(*id);
|
||||
});
|
||||
@@ -22,7 +22,7 @@ utils::result<int64_t, utils::error> sequence_pk_generator::next_id(const sql::e
|
||||
utils::result<int64_t, utils::error> sequence_pk_generator::current_id(const sql::executor& exec) {
|
||||
return current_id_query_.fetch_value<int64_t>(exec).and_then([](const std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
||||
if (!id) {
|
||||
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
||||
return utils::failure(utils::error(sql::error_code::RetrieveDataFailed, "Sequence returned no value"));
|
||||
}
|
||||
return utils::ok(*id);
|
||||
});
|
||||
|
||||
@@ -10,21 +10,11 @@
|
||||
#include <stdexcept>
|
||||
|
||||
namespace matador::query {
|
||||
class producer_accessor {
|
||||
public:
|
||||
static const std::unordered_map<std::type_index, std::unique_ptr<sql::object_resolver_producer>>& resolver_producers(const basic_schema& scm) {
|
||||
return scm.resolver_producers_;
|
||||
}
|
||||
static const std::unordered_map<object::collection_composite_key, std::unique_ptr<sql::collection_resolver_producer>, object::collection_composite_key_hash>& collection_resolver_producers(const basic_schema& scm) {
|
||||
return scm.collection_resolver_producers_;
|
||||
}
|
||||
};
|
||||
|
||||
utils::error make_error(const error_code ec, const std::string &msg) {
|
||||
return utils::error(ec, msg);
|
||||
}
|
||||
|
||||
session::session(session_context&& ctx, const query::schema &scm)
|
||||
session::session(session_context&& ctx, const basic_schema &scm)
|
||||
: pool_(ctx.dns, ctx.connection_count, [ctx](const sql::connection_info& info) { return sql::connection(info, ctx.resolver_service); })
|
||||
, cache_(ctx.bus, pool_, ctx.cache_size)
|
||||
, dialect_(sql::backend_provider::instance().connection_dialect(pool_.info().type))
|
||||
@@ -32,15 +22,15 @@ session::session(session_context&& ctx, const query::schema &scm)
|
||||
, resolver_service_(ctx.resolver_service) {
|
||||
using namespace matador::utils;
|
||||
for (const auto &[type, node] : schema_) {
|
||||
query::query_contexts queries;
|
||||
query_contexts queries;
|
||||
|
||||
// SELECT all
|
||||
queries.select_all = query::select(node.table())
|
||||
queries.select_all = select(node.table())
|
||||
.from(node.name())
|
||||
.compile(dialect_);
|
||||
if (node.table().has_primary_key()) {
|
||||
// SELECT one
|
||||
queries.select_one = query::select(node.table())
|
||||
queries.select_one = select(node.table())
|
||||
.from(node.name())
|
||||
.where(*node.table().primary_key_column() == _)
|
||||
.compile(dialect_);
|
||||
@@ -58,9 +48,16 @@ session::session(session_context&& ctx, const query::schema &scm)
|
||||
.compile(dialect_);
|
||||
}
|
||||
// INSERT one
|
||||
std::vector<table_column> columns;
|
||||
for (const auto &col: node.table().columns()) {
|
||||
if (col.is_primary_key() && utils::is_constraint_set(col.attributes().options(), constraints::Identity)) {
|
||||
continue;
|
||||
}
|
||||
columns.push_back(col);
|
||||
}
|
||||
queries.insert = query::insert()
|
||||
.into(node.name(), node.table())
|
||||
.values(query::generator::placeholders(node.table().columns().size()))
|
||||
.into(node.name(), columns)
|
||||
.values(generator::placeholders(columns.size()))
|
||||
.compile(dialect_);
|
||||
|
||||
queries.insert.resolver = resolver_service_;
|
||||
@@ -71,8 +68,7 @@ session::session(session_context&& ctx, const query::schema &scm)
|
||||
contexts_by_type_[node.node().type_index()] = queries;
|
||||
}
|
||||
|
||||
auto factory = std::make_shared<sql::producer_resolver_factory>();
|
||||
for (const auto &pair : producer_accessor::resolver_producers(schema_)) {
|
||||
for (const auto &pair : schema_.resolver_producers()) {
|
||||
auto res = pair.second->build_query(dialect_).and_then([this](sql::query_context&& query_ctx) -> result<sql::statement, error> {
|
||||
query_ctx.resolver = resolver_service_;
|
||||
return cache_.acquire(query_ctx);
|
||||
@@ -89,8 +85,7 @@ session::session(session_context&& ctx, const query::schema &scm)
|
||||
}
|
||||
}
|
||||
|
||||
auto collection_factory = std::make_shared<sql::producer_collection_resolver_factory>();
|
||||
for (const auto &pair : producer_accessor::collection_resolver_producers(schema_)) {
|
||||
for (const auto &pair : schema_.collection_resolver_producers()) {
|
||||
auto res = pair.second->build_query(dialect_).and_then([this](sql::query_context&& query_ctx) -> result<sql::statement, error> {
|
||||
query_ctx.resolver = resolver_service_;
|
||||
return cache_.acquire(query_ctx);
|
||||
@@ -108,43 +103,7 @@ session::session(session_context&& ctx, const query::schema &scm)
|
||||
}
|
||||
}
|
||||
|
||||
// const class sql::dialect &session::dialect() const {
|
||||
// return dialect_;
|
||||
// }
|
||||
//
|
||||
// std::shared_ptr<sql::resolver_service> session::resolver() const {
|
||||
// return resolver_service_;
|
||||
// }
|
||||
|
||||
const query::basic_schema & session::schema() const {
|
||||
const basic_schema & session::schema() const {
|
||||
return schema_;
|
||||
}
|
||||
|
||||
// utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> session::fetch(const sql::query_context& ctx) const {
|
||||
// if (const auto result = cache_.acquire(ctx); !result) {
|
||||
// return utils::failure(result.err());
|
||||
// } else if (auto fetch_result = result->fetch_internal(); !fetch_result) {
|
||||
// return utils::failure(fetch_result.err());
|
||||
// } else {
|
||||
// return fetch_result;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// utils::result<sql::execute_result, utils::error> session::execute(const sql::query_context& ctx) const {
|
||||
// if (const auto result = cache_.acquire(ctx); !result) {
|
||||
// return utils::failure(result.err());
|
||||
// } else if (auto exec_result = result->execute(); !exec_result) {
|
||||
// return utils::failure(exec_result.err());
|
||||
// } else {
|
||||
// return exec_result;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// utils::result<sql::statement, utils::error> session::prepare(const sql::query_context& ctx) {
|
||||
// return cache_.acquire(ctx);
|
||||
// }
|
||||
//
|
||||
// std::string session::str(const sql::query_context& ctx) const {
|
||||
// return ctx.sql;
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ table_pk_generator::table_pk_generator(const std::string& table_name, const std:
|
||||
utils::result<int64_t, utils::error> table_pk_generator::next_id(const sql::executor &exec) {
|
||||
return next_id_query_.fetch_value<int64_t>(exec).and_then([](const std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
||||
if (!id) {
|
||||
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
||||
return utils::failure(utils::error(sql::error_code::RetrieveDataFailed, "Sequence returned no value"));
|
||||
}
|
||||
return utils::ok(*id);
|
||||
});
|
||||
@@ -30,7 +30,7 @@ utils::result<int64_t, utils::error> table_pk_generator::next_id(const sql::exec
|
||||
utils::result<int64_t, utils::error> table_pk_generator::current_id(const sql::executor& exec) {
|
||||
return current_id_query_.fetch_value<int64_t>(exec).and_then([](const std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
||||
if (!id) {
|
||||
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
||||
return utils::failure(utils::error(sql::error_code::RetrieveDataFailed, "Sequence returned no value"));
|
||||
}
|
||||
return utils::ok(*id);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user