sequence table progress
This commit is contained in:
parent
3fb23e167e
commit
433b0e40e1
|
|
@ -77,6 +77,11 @@ public:
|
||||||
basic_schema();
|
basic_schema();
|
||||||
explicit basic_schema(const std::string &name);
|
explicit basic_schema(const std::string &name);
|
||||||
|
|
||||||
|
[[nodiscard]] std::string name() const;
|
||||||
|
|
||||||
|
[[nodiscard]] const object::repository &repo() const;
|
||||||
|
object::repository &repo();
|
||||||
|
|
||||||
[[nodiscard]] utils::result<void, utils::error> create(const sql::connection &conn) const;
|
[[nodiscard]] utils::result<void, utils::error> create(const sql::connection &conn) const;
|
||||||
[[nodiscard]] utils::result<void, utils::error> drop(const sql::connection &conn) const;
|
[[nodiscard]] utils::result<void, utils::error> drop(const sql::connection &conn) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -245,9 +245,6 @@ public:
|
||||||
return basic_schema::contains(std::type_index(typeid(Type)));
|
return basic_schema::contains(std::type_index(typeid(Type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] const object::repository &repo() const { return repo_; }
|
|
||||||
object::repository &repo() { return repo_; }
|
|
||||||
|
|
||||||
void dump(std::ostream &os) const;
|
void dump(std::ostream &os) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "matador/query/basic_schema.hpp"
|
#include "matador/query/basic_schema.hpp"
|
||||||
|
|
||||||
|
#include "matador/query/builder.hpp"
|
||||||
#include "matador/query/query.hpp"
|
#include "matador/query/query.hpp"
|
||||||
|
|
||||||
#include "matador/sql/connection.hpp"
|
#include "matador/sql/connection.hpp"
|
||||||
|
|
@ -51,6 +52,18 @@ basic_schema::basic_schema(const std::string &name)
|
||||||
: repo_(name) {
|
: repo_(name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string basic_schema::name() const {
|
||||||
|
return repo_.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
const object::repository& basic_schema::repo() const {
|
||||||
|
return repo_;
|
||||||
|
}
|
||||||
|
|
||||||
|
object::repository& basic_schema::repo() {
|
||||||
|
return repo_;
|
||||||
|
}
|
||||||
|
|
||||||
utils::result<void, utils::error> basic_schema::create(const sql::connection &conn) const {
|
utils::result<void, utils::error> basic_schema::create(const sql::connection &conn) const {
|
||||||
std::vector<std::string> fk_sql_commands;
|
std::vector<std::string> fk_sql_commands;
|
||||||
|
|
||||||
|
|
@ -271,7 +284,27 @@ utils::result<void, utils::error> setup_primary_key_generator(const basic_schema
|
||||||
return utils::failure(result.err());
|
return utils::failure(result.err());
|
||||||
}
|
}
|
||||||
} else if (node.pk_generator().type() == utils::generator_type::Table) {
|
} else if (node.pk_generator().type() == utils::generator_type::Table) {
|
||||||
|
if (const auto result = conn.exists(scm.name(), "sequence_table"); result) {
|
||||||
|
if (!*result) {
|
||||||
|
const auto exec_result = create()
|
||||||
|
.table("sequence_table")
|
||||||
|
.columns({
|
||||||
|
column("name", utils::basic_type::Varchar, 255),
|
||||||
|
column("next_id", utils::basic_type::Int64)
|
||||||
|
})
|
||||||
|
.execute(conn);
|
||||||
|
if (!exec_result) {
|
||||||
|
return utils::failure(exec_result.err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return utils::failure(result.err());
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto insert_result = insert().into("sequence_table", {"name", "next_id"}).values({node.name(), 1}).execute(conn);
|
||||||
|
if (!insert_result) {
|
||||||
|
return utils::failure(insert_result.err());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -286,7 +319,10 @@ utils::result<void, utils::error> cleanup_primary_key_generator(const basic_sche
|
||||||
return utils::failure(result.err());
|
return utils::failure(result.err());
|
||||||
}
|
}
|
||||||
} else if (node.pk_generator().type() == utils::generator_type::Table) {
|
} else if (node.pk_generator().type() == utils::generator_type::Table) {
|
||||||
|
const auto result = drop().sequence(node.name() + "_pk_seq").execute(conn);
|
||||||
|
if (!result) {
|
||||||
|
return utils::failure(result.err());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ schema::iterator schema::insert_table(const std::type_index &ti, const object::r
|
||||||
pk_generator = std::make_unique<sequence_pk_generator>(node.name() + "_pk_seq");
|
pk_generator = std::make_unique<sequence_pk_generator>(node.name() + "_pk_seq");
|
||||||
break;
|
break;
|
||||||
case utils::generator_type::Table:
|
case utils::generator_type::Table:
|
||||||
pk_generator = std::make_unique<table_pk_generator>("TABLE_SEQS", node.name());
|
pk_generator = std::make_unique<table_pk_generator>("sequence_table", node.name());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pk_generator = std::make_unique<manual_pk_generator>();
|
pk_generator = std::make_unique<manual_pk_generator>();
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,26 @@ TEST_CASE_METHOD(SessionFixture, "Test insert object with has many relation with
|
||||||
s_king->books.push_back(make_object<book_sequence>("Misery", nullobj, 1987));
|
s_king->books.push_back(make_object<book_sequence>("Misery", nullobj, 1987));
|
||||||
s_king->books.push_back(make_object<book_sequence>("The Dark Tower: The Gunslinger", nullobj, 1982));
|
s_king->books.push_back(make_object<book_sequence>("The Dark Tower: The Gunslinger", nullobj, 1982));
|
||||||
|
|
||||||
|
auto res = ses.insert(s_king);
|
||||||
|
REQUIRE(res.is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE_METHOD(SessionFixture, "Test insert object with has many relation with table sequence", "[session][insert][has_many][table_sequence]") {
|
||||||
|
const auto result = schema.attach<book_table>("books")
|
||||||
|
.and_then( [this] { return schema.attach<author_table>("authors"); } )
|
||||||
|
.and_then([this] { return schema.create(db); } );
|
||||||
|
REQUIRE(result.is_ok());
|
||||||
|
|
||||||
|
session ses({bus, connection::dns, 4}, schema);
|
||||||
|
|
||||||
|
auto s_king = make_object<author_table>("Steven King");
|
||||||
|
|
||||||
|
s_king->books.push_back(make_object<book_table>("Carrie", nullobj, 1974));
|
||||||
|
s_king->books.push_back(make_object<book_table>("The Shining", nullobj, 1977));
|
||||||
|
s_king->books.push_back(make_object<book_table>("It", nullobj, 1986));
|
||||||
|
s_king->books.push_back(make_object<book_table>("Misery", nullobj, 1987));
|
||||||
|
s_king->books.push_back(make_object<book_table>("The Dark Tower: The Gunslinger", nullobj, 1982));
|
||||||
|
|
||||||
auto res = ses.insert(s_king);
|
auto res = ses.insert(s_king);
|
||||||
REQUIRE(res.is_ok());
|
REQUIRE(res.is_ok());
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue