added session context and implemented the executor interface for session

This commit is contained in:
Sascha Kühl
2025-08-14 15:48:21 +02:00
parent a32330ef5b
commit 843d125b99
19 changed files with 131 additions and 100 deletions
+2 -1
View File
@@ -11,7 +11,8 @@ enum class error_code : uint8_t {
NoConnectionAvailable,
UnknownType,
FailedToBuildQuery,
FailedToFindObject
FailedToFindObject,
Failed
};
class orm_category_impl final : public std::error_category
+52 -42
View File
@@ -9,7 +9,9 @@
#include "matador/sql/column_generator.hpp"
#include "matador/sql/connection.hpp"
#include "matador/sql/connection_pool.hpp"
#include "matador/sql/executor.hpp"
#include "matador/sql/statement.hpp"
#include "matador/sql/statement_cache.hpp"
#include "matador/object/object_ptr.hpp"
#include "matador/object/object_definition.hpp"
@@ -21,9 +23,15 @@ namespace matador::orm {
utils::error make_error(error_code ec, const std::string &msg);
class session final {
struct session_context {
utils::message_bus &bus;
sql::connection_pool &pool;
size_t cache_size{500};
};
class session final : public sql::executor {
public:
explicit session(sql::connection_pool &pool);
explicit session(session_context &&ctx);
template<typename Type>
[[nodiscard]] utils::result<void, utils::error> attach(const std::string &table_name) const;
@@ -42,10 +50,10 @@ public:
template<typename Type, typename PrimaryKeyType>
utils::result<object::object_ptr<Type>, utils::error> find(const PrimaryKeyType &pk) {
auto c = pool_.acquire();
if (!c.valid()) {
return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection."));
}
// auto c = pool_.acquire();
// if (!c.valid()) {
// return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection."));
// }
auto info = schema_->info<Type>();
if (!info) {
return utils::failure(make_error(error_code::UnknownType, "Failed to determine requested type."));
@@ -57,7 +65,7 @@ public:
return utils::failure(make_error(error_code::FailedToBuildQuery, "Failed to build query for type " + info->get().name() + "."));
}
auto obj = build_select_query(data.release()).template fetch_one<Type>(*c);
auto obj = build_select_query(data.release()).template fetch_one<Type>(*this);
if (!obj) {
return utils::failure(obj.err());
@@ -70,10 +78,10 @@ public:
template<typename Type>
utils::result<sql::query_result<Type>, utils::error> find() {
const auto c = pool_.acquire();
if (!c.valid()) {
return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection."));
}
// const auto c = pool_.acquire();
// if (!c.valid()) {
// return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection."));
// }
auto info = schema_->info<Type>();
if (!info) {
return utils::failure(make_error(error_code::UnknownType, "Failed to determine requested type."));
@@ -85,51 +93,54 @@ public:
return utils::failure(make_error(error_code::FailedToBuildQuery, "Failed to build query for type " + info->get().name() + "."));
}
return build_select_query(data.release()).template fetch_all<Type>(*c);
}
template<typename Type>
utils::result<query::query_from_intermediate, utils::error> select() {
auto c = pool_.acquire();
if (!c.valid()) {
return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection."));
}
auto info = schema_->info<Type>();
if (!info) {
return utils::failure(make_error(error_code::UnknownType, "Failed to determine requested type."));
}
session_query_builder eqb(*schema_);
auto data = eqb.build<Type>();
if (!data.is_ok()) {
return utils::failure(make_error(error_code::FailedToBuildQuery, "Failed to build query for type " + info->get().name() + "."));
}
return utils::ok(build_select_query(data.release()).template fetch_all<Type>(*c));
return build_select_query(data.release()).template fetch_all<Type>(*this);
}
// template<typename Type>
// utils::result<query::query_from_intermediate, utils::error> select() {
// auto c = pool_.acquire();
// if (!c.valid()) {
// return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection."));
// }
// auto info = schema_->info<Type>();
// if (!info) {
// return utils::failure(make_error(error_code::UnknownType, "Failed to determine requested type."));
// }
//
// session_query_builder eqb(*schema_);
// auto data = eqb.build<Type>();
// if (!data.is_ok()) {
// return utils::failure(make_error(error_code::FailedToBuildQuery, "Failed to build query for type " + info->get().name() + "."));
// }
//
// return utils::ok(build_select_query(data.release()).template fetch_all<Type>(*c));
// }
//
template<typename Type>
utils::result<void, utils::error> drop_table();
utils::result<void, utils::error> drop_table(const std::string &table_name) const;
[[nodiscard]] utils::result<sql::query_result<sql::record>, utils::error> fetch(const sql::query_context &q) const;
[[nodiscard]] size_t execute(const std::string &sql) const;
[[nodiscard]] sql::statement prepare(const sql::query_context& q) const;
[[nodiscard]] utils::result<sql::query_result<sql::record>, utils::error> fetch_all(const sql::query_context &q) const;
[[nodiscard]] utils::result<size_t, utils::error> execute(const std::string &sql) const;
[[nodiscard]] std::vector<object::attribute_definition> describe_table(const std::string &table_name) const;
[[nodiscard]] bool table_exists(const std::string &table_name) const;
[[nodiscard]] const sql::dialect& dialect() const;
void dump_schema(std::ostream &os) const;
[[nodiscard]] utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::query_context &ctx) const override;
[[nodiscard]] utils::result<size_t, utils::error> execute(const sql::query_context &ctx) const override;
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(const sql::query_context &ctx) override;
[[nodiscard]] std::string str( const sql::query_context& ctx ) const override;
[[nodiscard]] const sql::dialect& dialect() const override;
private:
friend class query_select;
static query::fetchable_query build_select_query(entity_query_data &&data);
private:
sql::connection_pool &pool_;
mutable sql::statement_cache cache_;
const sql::dialect &dialect_;
std::unique_ptr<object::schema> schema_;
@@ -147,9 +158,8 @@ utils::result<void, utils::error> session::attach( const std::string& table_name
}
template<typename Type>
utils::result<object::object_ptr<Type>, utils::error> session::insert(Type *obj)
{
auto c = pool_.acquire();
utils::result<object::object_ptr<Type>, utils::error> session::insert(Type *obj) {
// auto c = pool_.acquire();
auto info = schema_->info<Type>();
if (!info) {
return utils::failure(info.err());
@@ -158,7 +168,7 @@ utils::result<object::object_ptr<Type>, utils::error> session::insert(Type *obj)
auto res = query::query::insert()
.into(info->get().name(), sql::column_generator::generate<Type>(*schema_, true))
.values(*obj)
.execute(*c);
.execute(*this);
if (!res) {
return utils::failure(res.err());
}