added alter table command to fluent query builder (progress)
This commit is contained in:
@@ -4,17 +4,21 @@ add_library(matador-orm STATIC
|
||||
../../include/matador/orm/session.hpp
|
||||
../../include/matador/orm/session_query_builder.hpp
|
||||
../../include/matador/query/attribute_string_writer.hpp
|
||||
../../include/matador/query/criteria.hpp
|
||||
../../include/matador/query/criteria/abstract_column_criteria.hpp
|
||||
../../include/matador/query/criteria/abstract_criteria.hpp
|
||||
../../include/matador/query/criteria/between_criteria.hpp
|
||||
../../include/matador/query/criteria/collection_criteria.hpp
|
||||
../../include/matador/query/criteria.hpp
|
||||
../../include/matador/query/criteria/criteria_operators.hpp
|
||||
../../include/matador/query/criteria/criteria_utils.hpp
|
||||
../../include/matador/query/criteria/criteria_visitor.hpp
|
||||
../../include/matador/query/criteria/like_criteria.hpp
|
||||
../../include/matador/query/criteria/logical_criteria.hpp
|
||||
../../include/matador/query/criteria_evaluator.hpp
|
||||
../../include/matador/query/fk_value_extractor.hpp
|
||||
../../include/matador/query/intermediates/executable_query.hpp
|
||||
../../include/matador/query/intermediates/fetchable_query.hpp
|
||||
../../include/matador/query/intermediates/query_alter_intermediate.hpp
|
||||
../../include/matador/query/intermediates/query_create_intermediate.hpp
|
||||
../../include/matador/query/intermediates/query_delete_from_intermediate.hpp
|
||||
../../include/matador/query/intermediates/query_delete_intermediate.hpp
|
||||
@@ -81,6 +85,7 @@ add_library(matador-orm STATIC
|
||||
orm/session.cpp
|
||||
orm/session_query_builder.cpp
|
||||
query/attribute_string_writer.cpp
|
||||
query/criteria/abstract_column_criteria.cpp
|
||||
query/criteria/between_criteria.cpp
|
||||
query/criteria/binary_criteria.cpp
|
||||
query/criteria/collection_criteria.cpp
|
||||
@@ -88,8 +93,10 @@ add_library(matador-orm STATIC
|
||||
query/criteria/like_criteria.cpp
|
||||
query/criteria/logical_criteria.cpp
|
||||
query/criteria/not_criteria.cpp
|
||||
query/criteria_evaluator.cpp
|
||||
query/intermediates/executable_query.cpp
|
||||
query/intermediates/fetchable_query.cpp
|
||||
query/intermediates/query_alter_intermediate.cpp
|
||||
query/intermediates/query_create_intermediate.cpp
|
||||
query/intermediates/query_delete_from_intermediate.cpp
|
||||
query/intermediates/query_delete_intermediate.cpp
|
||||
@@ -145,11 +152,8 @@ add_library(matador-orm STATIC
|
||||
sql/statement.cpp
|
||||
sql/statement_cache.cpp
|
||||
sql/table.cpp
|
||||
../../include/matador/query/criteria_evaluator.hpp
|
||||
query/criteria_evaluator.cpp
|
||||
../../include/matador/query/criteria/criteria_utils.hpp
|
||||
../../include/matador/query/criteria/abstract_column_criteria.hpp
|
||||
query/criteria/abstract_column_criteria.cpp
|
||||
../../include/matador/query/intermediates/query_alter_table_intermediate.hpp
|
||||
query/intermediates/query_alter_table_intermediate.cpp
|
||||
)
|
||||
|
||||
target_include_directories(matador-orm
|
||||
|
||||
@@ -2,11 +2,19 @@
|
||||
|
||||
#include "matador/orm/error_code.hpp"
|
||||
#include "matador/orm/session.hpp"
|
||||
|
||||
#include "matador/query/query.hpp"
|
||||
|
||||
#include "matador/sql/backend_provider.hpp"
|
||||
#include "matador/sql/connection_pool.hpp"
|
||||
#include "matador/sql/dialect.hpp"
|
||||
|
||||
namespace matador::orm {
|
||||
schema::schema(sql::connection_pool& pool)
|
||||
: repo_(sql::backend_provider::instance().connection_dialect(pool.info().type).default_schema_name())
|
||||
, pool_(pool) {
|
||||
}
|
||||
|
||||
schema::schema(sql::connection_pool &pool, const std::string& name)
|
||||
: repo_(name)
|
||||
, pool_(pool) {}
|
||||
@@ -69,7 +77,38 @@ matador::utils::result<void, matador::utils::error> matador::orm::schema::create
|
||||
}
|
||||
|
||||
matador::utils::result<void, matador::utils::error> matador::orm::schema::drop() const {
|
||||
return utils::ok<void>();
|
||||
std::vector<std::string> drop_sql_commands;
|
||||
auto c = pool_.acquire();
|
||||
for (const auto &node: repo_) {
|
||||
auto ctx = query::query::drop()
|
||||
.table(node->name())
|
||||
.compile(*c);
|
||||
|
||||
drop_sql_commands.push_back(ctx.sql);
|
||||
// determine constraints and drop them
|
||||
for (auto it = node->info().endpoint_begin(); it != node->info().endpoint_end(); ++it) {
|
||||
const auto ctx = query::query::alter()
|
||||
.table( "" )
|
||||
.add_constraint( it->second->node().name() )
|
||||
.foreign_key( "" )
|
||||
.references( "" ).compile(*c);
|
||||
|
||||
}
|
||||
// for ( const auto& [sql, command] : ctx.additional_commands ) {
|
||||
// if (auto result = c->execute(ctx.sql); !result) {
|
||||
// return utils::failure(result.err());
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// execute additional commands (e.g. ALTER TABLE ADD FK)
|
||||
for (const auto &sql: drop_sql_commands) {
|
||||
std::cout << sql << std::endl;
|
||||
if (auto result = c->execute(sql); !result) {
|
||||
return utils::failure(result.err());
|
||||
}
|
||||
}
|
||||
return utils::ok<void>();
|
||||
}
|
||||
|
||||
matador::utils::result<void, matador::utils::error> matador::orm::schema::drop_table(const std::string& table_name) const {
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
#include "matador/query/intermediates/query_alter_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
query_alter_intermediate::query_alter_intermediate() {
|
||||
context_->parts.push_back(std::make_unique<internal::query_alter_part>());
|
||||
}
|
||||
|
||||
query_alter_table_intermediate query_alter_intermediate::table( const sql::table& table ) const {
|
||||
context_->parts.push_back(std::make_unique<internal::query_alter_table_part>(table));
|
||||
return {context_};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
#include "matador/query/intermediates/query_alter_table_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
executable_query query_add_foreign_key_constraint_intermediate::references( const sql::table& table, const std::vector<sql::column>& columns) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_add_foreign_key_reference_part>(table, columns));
|
||||
|
||||
return {context_};
|
||||
}
|
||||
|
||||
query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_key(const sql::column& column) const {
|
||||
return primary_keys({column});
|
||||
}
|
||||
|
||||
query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_keys( const std::vector<sql::column>& columns ) const {
|
||||
context_->parts.push_back(std::make_unique<internal::query_add_primary_key_constraint_part>(columns));
|
||||
|
||||
return {context_};
|
||||
}
|
||||
|
||||
query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_key(const sql::column& column) const {
|
||||
return foreign_keys({column});
|
||||
}
|
||||
|
||||
query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_keys( const std::vector<sql::column>& columns ) const {
|
||||
context_->parts.push_back(std::make_unique<internal::query_add_foreign_key_constraint_part>(columns));
|
||||
|
||||
return {context_};
|
||||
}
|
||||
|
||||
void query_drop_key_constraint_intermediate::constraint( const std::string& name ) {}
|
||||
|
||||
void query_drop_key_constraint_intermediate::primary_key() {}
|
||||
|
||||
void query_drop_key_constraint_intermediate::foreign_key( const std::string& name ) {}
|
||||
|
||||
void query_drop_key_constraint_intermediate::foreign_keys( const std::vector<std::string>& names ) {}
|
||||
|
||||
query_add_key_constraint_intermediate query_alter_table_intermediate::add_constraint( const std::string& name ) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_add_key_constraint_part>(name));
|
||||
|
||||
return {context_};
|
||||
}
|
||||
|
||||
query_drop_key_constraint_intermediate query_alter_table_intermediate::drop_constraint( const std::string& name ) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_drop_key_constraint_part>(name));
|
||||
return {context_};
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,89 @@
|
||||
#include <utility>
|
||||
|
||||
namespace matador::query::internal {
|
||||
query_alter_part::query_alter_part()
|
||||
: query_part(sql::dialect_token::Alter) {}
|
||||
|
||||
void query_alter_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
query_alter_table_part::query_alter_table_part(sql::table table )
|
||||
: query_part(sql::dialect_token::Table)
|
||||
, table_(std::move(table)) {}
|
||||
|
||||
void query_alter_table_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::table& query_alter_table_part::table() const {
|
||||
return table_;
|
||||
}
|
||||
|
||||
query_add_key_constraint_part::query_add_key_constraint_part(const std::string& name)
|
||||
: query_part(sql::dialect_token::AddConstraint)
|
||||
, name_(name){}
|
||||
|
||||
void query_add_key_constraint_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const std::string& query_add_key_constraint_part::name() const {
|
||||
return name_;
|
||||
}
|
||||
|
||||
query_drop_key_constraint_part::query_drop_key_constraint_part( const std::string& name )
|
||||
: query_part( sql::dialect_token::DropConstraint )
|
||||
, name_( name ){}
|
||||
|
||||
void query_drop_key_constraint_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const std::string& query_drop_key_constraint_part::name() const {
|
||||
return name_;
|
||||
}
|
||||
|
||||
query_add_foreign_key_constraint_part::query_add_foreign_key_constraint_part(const std::vector<sql::column>& columns)
|
||||
: query_part(sql::dialect_token::ForeignKey)
|
||||
, columns_(columns) {}
|
||||
|
||||
void query_add_foreign_key_constraint_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const std::vector<sql::column>& query_add_foreign_key_constraint_part::columns() const {
|
||||
return columns_;
|
||||
}
|
||||
|
||||
query_add_foreign_key_reference_part::query_add_foreign_key_reference_part( sql::table table, const std::vector<sql::column>& columns )
|
||||
: query_part(sql::dialect_token::References)
|
||||
, table_(std::move(table))
|
||||
, columns_(columns) {}
|
||||
|
||||
void query_add_foreign_key_reference_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::table& query_add_foreign_key_reference_part::table() const {
|
||||
return table_;
|
||||
}
|
||||
|
||||
const std::vector<sql::column>& query_add_foreign_key_reference_part::columns() const {
|
||||
return columns_;
|
||||
}
|
||||
|
||||
query_add_primary_key_constraint_part::query_add_primary_key_constraint_part(const std::vector<sql::column>& columns)
|
||||
: query_part(sql::dialect_token::PrimaryKey)
|
||||
, columns_(columns) {}
|
||||
|
||||
void query_add_primary_key_constraint_part::accept( query_part_visitor& visitor ) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const std::vector<sql::column>& query_add_primary_key_constraint_part::columns() const {
|
||||
return columns_;
|
||||
}
|
||||
|
||||
query_select_part::query_select_part(std::vector<sql::column> columns)
|
||||
: query_part(sql::dialect_token::Select)
|
||||
@@ -74,7 +157,7 @@ const abstract_criteria &query_where_part::condition() const
|
||||
return *condition_;
|
||||
}
|
||||
|
||||
query_table_name_part::query_table_name_part(sql::dialect_token token, std::string table_name)
|
||||
query_table_name_part::query_table_name_part(const sql::dialect_token token, std::string table_name)
|
||||
: query_part(token)
|
||||
, table_name_(std::move(table_name)) {}
|
||||
|
||||
|
||||
@@ -68,4 +68,7 @@ query_delete_intermediate query::remove() {
|
||||
return {};
|
||||
}
|
||||
|
||||
query_alter_intermediate query::alter() {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
@@ -51,6 +51,28 @@ std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const
|
||||
return d->prepare_identifier(col);
|
||||
}
|
||||
|
||||
void query_compiler::visit(internal::query_alter_part& part) {
|
||||
query_.sql = dialect_->token_at(sql::dialect_token::Create);
|
||||
}
|
||||
|
||||
void query_compiler::visit(internal::query_alter_table_part& part) {
|
||||
query_.command = sql::sql_command::SQL_ALTER_TABLE;
|
||||
query_.sql += " " + dialect_->token_at(sql::dialect_token::Table) + " " +
|
||||
dialect_->prepare_identifier_string(part.table().name);
|
||||
}
|
||||
|
||||
void query_compiler::visit(internal::query_add_key_constraint_part& part) {
|
||||
query_.sql += " " + dialect_->token_at(sql::dialect_token::AddConstraint) + " " + part.name();
|
||||
}
|
||||
|
||||
void query_compiler::visit( internal::query_add_foreign_key_constraint_part& part ) {}
|
||||
|
||||
void query_compiler::visit( internal::query_add_primary_key_constraint_part& part ) {}
|
||||
|
||||
void query_compiler::visit( internal::query_add_foreign_key_reference_part& part ) {}
|
||||
|
||||
void query_compiler::visit(internal::query_drop_key_constraint_part& part) {}
|
||||
|
||||
void query_compiler::visit(internal::query_select_part &select_part)
|
||||
{
|
||||
query_.command = sql::sql_command::SQL_SELECT;
|
||||
|
||||
Reference in New Issue
Block a user