backend tests progress

This commit is contained in:
2024-02-01 17:14:48 +01:00
parent 7c02d745c8
commit c025fb282a
23 changed files with 354 additions and 272 deletions
+69 -4
View File
@@ -8,16 +8,17 @@
namespace matador::sql {
connection::connection(connection_info info)
connection::connection(connection_info info, const std::shared_ptr<table_repository> &repo)
: connection_info_(std::move(info))
, logger_(stdout, "SQL")
, dialect_(backend_provider::instance().connection_dialect(info.type))
, dialect_(backend_provider::instance().connection_dialect(connection_info_.type))
, table_repository_(repo)
{
connection_.reset(backend_provider::instance().create_connection(connection_info_.type, connection_info_));
}
connection::connection(const std::string& dns)
: connection(connection_info::parse(dns))
connection::connection(const std::string& dns, const std::shared_ptr<table_repository> &repo)
: connection(connection_info::parse(dns), repo)
{}
connection::connection(const connection &x)
@@ -68,6 +69,36 @@ const connection_info &connection::info() const
return connection_info_;
}
query_create_intermediate connection::create()
{
return query_create_intermediate(*this);
}
query_drop_intermediate connection::drop()
{
return query_drop_intermediate{*this};
}
query_select_intermediate connection::select(std::initializer_list<column> columns)
{
return {*this, columns};
}
query_insert_intermediate connection::insert()
{
return query_insert_intermediate{*this};
}
query_update_intermediate connection::update(const std::string &table)
{
return query_update_intermediate{*this, table};
}
query_delete_intermediate connection::remove()
{
return query_delete_intermediate{*this};
}
record connection::describe(const std::string &table_name) const
{
return std::move(connection_->describe(table_name));
@@ -78,12 +109,41 @@ bool connection::exists(const std::string &schema_name, const std::string &table
return connection_->exists(schema_name, table_name);
}
bool connection::exists(const std::string &table_name) const
{
return connection_->exists(dialect_.default_schema_name(), table_name);
}
size_t connection::execute(const std::string &sql) const
{
logger_.debug(sql);
return connection_->execute(sql);
}
query_result<record> connection::fetch(const query_context &q) const
{
if (q.prototype.empty() || q.prototype.unknown()) {
const auto table_prototype = describe(q.table_name);
for (auto &col : q.prototype) {
if (const auto rit = table_prototype.find(col.name()); col.type() == data_type_t::type_unknown && rit != table_prototype.end()) {
const_cast<column&>(col).type(rit->type());
}
}
}
// auto it = prototypes_.find(q.table_name);
// if (it == prototypes_.end()) {
// it = prototypes_.emplace(q.table_name, describe(q.table_name)).first;
// }
// // adjust columns from given query
// for (auto &col : q.prototype) {
// if (const auto rit = it->second.find(col.name()); col.type() == data_type_t::type_unknown && rit != it->second.end()) {
// const_cast<column&>(col).type(rit->type());
// }
// }
auto res = fetch(q.sql);
return query_result<record>{std::move(res), q.prototype};
}
std::unique_ptr<query_result_impl> connection::fetch(const std::string &sql) const
{
logger_.debug(sql);
@@ -100,4 +160,9 @@ const class dialect &connection::dialect() const
return dialect_;
}
std::shared_ptr<table_repository> connection::tables() const
{
return table_repository_;
}
}
+43 -39
View File
@@ -5,83 +5,83 @@ namespace matador::sql {
query_result<record> query_select_finish::fetch_all()
{
return session_.fetch(builder_.compile());
return connection_.fetch(builder_.compile());
}
record query_select_finish::fetch_one()
{
return *session_.fetch(builder_.compile()).begin().get();
return *connection_.fetch(builder_.compile()).begin().get();
}
std::unique_ptr<query_result_impl> query_select_finish::fetch()
{
return session_.fetch(builder_.compile().sql);
return connection_.fetch(builder_.compile().sql);
}
statement query_select_finish::prepare()
{
return session_.prepare(builder_.compile());
return connection_.prepare(builder_.compile());
}
query_intermediate::query_intermediate(session &db, query_builder &query)
: session_(db), builder_(query) {}
query_intermediate::query_intermediate(connection &db, query_builder &query)
: connection_(db), builder_(query) {}
query_offset_intermediate query_order_direction_intermediate::offset(size_t offset)
{
return {session_, builder_};
return {connection_, builder_};
}
query_limit_intermediate query_offset_intermediate::limit(size_t limit)
{
return {session_, builder_};
return {connection_, builder_};
}
query_limit_intermediate query_order_direction_intermediate::limit(size_t limit)
{
return {session_, builder_};
return {connection_, builder_};
}
query_order_by_intermediate query_group_by_intermediate::order_by(const std::string &name)
{
return {session_, builder_.order_by(name)};
return {connection_, builder_.order_by(name)};
}
query_order_direction_intermediate query_order_by_intermediate::asc()
{
return {session_, builder_.asc()};
return {connection_, builder_.asc()};
}
query_order_direction_intermediate query_order_by_intermediate::desc()
{
return {session_, builder_.desc()};
return {connection_, builder_.desc()};
}
query_group_by_intermediate query_from_intermediate::group_by(const std::string &name)
{
return {session_, builder_.group_by(name)};
return {connection_, builder_.group_by(name)};
}
query_order_by_intermediate query_from_intermediate::order_by(const std::string &name)
{
return {session_, builder_.order_by(name)};
return {connection_, builder_.order_by(name)};
}
query_group_by_intermediate query_where_intermediate::group_by(const std::string &name)
{
return {session_, builder_.group_by(name)};
return {connection_, builder_.group_by(name)};
}
query_order_by_intermediate query_where_intermediate::order_by(const std::string &name)
{
return {session_, builder_.order_by(name)};
return {connection_, builder_.order_by(name)};
}
query_where_intermediate query_from_intermediate::where(const basic_condition &cond)
{
return query_where_intermediate{session_, builder_.where(cond)};
return query_where_intermediate{connection_, builder_.where(cond)};
}
query_select_intermediate::query_select_intermediate(session &s, const std::vector<column>& columns)
query_select_intermediate::query_select_intermediate(connection &s, const std::vector<column>& columns)
: query_start_intermediate(s)
{
builder_.select(columns);
@@ -89,10 +89,10 @@ query_select_intermediate::query_select_intermediate(session &s, const std::vect
query_from_intermediate query_select_intermediate::from(const std::string &table, const std::string &as)
{
return {session_, builder_.from(table, as)};
return {connection_, builder_.from(table, as)};
}
query_insert_intermediate::query_insert_intermediate(session &s)
query_insert_intermediate::query_insert_intermediate(connection &s)
: query_start_intermediate(s)
{
builder_.insert();
@@ -100,36 +100,40 @@ query_insert_intermediate::query_insert_intermediate(session &s)
query_into_intermediate query_insert_intermediate::into(const std::string &table, std::initializer_list<std::string> column_names)
{
return {session_, builder_.into(table, column_names)};
return {connection_, builder_.into(table, column_names)};
}
size_t query_execute_finish::execute()
{
return session_.execute(builder_.compile().sql);
return connection_.execute(builder_.compile().sql);
}
statement query_execute_finish::prepare()
{
return session_.prepare(builder_.compile());
return connection_.prepare(builder_.compile());
}
query_execute_finish query_into_intermediate::values(std::initializer_list<any_type> values)
{
return {session_, builder_.values(values)};
return {connection_, builder_.values(values)};
}
query_create_intermediate::query_create_intermediate(session &s, table_repository &repo)
: query_start_intermediate(s)
, repository_(repo) {
query_create_intermediate::query_create_intermediate(connection &db)
: query_start_intermediate(db) {
builder_.create();
}
query_execute_finish query_create_intermediate::table(const std::string &table, std::initializer_list<column> columns)
{
return {session_, builder_.table(table, columns)};
return {connection_, builder_.table(table, columns)};
}
query_drop_intermediate::query_drop_intermediate(session &s)
std::shared_ptr<table_repository> query_create_intermediate::tables() const
{
return connection_.tables();
}
query_drop_intermediate::query_drop_intermediate(connection &s)
: query_start_intermediate(s)
{
builder_.drop();
@@ -137,20 +141,20 @@ query_drop_intermediate::query_drop_intermediate(session &s)
query_execute_finish query_drop_intermediate::table(const std::string &table)
{
return {session_, builder_.table(table)};
return {connection_, builder_.table(table)};
}
query_execute_finish query_execute_where_intermediate::limit(int limit)
{
return {session_, builder_.limit(limit)};
return {connection_, builder_.limit(limit)};
}
query_execute_where_intermediate query_set_intermediate::where(const basic_condition &cond)
{
return {session_, builder_.where(cond)};
return {connection_, builder_.where(cond)};
}
query_update_intermediate::query_update_intermediate(session &s, const std::string& table_name)
query_update_intermediate::query_update_intermediate(connection &s, const std::string& table_name)
: query_start_intermediate(s)
{
builder_.update(table_name);
@@ -158,15 +162,15 @@ query_update_intermediate::query_update_intermediate(session &s, const std::stri
query_set_intermediate query_update_intermediate::set(std::initializer_list<key_value_pair> columns)
{
return {session_, builder_.set(columns)};
return {connection_, builder_.set(columns)};
}
query_execute_where_intermediate query_delete_from_intermediate::where(const basic_condition &cond)
{
return {session_, builder_.where(cond)};
return {connection_, builder_.where(cond)};
}
query_delete_intermediate::query_delete_intermediate(session &s)
query_delete_intermediate::query_delete_intermediate(connection &s)
: query_start_intermediate(s)
{
builder_.remove();
@@ -174,11 +178,11 @@ query_delete_intermediate::query_delete_intermediate(session &s)
query_delete_from_intermediate query_delete_intermediate::from(const std::string &table)
{
return {session_, builder_.from(table)};
return {connection_, builder_.from(table)};
}
query_start_intermediate::query_start_intermediate(session &s)
: session_(s)
query_start_intermediate::query_start_intermediate(connection &s)
: connection_(s)
, builder_(s.dialect())
{}
}
+8
View File
@@ -1,5 +1,6 @@
#include "matador/sql/record.hpp"
#include <algorithm>
#include <stdexcept>
namespace matador::sql {
@@ -133,6 +134,13 @@ void record::clear()
columns_by_name_.clear();
}
bool record::unknown() const
{
return std::all_of(std::begin(columns_), std::end(columns_), [](const auto &col) {
return col.type() == data_type_t::type_unknown;
});
}
void record::init()
{
size_t index{0};
-30
View File
@@ -10,36 +10,6 @@ session::session(connection_pool<connection> &pool)
: pool_(pool)
, dialect_(backend_provider::instance().connection_dialect(pool_.info().type)) {}
query_create_intermediate session::create()
{
return query_create_intermediate{*this, table_repository_};
}
query_drop_intermediate session::drop()
{
return query_drop_intermediate{*this};
}
query_select_intermediate session::select(std::initializer_list<column> columns)
{
return {*this, columns};
}
query_insert_intermediate session::insert()
{
return query_insert_intermediate{*this};
}
query_update_intermediate session::update(const std::string &table)
{
return query_update_intermediate{*this, table};
}
query_delete_intermediate session::remove()
{
return query_delete_intermediate{*this};
}
query_result<record> session::fetch(const query_context &q) const
{
auto c = pool_.acquire();
+5
View File
@@ -31,4 +31,9 @@ std::pair<std::string, std::string> table_repository::reference(const std::type_
return {};
}
bool table_repository::exists(const std::type_index &ti) const
{
return repository_.count(ti) > 0;
}
}