transactd 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
  3. data/bin/common/tdclc_64_3_6.dll +0 -0
  4. data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
  5. data/build/swig/tdcl.i +5 -0
  6. data/build/tdclc/tdclc.cbproj +1 -1
  7. data/build/tdclc/tdclc.rc +4 -4
  8. data/build/tdclcpp/tdclcpp.rc +4 -4
  9. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  10. data/build/tdclrb/tdclrb.rc +4 -4
  11. data/source/bzs/db/engine/mysql/database.cpp +210 -184
  12. data/source/bzs/db/engine/mysql/database.h +276 -105
  13. data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
  14. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
  15. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
  16. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  17. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  18. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
  19. data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
  20. data/source/bzs/db/protocol/tdap/client/database.h +6 -1
  21. data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
  22. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
  23. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  24. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
  25. data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
  26. data/source/bzs/db/protocol/tdap/client/field.h +3 -1
  27. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
  28. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
  30. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
  31. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
  32. data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
  33. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
  34. data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
  35. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
  36. data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
  38. data/source/bzs/db/protocol/tdap/client/request.h +46 -38
  39. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
  40. data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
  41. data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
  42. data/source/bzs/db/protocol/tdap/client/table.h +4 -1
  43. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
  44. data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
  45. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
  50. data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
  52. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  53. data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
  54. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
  55. data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
  56. data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
  57. data/source/bzs/example/ormap_c.cpp +2 -2
  58. data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
  59. data/source/bzs/test/tdclatl/test_v3.js +48 -1
  60. data/source/bzs/test/tdclphp/bench.php +89 -76
  61. data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
  62. data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
  63. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
  64. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
  65. data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
  66. data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
  67. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
  68. data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
  69. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
  70. data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
  71. data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
  72. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
  73. data/source/bzs/test/trdclengn/testField.h +522 -1
  74. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
  75. data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
  76. data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
  77. data/source/global/tdclatl/RecordsetQuery.h +1 -1
  78. data/source/global/tdclatl/Table.cpp +17 -0
  79. data/source/global/tdclatl/Table.h +3 -1
  80. data/source/global/tdclatl/tdclatl.idl +7 -2
  81. data/transactd.gemspec +1 -1
  82. metadata +7 -5
  83. data/bin/common/tdclc_64_3_5.dll +0 -0
@@ -21,6 +21,7 @@
21
21
  #include "testbase.h"
22
22
  #include <bzs/db/protocol/tdap/btrDate.h>
23
23
  #include <bzs/db/protocol/tdap/client/connMgr.h>
24
+ #include <bzs/db/protocol/tdap/client/stringConverter.h>
24
25
  #include <limits.h>
25
26
  #include <stdlib.h>
26
27
 
@@ -494,6 +495,13 @@ short createTestUsers(database* db)
494
495
  fd->setNullable(true);
495
496
  fd = insertField(def, tableid, ++fieldnum, _T("name"), ft_myvarchar, 151);
496
497
  fd->setLenByCharnum(50);
498
+ fd = insertField(def, tableid, ++fieldnum, _T("blob"), ft_myblob, 9);
499
+ fd->setCharsetIndex(CHARSET_BIN);
500
+ fd->setNullable(true);
501
+
502
+ fd = insertField(def, tableid, ++fieldnum, _T("utime"), ft_mytimestamp, 7);
503
+ fd->setDefaultValue(DFV_TIMESTAMP_DEFAULT);
504
+ fd->setTimeStampOnUpdate(true);
497
505
 
498
506
  keydef* kd = insertKey(def, tableid, 0);
499
507
  kd->segments[0].fieldNum = 0;
