transactd 3.5.0 → 3.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
- data/bin/common/tdclc_64_3_6.dll +0 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
- data/build/swig/tdcl.i +5 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +210 -184
- data/source/bzs/db/engine/mysql/database.h +276 -105
- data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
- data/source/bzs/db/protocol/tdap/client/database.h +6 -1
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
- data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
- data/source/bzs/db/protocol/tdap/client/field.h +3 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
- data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
- data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
- data/source/bzs/db/protocol/tdap/client/request.h +46 -38
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
- data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
- data/source/bzs/db/protocol/tdap/client/table.h +4 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
- data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
- data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
- data/source/bzs/example/ormap_c.cpp +2 -2
- data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
- data/source/bzs/test/tdclatl/test_v3.js +48 -1
- data/source/bzs/test/tdclphp/bench.php +89 -76
- data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
- data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
- data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
- data/source/bzs/test/trdclengn/testField.h +522 -1
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
- data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
- data/source/global/tdclatl/RecordsetQuery.h +1 -1
- data/source/global/tdclatl/Table.cpp +17 -0
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/tdclatl.idl +7 -2
- data/transactd.gemspec +1 -1
- metadata +7 -5
- 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.
|
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)
|