| 141 dbuClassAdd(address, Address, zip); |
141 dbuClassAdd(address, Address, zip); |
| 142 dbuClassAdd(address, Address, city); |
142 dbuClassAdd(address, Address, city); |
| 143 dbuClassAddObj(address, "country_id", offsetof(Address, country), country); |
143 dbuClassAddObj(address, "country_id", offsetof(Address, country), country); |
| 144 |
144 |
| 145 role = dbuRegisterClass(ctx, "role", Role, role_id); |
145 role = dbuRegisterClass(ctx, "role", Role, role_id); |
| |
146 dbuClassAdd(role, Role, person_id); |
| |
147 dbuClassAdd(role, Role, name); |
| 146 |
148 |
| 147 person = dbuRegisterClass(ctx, "person", Person, person_id); |
149 person = dbuRegisterClass(ctx, "person", Person, person_id); |
| 148 dbuClassAdd(person, Person, name); |
150 dbuClassAdd(person, Person, name); |
| 149 dbuClassAdd(person, Person, email); |
151 dbuClassAdd(person, Person, email); |
| 150 dbuClassAdd(person, Person, age); |
152 dbuClassAdd(person, Person, age); |
| 270 } |
272 } |
| 271 |
273 |
| 272 cxMempoolFree(mp); |
274 cxMempoolFree(mp); |
| 273 } |
275 } |
| 274 |
276 |
| 275 CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons) { |
277 CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons, bool verify_address) { |
| 276 CX_TEST_ASSERT(persons); |
278 CX_TEST_ASSERT(persons); |
| 277 CX_TEST_ASSERT(cxListSize(persons) == 2); |
279 CX_TEST_ASSERT(cxListSize(persons) == 2); |
| 278 |
280 |
| 279 Person *p0 = cxListAt(persons, 0); |
281 Person *p0 = cxListAt(persons, 0); |
| 280 Person *p1 = cxListAt(persons, 1); |
282 Person *p1 = cxListAt(persons, 1); |
| 289 CX_TEST_ASSERT(p1->age == 25); |
291 CX_TEST_ASSERT(p1->age == 25); |
| 290 CX_TEST_ASSERT(p0->iscustomer == 0); |
292 CX_TEST_ASSERT(p0->iscustomer == 0); |
| 291 CX_TEST_ASSERT(p1->iscustomer == 1); |
293 CX_TEST_ASSERT(p1->iscustomer == 1); |
| 292 CX_TEST_ASSERT(p0->hash == 123456789); |
294 CX_TEST_ASSERT(p0->hash == 123456789); |
| 293 CX_TEST_ASSERT(p1->hash == 987654321); |
295 CX_TEST_ASSERT(p1->hash == 987654321); |
| 294 |
296 |
| 295 CX_TEST_ASSERT(p0->address != NULL); |
297 if(verify_address) { |
| 296 CX_TEST_ASSERT(p1->address != NULL); |
298 CX_TEST_ASSERT(p0->address != NULL); |
| 297 |
299 CX_TEST_ASSERT(p1->address != NULL); |
| 298 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); |
300 |
| 299 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); |
301 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); |
| 300 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); |
302 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); |
| 301 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); |
303 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); |
| 302 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); |
304 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); |
| 303 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); |
305 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); |
| |
306 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); |
| |
307 } |
| 304 } |
308 } |
| 305 |
309 |
| 306 CX_TEST(testMultiTableQuery) { |
310 CX_TEST(testMultiTableQuery) { |
| 307 CxMempool *mp = cxMempoolCreateSimple(64); |
311 CxMempool *mp = cxMempoolCreateSimple(64); |
| 308 |
312 |
| 310 const char *sql1 = "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;"; |
314 const char *sql1 = "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;"; |
| 311 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
315 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 312 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
316 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 313 CxList *persons = dbuObjectBuilderGetList(builder); |
317 CxList *persons = dbuObjectBuilderGetList(builder); |
| 314 |
318 |
| 315 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
319 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); |
| 316 |
320 |
| 317 dbuObjectBuilderDestroy(builder); |
321 dbuObjectBuilderDestroy(builder); |
| 318 } |
322 } |
| 319 |
323 |
| 320 cxMempoolFree(mp); |
324 cxMempoolFree(mp); |
| 327 const char *sql1 = "select p.*, NULL as [__address], a.* from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;"; |
331 const char *sql1 = "select p.*, NULL as [__address], a.* from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;"; |
| 328 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
332 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 329 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
333 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 330 CxList *persons = dbuObjectBuilderGetList(builder); |
334 CxList *persons = dbuObjectBuilderGetList(builder); |
| 331 |
335 |
| 332 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
336 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); |
| 333 |
337 |
| 334 dbuObjectBuilderDestroy(builder); |
338 dbuObjectBuilderDestroy(builder); |
| 335 } |
339 } |
| 336 |
340 |
| 337 cxMempoolFree(mp); |
341 cxMempoolFree(mp); |
| 359 "order by p.person_id;"; |
363 "order by p.person_id;"; |
| 360 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
364 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
| 361 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
365 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 362 CxList *persons = dbuObjectBuilderGetList(builder); |
366 CxList *persons = dbuObjectBuilderGetList(builder); |
| 363 |
367 |
| 364 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
368 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); |
| 365 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); |
369 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); |
| 366 |
370 |
| 367 dbuObjectBuilderDestroy(builder); |
371 dbuObjectBuilderDestroy(builder); |
| 368 } |
372 } |
| 369 |
373 |
| 382 "order by p.person_id;"; |
386 "order by p.person_id;"; |
| 383 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
387 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
| 384 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
388 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 385 CxList *persons = dbuObjectBuilderGetList(builder); |
389 CxList *persons = dbuObjectBuilderGetList(builder); |
| 386 |
390 |
| 387 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
391 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); |
| 388 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); |
392 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); |
| 389 |
393 |
| 390 dbuObjectBuilderDestroy(builder); |
394 dbuObjectBuilderDestroy(builder); |
| 391 } |
395 } |
| 392 |
396 |
| 393 cxMempoolFree(mp); |
397 cxMempoolFree(mp); |
| 394 } |
398 } |
| |
399 |
| |
400 CX_TEST_SUBROUTINE(verifyPersonRoles, CxList *persons) { |
| |
401 Person *p0 = cxListAt(persons, 0); |
| |
402 Person *p1 = cxListAt(persons, 1); |
| |
403 CX_TEST_ASSERT(p0 && p1); |
| |
404 |
| |
405 CX_TEST_ASSERT(cxListSize(p0->roles) == 3); |
| |
406 CX_TEST_ASSERT(cxListSize(p1->roles) == 1); |
| |
407 |
| |
408 Role *r0 = cxListAt(p0->roles, 0); |
| |
409 Role *r1 = cxListAt(p0->roles, 1); |
| |
410 Role *r2 = cxListAt(p0->roles, 2); |
| |
411 |
| |
412 Role *p1_r0 = cxListAt(p1->roles, 0); |
| |
413 |
| |
414 CX_TEST_ASSERT(!cx_strcmp(r0->name, "finance")); |
| |
415 CX_TEST_ASSERT(!cx_strcmp(r1->name, "dev")); |
| |
416 CX_TEST_ASSERT(!cx_strcmp(r2->name, "manager")); |
| |
417 |
| |
418 CX_TEST_ASSERT(!cx_strcmp(p1_r0->name, "extern")); |
| |
419 } |
| |
420 |
| |
421 CX_TEST(testQuerySubListDense1) { |
| |
422 CxMempool *mp = cxMempoolCreateSimple(64); |
| |
423 |
| |
424 CX_TEST_DO { |
| |
425 const char *sql1 = |
| |
426 "select p.*, r.role_id as [__role__role_id], r.person_id, r.name from Person p inner join Role r on p.person_id = r.person_id order by p.person_id;"; |
| |
427 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| |
428 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| |
429 dbuObjectBuilderSetDenseResult(builder, true); |
| |
430 CxList *persons = dbuObjectBuilderGetList(builder); |
| |
431 |
| |
432 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, false); |
| |
433 CX_TEST_CALL_SUBROUTINE(verifyPersonRoles, persons); |
| |
434 |
| |
435 dbuObjectBuilderDestroy(builder); |
| |
436 } |
| |
437 |
| |
438 cxMempoolFree(mp); |
| |
439 } |