diff --git a/include/cpphibernate/driver/mariadb/schema/table.h b/include/cpphibernate/driver/mariadb/schema/table.h index 1dbb83f..cbef31e 100644 --- a/include/cpphibernate/driver/mariadb/schema/table.h +++ b/include/cpphibernate/driver/mariadb/schema/table.h @@ -67,8 +67,11 @@ beg_namespace_cpphibernate_driver_mariadb const table_t* get_derived(size_t id) const; /* CRUD */ - inline void init(const init_context& context) const - { return init_exec(context); } + inline void init_stage1(const init_context& context) const + { return init_stage1_exec(context); } + + inline void init_stage2(const init_context& context) const + { return init_stage2_exec(context); } inline decltype(auto) create_update(const create_update_context& context) const { return create_update_intern(context); } @@ -86,12 +89,14 @@ beg_namespace_cpphibernate_driver_mariadb using statement_ptr = std::unique_ptr<::cppmariadb::statement>; mutable statement_ptr _statement_create_table; + mutable statement_ptr _statement_alter_table; mutable statement_ptr _statement_insert_into; ::cppmariadb::statement& get_statement_create_table() const; + ::cppmariadb::statement* get_statement_alter_table() const; ::cppmariadb::statement& get_statement_insert_into() const; - std::string execute_insert_update( + std::string execute_create_update( const create_update_context& context, ::cppmariadb::statement& statement, const filter_t* filter) const; @@ -99,7 +104,8 @@ beg_namespace_cpphibernate_driver_mariadb virtual std::string create_update_base(const create_update_context& context) const; protected: - void init_exec (const init_context& context) const; + void init_stage1_exec (const init_context& context) const; + void init_stage2_exec (const init_context& context) const; virtual std::string create_update_intern(const create_update_context& context) const; std::string create_update_exec (const create_update_context& context) const; diff --git a/src/driver/mariadb/schema/schema.cpp b/src/driver/mariadb/schema/schema.cpp index 6e21334..74358ed 100644 --- a/src/driver/mariadb/schema/schema.cpp +++ b/src/driver/mariadb/schema/schema.cpp @@ -193,7 +193,12 @@ void schema_t::init(const init_context& context) const for (auto& kvp : tables) { assert(kvp.second); - kvp.second->init(context); + kvp.second->init_stage1(context); + } + for (auto& kvp : tables) + { + assert(kvp.second); + kvp.second->init_stage2(context); } } diff --git a/src/driver/mariadb/schema/table.cpp b/src/driver/mariadb/schema/table.cpp index 44c4e44..7878523 100644 --- a/src/driver/mariadb/schema/table.cpp +++ b/src/driver/mariadb/schema/table.cpp @@ -14,9 +14,9 @@ using namespace ::cpphibernate::driver::mariadb_impl; /* build queries */ -std::string build_create_table_query(const table_t& table) +std::string build_init_stage1_query(const table_t& table) { -std::ostringstream os; + std::ostringstream os; /* CREATE TABLE */ os << "CREATE TABLE IF NOT EXISTS `" @@ -194,14 +194,38 @@ std::ostringstream os; << "` ASC )"; } + /* CREATE TABLE end */ + os << decindent + << indent + << ")" + << indent + << "ENGINE = InnoDB" + << indent + << "DEFAULT CHARACTER SET = utf8"; + + return os.str(); +} + +std::string build_init_stage2_query(const table_t& table) +{ + std::ostringstream os; + + /* ALTER TABLE */ + os << "ALTER TABLE `" + << table.table_name + << "`" + << incindent; + + size_t index = 0; + /* CONSTRAINT base table */ if (table.base_table) { assert(table.base_table->primary_key_field); auto& ref_key_info = *table.base_table->primary_key_field; - os << "," - << indent - << "CONSTRAINT `fk_" + if (index++) os << ","; + os << indent + << "ADD CONSTRAINT `fk_" << table.table_name << "_to_" << ref_key_info.field_name @@ -234,9 +258,9 @@ std::ostringstream os; assert(field_info.referenced_table); assert(field_info.referenced_table->primary_key_field); auto& ref_key_info = *field_info.referenced_table->primary_key_field; - os << "," - << indent - << "CONSTRAINT `fk_" + if (index++) os << ","; + os << indent + << "ADD CONSTRAINT `fk_" << table.table_name << "_to_" << ref_key_info.table_name @@ -273,11 +297,11 @@ std::ostringstream os; assert(field_info.table); assert(field_info.table->primary_key_field); auto& ref_key_info = *field_info.table->primary_key_field; - os << "," - << indent - << "CONSTRAINT `fk_" + if (index++) os << ","; + os << indent + << "ADD CONSTRAINT `fk_" << table.table_name - << "_" + << "_to_" << field_info.table_name << "_id_" << field_info.field_name @@ -304,19 +328,12 @@ std::ostringstream os; << decindent; } - /* CREATE TABLE end */ - os << decindent - << indent - << ")" - << indent - << "ENGINE = InnoDB" - << indent - << "DEFAULT CHARACTER SET = utf8"; - - return os.str(); + return index == 0 + ? std::string { } + : os.str(); } -std::string build_insert_update_query(const table_t& table, const filter_t* filter, const field_t* owner) +std::string build_create_update_query(const table_t& table, const filter_t* filter, const field_t* owner) { std::ostringstream os; @@ -469,9 +486,9 @@ std::string build_insert_update_query(const table_t& table, const filter_t* filt return os.str(); } -/* execute_insert_update */ +/* execute_create_update */ -std::string table_t::execute_insert_update( +std::string table_t::execute_create_update( const create_update_context& context, ::cppmariadb::statement& statement, const filter_t* filter) const @@ -672,16 +689,28 @@ const table_t* table_t::get_derived(size_t id) const { if (_statement_create_table) return *_statement_create_table; - auto query = build_create_table_query(*this); + auto query = build_init_stage1_query(*this); _statement_create_table.reset(new ::cppmariadb::statement(query)); return *_statement_create_table; } +::cppmariadb::statement* table_t::get_statement_alter_table() const +{ + if (!_statement_alter_table) + { + auto query = build_init_stage2_query(*this); + _statement_alter_table.reset(new ::cppmariadb::statement(query)); + } + if (_statement_alter_table->empty()) + return nullptr; + return _statement_alter_table.get(); +} + ::cppmariadb::statement& table_t::get_statement_insert_into() const { if (_statement_insert_into) return *_statement_insert_into; - auto query = build_insert_update_query(*this, nullptr, nullptr); + auto query = build_create_update_query(*this, nullptr, nullptr); _statement_create_table.reset(new ::cppmariadb::statement(query)); return *_statement_create_table; } @@ -692,7 +721,7 @@ std::string table_t::create_update_base(const create_update_context& context) co << "'" << this->table_name << "' does not implement create_update_base!").str()); } -void table_t::init_exec(const init_context& context) const +void table_t::init_stage1_exec(const init_context& context) const { auto& statement = get_statement_create_table(); auto& connection = context.connection; @@ -700,10 +729,19 @@ void table_t::init_exec(const init_context& context) const connection.execute(statement); } +void table_t::init_stage2_exec(const init_context& context) const +{ + auto* statement = get_statement_alter_table(); + auto& connection = context.connection; + if (!statement) return; + cpphibernate_debug_log("execute ALTER TABLE query: " << statement->query(connection)); + connection.execute(*statement); +} + std::string table_t::create_update_exec(const create_update_context& context) const { auto& statement = get_statement_insert_into(); - return execute_insert_update(context, statement, nullptr); + return execute_create_update(context, statement, nullptr); } std::string table_t::create_update_intern(const create_update_context& context) const diff --git a/test/cpphibernate_create.cpp b/test/cpphibernate_create.cpp index f5cbf81..a864dc9 100644 --- a/test/cpphibernate_create.cpp +++ b/test/cpphibernate_create.cpp @@ -6,19 +6,19 @@ using namespace ::testing; using namespace ::cpphibernate; -/* + TEST(CppHibernateTests, create_test1) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT Uuid()", result_used({ - { "02689aa7-aa28-11e8-bf41-0242ac110002" } + { "3d12697a-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test1` " "SET " - "`tbl_test1_id`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_test1_id`=UuidToBin('X3d12697a-abb9-11e8-98d0-529269fb1459X'), " "`str_data`='Xstr_data of class `test1` object `t1`X', " "`str64_data`='Xstr64_data of class `test1` object `t1`X', " "`u32_nullable`=null, " @@ -55,12 +55,12 @@ TEST(CppHibernateTests, create_test2) expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT Uuid()", result_used({ - { "02689aa7-aa28-11e8-bf41-0242ac110002" } + { "3d1270dc-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test2` " "SET " - "`tbl_test2_id`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_test2_id`=UuidToBin('X3d1270dc-abb9-11e8-98d0-529269fb1459X'), " "`u8_data`='X1X', " "`i8_data`='X2X', " "`u16_data`='X3X', " @@ -96,12 +96,12 @@ TEST(CppHibernateTests, create_test3) expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT Uuid()", result_used({ - { "02689aa7-aa28-11e8-bf41-0242ac110002" } + { "3d12737a-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test3` " "SET " - "`tbl_test3_id`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_test3_id`=UuidToBin('X3d12737a-abb9-11e8-98d0-529269fb1459X'), " "`tbl_derived3_id_test3_list`=UuidToBin(null), " "`tbl_derived3_id_test3_vector`=UuidToBin(null), " "`u32_data`='X5X', " @@ -139,25 +139,25 @@ TEST(CppHibernateTests, create_derived1) expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT Uuid()", result_used({ - { "02689aa7-aa28-11e8-bf41-0242ac110002" } + { "3d12758c-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "SELECT Uuid()", result_used({ - { "a572edde-aadb-11e8-98d0-529269fb1459" } + { "3d12778a-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_base` " "SET " - "`tbl_base_id`=UuidToBin('Xa572edde-aadb-11e8-98d0-529269fb1459X'), " + "`tbl_base_id`=UuidToBin('X3d12778a-abb9-11e8-98d0-529269fb1459X'), " "`name`='Xderived1X', " "`__type`='X11X'", result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "b80ffb20-aae6-11e8-98d0-529269fb1459" } + { "3d127988-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test1` " "SET " - "`tbl_test1_id`=UuidToBin('Xb80ffb20-aae6-11e8-98d0-529269fb1459X'), " + "`tbl_test1_id`=UuidToBin('X3d127988-abb9-11e8-98d0-529269fb1459X'), " "`str_data`='Xstr_data of class `test1` object `d1.test1_data`X', " "`str64_data`='Xstr64_data of class `test1` object `d1.test1_data`X', " "`u32_nullable`='X32X', " @@ -167,9 +167,9 @@ TEST(CppHibernateTests, create_derived1) expect_query(mock, "INSERT INTO " "`tbl_derived1` " "SET " - "`tbl_derived1_id`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " - "`tbl_base_id`=UuidToBin('Xa572edde-aadb-11e8-98d0-529269fb1459X'), " - "`tbl_test1_id_test1_data`=UuidToBin('Xb80ffb20-aae6-11e8-98d0-529269fb1459X'), " + "`tbl_derived1_id`=UuidToBin('X3d12758c-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_base_id`=UuidToBin('X3d12778a-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_test1_id_test1_data`=UuidToBin('X3d127988-abb9-11e8-98d0-529269fb1459X'), " "`enum_data`='Xtest2X'", result_affected_rows(1)); expect_query(mock, "COMMIT"); @@ -204,37 +204,37 @@ TEST(CppHibernateTests, create_derived2) expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT Uuid()", result_used({ - { "02689aa7-aa28-11e8-bf41-0242ac110002" } + { "3d127bcc-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "SELECT Uuid()", result_used({ - { "a572edde-aadb-11e8-98d0-529269fb1459" } + { "3d127db6-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_base` " "SET " - "`tbl_base_id`=UuidToBin('Xa572edde-aadb-11e8-98d0-529269fb1459X'), " + "`tbl_base_id`=UuidToBin('X3d127db6-abb9-11e8-98d0-529269fb1459X'), " "`name`='Xderived2X', " "`__type`='X12X'", result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "b80ffb20-aae6-11e8-98d0-529269fb1459" } + { "3d1283a6-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test2` " "SET " - "`tbl_test2_id`=UuidToBin('Xb80ffb20-aae6-11e8-98d0-529269fb1459X'), " + "`tbl_test2_id`=UuidToBin('X3d1283a6-abb9-11e8-98d0-529269fb1459X'), " "`u8_data`='X10X', " "`i8_data`='X11X', " "`u16_data`='X12X', " "`i16_data`='X13X'", result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "9470a0be-aae8-11e8-a137-529269fb1459" } + { "3d128522-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test2` " "SET " - "`tbl_test2_id`=UuidToBin('X9470a0be-aae8-11e8-a137-529269fb1459X'), " + "`tbl_test2_id`=UuidToBin('X3d128522-abb9-11e8-98d0-529269fb1459X'), " "`u8_data`='X20X', " "`i8_data`='X21X', " "`u16_data`='X22X', " @@ -243,10 +243,10 @@ TEST(CppHibernateTests, create_derived2) expect_query(mock, "INSERT INTO " "`tbl_derived2` " "SET " - "`tbl_derived2_id`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " - "`tbl_base_id`=UuidToBin('Xa572edde-aadb-11e8-98d0-529269fb1459X'), " - "`tbl_test2_id_test2_nullable`=UuidToBin('Xb80ffb20-aae6-11e8-98d0-529269fb1459X'), " - "`tbl_test2_id_test2_ptr_u`=UuidToBin('X9470a0be-aae8-11e8-a137-529269fb1459X'), " + "`tbl_derived2_id`=UuidToBin('X3d127bcc-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_base_id`=UuidToBin('X3d127db6-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_test2_id_test2_nullable`=UuidToBin('X3d1283a6-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_test2_id_test2_ptr_u`=UuidToBin('X3d128522-abb9-11e8-98d0-529269fb1459X'), " "`tbl_test2_id_test2_ptr_s`=UuidToBin(null)", result_affected_rows(1)); expect_query(mock, "COMMIT"); @@ -279,33 +279,33 @@ TEST(CppHibernateTests, create_derived2) auto context = make_context(test_schema, connection); context.create(static_cast(d2)); } -*/ + TEST(CppHibernateTests, create_derived3) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT Uuid()", result_used({ - { "02689aa7-aa28-11e8-bf41-0242ac110002" } + { "3d12866c-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "SELECT Uuid()", result_used({ - { "df032510-aae9-11e8-98d0-529269fb1459" } + { "3d1287a2-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "SELECT Uuid()", result_used({ - { "a572edde-aadb-11e8-98d0-529269fb1459" } + { "3d1288ce-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_base` " "SET " - "`tbl_base_id`=UuidToBin('Xa572edde-aadb-11e8-98d0-529269fb1459X'), " + "`tbl_base_id`=UuidToBin('X3d1288ce-abb9-11e8-98d0-529269fb1459X'), " "`name`='Xderived3X', " "`__type`='X13X'", result_affected_rows(1)); expect_query(mock, "INSERT INTO " "`tbl_derived2` " "SET " - "`tbl_derived2_id`=UuidToBin('Xdf032510-aae9-11e8-98d0-529269fb1459X'), " - "`tbl_base_id`=UuidToBin('Xa572edde-aadb-11e8-98d0-529269fb1459X'), " + "`tbl_derived2_id`=UuidToBin('X3d1287a2-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_base_id`=UuidToBin('X3d1288ce-abb9-11e8-98d0-529269fb1459X'), " "`tbl_test2_id_test2_nullable`=UuidToBin(null), " "`tbl_test2_id_test2_ptr_u`=UuidToBin(null), " "`tbl_test2_id_test2_ptr_s`=UuidToBin(null)", @@ -313,18 +313,18 @@ TEST(CppHibernateTests, create_derived3) expect_query(mock, "INSERT INTO " "`tbl_derived3` " "SET " - "`tbl_derived3_id`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " - "`tbl_derived2_id`=UuidToBin('Xdf032510-aae9-11e8-98d0-529269fb1459X')", + "`tbl_derived3_id`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_derived2_id`=UuidToBin('X3d1287a2-abb9-11e8-98d0-529269fb1459X')", result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "be0baad8-aaeb-11e8-a137-529269fb1459" } + { "3d1289f0-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test3` " "SET " - "`tbl_test3_id`=UuidToBin('Xbe0baad8-aaeb-11e8-a137-529269fb1459X'), " - "`tbl_derived3_id_test3_list`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_test3_id`=UuidToBin('X3d1289f0-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_derived3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X'), " "`tbl_derived3_id_test3_vector`=UuidToBin(null), " "`u32_data`='X100X', " "`i32_data`='X101X', " @@ -333,13 +333,13 @@ TEST(CppHibernateTests, create_derived3) result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "be0bb3e8-aaeb-11e8-a137-529269fb1459" } + { "3d128b26-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test3` " "SET " - "`tbl_test3_id`=UuidToBin('Xbe0bb3e8-aaeb-11e8-a137-529269fb1459X'), " - "`tbl_derived3_id_test3_list`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_test3_id`=UuidToBin('X3d128b26-abb9-11e8-98d0-529269fb1459X'), " + "`tbl_derived3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X'), " "`tbl_derived3_id_test3_vector`=UuidToBin(null), " "`u32_data`='X110X', " "`i32_data`='X111X', " @@ -348,14 +348,14 @@ TEST(CppHibernateTests, create_derived3) result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "be0bb974-aaeb-11e8-a137-529269fb1459" } + { "3d128eb4-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test3` " "SET " - "`tbl_test3_id`=UuidToBin('Xbe0bb974-aaeb-11e8-a137-529269fb1459X'), " + "`tbl_test3_id`=UuidToBin('X3d128eb4-abb9-11e8-98d0-529269fb1459X'), " "`tbl_derived3_id_test3_list`=UuidToBin(null), " - "`tbl_derived3_id_test3_vector`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X'), " "`u32_data`='X120X', " "`i32_data`='X121X', " "`u64_data`='X122X', " @@ -363,14 +363,14 @@ TEST(CppHibernateTests, create_derived3) result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "be0bbbc2-aaeb-11e8-a137-529269fb1459" } + { "3d128ffe-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test3` " "SET " - "`tbl_test3_id`=UuidToBin('Xbe0bbbc2-aaeb-11e8-a137-529269fb1459X'), " + "`tbl_test3_id`=UuidToBin('X3d128ffe-abb9-11e8-98d0-529269fb1459X'), " "`tbl_derived3_id_test3_list`=UuidToBin(null), " - "`tbl_derived3_id_test3_vector`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X'), " "`u32_data`='X130X', " "`i32_data`='X131X', " "`u64_data`='X132X', " @@ -378,14 +378,14 @@ TEST(CppHibernateTests, create_derived3) result_affected_rows(1)); expect_query(mock, "SELECT Uuid()", result_used({ - { "78ee918a-aaec-11e8-98d0-529269fb1459" } + { "3d129134-abb9-11e8-98d0-529269fb1459" } })); expect_query(mock, "INSERT INTO " "`tbl_test3` " "SET " - "`tbl_test3_id`=UuidToBin('X78ee918a-aaec-11e8-98d0-529269fb1459X'), " + "`tbl_test3_id`=UuidToBin('X3d129134-abb9-11e8-98d0-529269fb1459X'), " "`tbl_derived3_id_test3_list`=UuidToBin(null), " - "`tbl_derived3_id_test3_vector`=UuidToBin('X02689aa7-aa28-11e8-bf41-0242ac110002X'), " + "`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X'), " "`u32_data`='X140X', " "`i32_data`='X141X', " "`u64_data`='X142X', " diff --git a/test/cpphibernate_init.cpp b/test/cpphibernate_init.cpp index f0ac1ee..866660d 100644 --- a/test/cpphibernate_init.cpp +++ b/test/cpphibernate_init.cpp @@ -87,17 +87,7 @@ TEST(CppHibernateTests, init) " PRIMARY KEY ( `tbl_test3_id` ),\n" " UNIQUE INDEX `index_tbl_test3_id` ( `tbl_test3_id` ASC ),\n" " INDEX `index_tbl_derived3_id_test3_list` ( `tbl_derived3_id_test3_list` ASC ),\n" - " INDEX `index_tbl_derived3_id_test3_vector` ( `tbl_derived3_id_test3_vector` ASC ),\n" - " CONSTRAINT `fk_tbl_test3_tbl_derived3_id_test3_list`\n" - " FOREIGN KEY (`tbl_derived3_id_test3_list`)\n" - " REFERENCES `test`.`tbl_derived3` (`tbl_derived3_id`)\n" - " ON DELETE SET NULL\n" - " ON UPDATE NO ACTION,\n" - " CONSTRAINT `fk_tbl_test3_tbl_derived3_id_test3_vector`\n" - " FOREIGN KEY (`tbl_derived3_id_test3_vector`)\n" - " REFERENCES `test`.`tbl_derived3` (`tbl_derived3_id`)\n" - " ON DELETE SET NULL\n" - " ON UPDATE NO ACTION\n" + " INDEX `index_tbl_derived3_id_test3_vector` ( `tbl_derived3_id_test3_vector` ASC )\n" ")\n" "ENGINE = InnoDB\n" "DEFAULT CHARACTER SET = utf8"); @@ -122,17 +112,7 @@ TEST(CppHibernateTests, init) " PRIMARY KEY ( `tbl_derived1_id` ),\n" " UNIQUE INDEX `index_tbl_derived1_id` ( `tbl_derived1_id` ASC ),\n" " UNIQUE INDEX `index_tbl_base_id` ( `tbl_base_id` ASC ),\n" - " INDEX `index_tbl_test1_id_test1_data` ( `tbl_test1_id_test1_data` ASC ),\n" - " CONSTRAINT `fk_tbl_derived1_to_tbl_base_id`\n" - " FOREIGN KEY (`tbl_base_id`)\n" - " REFERENCES `test`.`tbl_base` (`tbl_base_id`)\n" - " ON DELETE CASCADE\n" - " ON UPDATE NO ACTION,\n" - " CONSTRAINT `fk_tbl_derived1_to_tbl_test1_id_test1_data`\n" - " FOREIGN KEY (`tbl_test1_id_test1_data`)\n" - " REFERENCES `test`.`tbl_test1` (`tbl_test1_id`)\n" - " ON DELETE CASCADE\n" - " ON UPDATE NO ACTION\n" + " INDEX `index_tbl_test1_id_test1_data` ( `tbl_test1_id_test1_data` ASC )\n" ")\n" "ENGINE = InnoDB\n" "DEFAULT CHARACTER SET = utf8"); @@ -149,46 +129,74 @@ TEST(CppHibernateTests, init) " UNIQUE INDEX `index_tbl_base_id` ( `tbl_base_id` ASC ),\n" " INDEX `index_tbl_test2_id_test2_nullable` ( `tbl_test2_id_test2_nullable` ASC ),\n" " INDEX `index_tbl_test2_id_test2_ptr_u` ( `tbl_test2_id_test2_ptr_u` ASC ),\n" - " INDEX `index_tbl_test2_id_test2_ptr_s` ( `tbl_test2_id_test2_ptr_s` ASC ),\n" - " CONSTRAINT `fk_tbl_derived2_to_tbl_base_id`\n" + " INDEX `index_tbl_test2_id_test2_ptr_s` ( `tbl_test2_id_test2_ptr_s` ASC )\n" + ")\n" + "ENGINE = InnoDB\n" + "DEFAULT CHARACTER SET = utf8"); + + expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_derived3`\n" + "(\n" + " `tbl_derived3_id` BINARY(16) NOT NULL,\n" + " `tbl_derived2_id` BINARY(16) NOT NULL,\n" + " PRIMARY KEY ( `tbl_derived3_id` ),\n" + " UNIQUE INDEX `index_tbl_derived3_id` ( `tbl_derived3_id` ASC ),\n" + " UNIQUE INDEX `index_tbl_derived2_id` ( `tbl_derived2_id` ASC )\n" + ")\n" + "ENGINE = InnoDB\n" + "DEFAULT CHARACTER SET = utf8"); + + expect_query(mock, "ALTER TABLE `tbl_test3`\n" + " ADD CONSTRAINT `fk_tbl_test3_to_tbl_derived3_id_test3_list`\n" + " FOREIGN KEY (`tbl_derived3_id_test3_list`)\n" + " REFERENCES `test`.`tbl_derived3` (`tbl_derived3_id`)\n" + " ON DELETE SET NULL\n" + " ON UPDATE NO ACTION,\n" + " ADD CONSTRAINT `fk_tbl_test3_to_tbl_derived3_id_test3_vector`\n" + " FOREIGN KEY (`tbl_derived3_id_test3_vector`)\n" + " REFERENCES `test`.`tbl_derived3` (`tbl_derived3_id`)\n" + " ON DELETE SET NULL\n" + " ON UPDATE NO ACTION"); + + expect_query(mock, "ALTER TABLE `tbl_derived1`\n" + " ADD CONSTRAINT `fk_tbl_derived1_to_tbl_base_id`\n" + " FOREIGN KEY (`tbl_base_id`)\n" + " REFERENCES `test`.`tbl_base` (`tbl_base_id`)\n" + " ON DELETE CASCADE\n" + " ON UPDATE NO ACTION,\n" + " ADD CONSTRAINT `fk_tbl_derived1_to_tbl_test1_id_test1_data`\n" + " FOREIGN KEY (`tbl_test1_id_test1_data`)\n" + " REFERENCES `test`.`tbl_test1` (`tbl_test1_id`)\n" + " ON DELETE CASCADE\n" + " ON UPDATE NO ACTION"); + + expect_query(mock, "ALTER TABLE `tbl_derived2`\n" + " ADD CONSTRAINT `fk_tbl_derived2_to_tbl_base_id`\n" " FOREIGN KEY (`tbl_base_id`)\n" " REFERENCES `test`.`tbl_base` (`tbl_base_id`)\n" " ON DELETE CASCADE\n" " ON UPDATE NO ACTION,\n" - " CONSTRAINT `fk_tbl_derived2_to_tbl_test2_id_test2_nullable`\n" + " ADD CONSTRAINT `fk_tbl_derived2_to_tbl_test2_id_test2_nullable`\n" " FOREIGN KEY (`tbl_test2_id_test2_nullable`)\n" " REFERENCES `test`.`tbl_test2` (`tbl_test2_id`)\n" " ON DELETE CASCADE\n" " ON UPDATE NO ACTION,\n" - " CONSTRAINT `fk_tbl_derived2_to_tbl_test2_id_test2_ptr_u`\n" + " ADD CONSTRAINT `fk_tbl_derived2_to_tbl_test2_id_test2_ptr_u`\n" " FOREIGN KEY (`tbl_test2_id_test2_ptr_u`)\n" " REFERENCES `test`.`tbl_test2` (`tbl_test2_id`)\n" " ON DELETE CASCADE\n" " ON UPDATE NO ACTION,\n" - " CONSTRAINT `fk_tbl_derived2_to_tbl_test2_id_test2_ptr_s`\n" + " ADD CONSTRAINT `fk_tbl_derived2_to_tbl_test2_id_test2_ptr_s`\n" " FOREIGN KEY (`tbl_test2_id_test2_ptr_s`)\n" " REFERENCES `test`.`tbl_test2` (`tbl_test2_id`)\n" " ON DELETE CASCADE\n" - " ON UPDATE NO ACTION\n" - ")\n" - "ENGINE = InnoDB\n" - "DEFAULT CHARACTER SET = utf8"); + " ON UPDATE NO ACTION"); - expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_derived3`\n" - "(\n" - " `tbl_derived3_id` BINARY(16) NOT NULL,\n" - " `tbl_derived2_id` BINARY(16) NOT NULL,\n" - " PRIMARY KEY ( `tbl_derived3_id` ),\n" - " UNIQUE INDEX `index_tbl_derived3_id` ( `tbl_derived3_id` ASC ),\n" - " UNIQUE INDEX `index_tbl_derived2_id` ( `tbl_derived2_id` ASC ),\n" - " CONSTRAINT `fk_tbl_derived3_to_tbl_derived2_id`\n" + expect_query(mock, "ALTER TABLE `tbl_derived3`\n" + " ADD CONSTRAINT `fk_tbl_derived3_to_tbl_derived2_id`\n" " FOREIGN KEY (`tbl_derived2_id`)\n" " REFERENCES `test`.`tbl_derived2` (`tbl_derived2_id`)\n" " ON DELETE CASCADE\n" - " ON UPDATE NO ACTION\n" - ")\n" - "ENGINE = InnoDB\n" - "DEFAULT CHARACTER SET = utf8"); + " ON UPDATE NO ACTION"); expect_query(mock, "COMMIT"); diff --git a/test/mariadb_mock.cpp b/test/mariadb_mock.cpp index 82c5e39..c0146e0 100644 --- a/test/mariadb_mock.cpp +++ b/test/mariadb_mock.cpp @@ -41,7 +41,7 @@ MYSQL_FIELD* STDCALL mysql_fetch_fields (MYSQL_RES *res) { return (mariadb_mock_instance ? mariadb_mock_instance->mysql_fetch_fields(res) : nullptr); } int STDCALL mysql_real_query (MYSQL *mysql, const char *q, unsigned long length) - { return (mariadb_mock_instance ? mariadb_mock_instance->mysql_real_query(mysql, q, length) : 0); } + { std::cout << std::string(q, length) << ";" << std::endl; return (mariadb_mock_instance ? mariadb_mock_instance->mysql_real_query(mysql, q, length) : 0); } unsigned int STDCALL mysql_errno (MYSQL *mysql) { return (mariadb_mock_instance ? mariadb_mock_instance->mysql_errno(mysql) : 0); }