implemented lazy loading for object_ptr and belongs_to

This commit is contained in:
2026-01-15 12:40:54 +01:00
parent db8e137c11
commit 7626331866
81 changed files with 1790 additions and 927 deletions
+24 -6
View File
@@ -3,7 +3,6 @@
#include "matador/sql/backend_provider.hpp"
#include "matador/sql/dialect.hpp"
#include "matador/sql/dialect_token.hpp"
#include "matador/sql/error_code.hpp"
#include "matador/sql/interface/connection_impl.hpp"
@@ -28,16 +27,29 @@ public:
};
}
connection::connection(const connection_info& info, const std::shared_ptr<abstract_sql_logger> &sql_logger)
: logger_(sql_logger)
{
connection::connection(const connection_info& info, logger_ptr sql_logger)
: logger_(std::move(sql_logger)) {
connection_.reset(backend_provider::instance().create_connection(info.type, info));
}
connection::connection(const std::string& dns, const std::shared_ptr<abstract_sql_logger> &sql_logger)
connection::connection(const connection_info &info,
std::shared_ptr<producer_resolver_factory> resolver_factory,
logger_ptr sql_logger)
: logger_(std::move(sql_logger))
, resolver_factory_(std::move(resolver_factory)) {
connection_.reset(backend_provider::instance().create_connection(info.type, info));
}
connection::connection(const std::string& dns, const logger_ptr &sql_logger)
: connection(connection_info::parse(dns), sql_logger)
{}
connection::connection(const std::string &dns,
std::shared_ptr<producer_resolver_factory> resolver_factory,
const logger_ptr &sql_logger)
: connection(connection_info::parse(dns), std::move(resolver_factory), sql_logger)
{}
connection::connection(const connection &x) {
if (x.connection_) {
throw std::runtime_error("couldn't copy connection with valid connection impl");
@@ -58,11 +70,13 @@ connection &connection::operator=(const connection &x) {
connection::connection( connection&& x ) noexcept
: connection_(std::move(x.connection_))
, logger_(std::move(x.logger_))
, resolver_factory_(std::move(x.resolver_factory_))
{}
connection & connection::operator=(connection &&x) noexcept {
connection_ = std::move(x.connection_);
logger_ = std::move(x.logger_);
resolver_factory_ = std::move(x.resolver_factory_);
return *this;
}
@@ -71,7 +85,7 @@ connection::~connection() {
if (!connection_) {
return;
}
if (connection_->is_open()) {
if (const auto result = connection_->is_open(); *result) {
connection_->close();
}
connection_impl* impl = connection_.release();
@@ -219,6 +233,10 @@ const class dialect &connection::dialect() const
return connection_->dialect();
}
std::shared_ptr<class producer_resolver_factory> connection::resolver_factory() const {
return resolver_factory_;
}
utils::result<std::unique_ptr<statement_impl>, utils::error> connection::perform_prepare(const query_context& ctx) const {
if (ctx.command != sql_command::SQL_CREATE_TABLE && (ctx.prototype.empty() || has_unknown_columns(ctx.prototype))) {
if (const auto result = describe(ctx.table_name); result.is_ok()) {