@@ -3384,7 +3392,7 @@ void testConnMgr()
3384
3392
  {
3385
3393
  const connMgr::records& recs = mgr->slaveHosts();
3386
3394
  BOOST_CHECK(mgr->stat() == 0);
3387
- for (int i=0;i<recs.size();++i)
3395
+ for (int i=0;i<(int)recs.size();++i)
3388
3396
  {
3389
3397
  _TCHAR tmp[1024];
3390
3398
  recs[i].value(tmp, 1024);
@@ -3419,6 +3427,519 @@ void testCreateInfo()
3419
3427
  BOOST_CHECK(db->stat() == 0);
3420
3428
  }
3421
3429
 
3430
+ void testAlias()
3431
+ {
3432
+ try
3433
+ {
3434
+ database_ptr db = createDatabaseObject();
3435
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3436
+ table_ptr tb = openTable(db, _T("users"));
3437
+ tb->setAlias(_T("name"), _T("name_alias"));
3438
+ tb->setAlias(_T("name"), _T("name_alias2"));
3439
+ tb->setKeyNum(0);
3440
+ tb->seekFirst();
3441
+ BOOST_CHECK(tb->stat() == 0);
3442
+ // access original
3443
+ BOOST_CHECK(_tstring(tb->getFVstr(_T("name"))) == _tstring(_T("John")));
3444
+ // access alias
3445
+ BOOST_CHECK(_tstring(tb->getFVstr(_T("name_alias"))) == _tstring(_T("John")));
3446
+ BOOST_CHECK(_tstring(tb->getFVstr(_T("name_alias2"))) == _tstring(_T("John")));
3447
+ //query
3448
+ query q;
3449
+ q.select(_T("name_alias2_"));
3450
+ tb->setQuery(&q);
3451
+ BOOST_CHECK(tb->stat() != 0);
3452
+
3453
+ q.reset().select(_T("name_alias2"));
3454
+ tb->setQuery(&q);
3455
+ BOOST_CHECK(tb->stat() == 0);
3456
+ tb->clearBuffer();
3457
+ tb->find();
3458
+ if (tb->stat() == 0)
3459
+ BOOST_CHECK(_tstring(tb->getFVstr(_T("name_alias2"))) == _tstring(_T("John")));
3460
+ while (tb->stat() == 0)
3461
+ {
3462
+ BOOST_CHECK(_tstring(tb->getFVstr(_T("name"))) != _tstring(_T("")));
3463
+ tb->findNext();
3464
+ }
3465
+ }
3466
+ catch (bzs::rtl::exception& e)
3467
+ {
3468
+ BOOST_CHECK(false);
3469
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
3470
+ }
3471
+ }
3472
+
3473
+ void testAutoincWithBlob()
3474
+ {
3475
+ try
3476
+ {
3477
+ database_ptr db = createDatabaseObject();
3478
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3479
+ table_ptr tb = openTable(db, _T("users"));
3480
+
3481
+ tb->setKeyNum(0);
3482
+ tb->clearBuffer();
3483
+ tb->setFV(_T("blob"), "abc");
3484
+ tb->insert();
3485
+ BOOST_CHECK(tb->stat() == 0);
3486
+ BOOST_CHECK(tb->getFVint(_T("id")) > 0);
3487
+ BOOST_CHECK(strcmp(tb->getFVAstr(_T("blob")), "abc") == 0);
3488
+
3489
+ tb->clearBuffer();
3490
+ tb->setFVNull(_T("blob"), true);
3491
+ tb->insert();
3492
+ BOOST_CHECK(tb->stat() == 0);
3493
+ BOOST_CHECK(tb->getFVint(_T("id")) > 0);
3494
+ BOOST_CHECK(tb->getFVNull(_T("blob")) == true);
3495
+
3496
+ }
3497
+ catch (bzs::rtl::exception& e)
3498
+ {
3499
+ BOOST_CHECK(false);
3500
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
3501
+ }
3502
+ }
3503
+
3504
+ void testBinaryFieldConvert()
3505
+ {
3506
+ // Ansi
3507
+ stringConverter cv(CP_UTF8, CP_UTF8);
3508
+ //Unicode --> utf8
3509
+ bool ret = cv.isNeedConvert<WCHAR, char>() == true;
3510
+ BOOST_CHECK(ret);
3511
+
3512
+ //utf8 --> utf8
3513
+ ret = cv.isNeedConvert<char, char>() == false;
3514
+ BOOST_CHECK(ret);
3515
+
3516
+ //cp932 --> utf8
3517
+ cv.setCodePage(932);
3518
+ ret = cv.isNeedConvert<char, char>() == true;
3519
+ BOOST_CHECK(ret);
3520
+
3521
+ //binnary --> utf8
3522
+ cv.setCodePage(0);
3523
+ ret = cv.isNeedConvert<char, char>() == false;
3524
+ BOOST_CHECK(ret);
3525
+
3526
+ //binnary ? Unicode --> utf8, Unicode fields are force convert
3527
+ ret = cv.isNeedConvert<WCHAR, char>() == true;
3528
+ BOOST_CHECK(ret);
3529
+
3530
+ // Unicode
3531
+ // Unicode --> Unicode
3532
+ cv.setCodePage(CP_UTF8);
3533
+ ret = cv.isNeedConvert<WCHAR, WCHAR>() == false;
3534
+ BOOST_CHECK(ret);
3535
+
3536
+ //utf8 --> Unicode
3537
+ ret = cv.isNeedConvert<char, WCHAR>() == true;
3538
+ BOOST_CHECK(ret);
3539
+
3540
+ //cp932 --> Unicode
3541
+ cv.setCodePage(932);
3542
+ ret = cv.isNeedConvert<char, WCHAR>() == true;
3543
+ BOOST_CHECK(ret);
3544
+
3545
+ //binnary --> Unicode
3546
+ cv.setCodePage(0);
3547
+ ret = cv.isNeedConvert<char, WCHAR>() == false;
3548
+ BOOST_CHECK(ret);
3549
+
3550
+ //binnary ? Unicode --> Unicode,
3551
+ ret = cv.isNeedConvert<WCHAR, WCHAR>() == false;
3552
+ BOOST_CHECK(ret);
3553
+
3554
+ }
3555
+
3556
+ void testTableInvalidRecord()
3557
+ {
3558
+ database_ptr db = createDatabaseObject();
3559
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3560
+ table_ptr tb = openTable(db, _T("users"));
3561
+ query q;
3562
+ q.in(1,2,-1,3,4,50000);
3563
+ tb->clearBuffer();
3564
+ tb->setKeyNum(0);
3565
+ tb->setQuery(&q);
3566
+ tb->find();
3567
+ int i = 0;
3568
+ int fdi = 0;
3569
+ while (tb->stat()==0 || tb->stat() == STATUS_NOT_FOUND_TI)
3570
+ {
3571
+ if (i == 2 || i == 5)
3572
+ {
3573
+ BOOST_CHECK(tb->fields().isInvalidRecord() == true);
3574
+ BOOST_CHECK(tb->fields()[fdi].isNull() == true);
3575
+ }
3576
+ else
3577
+ {
3578
+ BOOST_CHECK(tb->fields().isInvalidRecord() == false);
3579
+ BOOST_CHECK(tb->fields()[fdi].isNull() == false);
3580
+ }
3581
+ //printf("index %d = %s\n", i, tb->fields()[fdi].isNull() ? "NULL" : "NOT NULL");
3582
+ tb->findNext();
3583
+ ++i;
3584
+ }
3585
+ BOOST_CHECK(tb->fields().isInvalidRecord() == true);
3586
+ tb->clearBuffer();
3587
+ BOOST_CHECK(tb->fields().isInvalidRecord() == false);
3588
+
3589
+ activeTable at(db, _T("users"));
3590
+ recordset rs;
3591
+ at.index(0).read(rs, q);
3592
+ BOOST_CHECK(rs.size() == 6);
3593
+
3594
+ for (int i = 0; i < (int)rs.size(); ++i)
3595
+ {
3596
+ if (i == 2 || i == 5)
3597
+ {
3598
+ BOOST_CHECK(rs[i].isInvalidRecord() == true);
3599
+ BOOST_CHECK(rs[i][fdi].isNull() == true);
3600
+ }
3601
+ else
3602
+ {
3603
+ BOOST_CHECK(rs[i].isInvalidRecord() == false);
3604
+ BOOST_CHECK(rs[i][fdi].isNull() == false);
3605
+ }
3606
+ }
3607
+
3608
+ }
3609
+
3610
+ bool checkTimeStampFormat(database_ptr db, const char* funcName)
3611
+ {
3612
+ btrVersions versions;
3613
+ db->getBtrVersion(&versions);
3614
+ if(versions.versions[VER_IDX_DB_SERVER].isFullLegacyTimeFormat())
3615
+ {
3616
+ printf("[Warning] Server not support timstamp with microseconds.(%s is passed)\n", funcName);
3617
+ return false;
3618
+ }
3619
+ return true;
3620
+ }
3621
+
3622
+ void test_UTCC()
3623
+ {
3624
+ database_ptr db = createDatabaseObject();
3625
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3626
+ if (checkTimeStampFormat(db, "test_UTCC") == false)
3627
+ return;
3628
+ table_ptr tb = openTable(db, _T("users"));
3629
+ table_ptr tb2 = openTable(db, _T("users"));
3630
+ // test in changeCurrentCc or changeCurrentNcc
3631
+
3632
+ db->beginTrn();
3633
+ tb->seekFirst();
3634
+ BOOST_CHECK(tb->stat() == 0);
3635
+ tb2->seekFirst();
3636
+ //Sleep(1000);
3637
+ BOOST_CHECK(tb2->stat() == 0);
3638
+ tb->setFV(_T("name"), _T("John"));
3639
+ tb->update();
3640
+ BOOST_CHECK(tb->stat() == 0);
3641
+ tb2->setFV(_T("name"), _T("mike"));
3642
+ tb2->setUpdateConflictCheck(true);
3643
+ tb2->update(nstable::changeCurrentCc);
3644
+ BOOST_CHECK(tb2->stat() == STATUS_CHANGE_CONFLICT);
3645
+ db->abortTrn();
3646
+
3647
+ db->beginTrn();
3648
+ tb->seekFirst();
3649
+ BOOST_CHECK(tb->stat() == 0);
3650
+ tb2->seekFirst();
3651
+ BOOST_CHECK(tb2->stat() == 0);
3652
+ tb->setFV(_T("name"), _T("John"));
3653
+ tb->update();
3654
+ BOOST_CHECK(tb->stat() == 0);
3655
+ tb2->setFV(_T("name"), _T("mike"));
3656
+ tb2->setUpdateConflictCheck(false);
3657
+ tb2->update(nstable::changeCurrentCc);
3658
+ BOOST_CHECK(tb2->stat() == 0);
3659
+ db->abortTrn();
3660
+
3661
+ db->beginTrn();
3662
+ tb->seekFirst();
3663
+ BOOST_CHECK(tb->stat() == 0);
3664
+ tb2->seekFirst();
3665
+ //Sleep(1000);
3666
+ BOOST_CHECK(tb2->stat() == 0);
3667
+ tb->setFV(_T("name"), _T("John"));
3668
+ tb->update();
3669
+ BOOST_CHECK(tb->stat() == 0);
3670
+ tb2->setFV(_T("name"), _T("mike"));
3671
+ // test in changeInKey
3672
+ tb2->setUpdateConflictCheck(true);
3673
+ tb2->update(nstable::changeInKey);
3674
+ BOOST_CHECK(tb2->stat() == STATUS_CHANGE_CONFLICT);
3675
+ db->abortTrn();
3676
+
3677
+ db->beginTrn();
3678
+ tb->seekFirst();
3679
+ BOOST_CHECK(tb->stat() == 0);
3680
+ tb2->seekFirst();
3681
+ BOOST_CHECK(tb2->stat() == 0);
3682
+ tb->setFV(_T("name"), _T("John"));
3683
+ tb->update();
3684
+ BOOST_CHECK(tb->stat() == 0);
3685
+ tb2->setFV(_T("name"), _T("mike"));
3686
+ tb2->setUpdateConflictCheck(false);
3687
+ tb2->update(nstable::changeInKey);
3688
+ BOOST_CHECK(tb2->stat() == 0);
3689
+ db->abortTrn();
3690
+ }
3691
+
3692
+ void test_UTCC_delete()
3693
+ {
3694
+ database_ptr db = createDatabaseObject();
3695
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3696
+ if (checkTimeStampFormat(db, "test_UTCC_delete") == false)
3697
+ return;
3698
+ table_ptr tb = openTable(db, _T("users"));
3699
+ table_ptr tb2 = openTable(db, _T("users"));
3700
+ // test in changeCurrentCc or changeCurrentNcc
3701
+
3702
+ db->beginTrn();
3703
+ tb->seekFirst();
3704
+ BOOST_CHECK(tb->stat() == 0);
3705
+ tb2->seekFirst();
3706
+ //Sleep(1000);
3707
+ BOOST_CHECK(tb2->stat() == 0);
3708
+ tb->setFV(_T("name"), _T("John"));
3709
+ tb->update();
3710
+ BOOST_CHECK(tb->stat() == 0);
3711
+ tb2->setUpdateConflictCheck(true);
3712
+ tb2->del(false);
3713
+ BOOST_CHECK(tb2->stat() == STATUS_CHANGE_CONFLICT);
3714
+ db->abortTrn();
3715
+
3716
+ db->beginTrn();
3717
+ tb->seekFirst();
3718
+ BOOST_CHECK(tb->stat() == 0);
3719
+ tb2->seekFirst();
3720
+ BOOST_CHECK(tb2->stat() == 0);
3721
+ tb->setFV(_T("name"), _T("John"));
3722
+ tb->update();
3723
+ BOOST_CHECK(tb->stat() == 0);
3724
+ tb2->setUpdateConflictCheck(false);
3725
+ tb2->del(false);
3726
+ BOOST_CHECK(tb2->stat() == 0);
3727
+ db->abortTrn();
3728
+
3729
+ db->beginTrn();
3730
+ tb->seekFirst();
3731
+ BOOST_CHECK(tb->stat() == 0);
3732
+ tb2->seekFirst();
3733
+ //Sleep(1000);
3734
+ BOOST_CHECK(tb2->stat() == 0);
3735
+ tb->setFV(_T("name"), _T("John"));
3736
+ tb->update();
3737
+ BOOST_CHECK(tb->stat() == 0);
3738
+ // test in changeInKey
3739
+ tb2->setUpdateConflictCheck(true);
3740
+ tb2->del(true);
3741
+ BOOST_CHECK(tb2->stat() == STATUS_CHANGE_CONFLICT);
3742
+ db->abortTrn();
3743
+
3744
+ db->beginTrn();
3745
+ tb->seekFirst();
3746
+ BOOST_CHECK(tb->stat() == 0);
3747
+ tb2->seekFirst();
3748
+ BOOST_CHECK(tb2->stat() == 0);
3749
+ tb->setFV(_T("name"), _T("John"));
3750
+ tb->update();
3751
+ BOOST_CHECK(tb->stat() == 0);
3752
+ tb2->setUpdateConflictCheck(false);
3753
+ tb2->del(true);
3754
+ BOOST_CHECK(tb2->stat() == 0);
3755
+ db->abortTrn();
3756
+ }
3757
+
3758
+
3759
+ void test_UTCC_wt()
3760
+ {
3761
+ database_ptr db = createDatabaseObject();
3762
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3763
+ if (checkTimeStampFormat(db, "test_UTCC_wt") == false)
3764
+ return;
3765
+ activeTable at(db, _T("users"));
3766
+ activeTable at2(db, _T("users"));
3767
+ writableRecord& wr = at.getWritableRecord();
3768
+ writableRecord& wr2 = at2.getWritableRecord();
3769
+
3770
+ db->beginTrn();
3771
+ wr[_T("id")] = 1;
3772
+ bool ret = wr.read();
3773
+ BOOST_CHECK(ret);
3774
+ wr2[_T("id")] = 1;
3775
+ bool ret2 = wr2.read();
3776
+ BOOST_CHECK(ret2);
3777
+ wr[_T("name")] = _T("John");
3778
+ wr.update();
3779
+
3780
+ wr2[_T("name")] = _T("mike");
3781
+ at2.table()->setUpdateConflictCheck(true);
3782
+ try
3783
+ {
3784
+ wr2.update(true, true);
3785
+ BOOST_CHECK(false);
3786
+ }
3787
+ catch(bzs::rtl::exception& e)
3788
+ {
3789
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3790
+ }
3791
+ try
3792
+ {
3793
+ wr2.update();
3794
+ BOOST_CHECK(false);
3795
+ }
3796
+ catch(bzs::rtl::exception& e)
3797
+ {
3798
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3799
+ }
3800
+ db->abortTrn();
3801
+
3802
+ db->beginTrn();
3803
+ wr[_T("id")] = 1;
3804
+ ret = wr.read();
3805
+ BOOST_CHECK(ret);
3806
+ wr2[_T("id")] = 1;
3807
+ ret2 = wr2.read();
3808
+ BOOST_CHECK(ret2);
3809
+ wr[_T("name")] = _T("John");
3810
+ wr.update();
3811
+
3812
+ wr2[_T("name")] = _T("mike");
3813
+ at2.table()->setUpdateConflictCheck(false);
3814
+ try
3815
+ {
3816
+ wr2.update();
3817
+ BOOST_CHECK(true);
3818
+ }
3819
+ catch(bzs::rtl::exception& e)
3820
+ {
3821
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3822
+ }
3823
+ db->abortTrn();
3824
+
3825
+
3826
+ }
3827
+
3828
+ void test_UTCC_wt_save()
3829
+ {
3830
+ database_ptr db = createDatabaseObject();
3831
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3832
+ if (checkTimeStampFormat(db, "test_UTCC_wt_save") == false)
3833
+ return;
3834
+ activeTable at(db, _T("users"));
3835
+ activeTable at2(db, _T("users"));
3836
+ writableRecord& wr = at.getWritableRecord();
3837
+ writableRecord& wr2 = at2.getWritableRecord();
3838
+
3839
+ db->beginTrn();
3840
+ wr[_T("id")] = 1;
3841
+ bool ret = wr.read();
3842
+ BOOST_CHECK(ret);
3843
+ wr2[_T("id")] = 1;
3844
+ bool ret2 = wr2.read();
3845
+ BOOST_CHECK(ret2);
3846
+ wr[_T("name")] = _T("John");
3847
+ wr.save();
3848
+
3849
+ wr2[_T("name")] = _T("mike");
3850
+ at2.table()->setUpdateConflictCheck(true);
3851
+ try
3852
+ {
3853
+ wr2.save();
3854
+ BOOST_CHECK(false);
3855
+ }
3856
+ catch(bzs::rtl::exception& e)
3857
+ {
3858
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3859
+ }
3860
+
3861
+ db->abortTrn();
3862
+
3863
+ db->beginTrn();
3864
+ wr[_T("id")] = 1;
3865
+ ret = wr.read();
3866
+ BOOST_CHECK(ret);
3867
+ wr2[_T("id")] = 1;
3868
+ ret2 = wr2.read();
3869
+ BOOST_CHECK(ret2);
3870
+ wr[_T("name")] = _T("John");
3871
+ wr.save();
3872
+
3873
+ wr2[_T("name")] = _T("mike");
3874
+ at2.table()->setUpdateConflictCheck(false);
3875
+ try
3876
+ {
3877
+ wr2.save();
3878
+ BOOST_CHECK(true);
3879
+ }
3880
+ catch(bzs::rtl::exception& e)
3881
+ {
3882
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3883
+ }
3884
+ db->abortTrn();
3885
+
3886
+
3887
+ }
3888
+
3889
+ void test_UTCC_wt_delete()
3890
+ {
3891
+ database_ptr db = createDatabaseObject();
3892
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF);
3893
+ if (checkTimeStampFormat(db, "test_UTCC_wt_delete") == false)
3894
+ return;
3895
+ activeTable at(db, _T("users"));
3896
+ activeTable at2(db, _T("users"));
3897
+ writableRecord& wr = at.getWritableRecord();
3898
+ writableRecord& wr2 = at2.getWritableRecord();
3899
+
3900
+ db->beginTrn();
3901
+ wr[_T("id")] = 1;
3902
+ bool ret = wr.read();
3903
+ BOOST_CHECK(ret);
3904
+ wr2[_T("id")] = 1;
3905
+ bool ret2 = wr2.read();
3906
+ BOOST_CHECK(ret2);
3907
+ wr[_T("name")] = _T("John");
3908
+ wr.update();
3909
+ at2.table()->setUpdateConflictCheck(true);
3910
+ try
3911
+ {
3912
+ wr2.del();
3913
+ BOOST_CHECK(false);
3914
+ }
3915
+ catch(bzs::rtl::exception& e)
3916
+ {
3917
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3918
+ }
3919
+ db->abortTrn();
3920
+
3921
+ db->beginTrn();
3922
+ wr[_T("id")] = 1;
3923
+ ret = wr.read();
3924
+ BOOST_CHECK(ret);
3925
+ wr2[_T("id")] = 1;
3926
+ ret2 = wr2.read();
3927
+ BOOST_CHECK(ret2);
3928
+ wr[_T("name")] = _T("John");
3929
+ wr.update();
3930
+ at2.table()->setUpdateConflictCheck(false);
3931
+ try
3932
+ {
3933
+ wr2.del();
3934
+ BOOST_CHECK(true);
3935
+ }
3936
+ catch(bzs::rtl::exception& e)
3937
+ {
3938
+ BOOST_CHECK(*bzs::rtl::getCode(e) == STATUS_CHANGE_CONFLICT);
3939
+ }
3940
+ db->abortTrn();
3941
+ }
3942
+
3422
3943
  #pragma warning(default : 4996)
