implemented sqlite fetch

This commit is contained in:
2023-11-15 22:54:58 +01:00
parent d76ac60278
commit 7c1e940814
24 changed files with 388 additions and 267 deletions
+2 -75
View File
@@ -1,7 +1,5 @@
#include "matador/sql/column_generator.hpp"
#include "matador/utils/identifiable.hpp"
namespace matador::sql {
column_generator::column_generator(std::vector<column> &columns)
@@ -17,80 +15,9 @@ void column_generator::on_revision(const char *id, unsigned long long int &x)
on_attribute(id, x);
}
void column_generator::on_belongs_to(const char *id, utils::identifiable &x, utils::cascade_type)
void fk_column_generator::on_primary_key(const char *, std::string &, size_t size)
{
columns_.push_back(fk_column_generator_.generate(id, x));
type_ = data_type_traits<std::string>::builtin_type(size);
}
void column_generator::on_has_one(const char *id, utils::identifiable &x, utils::cascade_type)
{
columns_.push_back(fk_column_generator_.generate(id, x));
}
column fk_column_generator::generate(const char *id, utils::identifiable &x)
{
x.primary_key().serialize(*this);
return column{id, type_, { utils::constraints::FOREIGN_KEY }};
}
template < typename Type >
data_type_t determine_data_type(const Type &)
{
return data_type_traits<Type>::builtin_type(0);
}
data_type_t determine_data_type(const std::string&, size_t size)
{
return data_type_traits<std::string>::builtin_type(size);
}
void fk_column_generator::serialize(short &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(int &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(long &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(long long int &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(unsigned short &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(unsigned int &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(unsigned long &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(unsigned long long int &i, const utils::field_attributes &attributes)
{
type_ = determine_data_type(i);
}
void fk_column_generator::serialize(std::string &x, const utils::field_attributes &attributes)
{
type_ = determine_data_type(x, attributes.size());
}
void fk_column_generator::serialize(utils::null_type_t &type, const utils::field_attributes &attributes)
{
type_ = data_type_t::type_null;
}
}
-10
View File
@@ -16,14 +16,4 @@ void column_name_generator::on_revision(const char *id, unsigned long long int &
column_names_.emplace_back(id);
}
void column_name_generator::on_belongs_to(const char *id, utils::identifiable &, utils::cascade_type)
{
column_names_.emplace_back(id);
}
void column_name_generator::on_has_one(const char *id, utils::identifiable &, utils::cascade_type)
{
column_names_.emplace_back(id);
}
}
+2 -1
View File
@@ -65,7 +65,8 @@ const connection_info &connection::info() const
query_result<record> connection::fetch(const std::string &sql)
{
return query_result<record>(connection_->fetch(sql));
auto rec = connection_->describe("person");
return {connection_->fetch(sql), [rec](){ return new record(rec); }};
}
std::pair<size_t, std::string> connection::execute(const std::string &sql)
+27 -17
View File
@@ -97,27 +97,32 @@ query_builder& query_builder::drop() {
return *this;
}
query_builder& query_builder::select(std::initializer_list<std::string> column_names) {
initialize(command_t::SELECT, state_t::QUERY_SELECT);
query_builder& query_builder::select(std::initializer_list<std::string> column_names)
{
initialize(command_t::SELECT, state_t::QUERY_SELECT);
query_parts_.emplace_back(dialect_.token_at(dialect::token_t::SELECT) + " ");
query_parts_.emplace_back(dialect_.token_at(dialect::token_t::SELECT) + " ");
std::string result;
if (column_names.size() < 2) {
for (const auto &col : column_names) {
result.append(dialect_.prepare_identifier(col));
}
} else {
auto it = column_names.begin();
result.append(dialect_.prepare_identifier(*it++));
for (; it != column_names.end(); ++it) {
result.append(", ");
result.append(dialect_.prepare_identifier(*it));
}
prototype_.clear();
std::string result;
if (column_names.size() < 2) {
for (const auto &col : column_names) {
result.append(dialect_.prepare_identifier(col));
prototype_.append(column{col});
}
} else {
auto it = column_names.begin();
result.append(dialect_.prepare_identifier(*it++));
for (; it != column_names.end(); ++it) {
result.append(", ");
result.append(dialect_.prepare_identifier(*it));
prototype_.append(column{*it});
}
}
query_parts_.emplace_back(result);
return *this;
query_parts_.emplace_back(result);
return *this;
}
query_builder& query_builder::insert() {
@@ -393,6 +398,11 @@ std::string query_builder::compile() {
return result;
}
const record& query_builder::prototype() const
{
return prototype_;
}
void query_builder::transition_to(query_builder::state_t next)
{
if (transitions_[state_].count(next) == 0) {
+3 -7
View File
@@ -22,14 +22,10 @@ void query_result_impl::on_attribute(const char *id, std::string &value, const u
read_value(id, column_index_++, value, attr.size());
}
void query_result_impl::on_belongs_to(const char *id, utils::identifiable &x, utils::cascade_type)
void
query_result_impl::on_attribute(const char *id, any_type &value, data_type_t type, const utils::field_attributes &attr)
{
}
void query_result_impl::on_has_one(const char *id, utils::identifiable &x, utils::cascade_type)
{
read_value(id, column_index_++, value, type, attr.size());
}
}
+13 -2
View File
@@ -15,7 +15,7 @@ const column &record::at(const std::string &name) const
return columns_by_name_.at(name).first;
}
const column &record::at(size_t index)
const column &record::at(size_t index) const
{
return columns_.at(index);
}
@@ -72,4 +72,15 @@ size_t record::size() const
return columns_.size();
}
}
bool record::empty() const
{
return columns_.empty();
}
void record::clear()
{
columns_.clear();
columns_by_name_.clear();
}
}