added session context and implemented the executor interface for session
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
namespace matador::sql {
|
||||
class executor;
|
||||
class prepared_executor;
|
||||
class statement;
|
||||
struct query_context;
|
||||
}
|
||||
@@ -20,7 +19,7 @@ public:
|
||||
using query_intermediate::query_intermediate;
|
||||
|
||||
[[nodiscard]] utils::result<size_t, utils::error> execute(const sql::executor &exec) const;
|
||||
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::prepared_executor &exec) const;
|
||||
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::executor &exec) const;
|
||||
[[nodiscard]] sql::query_context compile(const sql::executor &exec) const;
|
||||
[[nodiscard]] std::string str(const sql::executor &exec) const;
|
||||
};
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
namespace matador::sql {
|
||||
class executor;
|
||||
class prepared_executor;
|
||||
class statement;
|
||||
}
|
||||
|
||||
@@ -69,7 +68,7 @@ public:
|
||||
return utils::ok(std::optional<Type>{std::nullopt});
|
||||
}
|
||||
|
||||
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::prepared_executor &exec) const;
|
||||
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::executor &exec) const;
|
||||
|
||||
[[nodiscard]] std::string str(const sql::executor &exec) const;
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class connection_impl;
|
||||
/**
|
||||
* @brief The connection class represents a connection to a database.
|
||||
*/
|
||||
class connection final : public executor, public prepared_executor {
|
||||
class connection final : public executor {
|
||||
public:
|
||||
using logger_ptr = std::shared_ptr<abstract_sql_logger>;
|
||||
/**
|
||||
|
||||
@@ -12,22 +12,13 @@ struct query_context;
|
||||
class query_result_impl;
|
||||
class statement;
|
||||
|
||||
class dialect_executor_mixin {
|
||||
class executor {
|
||||
public:
|
||||
virtual ~dialect_executor_mixin() = default;
|
||||
virtual ~executor() = default;
|
||||
[[nodiscard]] virtual const class dialect& dialect() const = 0;
|
||||
};
|
||||
|
||||
class prepared_executor : public dialect_executor_mixin {
|
||||
public:
|
||||
[[nodiscard]] virtual utils::result<statement, utils::error> prepare(const query_context &ctx) = 0;
|
||||
};
|
||||
|
||||
class executor : public dialect_executor_mixin {
|
||||
public:
|
||||
[[nodiscard]] virtual utils::result<size_t, utils::error> execute(const query_context &ctx) const = 0;
|
||||
[[nodiscard]] virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &ctx) const = 0;
|
||||
|
||||
[[nodiscard]] virtual utils::result<statement, utils::error> prepare(const query_context &ctx) = 0;
|
||||
[[nodiscard]] virtual std::string str(const query_context &ctx) const = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -123,6 +123,8 @@ public:
|
||||
|
||||
[[nodiscard]] std::string sql() const;
|
||||
|
||||
[[nodiscard]] utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch_internal() const;
|
||||
|
||||
private:
|
||||
template<class Type>
|
||||
friend class detail::identifier_binder;
|
||||
|
||||
@@ -68,6 +68,7 @@ public:
|
||||
return bus_.subscribe<EventType>(handler);
|
||||
}
|
||||
|
||||
connection_pool& pool() const;
|
||||
|
||||
private:
|
||||
size_t max_size_{};
|
||||
|
||||
Reference in New Issue
Block a user