3423
3944
 
3424
3945
  #endif // BZS_TEST_TRDCLENGN_TESTFIELD_H
@@ -218,7 +218,7 @@ void testFielddefs(database* db)
218
218
  BOOST_CHECK_MESSAGE(fd->nullbytes() == 2, "Invalid nullbytes = " << (int)fd->nullbytes());
219
219
  //fielddefs copy test
220
220
  fielddefs& fds = *fielddefs::create();
221
- fds.addAllFileds(tb->tableDef());
221
+ fds.addAllFields(tb->tableDef());
222
222
  fd = &fds[1];
223
223
  BOOST_CHECK_MESSAGE(fd->nullbit() == 0, "Invalid nullbit = " << (int)fd->nullbit());
224
224
  BOOST_CHECK_MESSAGE(fd->nullbytes() == 2, "Invalid nullbytes = " << (int)fd->nullbytes());
@@ -1066,6 +1066,42 @@ BOOST_AUTO_TEST_CASE(createInfo)
1066
1066
  }
1067
1067
  BOOST_AUTO_TEST_SUITE_END()
1068
1068
 
1069
+ BOOST_AUTO_TEST_SUITE(tableAlias)
1070
+ BOOST_AUTO_TEST_CASE(tableAlias)
1071
+ {
1072
+ testAlias();
1073
+ testAutoincWithBlob();
1074
+ }
1075
+
1076
+ BOOST_AUTO_TEST_SUITE_END()
1077
+
1078
+ BOOST_AUTO_TEST_SUITE(binaryFieldConvert)
1079
+ BOOST_AUTO_TEST_CASE(binaryFieldConvert)
1080
+ {
1081
+ testBinaryFieldConvert();
1082
+ }
1069
1083
 
