introduced table repository

This commit is contained in:
2023-11-16 20:15:52 +01:00
parent 7c1e940814
commit c801d53e8c
25 changed files with 589 additions and 150 deletions
+4 -2
View File
@@ -15,7 +15,8 @@ set(SQL_SOURCES
sql/column_generator.cpp
sql/column_name_generator.cpp
sql/key_value_generator.cpp
sql/fk_value_extractor.cpp)
sql/fk_value_extractor.cpp
sql/table_repository.cpp)
set(SQL_HEADER
../include/matador/sql/dialect.hpp
@@ -42,7 +43,8 @@ set(SQL_HEADER
../include/matador/sql/any_type.hpp
../include/matador/sql/key_value_generator.hpp
../include/matador/sql/foreign.hpp
../include/matador/sql/fk_value_extractor.hpp)
../include/matador/sql/fk_value_extractor.hpp
"../include/matador/sql/table_repository.hpp")
set(UTILS_HEADER
../include/matador/utils/field_attributes.hpp
+21
View File
@@ -3,6 +3,27 @@
#include "matador/sql/column.hpp"
namespace matador::sql {
const column::data_type_index column::data_type_index_ {
data_type_t::type_char,
data_type_t::type_short,
data_type_t::type_int,
data_type_t::type_long,
data_type_t::type_long_long,
data_type_t::type_unsigned_char,
data_type_t::type_unsigned_short,
data_type_t::type_unsigned_int,
data_type_t::type_unsigned_long,
data_type_t::type_unsigned_long_long,
data_type_t::type_float,
data_type_t::type_double,
data_type_t::type_bool,
data_type_t::type_char_pointer,
data_type_t::type_varchar,
data_type_t::type_text,
data_type_t::type_null,
};
column::column(std::string name, data_type_t type, utils::field_attributes attr)
: name_(std::move(name))
, type_(type)
+9 -2
View File
@@ -2,8 +2,10 @@
namespace matador::sql {
column_generator::column_generator(std::vector<column> &columns)
: columns_(columns) {}
column_generator::column_generator(std::vector<column> &columns, const table_repository &repo)
: columns_(columns)
, repo_(repo)
{}
void column_generator::on_primary_key(const char *id, std::string &pk, size_t size)
{
@@ -15,6 +17,11 @@ void column_generator::on_revision(const char *id, unsigned long long int &x)
on_attribute(id, x);
}
std::pair<std::string, std::string> column_generator::determine_foreign_ref(const std::type_index &ti)
{
return repo_.reference(ti);
}
void fk_column_generator::on_primary_key(const char *, std::string &, size_t size)
{
type_ = data_type_traits<std::string>::builtin_type(size);
+5
View File
@@ -98,6 +98,11 @@ query_builder& query_builder::drop() {
}
query_builder& query_builder::select(std::initializer_list<std::string> column_names)
{
return select(std::vector<std::string>{column_names});
}
query_builder& query_builder::select(const std::vector<std::string> &column_names)
{
initialize(command_t::SELECT, state_t::QUERY_SELECT);
+4
View File
@@ -100,6 +100,10 @@ query_execute_finish query_into_intermediate::values(std::initializer_list<any_t
return {db(), query().values(values)};
}
query_create_intermediate::query_create_intermediate(session &db, query_builder &query, table_repository &repo)
: query_intermediate(db, query)
, repository_(repo) {}
query_execute_finish query_create_intermediate::table(const std::string &table, std::initializer_list<column> columns)
{
return {db(), query().table(table, columns)};
+47 -5
View File
@@ -1,13 +1,38 @@
#include "matador/sql/record.hpp"
#include <stdexcept>
namespace matador::sql {
record::record(std::initializer_list<column> columns)
: columns_(columns) {
size_t index{0};
for(auto &col : columns_) {
columns_by_name_.emplace(col.name(), column_index_pair {std::ref(col), index++});
: columns_(columns)
{
init();
}
record::record(const std::vector<column> &columns)
: columns_(columns)
{
init();
}
bool record::has_primary_key() const
{
return pk_index_ > -1;
}
const column &record::primary_key() const
{
if (!has_primary_key()) {
throw std::logic_error("record has no primary key");
}
return columns_[pk_index_];
}
const std::vector<column> &record::columns() const
{
return columns_;
}
const column &record::at(const std::string &name) const
@@ -34,7 +59,7 @@ record::const_iterator record::find(const std::string &column_name) const {
void record::append(column col)
{
auto &ref = columns_.emplace_back(std::move(col));
columns_by_name_.emplace(ref.name(), column_index_pair{std::ref(ref), columns_.size()-1});
add_to_map(ref, columns_.size()-1);
}
record::iterator record::begin()
@@ -83,4 +108,21 @@ void record::clear()
columns_by_name_.clear();
}
void record::init()
{
size_t index{0};
for(auto &col : columns_) {
add_to_map(col, index++);
// columns_by_name_.emplace(col.name(), column_index_pair {std::ref(col), index++});
}
}
void record::add_to_map(column &col, size_t index)
{
columns_by_name_.emplace(col.name(), column_index_pair {std::ref(col), index});
if (utils::is_constraint_set(col.attributes().options(), utils::constraints::PRIMARY_KEY)) {
pk_index_ = static_cast<int>(index);
}
}
}
+6 -1
View File
@@ -12,7 +12,7 @@ session::session(connection_pool<connection> &pool)
query_create_intermediate session::create()
{
return query_create_intermediate{*this, query_.create()};
return query_create_intermediate{*this, query_.create(), table_repository_};
}
query_drop_intermediate session::drop()
@@ -55,4 +55,9 @@ std::pair<size_t, std::string> session::execute(const std::string &sql) {
}
return c->execute(sql);
}
const table_repository& session::tables() const
{
return table_repository_;
}
}
+39
View File
@@ -0,0 +1,39 @@
#include "matador/sql/table_repository.hpp"
#include <stdexcept>
namespace matador::sql {
const table_info &table_repository::attach(std::type_index ti, const std::string &table_name, const record &proto)
{
return attach(ti, table_info{table_name, proto});
}
const table_info& table_repository::attach(const std::type_index ti, const table_info& table)
{
return repository_.try_emplace(ti, table).first->second;
}
std::optional<table_info> table_repository::info(std::type_index ti)
{
const auto it = repository_.find(ti);
if (it == repository_.end()) {
return std::nullopt;
}
return it->second;
}
std::pair<std::string, std::string> table_repository::reference(const std::type_index &ti) const
{
const auto it = repository_.find(ti);
if (it != repository_.end()) {
if (!it->second.prototype.has_primary_key()) {
throw std::logic_error("table doesn't has primary key");
}
return { it->second.name, it->second.prototype.primary_key().name() };
}
return {};
}
}