transactd 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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)