1084
+ BOOST_AUTO_TEST_SUITE_END()
1085
+
1086
+ BOOST_AUTO_TEST_SUITE(table_in)
1087
+ BOOST_AUTO_TEST_CASE(table_in_invalid)
1088
+ {
1089
+ testTableInvalidRecord();
1090
+ }
1091
+
1092
+ BOOST_AUTO_TEST_SUITE_END()
1093
+
1094
+ BOOST_AUTO_TEST_SUITE(table_utcc)
1095
+ BOOST_AUTO_TEST_CASE(table_utcc1)
1096
+ {
1097
+ test_UTCC();
1098
+ test_UTCC_delete();
1099
+ test_UTCC_wt();
1100
+ test_UTCC_wt_save();
1101
+ test_UTCC_wt_delete();
1102
+ }
1103
+
1104
+ BOOST_AUTO_TEST_SUITE_END()
1105
+
1070
1106
 
1071
1107
  // ------------------------------------------------------------------------
@@ -139,11 +139,12 @@ void testClone(database* db)
139
139
  db->close();
140
140
  BOOST_CHECK_MESSAGE(db->stat() == 0, "db close stat = " << db->stat());
141
141
  table* tb = db2->openTable(_T("user"), TD_OPEN_NORMAL);
142
- BOOST_CHECK_MESSAGE(0 == db2->stat(), "openTable" << db2->stat());
142
+ BOOST_CHECK_MESSAGE(0 == db2->stat(), "openTable " << db2->stat());
143
143
  if (db2)
