You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1045 lines
47 KiB

  1. #include <cpphibernate/driver/mariadb.h>
  2. #include "test_helper.h"
  3. #include "test_schema.h"
  4. #include "mariadb_mock.h"
  5. using namespace ::testing;
  6. using namespace ::cpphibernate;
  7. using namespace ::boost::hana::literals;
  8. TEST(CppHibernateTests, read_test1)
  9. {
  10. StrictMock<mariadb_mock> mock;
  11. expect_query(mock, "START TRANSACTION");
  12. expect_query(mock, "SELECT "
  13. "BinToUuid(`tbl_test1`.`tbl_test1_id`), "
  14. "`tbl_test1`.`str_data`, "
  15. "`tbl_test1`.`str64_data`, "
  16. "`tbl_test1`.`u32_nullable`, "
  17. "`tbl_test1`.`u32_ptr_u`, "
  18. "`tbl_test1`.`u32_ptr_s` "
  19. "FROM "
  20. "`tbl_test1` "
  21. "WHERE "
  22. "(`tbl_test1`.`tbl_test1_id`=UuidToBin('X3d12697a-abb9-11e8-98d0-529269fb1459X')) ",
  23. result_used({
  24. { "3d12697a-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `t1`", "str64_data of class `test1` object `t1`", nullptr, "123", "456" }
  25. }));
  26. expect_query(mock, "COMMIT");
  27. EXPECT_CALL(
  28. mock,
  29. mysql_close(
  30. reinterpret_cast<MYSQL*>(0x1111)));
  31. EXPECT_CALL(
  32. mock,
  33. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  34. .Times(AnyNumber())
  35. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  36. test1 t1;
  37. t1.id = uuid("3d12697a-abb9-11e8-98d0-529269fb1459");
  38. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  39. auto context = make_context<mariadb_driver>(test_schema, connection);
  40. context.read(t1);
  41. EXPECT_EQ (t1.id, uuid("3d12697a-abb9-11e8-98d0-529269fb1459"));
  42. EXPECT_EQ (t1.str_data, "str_data of class `test1` object `t1`");
  43. EXPECT_EQ (t1.str64_data, "str64_data of class `test1` object `t1`");
  44. EXPECT_FALSE(static_cast<bool>(t1.u32_nullable));
  45. ASSERT_TRUE (static_cast<bool>(t1.u32_ptr_u));
  46. EXPECT_EQ (*t1.u32_ptr_u, 123);
  47. ASSERT_TRUE (static_cast<bool>(t1.u32_ptr_s));
  48. EXPECT_EQ (*t1.u32_ptr_s, 456);
  49. }
  50. TEST(CppHibernateTests, read_test2)
  51. {
  52. StrictMock<mariadb_mock> mock;
  53. expect_query(mock, "START TRANSACTION");
  54. expect_query(mock, "SELECT "
  55. "BinToUuid(`tbl_test2`.`tbl_test2_id`), "
  56. "`tbl_test2`.`u8_data`, "
  57. "`tbl_test2`.`i8_data`, "
  58. "`tbl_test2`.`u16_data`, "
  59. "`tbl_test2`.`i16_data` "
  60. "FROM "
  61. "`tbl_test2` "
  62. "WHERE "
  63. "(`tbl_test2`.`tbl_test2_id`=UuidToBin('X3d1270dc-abb9-11e8-98d0-529269fb1459X')) ",
  64. result_used({
  65. { "3d1270dc-abb9-11e8-98d0-529269fb1459", "1", "2", "3", "4" }
  66. }));
  67. expect_query(mock, "COMMIT");
  68. EXPECT_CALL(
  69. mock,
  70. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  71. .Times(AnyNumber())
  72. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  73. EXPECT_CALL(
  74. mock,
  75. mysql_close(
  76. reinterpret_cast<MYSQL*>(0x1111)));
  77. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  78. auto context = make_context<mariadb_driver>(test_schema, connection);
  79. constexpr decltype(auto) test2_key_field = test_schema.tables[1_c].fields[0_c];
  80. test2 t2;
  81. context.read(t2, where(equal(test2_key_field, "3d1270dc-abb9-11e8-98d0-529269fb1459")));
  82. EXPECT_EQ(t2.id, uuid("3d1270dc-abb9-11e8-98d0-529269fb1459"));
  83. EXPECT_EQ(t2.u8_data, 1);
  84. EXPECT_EQ(t2.i8_data, 2);
  85. EXPECT_EQ(t2.u16_data, 3);
  86. EXPECT_EQ(t2.i16_data, 4);
  87. }
  88. TEST(CppHibernateTests, read_test3)
  89. {
  90. StrictMock<mariadb_mock> mock;
  91. expect_query(mock, "START TRANSACTION");
  92. expect_query(mock, "SELECT "
  93. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  94. "`tbl_test3`.`u32_data`, "
  95. "`tbl_test3`.`i32_data`, "
  96. "`tbl_test3`.`u64_data`, "
  97. "`tbl_test3`.`i64_data` "
  98. "FROM "
  99. "`tbl_test3` "
  100. "WHERE "
  101. "(`tbl_test3`.`tbl_test3_id`=UuidToBin('X3d12737a-abb9-11e8-98d0-529269fb1459X')) ",
  102. result_used({
  103. { "3d12737a-abb9-11e8-98d0-529269fb1459", "5", "6", "7", "8" }
  104. }));
  105. expect_query(mock, "COMMIT");
  106. EXPECT_CALL(
  107. mock,
  108. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  109. .Times(AnyNumber())
  110. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  111. EXPECT_CALL(
  112. mock,
  113. mysql_close(
  114. reinterpret_cast<MYSQL*>(0x1111)));
  115. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  116. auto context = make_context<mariadb_driver>(test_schema, connection);
  117. test3 t3;
  118. t3.id = uuid("3d12737a-abb9-11e8-98d0-529269fb1459");
  119. context.read(t3);
  120. EXPECT_EQ(t3.id, uuid("3d12737a-abb9-11e8-98d0-529269fb1459"));
  121. EXPECT_EQ(t3.u32_data, 5);
  122. EXPECT_EQ(t3.i32_data, 6);
  123. EXPECT_EQ(t3.u64_data, 7);
  124. EXPECT_EQ(t3.i64_data, 8);
  125. }
  126. TEST(CppHibernateTests, read_derived1_static)
  127. {
  128. StrictMock<mariadb_mock> mock;
  129. expect_query(mock, "START TRANSACTION");
  130. expect_query(mock, "SELECT "
  131. "BinToUuid(`tbl_base`.`tbl_base_id`), "
  132. "`tbl_base`.`name`, "
  133. "BinToUuid(`tbl_derived1`.`tbl_derived1_id`), "
  134. "`tbl_derived1`.`enum_data`, "
  135. "BinToUuid(`T0`.`tbl_test1_id`), "
  136. "`T0`.`str_data`, "
  137. "`T0`.`str64_data`, "
  138. "`T0`.`u32_nullable`, "
  139. "`T0`.`u32_ptr_u`, "
  140. "`T0`.`u32_ptr_s` "
  141. "FROM "
  142. "`tbl_derived1` "
  143. "JOIN "
  144. "`tbl_base` ON `tbl_derived1`.`tbl_base_id`=`tbl_base`.`tbl_base_id` "
  145. "LEFT JOIN "
  146. "`tbl_test1` AS `T0` ON `tbl_derived1`.`tbl_test1_id_test1_data`=`T0`.`tbl_test1_id` "
  147. "WHERE "
  148. "(`tbl_derived1`.`tbl_derived1_id`=UuidToBin('X3d12758c-abb9-11e8-98d0-529269fb1459X')) ",
  149. result_used({
  150. { "3d12778a-abb9-11e8-98d0-529269fb1459", "derived1", "3d12758c-abb9-11e8-98d0-529269fb1459", "test2", "3d127988-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `d1.test1_data`", "str64_data of class `test1` object `d1.test1_data`", "32", nullptr, "789" }
  151. }));
  152. expect_query(mock, "COMMIT");
  153. EXPECT_CALL(
  154. mock,
  155. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  156. .Times(AnyNumber())
  157. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  158. EXPECT_CALL(
  159. mock,
  160. mysql_close(
  161. reinterpret_cast<MYSQL*>(0x1111)));
  162. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  163. auto context = make_context<mariadb_driver>(test_schema, connection);
  164. derived1 d1;
  165. d1.derived1_id = uuid("3d12758c-abb9-11e8-98d0-529269fb1459");
  166. context.read(d1);
  167. EXPECT_EQ (d1.id, uuid("3d12778a-abb9-11e8-98d0-529269fb1459"));
  168. EXPECT_EQ (d1.derived1_id, uuid("3d12758c-abb9-11e8-98d0-529269fb1459"));
  169. EXPECT_EQ (d1.name, "derived1");
  170. EXPECT_EQ (d1.enum_data, test_enum::test2);
  171. EXPECT_EQ (d1.test1_data.str_data, "str_data of class `test1` object `d1.test1_data`");
  172. EXPECT_EQ (d1.test1_data.str64_data, "str64_data of class `test1` object `d1.test1_data`");
  173. ASSERT_TRUE (static_cast<bool>(d1.test1_data.u32_nullable));
  174. EXPECT_EQ (*d1.test1_data.u32_nullable, 32);
  175. ASSERT_TRUE (static_cast<bool>(d1.test1_data.u32_ptr_s));
  176. EXPECT_EQ (*d1.test1_data.u32_ptr_s, 789);
  177. EXPECT_FALSE(static_cast<bool>(d1.test1_data.u32_ptr_u));
  178. }
  179. TEST(CppHibernateTests, read_derived2_static)
  180. {
  181. StrictMock<mariadb_mock> mock;
  182. expect_query(mock, "START TRANSACTION");
  183. expect_query(mock, "SELECT "
  184. "BinToUuid(`tbl_base`.`tbl_base_id`), "
  185. "`tbl_base`.`name`, "
  186. "BinToUuid(`tbl_derived2`.`tbl_derived2_id`), "
  187. "BinToUuid(`T0`.`tbl_test2_id`), "
  188. "`T0`.`u8_data`, "
  189. "`T0`.`i8_data`, "
  190. "`T0`.`u16_data`, "
  191. "`T0`.`i16_data`, "
  192. "BinToUuid(`T1`.`tbl_test2_id`), "
  193. "`T1`.`u8_data`, "
  194. "`T1`.`i8_data`, "
  195. "`T1`.`u16_data`, "
  196. "`T1`.`i16_data`, "
  197. "BinToUuid(`T2`.`tbl_test2_id`), "
  198. "`T2`.`u8_data`, "
  199. "`T2`.`i8_data`, "
  200. "`T2`.`u16_data`, "
  201. "`T2`.`i16_data` "
  202. "FROM "
  203. "`tbl_derived2` "
  204. "JOIN "
  205. "`tbl_base` ON `tbl_derived2`.`tbl_base_id`=`tbl_base`.`tbl_base_id` "
  206. "LEFT JOIN "
  207. "`tbl_test2` AS `T0` ON `tbl_derived2`.`tbl_test2_id_test2_nullable`=`T0`.`tbl_test2_id` "
  208. "LEFT JOIN "
  209. "`tbl_test2` AS `T1` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_u`=`T1`.`tbl_test2_id` "
  210. "LEFT JOIN "
  211. "`tbl_test2` AS `T2` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_s`=`T2`.`tbl_test2_id` "
  212. "WHERE "
  213. "(`tbl_derived2`.`tbl_derived2_id`=UuidToBin('X3d127bcc-abb9-11e8-98d0-529269fb1459X')) ",
  214. result_used({
  215. { "3d127db6-abb9-11e8-98d0-529269fb1459", "derived2", "3d127bcc-abb9-11e8-98d0-529269fb1459", "3d1283a6-abb9-11e8-98d0-529269fb1459", "10", "11", "12", "13", "3d128522-abb9-11e8-98d0-529269fb1459", "20", "21", "22", "23", nullptr, nullptr, nullptr, nullptr, nullptr }
  216. }));
  217. expect_query(mock, "COMMIT");
  218. EXPECT_CALL(
  219. mock,
  220. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  221. .Times(AnyNumber())
  222. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  223. EXPECT_CALL(
  224. mock,
  225. mysql_close(
  226. reinterpret_cast<MYSQL*>(0x1111)));
  227. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  228. auto context = make_context<mariadb_driver>(test_schema, connection);
  229. derived2 d2;
  230. d2.derived2_id = uuid("3d127bcc-abb9-11e8-98d0-529269fb1459");
  231. context.read(d2);
  232. EXPECT_EQ (d2.id, uuid("3d127db6-abb9-11e8-98d0-529269fb1459"));
  233. EXPECT_EQ (d2.derived2_id, uuid("3d127bcc-abb9-11e8-98d0-529269fb1459"));
  234. EXPECT_EQ (d2.name, "derived2");
  235. ASSERT_TRUE (static_cast<bool>(d2.test2_nullable));
  236. EXPECT_EQ (d2.test2_nullable->u8_data, 10);
  237. EXPECT_EQ (d2.test2_nullable->i8_data, 11);
  238. EXPECT_EQ (d2.test2_nullable->u16_data, 12);
  239. EXPECT_EQ (d2.test2_nullable->i16_data, 13);
  240. ASSERT_TRUE (static_cast<bool>(d2.test2_ptr_u));
  241. EXPECT_EQ (d2.test2_ptr_u->u8_data, 20);
  242. EXPECT_EQ (d2.test2_ptr_u->i8_data, 21);
  243. EXPECT_EQ (d2.test2_ptr_u->u16_data, 22);
  244. EXPECT_EQ (d2.test2_ptr_u->i16_data, 23);
  245. EXPECT_FALSE(static_cast<bool>(d2.test2_ptr_s));
  246. }
  247. TEST(CppHibernateTests, read_derived3_static)
  248. {
  249. StrictMock<mariadb_mock> mock;
  250. expect_query(mock, "START TRANSACTION");
  251. expect_query(mock, "SELECT "
  252. "BinToUuid(`tbl_base`.`tbl_base_id`), "
  253. "`tbl_base`.`name`, "
  254. "BinToUuid(`tbl_derived2`.`tbl_derived2_id`), "
  255. "BinToUuid(`T0`.`tbl_test2_id`), "
  256. "`T0`.`u8_data`, "
  257. "`T0`.`i8_data`, "
  258. "`T0`.`u16_data`, "
  259. "`T0`.`i16_data`, "
  260. "BinToUuid(`T1`.`tbl_test2_id`), "
  261. "`T1`.`u8_data`, "
  262. "`T1`.`i8_data`, "
  263. "`T1`.`u16_data`, "
  264. "`T1`.`i16_data`, "
  265. "BinToUuid(`T2`.`tbl_test2_id`), "
  266. "`T2`.`u8_data`, "
  267. "`T2`.`i8_data`, "
  268. "`T2`.`u16_data`, "
  269. "`T2`.`i16_data`, "
  270. "BinToUuid(`tbl_derived3`.`tbl_derived3_id`) "
  271. "FROM "
  272. "`tbl_derived3` "
  273. "JOIN "
  274. "`tbl_derived2` ON `tbl_derived3`.`tbl_derived2_id`=`tbl_derived2`.`tbl_derived2_id` "
  275. "JOIN "
  276. "`tbl_base` ON `tbl_derived2`.`tbl_base_id`=`tbl_base`.`tbl_base_id` "
  277. "LEFT JOIN "
  278. "`tbl_test2` AS `T0` ON `tbl_derived2`.`tbl_test2_id_test2_nullable`=`T0`.`tbl_test2_id` "
  279. "LEFT JOIN "
  280. "`tbl_test2` AS `T1` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_u`=`T1`.`tbl_test2_id` "
  281. "LEFT JOIN "
  282. "`tbl_test2` AS `T2` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_s`=`T2`.`tbl_test2_id` "
  283. "WHERE "
  284. "(`tbl_derived3`.`tbl_derived3_id`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) ",
  285. result_used({
  286. { "3d1288ce-abb9-11e8-98d0-529269fb1459", "derived3", "3d1287a2-abb9-11e8-98d0-529269fb1459", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "3d12866c-abb9-11e8-98d0-529269fb1459" }
  287. }));
  288. expect_query(mock, "SELECT "
  289. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  290. "`tbl_test3`.`u32_data`, "
  291. "`tbl_test3`.`i32_data`, "
  292. "`tbl_test3`.`u64_data`, "
  293. "`tbl_test3`.`i64_data` "
  294. "FROM "
  295. "`tbl_test3` "
  296. "WHERE "
  297. "(`tbl_test3`.`tbl_derived3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) "
  298. "ORDER BY "
  299. "`tbl_test3`.`tbl_derived3_index_test3_list` ASC ",
  300. result_used({
  301. { "3d1289f0-abb9-11e8-98d0-529269fb1459", "100", "101", "102", "103" },
  302. { "3d128b26-abb9-11e8-98d0-529269fb1459", "110", "111", "112", "113" },
  303. }));
  304. expect_query(mock, "SELECT "
  305. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  306. "`tbl_test3`.`u32_data`, "
  307. "`tbl_test3`.`i32_data`, "
  308. "`tbl_test3`.`u64_data`, "
  309. "`tbl_test3`.`i64_data` "
  310. "FROM "
  311. "`tbl_test3` "
  312. "WHERE "
  313. "(`tbl_test3`.`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) "
  314. "ORDER BY "
  315. "`tbl_test3`.`tbl_derived3_index_test3_vector` ASC ",
  316. result_used({
  317. { "3d128eb4-abb9-11e8-98d0-529269fb1459", "120", "121", "122", "123" },
  318. { "3d128ffe-abb9-11e8-98d0-529269fb1459", "130", "131", "132", "133" },
  319. { "3d129134-abb9-11e8-98d0-529269fb1459", "140", "141", "142", "143" },
  320. }));
  321. expect_query(mock, "COMMIT");
  322. EXPECT_CALL(
  323. mock,
  324. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  325. .Times(AnyNumber())
  326. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  327. EXPECT_CALL(
  328. mock,
  329. mysql_close(
  330. reinterpret_cast<MYSQL*>(0x1111)));
  331. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  332. auto context = make_context<mariadb_driver>(test_schema, connection);
  333. derived3 d3;
  334. d3.derived3_id = uuid("3d12866c-abb9-11e8-98d0-529269fb1459");
  335. context.read(d3);
  336. EXPECT_EQ (d3.id, uuid("3d1288ce-abb9-11e8-98d0-529269fb1459"));
  337. EXPECT_EQ (d3.name, "derived3");
  338. EXPECT_EQ (d3.derived2_id, uuid("3d1287a2-abb9-11e8-98d0-529269fb1459"));
  339. EXPECT_FALSE(static_cast<bool>(d3.test2_nullable));
  340. EXPECT_FALSE(static_cast<bool>(d3.test2_ptr_u));
  341. EXPECT_FALSE(static_cast<bool>(d3.test2_ptr_s));
  342. EXPECT_EQ (d3.derived3_id, uuid("3d12866c-abb9-11e8-98d0-529269fb1459"));
  343. {
  344. auto it = d3.test3_list.begin();
  345. ASSERT_NE(it, d3.test3_list.end());
  346. EXPECT_EQ(it->id, uuid("3d1289f0-abb9-11e8-98d0-529269fb1459"));
  347. EXPECT_EQ(it->u32_data, 100);
  348. EXPECT_EQ(it->i32_data, 101);
  349. EXPECT_EQ(it->u64_data, 102);
  350. EXPECT_EQ(it->i64_data, 103);
  351. ++it;
  352. ASSERT_NE(it, d3.test3_list.end());
  353. EXPECT_EQ(it->id, uuid("3d128b26-abb9-11e8-98d0-529269fb1459"));
  354. EXPECT_EQ(it->u32_data, 110);
  355. EXPECT_EQ(it->i32_data, 111);
  356. EXPECT_EQ(it->u64_data, 112);
  357. EXPECT_EQ(it->i64_data, 113);
  358. ++it;
  359. EXPECT_EQ(it, d3.test3_list.end());
  360. }
  361. {
  362. auto it = d3.test3_vector.begin();
  363. ASSERT_NE(it, d3.test3_vector.end());
  364. EXPECT_EQ(it->id, uuid("3d128eb4-abb9-11e8-98d0-529269fb1459"));
  365. EXPECT_EQ(it->u32_data, 120);
  366. EXPECT_EQ(it->i32_data, 121);
  367. EXPECT_EQ(it->u64_data, 122);
  368. EXPECT_EQ(it->i64_data, 123);
  369. ++it;
  370. ASSERT_NE(it, d3.test3_vector.end());
  371. EXPECT_EQ(it->id, uuid("3d128ffe-abb9-11e8-98d0-529269fb1459"));
  372. EXPECT_EQ(it->u32_data, 130);
  373. EXPECT_EQ(it->i32_data, 131);
  374. EXPECT_EQ(it->u64_data, 132);
  375. EXPECT_EQ(it->i64_data, 133);
  376. ++it;
  377. ASSERT_NE(it, d3.test3_vector.end());
  378. EXPECT_EQ(it->id, uuid("3d129134-abb9-11e8-98d0-529269fb1459"));
  379. EXPECT_EQ(it->u32_data, 140);
  380. EXPECT_EQ(it->i32_data, 141);
  381. EXPECT_EQ(it->u64_data, 142);
  382. EXPECT_EQ(it->i64_data, 143);
  383. ++it;
  384. EXPECT_EQ(it, d3.test3_vector.end());
  385. }
  386. }
  387. TEST(CppHibernateTests, read_derived2_ptr_dynamic)
  388. {
  389. StrictMock<mariadb_mock> mock;
  390. expect_query(mock, "START TRANSACTION");
  391. expect_query(mock, "SELECT "
  392. "`tbl_base`.`__type` AS `__type`, "
  393. "BinToUuid(`tbl_base`.`tbl_base_id`), "
  394. "`tbl_base`.`name`, "
  395. "BinToUuid(`tbl_derived2`.`tbl_derived2_id`), "
  396. "BinToUuid(`T0`.`tbl_test2_id`), "
  397. "`T0`.`u8_data`, "
  398. "`T0`.`i8_data`, "
  399. "`T0`.`u16_data`, "
  400. "`T0`.`i16_data`, "
  401. "BinToUuid(`T1`.`tbl_test2_id`), "
  402. "`T1`.`u8_data`, "
  403. "`T1`.`i8_data`, "
  404. "`T1`.`u16_data`, "
  405. "`T1`.`i16_data`, "
  406. "BinToUuid(`T2`.`tbl_test2_id`), "
  407. "`T2`.`u8_data`, "
  408. "`T2`.`i8_data`, "
  409. "`T2`.`u16_data`, "
  410. "`T2`.`i16_data`, "
  411. "BinToUuid(`tbl_derived3`.`tbl_derived3_id`) "
  412. "FROM "
  413. "`tbl_derived2` "
  414. "JOIN "
  415. "`tbl_base` ON `tbl_derived2`.`tbl_base_id`=`tbl_base`.`tbl_base_id` "
  416. "LEFT JOIN "
  417. "`tbl_test2` AS `T0` ON `tbl_derived2`.`tbl_test2_id_test2_nullable`=`T0`.`tbl_test2_id` "
  418. "LEFT JOIN "
  419. "`tbl_test2` AS `T1` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_u`=`T1`.`tbl_test2_id` "
  420. "LEFT JOIN "
  421. "`tbl_test2` AS `T2` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_s`=`T2`.`tbl_test2_id` "
  422. "LEFT JOIN "
  423. "`tbl_derived3` ON `tbl_derived2`.`tbl_derived2_id`=`tbl_derived3`.`tbl_derived2_id` "
  424. "WHERE "
  425. "(`tbl_derived2`.`tbl_derived2_id`=UuidToBin('X3d1287a2-abb9-11e8-98d0-529269fb1459X')) ",
  426. result_used({
  427. {
  428. /* base */ "13", "3d1288ce-abb9-11e8-98d0-529269fb1459", "derived3",
  429. /* derived2 */ "3d1287a2-abb9-11e8-98d0-529269fb1459",
  430. /* derived2.test2_nullable */ nullptr, nullptr, nullptr, nullptr, nullptr,
  431. /* derived2.test2_ptr_u */ nullptr, nullptr, nullptr, nullptr, nullptr,
  432. /* derived2.test2_ptr_s */ nullptr, nullptr, nullptr, nullptr, nullptr,
  433. /* derived3 */ "3d12866c-abb9-11e8-98d0-529269fb1459"
  434. }
  435. }));
  436. expect_query(mock, "SELECT "
  437. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  438. "`tbl_test3`.`u32_data`, "
  439. "`tbl_test3`.`i32_data`, "
  440. "`tbl_test3`.`u64_data`, "
  441. "`tbl_test3`.`i64_data` "
  442. "FROM "
  443. "`tbl_test3` "
  444. "WHERE "
  445. "(`tbl_test3`.`tbl_derived3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) "
  446. "ORDER BY "
  447. "`tbl_test3`.`tbl_derived3_index_test3_list` ASC ",
  448. result_used({
  449. { "3d1289f0-abb9-11e8-98d0-529269fb1459", "100", "101", "102", "103" },
  450. { "3d128b26-abb9-11e8-98d0-529269fb1459", "110", "111", "112", "113" },
  451. }));
  452. expect_query(mock, "SELECT "
  453. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  454. "`tbl_test3`.`u32_data`, "
  455. "`tbl_test3`.`i32_data`, "
  456. "`tbl_test3`.`u64_data`, "
  457. "`tbl_test3`.`i64_data` "
  458. "FROM "
  459. "`tbl_test3` "
  460. "WHERE "
  461. "(`tbl_test3`.`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) "
  462. "ORDER BY "
  463. "`tbl_test3`.`tbl_derived3_index_test3_vector` ASC ",
  464. result_used({
  465. { "3d128eb4-abb9-11e8-98d0-529269fb1459", "120", "121", "122", "123" },
  466. { "3d128ffe-abb9-11e8-98d0-529269fb1459", "130", "131", "132", "133" },
  467. { "3d129134-abb9-11e8-98d0-529269fb1459", "140", "141", "142", "143" },
  468. }));
  469. expect_query(mock, "COMMIT");
  470. EXPECT_CALL(
  471. mock,
  472. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  473. .Times(AnyNumber())
  474. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  475. EXPECT_CALL(
  476. mock,
  477. mysql_close(
  478. reinterpret_cast<MYSQL*>(0x1111)));
  479. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  480. auto context = make_context<mariadb_driver>(test_schema, connection);
  481. constexpr decltype(auto) d2_key_field = test_schema.tables[5_c].fields[0_c];
  482. std::unique_ptr<derived2> d2_ptr;
  483. context.read(d2_ptr, where(equal(d2_key_field, "3d1287a2-abb9-11e8-98d0-529269fb1459")));
  484. auto* d3_ptr = dynamic_cast<derived3*>(d2_ptr.get());
  485. ASSERT_TRUE (d3_ptr);
  486. auto& d3 = *d3_ptr;
  487. EXPECT_EQ (d3.id, uuid("3d1288ce-abb9-11e8-98d0-529269fb1459"));
  488. EXPECT_EQ (d3.name, "derived3");
  489. EXPECT_EQ (d3.derived2_id, uuid("3d1287a2-abb9-11e8-98d0-529269fb1459"));
  490. EXPECT_FALSE(static_cast<bool>(d3.test2_nullable));
  491. EXPECT_FALSE(static_cast<bool>(d3.test2_ptr_u));
  492. EXPECT_FALSE(static_cast<bool>(d3.test2_ptr_s));
  493. EXPECT_EQ (d3.derived3_id, uuid("3d12866c-abb9-11e8-98d0-529269fb1459"));
  494. {
  495. auto it = d3.test3_list.begin();
  496. ASSERT_NE(it, d3.test3_list.end());
  497. EXPECT_EQ(it->id, uuid("3d1289f0-abb9-11e8-98d0-529269fb1459"));
  498. EXPECT_EQ(it->u32_data, 100);
  499. EXPECT_EQ(it->i32_data, 101);
  500. EXPECT_EQ(it->u64_data, 102);
  501. EXPECT_EQ(it->i64_data, 103);
  502. ++it;
  503. ASSERT_NE(it, d3.test3_list.end());
  504. EXPECT_EQ(it->id, uuid("3d128b26-abb9-11e8-98d0-529269fb1459"));
  505. EXPECT_EQ(it->u32_data, 110);
  506. EXPECT_EQ(it->i32_data, 111);
  507. EXPECT_EQ(it->u64_data, 112);
  508. EXPECT_EQ(it->i64_data, 113);
  509. ++it;
  510. EXPECT_EQ(it, d3.test3_list.end());
  511. }
  512. {
  513. auto it = d3.test3_vector.begin();
  514. ASSERT_NE(it, d3.test3_vector.end());
  515. EXPECT_EQ(it->id, uuid("3d128eb4-abb9-11e8-98d0-529269fb1459"));
  516. EXPECT_EQ(it->u32_data, 120);
  517. EXPECT_EQ(it->i32_data, 121);
  518. EXPECT_EQ(it->u64_data, 122);
  519. EXPECT_EQ(it->i64_data, 123);
  520. ++it;
  521. ASSERT_NE(it, d3.test3_vector.end());
  522. EXPECT_EQ(it->id, uuid("3d128ffe-abb9-11e8-98d0-529269fb1459"));
  523. EXPECT_EQ(it->u32_data, 130);
  524. EXPECT_EQ(it->i32_data, 131);
  525. EXPECT_EQ(it->u64_data, 132);
  526. EXPECT_EQ(it->i64_data, 133);
  527. ++it;
  528. ASSERT_NE(it, d3.test3_vector.end());
  529. EXPECT_EQ(it->id, uuid("3d129134-abb9-11e8-98d0-529269fb1459"));
  530. EXPECT_EQ(it->u32_data, 140);
  531. EXPECT_EQ(it->i32_data, 141);
  532. EXPECT_EQ(it->u64_data, 142);
  533. EXPECT_EQ(it->i64_data, 143);
  534. ++it;
  535. EXPECT_EQ(it, d3.test3_vector.end());
  536. }
  537. }
  538. TEST(CppHibernateTests, read_base_ptr_vector_dynamic)
  539. {
  540. StrictMock<mariadb_mock> mock;
  541. expect_query(mock, "START TRANSACTION");
  542. expect_query(mock, "SELECT "
  543. "`tbl_base`.`__type` AS `__type`, "
  544. "BinToUuid(`tbl_base`.`tbl_base_id`), "
  545. "`tbl_base`.`name`, "
  546. "BinToUuid(`tbl_derived1`.`tbl_derived1_id`), "
  547. "`tbl_derived1`.`enum_data`, "
  548. "BinToUuid(`T0`.`tbl_test1_id`), "
  549. "`T0`.`str_data`, "
  550. "`T0`.`str64_data`, "
  551. "`T0`.`u32_nullable`, "
  552. "`T0`.`u32_ptr_u`, "
  553. "`T0`.`u32_ptr_s`, "
  554. "BinToUuid(`tbl_derived2`.`tbl_derived2_id`), "
  555. "BinToUuid(`T1`.`tbl_test2_id`), "
  556. "`T1`.`u8_data`, "
  557. "`T1`.`i8_data`, "
  558. "`T1`.`u16_data`, "
  559. "`T1`.`i16_data`, "
  560. "BinToUuid(`T2`.`tbl_test2_id`), "
  561. "`T2`.`u8_data`, "
  562. "`T2`.`i8_data`, "
  563. "`T2`.`u16_data`, "
  564. "`T2`.`i16_data`, "
  565. "BinToUuid(`T3`.`tbl_test2_id`), "
  566. "`T3`.`u8_data`, "
  567. "`T3`.`i8_data`, "
  568. "`T3`.`u16_data`, "
  569. "`T3`.`i16_data`, "
  570. "BinToUuid(`tbl_derived3`.`tbl_derived3_id`) "
  571. "FROM "
  572. "`tbl_base` "
  573. "LEFT JOIN "
  574. "`tbl_derived1` ON `tbl_base`.`tbl_base_id`=`tbl_derived1`.`tbl_base_id` "
  575. "LEFT JOIN "
  576. "`tbl_test1` AS `T0` ON `tbl_derived1`.`tbl_test1_id_test1_data`=`T0`.`tbl_test1_id` "
  577. "LEFT JOIN "
  578. "`tbl_derived2` ON `tbl_base`.`tbl_base_id`=`tbl_derived2`.`tbl_base_id` "
  579. "LEFT JOIN "
  580. "`tbl_test2` AS `T1` ON `tbl_derived2`.`tbl_test2_id_test2_nullable`=`T1`.`tbl_test2_id` "
  581. "LEFT JOIN "
  582. "`tbl_test2` AS `T2` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_u`=`T2`.`tbl_test2_id` "
  583. "LEFT JOIN "
  584. "`tbl_test2` AS `T3` ON `tbl_derived2`.`tbl_test2_id_test2_ptr_s`=`T3`.`tbl_test2_id` "
  585. "LEFT JOIN "
  586. "`tbl_derived3` ON `tbl_derived2`.`tbl_derived2_id`=`tbl_derived3`.`tbl_derived2_id` ",
  587. result_used({
  588. {
  589. /* base */ "11", "3d12778a-abb9-11e8-98d0-529269fb1459", "derived1",
  590. /* derived1 */ "3d12758c-abb9-11e8-98d0-529269fb1459", "test2",
  591. /* derived1.test1 */ "3d127988-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `d1.test1_data`", "str64_data of class `test1` object `d1.test1_data`", "32", nullptr, "789",
  592. /* derived2 */ nullptr,
  593. /* derived2.test2_nullable */ nullptr, nullptr, nullptr, nullptr, nullptr,
  594. /* derived2.test2_ptr_u */ nullptr, nullptr, nullptr, nullptr, nullptr,
  595. /* derived2.test2_ptr_s */ nullptr, nullptr, nullptr, nullptr, nullptr,
  596. /* derived3 */ nullptr
  597. },
  598. {
  599. /* base */ "12", "3d127db6-abb9-11e8-98d0-529269fb1459", "derived2",
  600. /* derived1 */ nullptr, nullptr,
  601. /* derived1.test1 */ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
  602. /* derived2 */ "3d127bcc-abb9-11e8-98d0-529269fb1459",
  603. /* derived2.test2_nullable */ "3d1283a6-abb9-11e8-98d0-529269fb1459", "10", "11", "12", "13",
  604. /* derived2.test2_ptr_u */ "3d128522-abb9-11e8-98d0-529269fb1459", "20", "21", "22", "23",
  605. /* derived2.test2_ptr_s */ nullptr, nullptr, nullptr, nullptr, nullptr,
  606. /* derived3 */ nullptr
  607. },
  608. {
  609. /* base */ "13", "3d1288ce-abb9-11e8-98d0-529269fb1459", "derived3",
  610. /* derived1 */ nullptr, nullptr,
  611. /* derived1.test1 */ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
  612. /* derived2 */ "3d1287a2-abb9-11e8-98d0-529269fb1459",
  613. /* derived2.test2_nullable */ nullptr, nullptr, nullptr, nullptr, nullptr,
  614. /* derived2.test2_ptr_u */ nullptr, nullptr, nullptr, nullptr, nullptr,
  615. /* derived2.test2_ptr_s */ nullptr, nullptr, nullptr, nullptr, nullptr,
  616. /* derived3 */ "3d12866c-abb9-11e8-98d0-529269fb1459"
  617. },
  618. }));
  619. expect_query(mock, "SELECT "
  620. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  621. "`tbl_test3`.`u32_data`, "
  622. "`tbl_test3`.`i32_data`, "
  623. "`tbl_test3`.`u64_data`, "
  624. "`tbl_test3`.`i64_data` "
  625. "FROM "
  626. "`tbl_test3` "
  627. "WHERE "
  628. "(`tbl_test3`.`tbl_derived3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) "
  629. "ORDER BY "
  630. "`tbl_test3`.`tbl_derived3_index_test3_list` ASC ",
  631. result_used({
  632. { "3d1289f0-abb9-11e8-98d0-529269fb1459", "100", "101", "102", "103" },
  633. { "3d128b26-abb9-11e8-98d0-529269fb1459", "110", "111", "112", "113" },
  634. }));
  635. expect_query(mock, "SELECT "
  636. "BinToUuid(`tbl_test3`.`tbl_test3_id`), "
  637. "`tbl_test3`.`u32_data`, "
  638. "`tbl_test3`.`i32_data`, "
  639. "`tbl_test3`.`u64_data`, "
  640. "`tbl_test3`.`i64_data` "
  641. "FROM "
  642. "`tbl_test3` "
  643. "WHERE "
  644. "(`tbl_test3`.`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')) "
  645. "ORDER BY "
  646. "`tbl_test3`.`tbl_derived3_index_test3_vector` ASC ",
  647. result_used({
  648. { "3d128eb4-abb9-11e8-98d0-529269fb1459", "120", "121", "122", "123" },
  649. { "3d128ffe-abb9-11e8-98d0-529269fb1459", "130", "131", "132", "133" },
  650. { "3d129134-abb9-11e8-98d0-529269fb1459", "140", "141", "142", "143" },
  651. }));
  652. expect_query(mock, "COMMIT");
  653. EXPECT_CALL(
  654. mock,
  655. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  656. .Times(AnyNumber())
  657. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  658. EXPECT_CALL(
  659. mock,
  660. mysql_close(
  661. reinterpret_cast<MYSQL*>(0x1111)));
  662. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  663. auto context = make_context<mariadb_driver>(test_schema, connection);
  664. using base_ptr_type = std::unique_ptr<base>;
  665. using base_vec_type = std::vector<base_ptr_type>;
  666. base_vec_type base_vec;
  667. context.read(base_vec);
  668. auto bIt = base_vec.begin();
  669. {
  670. ASSERT_NE (bIt, base_vec.end());
  671. auto* base_ptr = bIt->get();
  672. ASSERT_TRUE(static_cast<bool>(base_ptr));
  673. auto* d1_ptr = dynamic_cast<derived1*>(base_ptr);
  674. ASSERT_TRUE(static_cast<bool>(d1_ptr));
  675. auto& d1 = *d1_ptr;
  676. ++bIt;
  677. EXPECT_EQ (d1.id, uuid("3d12778a-abb9-11e8-98d0-529269fb1459"));
  678. EXPECT_EQ (d1.derived1_id, uuid("3d12758c-abb9-11e8-98d0-529269fb1459"));
  679. EXPECT_EQ (d1.name, "derived1");
  680. EXPECT_EQ (d1.enum_data, test_enum::test2);
  681. EXPECT_EQ (d1.test1_data.str_data, "str_data of class `test1` object `d1.test1_data`");
  682. EXPECT_EQ (d1.test1_data.str64_data, "str64_data of class `test1` object `d1.test1_data`");
  683. ASSERT_TRUE (static_cast<bool>(d1.test1_data.u32_nullable));
  684. EXPECT_EQ (*d1.test1_data.u32_nullable, 32);
  685. ASSERT_TRUE (static_cast<bool>(d1.test1_data.u32_ptr_s));
  686. EXPECT_EQ (*d1.test1_data.u32_ptr_s, 789);
  687. EXPECT_FALSE(static_cast<bool>(d1.test1_data.u32_ptr_u));
  688. }
  689. {
  690. ASSERT_NE (bIt, base_vec.end());
  691. auto* base_ptr = bIt->get();
  692. ASSERT_TRUE(static_cast<bool>(base_ptr));
  693. auto* d2_ptr = dynamic_cast<derived2*>(base_ptr);
  694. ASSERT_TRUE(static_cast<bool>(d2_ptr));
  695. auto& d2 = *d2_ptr;
  696. ++bIt;
  697. EXPECT_EQ (d2.id, uuid("3d127db6-abb9-11e8-98d0-529269fb1459"));
  698. EXPECT_EQ (d2.derived2_id, uuid("3d127bcc-abb9-11e8-98d0-529269fb1459"));
  699. EXPECT_EQ (d2.name, "derived2");
  700. ASSERT_TRUE (static_cast<bool>(d2.test2_nullable));
  701. EXPECT_EQ (d2.test2_nullable->u8_data, 10);
  702. EXPECT_EQ (d2.test2_nullable->i8_data, 11);
  703. EXPECT_EQ (d2.test2_nullable->u16_data, 12);
  704. EXPECT_EQ (d2.test2_nullable->i16_data, 13);
  705. ASSERT_TRUE (static_cast<bool>(d2.test2_ptr_u));
  706. EXPECT_EQ (d2.test2_ptr_u->u8_data, 20);
  707. EXPECT_EQ (d2.test2_ptr_u->i8_data, 21);
  708. EXPECT_EQ (d2.test2_ptr_u->u16_data, 22);
  709. EXPECT_EQ (d2.test2_ptr_u->i16_data, 23);
  710. EXPECT_FALSE(static_cast<bool>(d2.test2_ptr_s));
  711. }
  712. {
  713. ASSERT_NE (bIt, base_vec.end());
  714. auto* base_ptr = bIt->get();
  715. ASSERT_TRUE(static_cast<bool>(base_ptr));
  716. auto* d3_ptr = dynamic_cast<derived3*>(base_ptr);
  717. ASSERT_TRUE(static_cast<bool>(d3_ptr));
  718. auto& d3 = *d3_ptr;
  719. ++bIt;
  720. EXPECT_EQ (d3.id, uuid("3d1288ce-abb9-11e8-98d0-529269fb1459"));
  721. EXPECT_EQ (d3.name, "derived3");
  722. EXPECT_EQ (d3.derived2_id, uuid("3d1287a2-abb9-11e8-98d0-529269fb1459"));
  723. EXPECT_FALSE(static_cast<bool>(d3.test2_nullable));
  724. EXPECT_FALSE(static_cast<bool>(d3.test2_ptr_u));
  725. EXPECT_FALSE(static_cast<bool>(d3.test2_ptr_s));
  726. EXPECT_EQ (d3.derived3_id, uuid("3d12866c-abb9-11e8-98d0-529269fb1459"));
  727. {
  728. auto it = d3.test3_list.begin();
  729. ASSERT_NE(it, d3.test3_list.end());
  730. EXPECT_EQ(it->id, uuid("3d1289f0-abb9-11e8-98d0-529269fb1459"));
  731. EXPECT_EQ(it->u32_data, 100);
  732. EXPECT_EQ(it->i32_data, 101);
  733. EXPECT_EQ(it->u64_data, 102);
  734. EXPECT_EQ(it->i64_data, 103);
  735. ++it;
  736. ASSERT_NE(it, d3.test3_list.end());
  737. EXPECT_EQ(it->id, uuid("3d128b26-abb9-11e8-98d0-529269fb1459"));
  738. EXPECT_EQ(it->u32_data, 110);
  739. EXPECT_EQ(it->i32_data, 111);
  740. EXPECT_EQ(it->u64_data, 112);
  741. EXPECT_EQ(it->i64_data, 113);
  742. ++it;
  743. EXPECT_EQ(it, d3.test3_list.end());
  744. }
  745. {
  746. auto it = d3.test3_vector.begin();
  747. ASSERT_NE(it, d3.test3_vector.end());
  748. EXPECT_EQ(it->id, uuid("3d128eb4-abb9-11e8-98d0-529269fb1459"));
  749. EXPECT_EQ(it->u32_data, 120);
  750. EXPECT_EQ(it->i32_data, 121);
  751. EXPECT_EQ(it->u64_data, 122);
  752. EXPECT_EQ(it->i64_data, 123);
  753. ++it;
  754. ASSERT_NE(it, d3.test3_vector.end());
  755. EXPECT_EQ(it->id, uuid("3d128ffe-abb9-11e8-98d0-529269fb1459"));
  756. EXPECT_EQ(it->u32_data, 130);
  757. EXPECT_EQ(it->i32_data, 131);
  758. EXPECT_EQ(it->u64_data, 132);
  759. EXPECT_EQ(it->i64_data, 133);
  760. ++it;
  761. ASSERT_NE(it, d3.test3_vector.end());
  762. EXPECT_EQ(it->id, uuid("3d129134-abb9-11e8-98d0-529269fb1459"));
  763. EXPECT_EQ(it->u32_data, 140);
  764. EXPECT_EQ(it->i32_data, 141);
  765. EXPECT_EQ(it->u64_data, 142);
  766. EXPECT_EQ(it->i64_data, 143);
  767. ++it;
  768. EXPECT_EQ(it, d3.test3_vector.end());
  769. }
  770. }
  771. EXPECT_EQ(bIt, base_vec.end());
  772. }
  773. TEST(CppHibernateTests, read_dummy_owner)
  774. {
  775. StrictMock<mariadb_mock> mock;
  776. expect_query(mock, "START TRANSACTION");
  777. expect_query(mock, "SELECT "
  778. "BinToUuid(`tbl_dummy_owner`.`tbl_dummy_owner_id`) "
  779. "FROM "
  780. "`tbl_dummy_owner` "
  781. "WHERE "
  782. "(`tbl_dummy_owner`.`tbl_dummy_owner_id`=UuidToBin('X00000000-0000-0000-0000-000000000001X')) ",
  783. result_used({
  784. { "00000000-0000-0000-0000-000000000001" },
  785. }));
  786. expect_query(mock, "SELECT "
  787. "BinToUuid(`tbl_dummy_id`.`tbl_dummy_id_id`), "
  788. "`tbl_dummy_id`.`data` "
  789. "FROM "
  790. "`tbl_dummy_id` WHERE (`tbl_dummy_id`.`tbl_dummy_owner_id_dummies`=UuidToBin('X00000000-0000-0000-0000-000000000001X')) "
  791. "ORDER BY "
  792. "`tbl_dummy_id`.`tbl_dummy_owner_index_dummies` ASC ",
  793. result_used({
  794. { "00000000-0000-0000-0001-000000000001", "123" },
  795. { "00000000-0000-0000-0001-000000000002", "456" },
  796. { "00000000-0000-0000-0001-000000000003", "789" },
  797. }));
  798. expect_query(mock, "COMMIT");
  799. EXPECT_CALL(
  800. mock,
  801. mysql_close(
  802. reinterpret_cast<MYSQL*>(0x1111)));
  803. EXPECT_CALL(
  804. mock,
  805. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  806. .Times(AnyNumber())
  807. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  808. dummy_owner d;
  809. d.id = uuid("00000000-0000-0000-0000-000000000001");
  810. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  811. auto context = make_context<mariadb_driver>(test_schema, connection);
  812. context.read(d);
  813. EXPECT_EQ(d.id, uuid("00000000-0000-0000-0000-000000000001"));
  814. ASSERT_EQ(d.dummies.size(), 3);
  815. EXPECT_EQ(d.dummies[0].data, 123);
  816. EXPECT_EQ(d.dummies[1].data, 456);
  817. EXPECT_EQ(d.dummies[2].data, 789);
  818. }
  819. TEST(CppHibernateTests, read_double_usage)
  820. {
  821. StrictMock<mariadb_mock> mock;
  822. expect_query(mock, "START TRANSACTION");
  823. expect_query(mock, "SELECT "
  824. "`tbl_double_usage`.`tbl_double_usage_id`, "
  825. "`T0`.`tbl_double_usage_item_id`, "
  826. "`T0`.`data` "
  827. "FROM "
  828. "`tbl_double_usage` "
  829. "LEFT JOIN "
  830. "`tbl_double_usage_item` AS `T0` ON `tbl_double_usage`.`tbl_double_usage_id`=`T0`.`tbl_double_usage_id_single_item` "
  831. "WHERE "
  832. "(`tbl_double_usage`.`tbl_double_usage_id`='X1X') ",
  833. result_used({
  834. { "1", "1001", "123" }
  835. }));
  836. expect_query(mock, "SELECT "
  837. "`tbl_double_usage_item`.`tbl_double_usage_item_id`, "
  838. "`tbl_double_usage_item`.`data` "
  839. "FROM "
  840. "`tbl_double_usage_item` "
  841. "WHERE "
  842. "(`tbl_double_usage_item`.`tbl_double_usage_id_multiple_items`='X1X') "
  843. "ORDER BY "
  844. "`tbl_double_usage_item`.`tbl_double_usage_index_multiple_items` ASC ",
  845. result_used({
  846. { "1002", "456" },
  847. { "1003", "789" }
  848. }));
  849. expect_query(mock, "COMMIT");
  850. EXPECT_CALL(
  851. mock,
  852. mysql_close(
  853. reinterpret_cast<MYSQL*>(0x1111)));
  854. EXPECT_CALL(
  855. mock,
  856. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  857. .Times(AnyNumber())
  858. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  859. double_usage d;
  860. d.id = 1;
  861. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  862. auto context = make_context<mariadb_driver>(test_schema, connection);
  863. context.read(d);
  864. EXPECT_EQ (d.id, 1);
  865. ASSERT_TRUE(d.single_item);
  866. ASSERT_EQ (d.multiple_items.size(), 2);
  867. EXPECT_EQ (d.single_item->id, 1001);
  868. EXPECT_EQ (d.single_item->data, 123);
  869. EXPECT_EQ (d.multiple_items[0].id, 1002);
  870. EXPECT_EQ (d.multiple_items[0].data, 456);
  871. EXPECT_EQ (d.multiple_items[1].id, 1003);
  872. EXPECT_EQ (d.multiple_items[1].data, 789);
  873. }
  874. TEST(CppHibernateTests, read_with_modifiers)
  875. {
  876. StrictMock<mariadb_mock> mock;
  877. expect_query(mock, "START TRANSACTION");
  878. expect_query(mock, "SELECT "
  879. "BinToUuid(`tbl_test1`.`tbl_test1_id`), "
  880. "`tbl_test1`.`str_data`, "
  881. "`tbl_test1`.`str64_data`, "
  882. "`tbl_test1`.`u32_nullable`, "
  883. "`tbl_test1`.`u32_ptr_u`, "
  884. "`tbl_test1`.`u32_ptr_s` "
  885. "FROM "
  886. "`tbl_test1` "
  887. "WHERE ("
  888. "`tbl_test1`.`tbl_test1_id`=UuidToBin('X3d1270dc-abb9-11e8-98d0-529269fb1459X')) "
  889. "ORDER_BY "
  890. "`tbl_test1`.`str_data` ASC, "
  891. "`tbl_test1`.`str64_data` DESC "
  892. "LIMIT 1 "
  893. "OFFSET 4",
  894. result_used({
  895. { "3d12697a-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `t1`", "str64_data of class `test1` object `t1`", nullptr, "123", "456" }
  896. }));
  897. expect_query(mock, "COMMIT");
  898. EXPECT_CALL(
  899. mock,
  900. mysql_close(
  901. reinterpret_cast<MYSQL*>(0x1111)));
  902. EXPECT_CALL(
  903. mock,
  904. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  905. .Times(AnyNumber())
  906. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  907. test1 t1;
  908. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  909. auto context = make_context<mariadb_driver>(test_schema, connection);
  910. constexpr decltype(auto) test1_key_field = test_schema.tables[0_c].fields[0_c];
  911. constexpr decltype(auto) test1_tmp_field_0 = test_schema.tables[0_c].fields[1_c];
  912. constexpr decltype(auto) test1_tmp_field_1 = test_schema.tables[0_c].fields[2_c];
  913. context.read(t1,
  914. where(equal(test1_key_field, "3d1270dc-abb9-11e8-98d0-529269fb1459")),
  915. limit(1_c),
  916. offset(4_c),
  917. order_by(
  918. ascending(test1_tmp_field_0),
  919. descending(test1_tmp_field_1)));
  920. EXPECT_EQ (t1.id, uuid("3d12697a-abb9-11e8-98d0-529269fb1459"));
  921. EXPECT_EQ (t1.str_data, "str_data of class `test1` object `t1`");
  922. EXPECT_EQ (t1.str64_data, "str64_data of class `test1` object `t1`");
  923. EXPECT_FALSE(static_cast<bool>(t1.u32_nullable));
  924. ASSERT_TRUE (static_cast<bool>(t1.u32_ptr_u));
  925. EXPECT_EQ (*t1.u32_ptr_u, 123);
  926. ASSERT_TRUE (static_cast<bool>(t1.u32_ptr_s));
  927. EXPECT_EQ (*t1.u32_ptr_s, 456);
  928. }