| @@ -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; | |||
| @@ -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); | |||
| } | |||
| } | |||
| @@ -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 | |||
| @@ -6,19 +6,19 @@ | |||
| using namespace ::testing; | |||
| using namespace ::cpphibernate; | |||
| /* | |||
| TEST(CppHibernateTests, create_test1) | |||
| { | |||
| StrictMock<mariadb_mock> 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<driver::mariadb>(test_schema, connection); | |||
| context.create(static_cast<base&>(d2)); | |||
| } | |||
| */ | |||
| TEST(CppHibernateTests, create_derived3) | |||
| { | |||
| StrictMock<mariadb_mock> 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', " | |||
| @@ -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"); | |||
| @@ -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); } | |||