144
144
  db2->release();
145
145
  bool ret = nsdatabase::testTablePtr(tb);
146
146
  BOOST_CHECK_MESSAGE(ret == true, "testTablePtr");
147
+
147
148
  tb->release();
148
149
 
149
150
  ret = nsdatabase::testTablePtr(tb);
@@ -490,20 +491,24 @@ void testFindIn(database* db)
490
491
  BOOST_CHECK_MESSAGE(tb->getFVint(fdi_id) == 10, "find in 10");
491
492
  tb->findNext();
492
493
  BOOST_CHECK_MESSAGE(tb->stat() == 4, "find in 300000 stat =" << tb->stat());
494
+ BOOST_CHECK(tb->fields().isInvalidRecord() == true);
495
+
493
496
 
494
497
  _TCHAR msg[1024];
495
498
  tb->keyValueDescription(msg, 1024);
496
499
  int comp = _tcscmp(_T("table:user\nstat:4\nid = 300000\n"), msg);
497
- BOOST_CHECK_MESSAGE(comp == 0, "find in keyValueDescription");
500
+ BOOST_CHECK_MESSAGE(comp == 0, "find in keyValueDescription" );
501
+
498
502
 
499
503
  tb->findNext();
500
504
  BOOST_CHECK_MESSAGE(tb->getFVint(fdi_id) == 50, "find in 50");
501
505
  tb->findNext();
502
506
  BOOST_CHECK_MESSAGE(tb->stat() == 4, "find in -1");
507
+ BOOST_CHECK(tb->fields().isInvalidRecord() == true);
503
508
 
504
509
  tb->keyValueDescription(msg, 1024);
505
510
  comp = _tcscmp(_T("table:user\nstat:4\nid = -1\n"), msg);
506
- BOOST_CHECK_MESSAGE(comp == 0, "find in keyValueDescription");
511
+ BOOST_CHECK_MESSAGE(comp == 0, "find in keyValueDescription" );
507
512
 
508
513
  tb->findNext();
509
514
  BOOST_CHECK_MESSAGE(tb->getFVint(fdi_id) == 80, "find in 80");
@@ -5226,6 +5231,56 @@ void testBinaryField()
5226
5231
  }
5227
5232
  }
5228
5233
 
5234
+ void testBinaryFieldSchame()
5235
+ {
5236
+ database_ptr db = createDatabaseObject();
5237
+ connectParams param(PROTOCOL, HOSTNAME, _T("querytest"),
5238
+ TRANSACTD_SCHEMANAME, g_userName, g_password);
5239
+ param.setMode(TD_OPEN_NORMAL);
5240
+ //prebuiltData(db.get(), param);
5241
+ database::setCompatibleMode(database::CMP_MODE_OLD_ALL);
5242
+ openDatabase(db, param);
5243
+ short tbid = db->dbDef()->tableNumByName(_T("groups"));
5244
+ BOOST_CHECK(tbid > 0);
5245
+ const fielddef* fd = &db->dbDef()->tableDefs(tbid)->fieldDefs[1];
5246
+ BOOST_CHECK(fd->charsetIndex() == mysql::charsetIndex(GetACP()));
5247
+ db->close(true /* withDropDefaultSchema */);
5248
+
5249
+ database::setCompatibleMode(database::CMP_MODE_MYSQL_NULL);
5250
+ openDatabase(db, param);
5251
+ tbid = db->dbDef()->tableNumByName(_T("groups"));
5252
+ BOOST_CHECK(tbid > 0);
5253
+ fd = &db->dbDef()->tableDefs(tbid)->fieldDefs[1];
5254
+ BOOST_CHECK(fd->charsetIndex() == CHARSET_BIN);
5255
+ db->close(true /* withDropDefaultSchema */);
5256
+
5257
+
5258
+ connectParams param2(PROTOCOL, HOSTNAME, _T("querytest"),
5259
+ NULL, g_userName, g_password);
5260
+ database::setCompatibleMode(database::CMP_MODE_OLD_BIN);
5261
+ openDatabase(db, param2);
5262
+ table* tb = db->openTable(_T("groups"));
5263
+ BOOST_CHECK(db->stat() == 0);
5264
+ tbid = db->dbDef()->tableNumByName(_T("groups"));
5265
+ BOOST_CHECK(tbid > 0);
5266
+ fd = &db->dbDef()->tableDefs(tbid)->fieldDefs[1];
5267
+ BOOST_CHECK(fd->charsetIndex() == mysql::charsetIndex(GetACP()));
5268
+ tb->release();
5269
+ db->close(true /* withDropDefaultSchema */);
5270
+
5271
+ database::setCompatibleMode(database::CMP_MODE_MYSQL_NULL);
5272
+ openDatabase(db, param2);
5273
+ tb = db->openTable(_T("groups"));
5274
+ BOOST_CHECK(db->stat() == 0);
5275
+ tbid = db->dbDef()->tableNumByName(_T("groups"));
5276
+ BOOST_CHECK(tbid > 0);
5277
+ fd = &db->dbDef()->tableDefs(tbid)->fieldDefs[1];
5278
+ BOOST_CHECK(fd->charsetIndex() == CHARSET_BIN);
5279
+ tb->release();
5280
+ db->close(true /* withDropDefaultSchema */);
5281
+
5282
+ }
5283
+
5229
5284
  void testGetDirUri()
5230
5285
  {
5231
5286
  _TCHAR retbuf[MAX_PATH];
@@ -5651,8 +5706,11 @@ BOOST_AUTO_TEST_SUITE(field)
5651
5706
 
5652
5707
  BOOST_AUTO_TEST_CASE(binary)
5653
5708
  {
5654
- testBinaryField();
5709
+ testBinaryField();
5710
+ testBinaryFieldSchame();
5655
5711
  }
5712
+
5713
+
5656
5714
  BOOST_AUTO_TEST_SUITE_END()
5657
5715
 
5658
5716
  BOOST_AUTO_TEST_SUITE(static_function)