transactd 2.2.0 → 2.3.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.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +20 -18
- data/README-JA +19 -17
- data/RELEASE_NOTE +144 -0
- data/RELEASE_NOTE-JA +153 -0
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/ruby.swg +10 -9
- data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
- data/build/swig/tdcl.i +30 -3
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +85 -41
- data/source/bzs/db/engine/mysql/database.h +35 -5
- data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
- data/source/bzs/db/protocol/tdap/client/client.h +30 -1
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
- data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
- data/source/bzs/db/protocol/tdap/client/field.h +7 -7
- data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
- data/source/bzs/db/protocol/tdap/client/request.h +11 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
- data/source/bzs/db/protocol/tdap/client/table.h +8 -7
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
- data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
- data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
- data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
- data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
- data/source/bzs/db/protocol/tdap/uri.h +4 -4
- data/source/bzs/db/transactd/transactd.cpp +6 -5
- data/source/bzs/env/crosscompile.cpp +17 -0
- data/source/bzs/env/crosscompile.h +4 -1
- data/source/bzs/env/mbcswchrLinux.cpp +3 -0
- data/source/bzs/example/deleteRecords.cpp +13 -0
- data/source/bzs/example/deleteRecords_c.cpp +8 -1
- data/source/bzs/example/insertRecords.cpp +14 -0
- data/source/bzs/example/insertRecords_c.cpp +8 -1
- data/source/bzs/example/ormap_c.cpp +8 -1
- data/source/bzs/example/queryData.cpp +92 -2
- data/source/bzs/example/queryData.h +3 -1
- data/source/bzs/example/readRecords.cpp +13 -0
- data/source/bzs/example/readRecords_c.cpp +8 -1
- data/source/bzs/example/updateRecords.cpp +13 -0
- data/source/bzs/example/updateRecords_c.cpp +8 -1
- data/source/bzs/example/update_with_transaction.cpp +13 -0
- data/source/bzs/example/update_with_transaction_c.cpp +8 -1
- data/source/bzs/example/useORMRecord.cpp +9 -3
- data/source/bzs/netsvc/client/iconnection.h +8 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
- data/source/bzs/netsvc/client/tcpClient.h +430 -214
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
- data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
- data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
- data/source/bzs/test/transactdBench/workerBase.h +2 -2
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
- data/source/global/tdclatl/Database.cpp +12 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/FieldDef.cpp +19 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -16
- data/source/global/tdclatl/GroupQuery.cpp +21 -16
- data/source/global/tdclatl/GroupQuery.h +1 -1
- data/source/global/tdclatl/QueryBase.cpp +14 -0
- data/source/global/tdclatl/QueryBase.h +2 -0
- data/source/global/tdclatl/Record.cpp +41 -10
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Recordset.cpp +117 -31
- data/source/global/tdclatl/Recordset.h +6 -5
- data/source/global/tdclatl/Table.cpp +24 -28
- data/source/global/tdclatl/Table.h +3 -4
- data/source/global/tdclatl/activeTable.cpp +149 -103
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +38 -18
- data/transactd.gemspec +1 -1
- metadata +8 -4
- data/bin/common/tdclc_32_2_2.dll +0 -0
- data/bin/common/tdclc_64_2_2.dll +0 -0
|
@@ -121,6 +121,7 @@ class fixture
|
|
|
121
121
|
public:
|
|
122
122
|
fixture() : m_db(NULL)
|
|
123
123
|
{
|
|
124
|
+
|
|
124
125
|
nsdatabase::setCheckTablePtr(true);
|
|
125
126
|
m_db = database::create();
|
|
126
127
|
if (!m_db)
|
|
@@ -141,6 +142,35 @@ public:
|
|
|
141
142
|
::database* db() const { return m_db; }
|
|
142
143
|
};
|
|
143
144
|
|
|
145
|
+
#ifdef _WIN32
|
|
146
|
+
class fixtureKanji
|
|
147
|
+
{
|
|
148
|
+
mutable database* m_db;
|
|
149
|
+
|
|
150
|
+
public:
|
|
151
|
+
fixtureKanji() : m_db(NULL)
|
|
152
|
+
{
|
|
153
|
+
nsdatabase::setExecCodePage(932);
|
|
154
|
+
nsdatabase::setCheckTablePtr(true);
|
|
155
|
+
m_db = database::create();
|
|
156
|
+
if (!m_db)
|
|
157
|
+
printf("Error database::create()\n");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
~fixtureKanji()
|
|
161
|
+
{
|
|
162
|
+
if (m_db)
|
|
163
|
+
m_db->release();
|
|
164
|
+
}
|
|
165
|
+
::database* db() const { return m_db; }
|
|
166
|
+
};
|
|
167
|
+
#else
|
|
168
|
+
typedef fixture fixtureKanji;
|
|
169
|
+
#endif
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
144
174
|
class fixtureQuery
|
|
145
175
|
{
|
|
146
176
|
database_ptr m_db;
|
|
@@ -239,6 +269,12 @@ void testCreateNewDataBase(database* db)
|
|
|
239
269
|
td.parentKeyNum = -1;
|
|
240
270
|
td.replicaKeyNum = -1;
|
|
241
271
|
td.pageSize = 2048;
|
|
272
|
+
#ifdef _WIN32
|
|
273
|
+
td.charsetIndex = CHARSET_CP932;
|
|
274
|
+
#else
|
|
275
|
+
td.charsetIndex = CHARSET_UTF8;
|
|
276
|
+
#endif
|
|
277
|
+
|
|
242
278
|
def->insertTable(&td);
|
|
243
279
|
BOOST_CHECK_MESSAGE(0 == def->stat(),
|
|
244
280
|
"insertTable stat = " << def->stat());
|
|
@@ -253,8 +289,18 @@ void testCreateNewDataBase(database* db)
|
|
|
253
289
|
|
|
254
290
|
fd = def->insertField(1, 1);
|
|
255
291
|
fd->setName(_T("name"));
|
|
256
|
-
fd->type = ft_zstring;
|
|
257
292
|
fd->len = (ushort_td)33;
|
|
293
|
+
|
|
294
|
+
//test padChar only string or wstring
|
|
295
|
+
fd->type = ft_string;
|
|
296
|
+
fd->setPadCharSettings(true, false);
|
|
297
|
+
BOOST_CHECK(fd->usePadChar() == true);
|
|
298
|
+
BOOST_CHECK(fd->trimPadChar() == false);
|
|
299
|
+
fd->setPadCharSettings(false, true);
|
|
300
|
+
BOOST_CHECK(fd->usePadChar() == false);
|
|
301
|
+
BOOST_CHECK(fd->trimPadChar() == true);
|
|
302
|
+
|
|
303
|
+
fd->type = ft_zstring;
|
|
258
304
|
def->updateTableDef(1);
|
|
259
305
|
BOOST_CHECK_MESSAGE(0 == def->stat(),
|
|
260
306
|
"updateTableDef 2 stat = " << def->stat());
|
|
@@ -382,6 +428,13 @@ void testInsert(database* db)
|
|
|
382
428
|
tb->insert();
|
|
383
429
|
BOOST_CHECK_MESSAGE(0 == tb->stat(), "insert");
|
|
384
430
|
}
|
|
431
|
+
//test invalid keyNum
|
|
432
|
+
tb->clearBuffer();
|
|
433
|
+
tb->setFV((short)0, _T("2"));
|
|
434
|
+
tb->setKeyNum(10);
|
|
435
|
+
tb->insert();
|
|
436
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum insert");
|
|
437
|
+
tb->setKeyNum(0);
|
|
385
438
|
|
|
386
439
|
db->beginTrn();
|
|
387
440
|
int n = 1;
|
|
@@ -423,12 +476,23 @@ void testFind(database* db)
|
|
|
423
476
|
{
|
|
424
477
|
|
|
425
478
|
table* tb = openTable(db);
|
|
426
|
-
|
|
479
|
+
|
|
480
|
+
//test invalid keyNum
|
|
427
481
|
tb->clearBuffer();
|
|
482
|
+
tb->setKeyNum(10);
|
|
428
483
|
tb->setFilter(_T("id >= 10 and id < 20000"), 1, 0);
|
|
429
484
|
int v = 10;
|
|
430
485
|
tb->setFV((short)0, v);
|
|
431
486
|
tb->find(table::findForword);
|
|
487
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum find");
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
tb->setKeyNum(0);
|
|
491
|
+
tb->clearBuffer();
|
|
492
|
+
tb->setFilter(_T("id >= 10 and id < 20000"), 1, 0);
|
|
493
|
+
v = 10;
|
|
494
|
+
tb->setFV((short)0, v);
|
|
495
|
+
tb->find(table::findForword);
|
|
432
496
|
findNextLoop(tb, v, 20000);
|
|
433
497
|
|
|
434
498
|
// backforword
|
|
@@ -478,10 +542,22 @@ void testFindIn(database* db)
|
|
|
478
542
|
{
|
|
479
543
|
|
|
480
544
|
table* tb = openTable(db);
|
|
481
|
-
|
|
545
|
+
|
|
546
|
+
//test invalid keyNum
|
|
482
547
|
tb->clearBuffer();
|
|
483
548
|
queryBase q;
|
|
484
549
|
q.addSeekKeyValue(_T("10"), true);
|
|
550
|
+
tb->setQuery(&q);
|
|
551
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "find in stat = " << tb->stat());
|
|
552
|
+
tb->setKeyNum(10);
|
|
553
|
+
tb->find();
|
|
554
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum seekKeyValue");
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
tb->setKeyNum(0);
|
|
558
|
+
tb->clearBuffer();
|
|
559
|
+
q.reset();
|
|
560
|
+
q.addSeekKeyValue(_T("10"), true);
|
|
485
561
|
q.addSeekKeyValue(_T("300000"));
|
|
486
562
|
q.addSeekKeyValue(_T("50"));
|
|
487
563
|
q.addSeekKeyValue(_T("-1"));
|
|
@@ -603,9 +679,16 @@ void testPrepareServer(database* db)
|
|
|
603
679
|
{
|
|
604
680
|
table* tb = openTable(db);
|
|
605
681
|
queryBase q;
|
|
606
|
-
|
|
607
|
-
|
|
682
|
+
|
|
683
|
+
//test invalid keyNum
|
|
684
|
+
tb->setKeyNum(10);
|
|
685
|
+
tb->clearBuffer();
|
|
686
|
+
q.queryString(_T("id >= ? and id < ?")).reject(0xFFFF).limit(0);
|
|
608
687
|
pq_handle stmt = tb->prepare(&q, true);
|
|
688
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum prepare");
|
|
689
|
+
|
|
690
|
+
tb->setKeyNum(0);
|
|
691
|
+
stmt = tb->prepare(&q, true);
|
|
609
692
|
BOOST_CHECK_MESSAGE(0 == tb->stat(), "prepare stat");
|
|
610
693
|
if (tb->stat()) return ;
|
|
611
694
|
|
|
@@ -677,20 +760,6 @@ void testPrepareServer(database* db)
|
|
|
677
760
|
tb->find(table::findForword);
|
|
678
761
|
findNextLoop(tb, v, 3000);
|
|
679
762
|
|
|
680
|
-
// Seeks prepare statement
|
|
681
|
-
/*q.reset();
|
|
682
|
-
q.queryString(_T("select id"));
|
|
683
|
-
pq_handle stmt3 = tb->prepare(&q, true);
|
|
684
|
-
const _TCHAR* vsi[6];
|
|
685
|
-
makeSupplyValues(vsi, 6, _T("10"), _T("11"), _T("12"), _T("13"),
|
|
686
|
-
_T("14"), _T("15"));
|
|
687
|
-
int keySegments = 1;
|
|
688
|
-
ret = supplyInValues(stmt3, vsi, 6, keySegments);
|
|
689
|
-
BOOST_CHECK_MESSAGE(ret == true, "supplyValues ");
|
|
690
|
-
tb->setPrepare(stmt3);
|
|
691
|
-
tb->find();
|
|
692
|
-
findNextLoop(tb, 10, 16);
|
|
693
|
-
*/
|
|
694
763
|
tb->release();
|
|
695
764
|
}
|
|
696
765
|
|
|
@@ -712,6 +781,13 @@ void testMovePercentage(database* db)
|
|
|
712
781
|
{
|
|
713
782
|
table* tb = openTable(db);
|
|
714
783
|
tb->clearBuffer();
|
|
784
|
+
|
|
785
|
+
//test invalid keyNum
|
|
786
|
+
tb->setKeyNum(10);
|
|
787
|
+
tb->seekByPercentage(5000); // 50%
|
|
788
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum prepare");
|
|
789
|
+
|
|
790
|
+
tb->setKeyNum(0);
|
|
715
791
|
tb->seekByPercentage(5000); // 50%
|
|
716
792
|
BOOST_CHECK_MESSAGE(0 == tb->stat(), "MovePercentage");
|
|
717
793
|
// If mainus is less than 500 then ok.
|
|
@@ -723,7 +799,16 @@ void testMovePercentage(database* db)
|
|
|
723
799
|
void testGetEqual(database* db)
|
|
724
800
|
{
|
|
725
801
|
table* tb = openTable(db);
|
|
802
|
+
|
|
803
|
+
//test invalid keyNum
|
|
804
|
+
tb->setKeyNum(10);
|
|
805
|
+
tb->clearBuffer();
|
|
806
|
+
tb->setFV((short)0, 10);
|
|
807
|
+
tb->seek();
|
|
808
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum seek");
|
|
809
|
+
|
|
726
810
|
db->beginSnapshot();
|
|
811
|
+
tb->setKeyNum(0);
|
|
727
812
|
for (int i = 2; i < 20002; i++)
|
|
728
813
|
{
|
|
729
814
|
tb->clearBuffer();
|
|
@@ -852,6 +937,13 @@ void testGetFirst(database* db)
|
|
|
852
937
|
{
|
|
853
938
|
table* tb = openTable(db);
|
|
854
939
|
tb->clearBuffer();
|
|
940
|
+
|
|
941
|
+
//test invalid keyNum
|
|
942
|
+
tb->setKeyNum(10);
|
|
943
|
+
tb->seekFirst();
|
|
944
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum seekFirst");
|
|
945
|
+
|
|
946
|
+
tb->setKeyNum(0);
|
|
855
947
|
tb->seekFirst();
|
|
856
948
|
BOOST_CHECK_MESSAGE(_tstring(_T("kosaka")) == _tstring(tb->getFVstr(1)),
|
|
857
949
|
"GetFirst");
|
|
@@ -862,6 +954,13 @@ void testGetLast(database* db)
|
|
|
862
954
|
{
|
|
863
955
|
table* tb = openTable(db);
|
|
864
956
|
tb->clearBuffer();
|
|
957
|
+
|
|
958
|
+
//test invalid keyNum
|
|
959
|
+
tb->setKeyNum(10);
|
|
960
|
+
tb->seekLast();
|
|
961
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(), "Invalid keynum seekFirst");
|
|
962
|
+
|
|
963
|
+
tb->setKeyNum(0);
|
|
865
964
|
tb->seekLast();
|
|
866
965
|
BOOST_CHECK_MESSAGE(20002 == tb->getFVint(fdi_id), "GetLast");
|
|
867
966
|
tb->release();
|
|
@@ -870,7 +969,6 @@ void testGetLast(database* db)
|
|
|
870
969
|
void testMovePosition(database* db)
|
|
871
970
|
{
|
|
872
971
|
table* tb = openTable(db);
|
|
873
|
-
tb->clearBuffer();
|
|
874
972
|
int vv = 15000;
|
|
875
973
|
tb->clearBuffer();
|
|
876
974
|
tb->setFV(fdi_id, vv);
|
|
@@ -891,6 +989,13 @@ void testMovePosition(database* db)
|
|
|
891
989
|
|
|
892
990
|
tb->seekByBookmark(pos);
|
|
893
991
|
BOOST_CHECK_MESSAGE(15000 == tb->getFVint(fdi_id), "MovePosition");
|
|
992
|
+
|
|
993
|
+
//test invalid keyNum
|
|
994
|
+
tb->setKeyNum(10);
|
|
995
|
+
tb->seekByBookmark(pos);
|
|
996
|
+
BOOST_CHECK_MESSAGE(STATUS_INVALID_KEYNUM == tb->stat(),
|
|
997
|
+
"Invalid keynum seekByBookmark stat = " << tb->stat());
|
|
998
|
+
|
|
894
999
|
tb->release();
|
|
895
1000
|
}
|
|
896
1001
|
|
|
@@ -1347,6 +1452,49 @@ void testTransactionLockRepeatable(database* db)
|
|
|
1347
1452
|
database::destroy(db2);
|
|
1348
1453
|
}
|
|
1349
1454
|
|
|
1455
|
+
|
|
1456
|
+
void testBug_015(database* db)
|
|
1457
|
+
{
|
|
1458
|
+
table* tb = openTable(db);
|
|
1459
|
+
db->beginTrn(SINGLELOCK_NOGAP);
|
|
1460
|
+
tb->seekFirst(); // lock(X)
|
|
1461
|
+
tb->unlock();
|
|
1462
|
+
tb->seekNext();
|
|
1463
|
+
/* Here! InnoDB issues an error message, please check the MySQL error log.
|
|
1464
|
+
[InnoDB: Error: unlock row could not find a 3 mode lock on the record]
|
|
1465
|
+
*/
|
|
1466
|
+
db->endTrn();
|
|
1467
|
+
tb->release();
|
|
1468
|
+
}
|
|
1469
|
+
/* READ_COMMITTED support select lock type */
|
|
1470
|
+
void testIssue_016(database* db)
|
|
1471
|
+
{
|
|
1472
|
+
table* tb = openTable(db);
|
|
1473
|
+
db->beginTrn(MULTILOCK_NOGAP);
|
|
1474
|
+
tb->seekFirst(ROW_LOCK_S);
|
|
1475
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "seekFirst S");
|
|
1476
|
+
tb->seekNext(ROW_LOCK_S);
|
|
1477
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "seekNext S");
|
|
1478
|
+
tb->seekNext(ROW_LOCK_X);
|
|
1479
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "seekNext X");
|
|
1480
|
+
tb->update();
|
|
1481
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "update");
|
|
1482
|
+
db->endTrn();
|
|
1483
|
+
|
|
1484
|
+
db->beginTrn(MULTILOCK_GAP);
|
|
1485
|
+
tb->seekFirst(ROW_LOCK_S);
|
|
1486
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "seekFirst S");
|
|
1487
|
+
tb->seekNext(ROW_LOCK_S);
|
|
1488
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "seekNext S");
|
|
1489
|
+
tb->seekNext(ROW_LOCK_X);
|
|
1490
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "seekNext X");
|
|
1491
|
+
tb->update();
|
|
1492
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "update");
|
|
1493
|
+
db->endTrn();
|
|
1494
|
+
tb->release();
|
|
1495
|
+
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1350
1498
|
/* isoration Level ISO_READ_COMMITED */
|
|
1351
1499
|
void testTransactionLockReadCommited(database* db)
|
|
1352
1500
|
{
|
|
@@ -1569,10 +1717,10 @@ void testTransactionLockReadCommited(database* db)
|
|
|
1569
1717
|
// No match records are unlocked.
|
|
1570
1718
|
tb2->setFV(fdi_id, 100);
|
|
1571
1719
|
tb2->seek(ROW_LOCK_X);
|
|
1572
|
-
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seek");
|
|
1720
|
+
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seek stat = " << tb2->stat());
|
|
1573
1721
|
tb2->setFV(fdi_id, 101);
|
|
1574
1722
|
tb2->seek(ROW_LOCK_X);
|
|
1575
|
-
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seek");
|
|
1723
|
+
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seek stat = " << tb2->stat());
|
|
1576
1724
|
tb2->unlock();
|
|
1577
1725
|
db->endTrn();
|
|
1578
1726
|
|
|
@@ -1738,20 +1886,37 @@ void testRecordLock(database* db)
|
|
|
1738
1886
|
tb2->seekFirst(ROW_LOCK_S);
|
|
1739
1887
|
BOOST_CHECK_MESSAGE(STATUS_INVALID_LOCKTYPE == tb2->stat(), "tb2->seekFirst");
|
|
1740
1888
|
|
|
1889
|
+
/* --------- Invalid unlock test ----------------------------*/
|
|
1890
|
+
tb2->seekFirst();
|
|
1891
|
+
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seekFirst");
|
|
1892
|
+
tb2->unlock();
|
|
1893
|
+
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seekFirst");
|
|
1894
|
+
|
|
1741
1895
|
tb2->release();
|
|
1742
1896
|
tb3->release();
|
|
1743
1897
|
database::destroy(db2);
|
|
1744
1898
|
|
|
1745
1899
|
}
|
|
1746
1900
|
|
|
1901
|
+
bool isMySQL5_7(database* db)
|
|
1902
|
+
{
|
|
1903
|
+
btrVersions vv;
|
|
1904
|
+
db->getBtrVersion(&vv);
|
|
1905
|
+
return (db->stat() == 0) &&
|
|
1906
|
+
((5 == vv.versions[1].majorVersion) &&
|
|
1907
|
+
(7 == vv.versions[1].minorVersion));
|
|
1908
|
+
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1747
1911
|
void testExclusive()
|
|
1748
1912
|
{
|
|
1913
|
+
|
|
1749
1914
|
// db mode exclusive
|
|
1750
1915
|
database* db = database::create();
|
|
1751
1916
|
/* -------------------------------------------------*/
|
|
1752
1917
|
/* database WRITE EXCLUSIVE */
|
|
1753
1918
|
/* -------------------------------------------------*/
|
|
1754
|
-
table* tb = openTable(db, TD_OPEN_EXCLUSIVE)
|
|
1919
|
+
table* tb = openTable(db, TD_OPEN_EXCLUSIVE);//DB TD_OPEN_EXCLUSIVE
|
|
1755
1920
|
BOOST_CHECK_MESSAGE(0 == db->stat(), "Exclusive opened 1 ");
|
|
1756
1921
|
|
|
1757
1922
|
// Can not open another connections.
|
|
@@ -1761,7 +1926,7 @@ void testExclusive()
|
|
|
1761
1926
|
db2->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME), TYPE_SCHEMA_BDF);
|
|
1762
1927
|
//database open error. Check database::stat()
|
|
1763
1928
|
BOOST_CHECK_MESSAGE(STATUS_CANNOT_LOCK_TABLE == db2->stat(),
|
|
1764
|
-
"open
|
|
1929
|
+
"open db2->stat = " << db2->stat());
|
|
1765
1930
|
dbdef* def = db->dbDef();
|
|
1766
1931
|
tabledef* td = def->tableDefs(1);
|
|
1767
1932
|
td->iconIndex = 3;
|
|
@@ -1775,17 +1940,25 @@ void testExclusive()
|
|
|
1775
1940
|
/* database READ EXCLUSIVE */
|
|
1776
1941
|
/* -------------------------------------------------*/
|
|
1777
1942
|
tb = openTable(db, TD_OPEN_READONLY_EXCLUSIVE);
|
|
1778
|
-
|
|
1943
|
+
|
|
1944
|
+
// read mysql version
|
|
1945
|
+
bool MySQL5_7 = isMySQL5_7(db);
|
|
1946
|
+
|
|
1779
1947
|
// Read only open
|
|
1780
1948
|
db2->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME), TYPE_SCHEMA_BDF);
|
|
1781
|
-
BOOST_CHECK_MESSAGE(0 == db2->stat(),
|
|
1949
|
+
BOOST_CHECK_MESSAGE(0 == db2->stat(),
|
|
1950
|
+
"read only open " << db2->stat());
|
|
1782
1951
|
db2->close();
|
|
1783
1952
|
|
|
1784
1953
|
// Normal open
|
|
1785
1954
|
db2->connect(makeUri(PROTOCOL, HOSTNAME, DBNAME), true);
|
|
1786
1955
|
db2->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME),
|
|
1787
1956
|
TYPE_SCHEMA_BDF, TD_OPEN_NORMAL);
|
|
1788
|
-
|
|
1957
|
+
if (MySQL5_7)
|
|
1958
|
+
BOOST_CHECK_MESSAGE(STATUS_CANNOT_LOCK_TABLE == db2->stat()
|
|
1959
|
+
, "Normal open");
|
|
1960
|
+
else
|
|
1961
|
+
BOOST_CHECK_MESSAGE(0 == db2->stat()
|
|
1789
1962
|
, "Normal open");
|
|
1790
1963
|
db2->close();
|
|
1791
1964
|
|
|
@@ -1964,12 +2137,13 @@ void testMissingUpdate(database* db)
|
|
|
1964
2137
|
BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb2->stat(), "tb2->seekLessThan");
|
|
1965
2138
|
// Get lock(X) same record in parallel. The InnoDB is good!
|
|
1966
2139
|
boost::scoped_ptr<boost::thread> t(new boost::thread(boost::bind(&worker::run, w.get())));
|
|
1967
|
-
Sleep(
|
|
2140
|
+
Sleep(100);
|
|
1968
2141
|
int v = tb->getFVint(fdi_id);//v = 30000
|
|
1969
2142
|
tb->setFV(fdi_id, ++v); //v = 30001
|
|
1970
2143
|
tb->insert();
|
|
2144
|
+
Sleep(1);
|
|
1971
2145
|
t->join();
|
|
1972
|
-
|
|
2146
|
+
Sleep(1);
|
|
1973
2147
|
if (db->trxIsolationServer() == SRV_ISO_REPEATABLE_READ)
|
|
1974
2148
|
{ /* When SRV_ISO_REPEATABLE_READ tb2 get gap lock first,
|
|
1975
2149
|
tb can not insert, it is dedlock!
|
|
@@ -2112,6 +2286,42 @@ void testSetOwner(database* db)
|
|
|
2112
2286
|
tb->release();
|
|
2113
2287
|
}
|
|
2114
2288
|
|
|
2289
|
+
void testReconnect(database* db)
|
|
2290
|
+
{
|
|
2291
|
+
table* tb = openTable(db);
|
|
2292
|
+
|
|
2293
|
+
database* db2 = database::create();
|
|
2294
|
+
db2->connect(makeUri(PROTOCOL, HOSTNAME, DBNAME), true);
|
|
2295
|
+
BOOST_CHECK_MESSAGE(0 == db2->stat(), "connect");
|
|
2296
|
+
db2->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME), TYPE_SCHEMA_BDF);
|
|
2297
|
+
BOOST_CHECK_MESSAGE(0 == db2->stat(), "db2->open");
|
|
2298
|
+
table* tb2 = db2->openTable(_T("user"));
|
|
2299
|
+
|
|
2300
|
+
//lock row
|
|
2301
|
+
tb->setFV(fdi_id, 10);
|
|
2302
|
+
tb->seek(ROW_LOCK_X);
|
|
2303
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seek stat = " << tb->stat());
|
|
2304
|
+
db->disconnectForReconnectTest();
|
|
2305
|
+
db->reconnect();
|
|
2306
|
+
|
|
2307
|
+
//Check restore lock
|
|
2308
|
+
tb2->setFV(fdi_id, 10);
|
|
2309
|
+
tb2->seek(ROW_LOCK_X);
|
|
2310
|
+
BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb2->stat(), "tb->seek stat = " << tb2->stat());
|
|
2311
|
+
|
|
2312
|
+
tb->seekNext();
|
|
2313
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seek stat = " << tb->stat());
|
|
2314
|
+
BOOST_CHECK_MESSAGE(11 == tb->getFVint(fdi_id), "getFVint 11 bad = " << tb->getFVint(fdi_id));
|
|
2315
|
+
|
|
2316
|
+
tb2->setFV(fdi_id, 11);
|
|
2317
|
+
tb2->seek(ROW_LOCK_X);
|
|
2318
|
+
BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb->seek stat = " << tb2->stat());
|
|
2319
|
+
|
|
2320
|
+
tb->release();
|
|
2321
|
+
tb2->release();
|
|
2322
|
+
database::destroy(db2);
|
|
2323
|
+
}
|
|
2324
|
+
|
|
2115
2325
|
void testCreateIndex(database* db)
|
|
2116
2326
|
{
|
|
2117
2327
|
table* tb = openTable(db);
|
|
@@ -3266,15 +3476,15 @@ void initKanjiName()
|
|
|
3266
3476
|
if (!nameInited)
|
|
3267
3477
|
{
|
|
3268
3478
|
wchar_t tmp[50];
|
|
3269
|
-
MultiByteToWideChar(
|
|
3479
|
+
MultiByteToWideChar(932, MB_PRECOMPOSED, dbNmae, -1, tmp, 50);
|
|
3270
3480
|
WideCharToMultiByte(CP_UTF8, 0, tmp, -1, dbNmae, 50, NULL, NULL);
|
|
3271
|
-
MultiByteToWideChar(
|
|
3481
|
+
MultiByteToWideChar(932, MB_PRECOMPOSED, bdfNmae, -1, tmp, 50);
|
|
3272
3482
|
WideCharToMultiByte(CP_UTF8, 0, tmp, -1, bdfNmae, 50, NULL, NULL);
|
|
3273
|
-
MultiByteToWideChar(
|
|
3483
|
+
MultiByteToWideChar(932, MB_PRECOMPOSED, tableNmae, -1, tmp, 50);
|
|
3274
3484
|
WideCharToMultiByte(CP_UTF8, 0, tmp, -1, tableNmae, 50, NULL, NULL);
|
|
3275
|
-
MultiByteToWideChar(
|
|
3485
|
+
MultiByteToWideChar(932, MB_PRECOMPOSED, fdName1, -1, tmp, 50);
|
|
3276
3486
|
WideCharToMultiByte(CP_UTF8, 0, tmp, -1, fdName1, 50, NULL, NULL);
|
|
3277
|
-
MultiByteToWideChar(
|
|
3487
|
+
MultiByteToWideChar(932, MB_PRECOMPOSED, fdName2, -1, tmp, 50);
|
|
3278
3488
|
WideCharToMultiByte(CP_UTF8, 0, tmp, -1, fdName2, 50, NULL, NULL);
|
|
3279
3489
|
nameInited = true;
|
|
3280
3490
|
}
|
|
@@ -3284,14 +3494,15 @@ void initKanjiName()
|
|
|
3284
3494
|
void testDropDatabaseKanji(database* db)
|
|
3285
3495
|
{
|
|
3286
3496
|
db->open(makeUri(PROTOCOL, HOSTNAME, dbNmae, bdfNmae));
|
|
3287
|
-
BOOST_CHECK_MESSAGE(0 == db->stat(), "
|
|
3497
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "db->open stat = " << db->stat());
|
|
3288
3498
|
|
|
3289
3499
|
db->drop();
|
|
3290
|
-
BOOST_CHECK_MESSAGE(0 == db->stat(), "
|
|
3500
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "db->drop() stat = " << db->stat());
|
|
3291
3501
|
}
|
|
3292
3502
|
|
|
3293
3503
|
void testKnajiCreateSchema(database* db)
|
|
3294
3504
|
{
|
|
3505
|
+
|
|
3295
3506
|
initKanjiName();
|
|
3296
3507
|
db->create(makeUri(PROTOCOL, HOSTNAME, dbNmae, bdfNmae));
|
|
3297
3508
|
if (db->stat() == STATUS_TABLE_EXISTS_ERROR)
|
|
@@ -3314,6 +3525,10 @@ void testKnajiCreateSchema(database* db)
|
|
|
3314
3525
|
memset(&td, 0, sizeof(tabledef));
|
|
3315
3526
|
#ifndef _UNICODE
|
|
3316
3527
|
td.schemaCodePage = CP_UTF8;
|
|
3528
|
+
td.charsetIndex = CHARSET_UTF8;
|
|
3529
|
+
#else
|
|
3530
|
+
td.schemaCodePage = CP_UTF8;
|
|
3531
|
+
td.charsetIndex = CHARSET_CP932;
|
|
3317
3532
|
#endif
|
|
3318
3533
|
td.setTableName(tableNmae);
|
|
3319
3534
|
td.setFileName(tableNmae);
|
|
@@ -3360,14 +3575,15 @@ table* openKnajiTable(database* db)
|
|
|
3360
3575
|
|
|
3361
3576
|
db->open(makeUri(PROTOCOL, HOSTNAME, dbNmae, bdfNmae), TYPE_SCHEMA_BDF,
|
|
3362
3577
|
TD_OPEN_NORMAL);
|
|
3363
|
-
BOOST_CHECK_MESSAGE(0 == db->stat(), "openKnajiTable 1");
|
|
3578
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "openKnajiTable 1 stat = " << db->stat());
|
|
3364
3579
|
table* tb = db->openTable(tableNmae);
|
|
3365
|
-
BOOST_CHECK_MESSAGE(0 == db->stat(), "openKnajiTable 2");
|
|
3580
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "openKnajiTable 2 stat = " << db->stat());
|
|
3366
3581
|
return tb;
|
|
3367
3582
|
}
|
|
3368
3583
|
|
|
3369
3584
|
void testInsertKanji(database* db)
|
|
3370
3585
|
{
|
|
3586
|
+
|
|
3371
3587
|
table* tb = openKnajiTable(db);
|
|
3372
3588
|
|
|
3373
3589
|
tb->clearBuffer();
|
|
@@ -3386,6 +3602,7 @@ void testInsertKanji(database* db)
|
|
|
3386
3602
|
|
|
3387
3603
|
void testGetEqualKanji(database* db)
|
|
3388
3604
|
{
|
|
3605
|
+
|
|
3389
3606
|
table* tb = openKnajiTable(db);
|
|
3390
3607
|
tb->clearBuffer();
|
|
3391
3608
|
tb->setFV((short)0, 1);
|
|
@@ -3869,6 +4086,47 @@ void teetNewDelete(database* db)
|
|
|
3869
4086
|
delete at;
|
|
3870
4087
|
}
|
|
3871
4088
|
|
|
4089
|
+
void testRecordsetClone(database* db)
|
|
4090
|
+
{
|
|
4091
|
+
|
|
4092
|
+
#ifdef LINUX
|
|
4093
|
+
const char* fd_name = "名前";
|
|
4094
|
+
#else
|
|
4095
|
+
#ifdef _UNICODE
|
|
4096
|
+
const wchar_t fd_name[] = { L"名前" };
|
|
4097
|
+
#else
|
|
4098
|
+
char fd_name[30];
|
|
4099
|
+
WideCharToMultiByte(CP_UTF8, 0, L"名前", -1, fd_name, 30, NULL, NULL);
|
|
4100
|
+
#endif
|
|
4101
|
+
#endif
|
|
4102
|
+
|
|
4103
|
+
activeTable atu(db, _T("user"));
|
|
4104
|
+
//activeTable atg(db, _T("groups"));
|
|
4105
|
+
activeTable ate(db, _T("extention"));
|
|
4106
|
+
recordset* rs = recordset::create();
|
|
4107
|
+
query q;
|
|
4108
|
+
|
|
4109
|
+
atu.alias(fd_name, _T("name"));
|
|
4110
|
+
q.select(_T("id"), _T("name"), _T("group"))
|
|
4111
|
+
.where(_T("id"), _T("<="), 15000);
|
|
4112
|
+
atu.index(0).keyValue(1).read(*rs, q);
|
|
4113
|
+
BOOST_CHECK_MESSAGE(rs->size() == 15000, " rs.size() 15000 bad = " << rs->size());
|
|
4114
|
+
BOOST_CHECK_MESSAGE(rs->fieldDefs()->size() == 3, " rs.fieldDefs()->size() 3 bad = " << rs->fieldDefs()->size());
|
|
4115
|
+
|
|
4116
|
+
// Join extention::comment
|
|
4117
|
+
q.reset();
|
|
4118
|
+
ate.index(0).join(
|
|
4119
|
+
*rs, q.select(_T("comment")).optimize(queryBase::joinHasOneOrHasMany),
|
|
4120
|
+
_T("id"));
|
|
4121
|
+
BOOST_CHECK_MESSAGE(rs->size() == 15000, "join rs.size() 15000 bad = " << rs->size());
|
|
4122
|
+
BOOST_CHECK_MESSAGE(rs->fieldDefs()->size() == 4, " rs.fieldDefs()->size() 4 bad = " << rs->fieldDefs()->size());
|
|
4123
|
+
|
|
4124
|
+
recordset* rs2 = rs->clone();
|
|
4125
|
+
rs->release();
|
|
4126
|
+
rs2->release();
|
|
4127
|
+
|
|
4128
|
+
}
|
|
4129
|
+
|
|
3872
4130
|
void testJoin(database* db)
|
|
3873
4131
|
{
|
|
3874
4132
|
|
|
@@ -4255,6 +4513,10 @@ void testServerPrepareJoin(database* db)
|
|
|
4255
4513
|
vs = rs[NO_RECORD_ID][_T("blob")].c_str();
|
|
4256
4514
|
ret = _tcscmp(vs, _T("6 blob")) == 0;
|
|
4257
4515
|
BOOST_CHECK_MESSAGE(ret == true, "row of 6 = '6 blob'");
|
|
4516
|
+
field fd = rs[NO_RECORD_ID][_T("binary")];
|
|
4517
|
+
ret = compBlobField(NO_RECORD_ID + 1, fd);
|
|
4518
|
+
BOOST_CHECK_MESSAGE(ret == true, "row of 6 = 'binary 256 byte'");
|
|
4519
|
+
|
|
4258
4520
|
|
|
4259
4521
|
// Test clone blob field
|
|
4260
4522
|
recordset& rs2 = *rs.clone();
|
|
@@ -4288,10 +4550,12 @@ void testServerPrepareJoin(database* db)
|
|
|
4288
4550
|
|
|
4289
4551
|
|
|
4290
4552
|
// restore record
|
|
4553
|
+
unsigned char bin[256];
|
|
4291
4554
|
tb->clearBuffer();
|
|
4292
4555
|
tb->setFV(_T("id"), NO_RECORD_ID);
|
|
4293
4556
|
tb->setFV(_T("comment"), _T("5 comment"));
|
|
4294
4557
|
tb->setFV(_T("blob"), _T("5 blob"));
|
|
4558
|
+
fillBlobField(3, NO_RECORD_ID, tb.get(), bin);
|
|
4295
4559
|
tb->insert();
|
|
4296
4560
|
BOOST_CHECK_MESSAGE(tb->stat() == 0, "ate insert id = 5");
|
|
4297
4561
|
if (tb->stat())
|
|
@@ -4301,13 +4565,115 @@ void testServerPrepareJoin(database* db)
|
|
|
4301
4565
|
ate.release();
|
|
4302
4566
|
db->drop();
|
|
4303
4567
|
}
|
|
4304
|
-
|
|
4568
|
+
}
|
|
4569
|
+
|
|
4570
|
+
void testReadMore(database* db)
|
|
4571
|
+
{
|
|
4572
|
+
#ifdef LINUX
|
|
4573
|
+
const char* fd_name = "名前";
|
|
4574
|
+
#else
|
|
4575
|
+
#ifdef _UNICODE
|
|
4576
|
+
const wchar_t fd_name[] = { L"名前" };
|
|
4577
|
+
#else
|
|
4578
|
+
char fd_name[30];
|
|
4579
|
+
WideCharToMultiByte(CP_UTF8, 0, L"名前", -1, fd_name, 30, NULL, NULL);
|
|
4580
|
+
#endif
|
|
4581
|
+
#endif
|
|
4582
|
+
|
|
4583
|
+
activeTable atu(db, _T("user"));
|
|
4584
|
+
atu.alias(fd_name, _T("name"));
|
|
4585
|
+
query q;
|
|
4586
|
+
q.select(_T("id"), _T("name"), _T("group"))
|
|
4587
|
+
.where(_T("name"), _T("="), _T("1*"))
|
|
4588
|
+
.reject(70).limit(8).stopAtLimit(true);
|
|
4589
|
+
pq_handle stmt1 = atu.prepare(q, true);
|
|
4590
|
+
BOOST_CHECK_MESSAGE(stmt1 != NULL, " stmt1");
|
|
4591
|
+
|
|
4592
|
+
recordset rs;
|
|
4593
|
+
atu.index(0).keyValue(18).read(rs, stmt1);
|
|
4594
|
+
BOOST_CHECK_MESSAGE(rs.size() == 2, "read");
|
|
4595
|
+
|
|
4596
|
+
recordset rs2;
|
|
4597
|
+
atu.readMore(rs2);
|
|
4598
|
+
BOOST_CHECK_MESSAGE(rs2.size() == 8, "readMore");
|
|
4599
|
+
|
|
4600
|
+
rs += rs2;
|
|
4601
|
+
BOOST_CHECK_MESSAGE(rs.size() == 10, "union");
|
|
4602
|
+
|
|
4603
|
+
}
|
|
4604
|
+
|
|
4605
|
+
void testFirstLastGroupFunction(database* db)
|
|
4606
|
+
{
|
|
4607
|
+
#ifdef LINUX
|
|
4608
|
+
const char* fd_name = "名前";
|
|
4609
|
+
#else
|
|
4610
|
+
#ifdef _UNICODE
|
|
4611
|
+
const wchar_t fd_name[] = { L"名前" };
|
|
4612
|
+
#else
|
|
4613
|
+
char fd_name[30];
|
|
4614
|
+
WideCharToMultiByte(CP_UTF8, 0, L"名前", -1, fd_name, 30, NULL, NULL);
|
|
4615
|
+
#endif
|
|
4616
|
+
#endif
|
|
4305
4617
|
|
|
4618
|
+
activeTable atu(db, _T("user"));
|
|
4619
|
+
atu.alias(fd_name, _T("name"));
|
|
4620
|
+
query q;
|
|
4621
|
+
q.select(_T("id"), _T("name"), _T("group"))
|
|
4622
|
+
.where(_T("name"), _T("="), _T("1*"))
|
|
4623
|
+
.reject(70).limit(8).stopAtLimit(true);
|
|
4624
|
+
pq_handle stmt1 = atu.prepare(q, true);
|
|
4625
|
+
BOOST_CHECK_MESSAGE(stmt1 != NULL, " stmt1");
|
|
4306
4626
|
|
|
4627
|
+
recordset rs;
|
|
4628
|
+
atu.index(0).keyValue(0).read(rs, stmt1);
|
|
4629
|
+
BOOST_CHECK_MESSAGE(rs.size() == 8, "read");
|
|
4307
4630
|
|
|
4631
|
+
groupQuery gq;
|
|
4632
|
+
fieldNames target;
|
|
4633
|
+
target.addValue(_T("name"));
|
|
4634
|
+
client::last last(target, _T("last_rec_name"));
|
|
4635
|
+
client::first first(target, _T("first_rec_name"));
|
|
4636
|
+
gq.addFunction(&last);
|
|
4637
|
+
gq.addFunction(&first);
|
|
4638
|
+
|
|
4639
|
+
rs.groupBy(gq);
|
|
4640
|
+
BOOST_CHECK_MESSAGE(rs.size() == 1, "read");
|
|
4641
|
+
|
|
4642
|
+
BOOST_CHECK_MESSAGE(rs[0][_T("first_rec_name")].c_str() == std::_tstring(_T("1 user")), "first_rec_name");
|
|
4643
|
+
BOOST_CHECK_MESSAGE(rs[0][_T("last_rec_name")].c_str() == std::_tstring(_T("16 user")), "last_rec_name");
|
|
4308
4644
|
|
|
4309
4645
|
}
|
|
4310
4646
|
|
|
4647
|
+
void testBlobOnlyTable(database* db)
|
|
4648
|
+
{
|
|
4649
|
+
// table access test
|
|
4650
|
+
table* tb = db->openTable(_T("blobonly"));
|
|
4651
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable stat = " << db->stat());
|
|
4652
|
+
tb->clearBuffer();
|
|
4653
|
+
static const int id = 1;
|
|
4654
|
+
tb->setFV((short)0, id);
|
|
4655
|
+
tb->seek();
|
|
4656
|
+
field fd = tb->fields()[_T("binary")];
|
|
4657
|
+
|
|
4658
|
+
bool ret = compBlobField(id, fd);
|
|
4659
|
+
BOOST_CHECK_MESSAGE(ret == true, "tb->seek binary 256 byte");
|
|
4660
|
+
tb->release();
|
|
4661
|
+
|
|
4662
|
+
// activeTable test
|
|
4663
|
+
activeTable at(db, _T("blobonly"));
|
|
4664
|
+
recordset rs;
|
|
4665
|
+
client::query q;
|
|
4666
|
+
q.where(_T("id"), _T("<"), 10);
|
|
4667
|
+
at.index(0).keyValue(1).read(rs, q);
|
|
4668
|
+
BOOST_CHECK_MESSAGE(rs.size() == 9, " rs.size() 9 bad = " << rs.size());
|
|
4669
|
+
for (int i= 0; i < 9; ++i)
|
|
4670
|
+
{
|
|
4671
|
+
fd = rs[i][_T("binary")];
|
|
4672
|
+
ret = compBlobField(i+1, fd);
|
|
4673
|
+
BOOST_CHECK_MESSAGE(ret == true, "rs[n][binary] binary 256 byte");
|
|
4674
|
+
}
|
|
4675
|
+
}
|
|
4676
|
+
|
|
4311
4677
|
void testWirtableRecord(database* db)
|
|
4312
4678
|
{
|
|
4313
4679
|
|
|
@@ -4420,6 +4786,428 @@ void testDbPool()
|
|
|
4420
4786
|
poolMgr.reset(0);
|
|
4421
4787
|
}
|
|
4422
4788
|
|
|
4789
|
+
//--------------------------------------------------------------------------------------
|
|
4790
|
+
// filter test
|
|
4791
|
+
//--------------------------------------------------------------------------------------
|
|
4792
|
+
#define FILTER_DB _T("filter_test")
|
|
4793
|
+
|
|
4794
|
+
const _TCHAR* fdf_names[] =
|
|
4795
|
+
{
|
|
4796
|
+
_T("ft_string"),
|
|
4797
|
+
_T("ft_wstring"),
|
|
4798
|
+
_T("ft_zstring"),
|
|
4799
|
+
_T("ft_wzstring"),
|
|
4800
|
+
_T("ft_mychar"),
|
|
4801
|
+
_T("ft_mywchar"),
|
|
4802
|
+
_T("ft_myvarchar"),
|
|
4803
|
+
_T("ft_mywvarchar"),
|
|
4804
|
+
_T("ft_myvarbinary"),
|
|
4805
|
+
_T("ft_mywvarbinary"),
|
|
4806
|
+
};
|
|
4807
|
+
|
|
4808
|
+
char fdf_types[] =
|
|
4809
|
+
{
|
|
4810
|
+
ft_string,
|
|
4811
|
+
ft_wstring,
|
|
4812
|
+
ft_zstring,
|
|
4813
|
+
ft_wzstring,
|
|
4814
|
+
ft_mychar,
|
|
4815
|
+
ft_mywchar,
|
|
4816
|
+
ft_myvarchar,
|
|
4817
|
+
ft_mywvarchar,
|
|
4818
|
+
ft_myvarbinary,
|
|
4819
|
+
ft_mywvarbinary,
|
|
4820
|
+
};
|
|
4821
|
+
|
|
4822
|
+
#define FILTER_RECORDS 15
|
|
4823
|
+
const _TCHAR* fd_values[15] =
|
|
4824
|
+
{
|
|
4825
|
+
_T("090-xxxx-xxx"),
|
|
4826
|
+
_T("090-xxxx-xxx"),
|
|
4827
|
+
_T(" "),
|
|
4828
|
+
_T("090-xxxx-xxx"),
|
|
4829
|
+
_T("080-xxxx-xxx"),
|
|
4830
|
+
_T("0"),
|
|
4831
|
+
_T(""),
|
|
4832
|
+
_T(""),
|
|
4833
|
+
_T("09"),
|
|
4834
|
+
_T("070"),
|
|
4835
|
+
_T(""),
|
|
4836
|
+
_T("090-xxxx-xxx"),
|
|
4837
|
+
_T("a90-xxxx-xxx"),
|
|
4838
|
+
_T("Aa0-xxxx-xxx"),
|
|
4839
|
+
_T("A90-xxxx-xxx"),
|
|
4840
|
+
};
|
|
4841
|
+
|
|
4842
|
+
void intFieldTypes(database* db)
|
|
4843
|
+
{
|
|
4844
|
+
if (!isUtf16leSupport(db))
|
|
4845
|
+
{
|
|
4846
|
+
for (int i = 0; i < 10; i++)
|
|
4847
|
+
{
|
|
4848
|
+
if ((i % 2) == 1)
|
|
4849
|
+
fdf_types[i] = fdf_types[i-1];
|
|
4850
|
+
}
|
|
4851
|
+
}
|
|
4852
|
+
}
|
|
4853
|
+
|
|
4854
|
+
void inserFilterTestRecords(database* db)
|
|
4855
|
+
{
|
|
4856
|
+
|
|
4857
|
+
|
|
4858
|
+
table* tb = db->openTable(_T("user"), TD_OPEN_NORMAL);
|
|
4859
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable stat = " << db->stat());
|
|
4860
|
+
db->beginTrn();
|
|
4861
|
+
for (int i = 0; i < FILTER_RECORDS; ++i)
|
|
4862
|
+
{
|
|
4863
|
+
tb->clearBuffer();
|
|
4864
|
+
tb->setFV((short)0, i);
|
|
4865
|
+
//set AllFields smae value
|
|
4866
|
+
for (int j=0;j<10;++j)
|
|
4867
|
+
tb->setFV(j+1, fd_values[i]);
|
|
4868
|
+
tb->insert();
|
|
4869
|
+
BOOST_CHECK_MESSAGE(0 == tb->stat(), "insert stat = " << tb->stat());
|
|
4870
|
+
|
|
4871
|
+
}
|
|
4872
|
+
db->endTrn();
|
|
4873
|
+
tb->release();
|
|
4874
|
+
}
|
|
4875
|
+
|
|
4876
|
+
void createFilterTestDb(database* db)
|
|
4877
|
+
{
|
|
4878
|
+
|
|
4879
|
+
db->create(makeUri(PROTOCOL, HOSTNAME, FILTER_DB, BDFNAME));
|
|
4880
|
+
if (db->stat() == STATUS_TABLE_EXISTS_ERROR)
|
|
4881
|
+
{
|
|
4882
|
+
db->open(makeUri(PROTOCOL, HOSTNAME, FILTER_DB, BDFNAME), TYPE_SCHEMA_BDF,
|
|
4883
|
+
TD_OPEN_NORMAL);
|
|
4884
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(),
|
|
4885
|
+
"open stat = " << db->stat());
|
|
4886
|
+
db->drop();
|
|
4887
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(),
|
|
4888
|
+
"drop stat = " << db->stat());
|
|
4889
|
+
db->create(makeUri(PROTOCOL, HOSTNAME, FILTER_DB, BDFNAME));
|
|
4890
|
+
}
|
|
4891
|
+
|
|
4892
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(),
|
|
4893
|
+
"createFilterTestDb stat = " << db->stat());
|
|
4894
|
+
// create table
|
|
4895
|
+
db->open(makeUri(PROTOCOL, HOSTNAME, FILTER_DB, BDFNAME), TYPE_SCHEMA_BDF,
|
|
4896
|
+
TD_OPEN_NORMAL);
|
|
4897
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(),
|
|
4898
|
+
"createFilterTestDb 1 stat = " << db->stat());
|
|
4899
|
+
|
|
4900
|
+
intFieldTypes(db);
|
|
4901
|
+
|
|
4902
|
+
dbdef* def = db->dbDef();
|
|
4903
|
+
if (def)
|
|
4904
|
+
{
|
|
4905
|
+
/* user table */
|
|
4906
|
+
tabledef td;
|
|
4907
|
+
memset(&td, 0, sizeof(tabledef));
|
|
4908
|
+
td.setTableName(_T("user"));
|
|
4909
|
+
td.setFileName(_T("user.dat"));
|
|
4910
|
+
td.id = 1;
|
|
4911
|
+
td.primaryKeyNum = -1;
|
|
4912
|
+
td.parentKeyNum = -1;
|
|
4913
|
+
td.replicaKeyNum = -1;
|
|
4914
|
+
td.pageSize = 2048;
|
|
4915
|
+
#ifdef _WIN32
|
|
4916
|
+
td.charsetIndex = CHARSET_CP932;
|
|
4917
|
+
#else
|
|
4918
|
+
td.charsetIndex = CHARSET_UTF8;
|
|
4919
|
+
#endif
|
|
4920
|
+
|
|
4921
|
+
def->insertTable(&td);
|
|
4922
|
+
BOOST_CHECK_MESSAGE(0 == def->stat(),
|
|
4923
|
+
"insertTable stat = " << def->stat());
|
|
4924
|
+
|
|
4925
|
+
fielddef* fd = def->insertField(1, 0);
|
|
4926
|
+
fd->setName(_T("id"));
|
|
4927
|
+
fd->type = ft_integer;
|
|
4928
|
+
fd->len = (ushort_td)4;
|
|
4929
|
+
|
|
4930
|
+
for (int i=0;i<10;++i)
|
|
4931
|
+
{
|
|
4932
|
+
fielddef* fd = def->insertField(1, i+1);
|
|
4933
|
+
fd->setName(fdf_names[i]);
|
|
4934
|
+
fd->type = fdf_types[i];
|
|
4935
|
+
fd->setLenByCharnum(20);
|
|
4936
|
+
}
|
|
4937
|
+
def->updateTableDef(1);
|
|
4938
|
+
BOOST_CHECK_MESSAGE(0 == def->stat(),
|
|
4939
|
+
"updateTableDef 1 stat = " << def->stat());
|
|
4940
|
+
|
|
4941
|
+
keydef* kd = def->insertKey(1, 0);
|
|
4942
|
+
kd->segments[0].fieldNum = 0;
|
|
4943
|
+
kd->segments[0].flags.bit8 = 1; // extended key type
|
|
4944
|
+
kd->segments[0].flags.bit1 = 1; // changeable
|
|
4945
|
+
kd->segmentCount = 1;
|
|
4946
|
+
|
|
4947
|
+
for (int i=0;i<10;++i)
|
|
4948
|
+
{
|
|
4949
|
+
kd = def->insertKey(1, i+1);
|
|
4950
|
+
kd->segments[0].fieldNum = i+1;
|
|
4951
|
+
kd->segments[0].flags.bit0 = 1; // duplicate
|
|
4952
|
+
kd->segments[0].flags.bit8 = 1; // extended key type
|
|
4953
|
+
kd->segments[0].flags.bit1 = 1; // changeable
|
|
4954
|
+
kd->segmentCount = 1;
|
|
4955
|
+
}
|
|
4956
|
+
|
|
4957
|
+
def->updateTableDef(1);
|
|
4958
|
+
BOOST_CHECK_MESSAGE(0 == def->stat(),
|
|
4959
|
+
"updateTableDef 3 stat = " << def->stat());
|
|
4960
|
+
|
|
4961
|
+
inserFilterTestRecords(db);
|
|
4962
|
+
}
|
|
4963
|
+
}
|
|
4964
|
+
|
|
4965
|
+
void setReject(query& q)
|
|
4966
|
+
{
|
|
4967
|
+
q.reject(0).limit(0);
|
|
4968
|
+
}
|
|
4969
|
+
|
|
4970
|
+
void setReject(pq_handle& q)
|
|
4971
|
+
{
|
|
4972
|
+
|
|
4973
|
+
}
|
|
4974
|
+
|
|
4975
|
+
template<class Q>
|
|
4976
|
+
void doTestReadByQuery(int num, activeTable& at, recordset& rs, Q& q,
|
|
4977
|
+
int compSize, const char* msg)
|
|
4978
|
+
{
|
|
4979
|
+
setReject(q);
|
|
4980
|
+
at.index(0).keyValue(0).read(rs, q);
|
|
4981
|
+
BOOST_CHECK_MESSAGE(compSize == (int)rs.size(),
|
|
4982
|
+
num << " " << msg << " rs.size() = " << rs.size());
|
|
4983
|
+
}
|
|
4984
|
+
|
|
4985
|
+
void testFilterOfServer(database* db)
|
|
4986
|
+
{
|
|
4987
|
+
intFieldTypes(db);
|
|
4988
|
+
|
|
4989
|
+
{
|
|
4990
|
+
activeTable atu(db, _T("user"));
|
|
4991
|
+
recordset rs;
|
|
4992
|
+
query q;
|
|
4993
|
+
for (int i = 0; i < 10; ++i)
|
|
4994
|
+
{
|
|
4995
|
+
// empty string
|
|
4996
|
+
|
|
4997
|
+
q.reset().where(fdf_names[i], _T("="), _T(""));
|
|
4998
|
+
int n = 3;
|
|
4999
|
+
if (atu.table()->tableDef()->fieldDefs[i+1].usePadChar())
|
|
5000
|
+
n += 1;
|
|
5001
|
+
doTestReadByQuery(i, atu, rs, q, n, "");
|
|
5002
|
+
q.where(fdf_names[i], _T("=i"), _T(""));
|
|
5003
|
+
doTestReadByQuery(i, atu, rs, q, n, "=i");
|
|
5004
|
+
|
|
5005
|
+
// match complate
|
|
5006
|
+
q.where(fdf_names[i], _T("="), _T("070"));
|
|
5007
|
+
doTestReadByQuery(i, atu, rs, q, 1, "= 070");
|
|
5008
|
+
|
|
5009
|
+
q.where(fdf_names[i], _T("=i"), _T("070"));
|
|
5010
|
+
doTestReadByQuery(i, atu, rs, q, 1, "=i 070");
|
|
5011
|
+
|
|
5012
|
+
// match complate
|
|
5013
|
+
q.where(fdf_names[i], _T("<"), _T("09"));
|
|
5014
|
+
doTestReadByQuery(i, atu, rs, q, 7, "< 09");
|
|
5015
|
+
|
|
5016
|
+
q.where(fdf_names[i], _T("<i"), _T("09"));
|
|
5017
|
+
doTestReadByQuery(i, atu, rs, q, 7, "<i 09");
|
|
5018
|
+
|
|
5019
|
+
// wildcard and prerare
|
|
5020
|
+
// 0:noprepare 1:prepare 2:prepareServer
|
|
5021
|
+
for (int j = 0 ; j < 3; ++j)
|
|
5022
|
+
{
|
|
5023
|
+
q.reset().reject(0).limit(0);
|
|
5024
|
+
if (j > 0)
|
|
5025
|
+
{
|
|
5026
|
+
q.where(fdf_names[i], _T("="), _T("?"));
|
|
5027
|
+
pq_handle pq = atu.prepare(q, (j == 2));
|
|
5028
|
+
supplyValue(pq, 0, _T("09*"));
|
|
5029
|
+
doTestReadByQuery(i, atu, rs, pq, 5, "prepare = 09*");
|
|
5030
|
+
|
|
5031
|
+
q.where(fdf_names[i], _T("=i"), _T("?"));
|
|
5032
|
+
pq_handle pq1 = atu.prepare(q, (j == 2));
|
|
5033
|
+
supplyValue(pq1, 0, _T("09*"));
|
|
5034
|
+
doTestReadByQuery(i, atu, rs, pq1, 5, "prepare =i 09*");
|
|
5035
|
+
|
|
5036
|
+
}else
|
|
5037
|
+
{
|
|
5038
|
+
q.where(fdf_names[i], _T("="), _T("09*"));
|
|
5039
|
+
doTestReadByQuery(i, atu, rs, q, 5, "= 09*");
|
|
5040
|
+
|
|
5041
|
+
q.where(fdf_names[i], _T("=i"), _T("09*"));
|
|
5042
|
+
doTestReadByQuery(i, atu, rs, q, 5, "=i 09*");
|
|
5043
|
+
}
|
|
5044
|
+
}
|
|
5045
|
+
|
|
5046
|
+
// ascii
|
|
5047
|
+
q.where(fdf_names[i], _T("="), _T("a*"));
|
|
5048
|
+
doTestReadByQuery(i, atu, rs, q, 1, " = a*");
|
|
5049
|
+
|
|
5050
|
+
q.where(fdf_names[i], _T("=i"), _T("a*"));
|
|
5051
|
+
doTestReadByQuery(i, atu, rs, q, 3, " =i a*");
|
|
5052
|
+
|
|
5053
|
+
q.where(fdf_names[i], _T("="), _T("A*"));
|
|
5054
|
+
doTestReadByQuery(i, atu, rs, q, 2, " = A*");
|
|
5055
|
+
|
|
5056
|
+
q.where(fdf_names[i], _T("=i"), _T("A*"));
|
|
5057
|
+
doTestReadByQuery(i, atu, rs, q, 3, " =i A*");
|
|
5058
|
+
|
|
5059
|
+
q.where(fdf_names[i], _T("="), _T("AA0*"));
|
|
5060
|
+
doTestReadByQuery(i, atu, rs, q, 0, " = AA0*");
|
|
5061
|
+
|
|
5062
|
+
q.where(fdf_names[i], _T("=i"), _T("AA0*"));
|
|
5063
|
+
doTestReadByQuery(i, atu, rs, q, 1, " =i Aa0*");
|
|
5064
|
+
|
|
5065
|
+
//case in-sencitive index no jaudge
|
|
5066
|
+
|
|
5067
|
+
for (int i = 0 ; i < 10 ; ++i)
|
|
5068
|
+
{
|
|
5069
|
+
q.where(fdf_names[i], _T("="), _T("A*"));
|
|
5070
|
+
setReject(q);
|
|
5071
|
+
atu.index(i+1).keyValue(_T("A")).read(rs, q);
|
|
5072
|
+
BOOST_CHECK_MESSAGE(2 == rs.size(),
|
|
5073
|
+
i << " " << "jaudge = A*" << " rs.size() = " << rs.size());
|
|
5074
|
+
BOOST_CHECK_MESSAGE(atu.table()->statReasonOfFind() == STATUS_REACHED_FILTER_COND,
|
|
5075
|
+
i << " " << "jaudge = A* FILTER_COND");
|
|
5076
|
+
|
|
5077
|
+
q.where(fdf_names[i], _T("=i"), _T("A*"));
|
|
5078
|
+
setReject(q);
|
|
5079
|
+
atu.index(i+1).keyValue(_T("A")).read(rs, q);
|
|
5080
|
+
BOOST_CHECK_MESSAGE(3 == rs.size(),
|
|
5081
|
+
i << " " << "jaudge = A*" << " rs.size() = " << rs.size());
|
|
5082
|
+
BOOST_CHECK_MESSAGE(atu.table()->statReasonOfFind() == STATUS_EOF,
|
|
5083
|
+
i << " " << "jaudge = A* STATUS_EOF");
|
|
5084
|
+
|
|
5085
|
+
}
|
|
5086
|
+
}
|
|
5087
|
+
}
|
|
5088
|
+
}
|
|
5089
|
+
|
|
5090
|
+
void doTestMatchBy(int num, recordset& rs, recordsetQuery& rq, int compSize, const _TCHAR* msg)
|
|
5091
|
+
{
|
|
5092
|
+
recordset* rss = rs.clone();
|
|
5093
|
+
rss->matchBy(rq);
|
|
5094
|
+
BOOST_CHECK_MESSAGE(compSize == (int)rss->size(),
|
|
5095
|
+
num << msg << _T(" rss->size = ") << rss->size());
|
|
5096
|
+
rss->release();
|
|
5097
|
+
}
|
|
5098
|
+
|
|
5099
|
+
void testFilterOfMatchBy(database* db)
|
|
5100
|
+
{
|
|
5101
|
+
intFieldTypes(db);
|
|
5102
|
+
{
|
|
5103
|
+
activeTable atu(db, _T("user"));
|
|
5104
|
+
query q;
|
|
5105
|
+
recordset rs;
|
|
5106
|
+
atu.index(0).keyValue(0).read(rs, q.all());
|
|
5107
|
+
BOOST_CHECK_MESSAGE(FILTER_RECORDS == rs.size(), " rs.size() = " << rs.size());
|
|
5108
|
+
for (int i = 0; i < 10; ++i)
|
|
5109
|
+
{
|
|
5110
|
+
// empty string
|
|
5111
|
+
recordsetQuery rq;
|
|
5112
|
+
rq.when(fdf_names[i], _T("="), _T(""));
|
|
5113
|
+
int n = 3;
|
|
5114
|
+
if (atu.table()->tableDef()->fieldDefs[i+1].usePadChar())
|
|
5115
|
+
n += 1;
|
|
5116
|
+
doTestMatchBy(i, rs, rq, n, _T(" = "));
|
|
5117
|
+
rq.reset().when(fdf_names[i], _T("=i"), _T(""));
|
|
5118
|
+
doTestMatchBy(i, rs, rq, n, _T(" =i "));
|
|
5119
|
+
|
|
5120
|
+
|
|
5121
|
+
// wildcard
|
|
5122
|
+
rq.reset().when(fdf_names[i], _T("="), _T("09*"));
|
|
5123
|
+
doTestMatchBy(i, rs, rq, 5, _T(" = 09*"));
|
|
5124
|
+
rq.reset().when(fdf_names[i], _T("=i"), _T("09*"));
|
|
5125
|
+
doTestMatchBy(i, rs, rq, 5, _T(" =i 09*"));
|
|
5126
|
+
|
|
5127
|
+
// match complate
|
|
5128
|
+
rq.reset().when(fdf_names[i], _T("="), _T("070"));
|
|
5129
|
+
doTestMatchBy(i, rs, rq, 1, _T(" = 070"));
|
|
5130
|
+
rq.reset().when(fdf_names[i], _T("=i"), _T("070"));
|
|
5131
|
+
doTestMatchBy(i, rs, rq, 1, _T(" =i 070"));
|
|
5132
|
+
|
|
5133
|
+
// match complate
|
|
5134
|
+
rq.reset().when(fdf_names[i], _T("<"), _T("09"));
|
|
5135
|
+
doTestMatchBy(i, rs, rq, 7, _T(" < 09"));
|
|
5136
|
+
|
|
5137
|
+
rq.reset().when(fdf_names[i], _T("<i"), _T("09"));
|
|
5138
|
+
doTestMatchBy(i, rs, rq, 7, _T(" <i 09"));
|
|
5139
|
+
|
|
5140
|
+
// ascii
|
|
5141
|
+
rq.reset().when(fdf_names[i], _T("="), _T("a*"));
|
|
5142
|
+
doTestMatchBy(i, rs, rq, 1, _T(" = a*"));
|
|
5143
|
+
|
|
5144
|
+
rq.reset().when(fdf_names[i], _T("=i"), _T("a*"));
|
|
5145
|
+
doTestMatchBy(i, rs, rq, 3, _T(" =i a*"));
|
|
5146
|
+
|
|
5147
|
+
rq.reset().when(fdf_names[i], _T("=i"), _T("A*"));
|
|
5148
|
+
doTestMatchBy(i, rs, rq, 3, _T(" =i A*"));
|
|
5149
|
+
|
|
5150
|
+
rq.reset().when(fdf_names[i], _T("="), _T("AA0*"));
|
|
5151
|
+
doTestMatchBy(i, rs, rq, 0, _T(" = AA0*"));
|
|
5152
|
+
|
|
5153
|
+
rq.reset().when(fdf_names[i], _T("=i"), _T("AA0*"));
|
|
5154
|
+
doTestMatchBy(i, rs, rq, 1, _T(" =i Aa0*"));
|
|
5155
|
+
|
|
5156
|
+
|
|
5157
|
+
BOOST_CHECK_MESSAGE(FILTER_RECORDS == rs.size(), " rs.size() = " << rs.size());
|
|
5158
|
+
}
|
|
5159
|
+
}
|
|
5160
|
+
db->drop();
|
|
5161
|
+
BOOST_CHECK_MESSAGE(0 == db->stat(), "drop stat = " << db->stat());
|
|
5162
|
+
}
|
|
5163
|
+
|
|
5164
|
+
unsigned char field_types[] =
|
|
5165
|
+
{
|
|
5166
|
+
ft_myvarbinary,
|
|
5167
|
+
ft_mywvarbinary,
|
|
5168
|
+
ft_myvarchar,
|
|
5169
|
+
ft_mywvarchar,
|
|
5170
|
+
ft_string,
|
|
5171
|
+
ft_wstring,
|
|
5172
|
+
ft_lstring,
|
|
5173
|
+
ft_lvar,
|
|
5174
|
+
ft_myblob,
|
|
5175
|
+
ft_mytext
|
|
5176
|
+
};
|
|
5177
|
+
|
|
5178
|
+
void testBinaryField()
|
|
5179
|
+
{
|
|
5180
|
+
unsigned char data[255], buf[255];
|
|
5181
|
+
for (int i = 0; i < 255 ;++i)
|
|
5182
|
+
data[i] = i;
|
|
5183
|
+
|
|
5184
|
+
fielddef fdd;
|
|
5185
|
+
fdd.type = ft_string;
|
|
5186
|
+
fdd.len = 255;
|
|
5187
|
+
fdd.pos = 0;
|
|
5188
|
+
|
|
5189
|
+
client::field fd(buf, fdd, NULL);
|
|
5190
|
+
for (int i = 0 ; i < 10; ++i)
|
|
5191
|
+
{
|
|
5192
|
+
fdd.type = field_types[i];
|
|
5193
|
+
int len = fdd.len - fdd.varLenBytes();
|
|
5194
|
+
if (i > 7)
|
|
5195
|
+
{
|
|
5196
|
+
fdd.len = 9; //blob type
|
|
5197
|
+
len = 255;
|
|
5198
|
+
}
|
|
5199
|
+
fd.setBin(data, len);
|
|
5200
|
+
uint_td size;
|
|
5201
|
+
void* p = fd.getBin(size);
|
|
5202
|
+
BOOST_CHECK_MESSAGE(len == (int)size, "binary size type = " << i);
|
|
5203
|
+
|
|
5204
|
+
BOOST_CHECK_MESSAGE(p != NULL, "binary ret type = " << i);
|
|
5205
|
+
int ret = memcmp(p, data, len);
|
|
5206
|
+
BOOST_CHECK_MESSAGE(0 == ret, "binary memcmp type = " << i);
|
|
5207
|
+
}
|
|
5208
|
+
}
|
|
5209
|
+
|
|
5210
|
+
|
|
4423
5211
|
// ------------------------------------------------------------------------
|
|
4424
5212
|
BOOST_AUTO_TEST_SUITE(btrv_nativ)
|
|
4425
5213
|
|
|
@@ -4529,6 +5317,17 @@ BOOST_FIXTURE_TEST_CASE(transactionLockRepeatable, fixture)
|
|
|
4529
5317
|
testTransactionLockRepeatable(db());
|
|
4530
5318
|
}
|
|
4531
5319
|
|
|
5320
|
+
BOOST_FIXTURE_TEST_CASE(bug_015, fixture)
|
|
5321
|
+
{
|
|
5322
|
+
testBug_015(db());
|
|
5323
|
+
}
|
|
5324
|
+
|
|
5325
|
+
BOOST_FIXTURE_TEST_CASE(issue_016, fixture)
|
|
5326
|
+
{
|
|
5327
|
+
testIssue_016(db());
|
|
5328
|
+
}
|
|
5329
|
+
|
|
5330
|
+
|
|
4532
5331
|
BOOST_FIXTURE_TEST_CASE(transactionLock, fixture)
|
|
4533
5332
|
{
|
|
4534
5333
|
testTransactionLockReadCommited(db());
|
|
@@ -4554,6 +5353,11 @@ BOOST_FIXTURE_TEST_CASE(MissingUpdate, fixture)
|
|
|
4554
5353
|
testMissingUpdate(db());
|
|
4555
5354
|
}
|
|
4556
5355
|
|
|
5356
|
+
BOOST_FIXTURE_TEST_CASE(reconnect, fixture)
|
|
5357
|
+
{
|
|
5358
|
+
testReconnect(db());
|
|
5359
|
+
}
|
|
5360
|
+
|
|
4557
5361
|
BOOST_FIXTURE_TEST_CASE(insert2, fixture)
|
|
4558
5362
|
{
|
|
4559
5363
|
testInsert2(db());
|
|
@@ -4569,6 +5373,7 @@ BOOST_FIXTURE_TEST_CASE(setOwner, fixture)
|
|
|
4569
5373
|
testSetOwner(db());
|
|
4570
5374
|
}
|
|
4571
5375
|
|
|
5376
|
+
|
|
4572
5377
|
BOOST_FIXTURE_TEST_CASE(createIndex, fixture)
|
|
4573
5378
|
{
|
|
4574
5379
|
testCreateIndex(db());
|
|
@@ -4628,32 +5433,32 @@ BOOST_AUTO_TEST_SUITE_END()
|
|
|
4628
5433
|
// ------------------------------------------------------------------------
|
|
4629
5434
|
BOOST_AUTO_TEST_SUITE(var_field)
|
|
4630
5435
|
|
|
4631
|
-
BOOST_FIXTURE_TEST_CASE(createDataBaseVar,
|
|
5436
|
+
BOOST_FIXTURE_TEST_CASE(createDataBaseVar, fixtureKanji)
|
|
4632
5437
|
{
|
|
4633
5438
|
testCreateDataBaseVar(db());
|
|
4634
5439
|
}
|
|
4635
5440
|
|
|
4636
|
-
BOOST_FIXTURE_TEST_CASE(varField,
|
|
5441
|
+
BOOST_FIXTURE_TEST_CASE(varField, fixtureKanji)
|
|
4637
5442
|
{
|
|
4638
5443
|
testVarField(db());
|
|
4639
5444
|
}
|
|
4640
5445
|
|
|
4641
|
-
BOOST_FIXTURE_TEST_CASE(varInsert,
|
|
5446
|
+
BOOST_FIXTURE_TEST_CASE(varInsert, fixtureKanji)
|
|
4642
5447
|
{
|
|
4643
5448
|
testVarInsert(db());
|
|
4644
5449
|
}
|
|
4645
5450
|
|
|
4646
|
-
BOOST_FIXTURE_TEST_CASE(varRead,
|
|
5451
|
+
BOOST_FIXTURE_TEST_CASE(varRead, fixtureKanji)
|
|
4647
5452
|
{
|
|
4648
5453
|
testVarRead(db());
|
|
4649
5454
|
}
|
|
4650
5455
|
|
|
4651
|
-
BOOST_FIXTURE_TEST_CASE(filterVar,
|
|
5456
|
+
BOOST_FIXTURE_TEST_CASE(filterVar, fixtureKanji)
|
|
4652
5457
|
{
|
|
4653
5458
|
testFilterVar(db());
|
|
4654
5459
|
}
|
|
4655
5460
|
|
|
4656
|
-
BOOST_FIXTURE_TEST_CASE(dropDataBaseVar,
|
|
5461
|
+
BOOST_FIXTURE_TEST_CASE(dropDataBaseVar, fixtureKanji)
|
|
4657
5462
|
{
|
|
4658
5463
|
testDropDataBaseVar(db());
|
|
4659
5464
|
}
|
|
@@ -4664,12 +5469,12 @@ BOOST_AUTO_TEST_SUITE_END()
|
|
|
4664
5469
|
// ------------------------------------------------------------------------
|
|
4665
5470
|
BOOST_AUTO_TEST_SUITE(filter)
|
|
4666
5471
|
|
|
4667
|
-
BOOST_FIXTURE_TEST_CASE(stringFileter,
|
|
5472
|
+
BOOST_FIXTURE_TEST_CASE(stringFileter, fixtureKanji)
|
|
4668
5473
|
{
|
|
4669
5474
|
testStringFileter(db());
|
|
4670
5475
|
}
|
|
4671
5476
|
|
|
4672
|
-
BOOST_FIXTURE_TEST_CASE(dropDataBaseStr,
|
|
5477
|
+
BOOST_FIXTURE_TEST_CASE(dropDataBaseStr, fixtureKanji)
|
|
4673
5478
|
{
|
|
4674
5479
|
testDropDataBaseStr(db());
|
|
4675
5480
|
}
|
|
@@ -4678,24 +5483,25 @@ BOOST_AUTO_TEST_SUITE_END()
|
|
|
4678
5483
|
// ------------------------------------------------------------------------
|
|
4679
5484
|
#endif
|
|
4680
5485
|
// ------------------------------------------------------------------------
|
|
5486
|
+
|
|
4681
5487
|
BOOST_AUTO_TEST_SUITE(kanjiSchema)
|
|
4682
5488
|
|
|
4683
|
-
BOOST_FIXTURE_TEST_CASE(knajiCreateSchema,
|
|
5489
|
+
BOOST_FIXTURE_TEST_CASE(knajiCreateSchema, fixtureKanji)
|
|
4684
5490
|
{
|
|
4685
5491
|
testKnajiCreateSchema(db());
|
|
4686
5492
|
}
|
|
4687
5493
|
|
|
4688
|
-
BOOST_FIXTURE_TEST_CASE(insertKanji,
|
|
5494
|
+
BOOST_FIXTURE_TEST_CASE(insertKanji, fixtureKanji)
|
|
4689
5495
|
{
|
|
4690
5496
|
testInsertKanji(db());
|
|
4691
5497
|
}
|
|
4692
5498
|
|
|
4693
|
-
BOOST_FIXTURE_TEST_CASE(getEqualKanji,
|
|
5499
|
+
BOOST_FIXTURE_TEST_CASE(getEqualKanji, fixtureKanji)
|
|
4694
5500
|
{
|
|
4695
5501
|
testGetEqualKanji(db());
|
|
4696
5502
|
}
|
|
4697
5503
|
|
|
4698
|
-
BOOST_FIXTURE_TEST_CASE(dropDatabaseKanji,
|
|
5504
|
+
BOOST_FIXTURE_TEST_CASE(dropDatabaseKanji, fixtureKanji)
|
|
4699
5505
|
{
|
|
4700
5506
|
testDropDatabaseKanji(db());
|
|
4701
5507
|
}
|
|
@@ -4733,24 +5539,65 @@ BOOST_FIXTURE_TEST_CASE(new_delete, fixtureQuery)
|
|
|
4733
5539
|
BOOST_FIXTURE_TEST_CASE(join, fixtureQuery)
|
|
4734
5540
|
{
|
|
4735
5541
|
testJoin(db());
|
|
5542
|
+
testRecordsetClone(db());
|
|
4736
5543
|
testPrepareJoin(db());
|
|
4737
5544
|
testServerPrepareJoin(db());
|
|
4738
5545
|
testWirtableRecord(db());
|
|
4739
5546
|
}
|
|
4740
5547
|
|
|
5548
|
+
BOOST_FIXTURE_TEST_CASE(readMore, fixtureQuery)
|
|
5549
|
+
{
|
|
5550
|
+
testReadMore(db());
|
|
5551
|
+
}
|
|
5552
|
+
|
|
5553
|
+
BOOST_FIXTURE_TEST_CASE(firstLastGropuFunction, fixtureQuery)
|
|
5554
|
+
{
|
|
5555
|
+
testFirstLastGroupFunction(db());
|
|
5556
|
+
}
|
|
5557
|
+
|
|
5558
|
+
BOOST_FIXTURE_TEST_CASE(blobOnly, fixtureQuery)
|
|
5559
|
+
{
|
|
5560
|
+
testBlobOnlyTable(db());
|
|
5561
|
+
}
|
|
5562
|
+
|
|
4741
5563
|
BOOST_AUTO_TEST_SUITE_END()
|
|
4742
5564
|
|
|
5565
|
+
|
|
4743
5566
|
BOOST_AUTO_TEST_SUITE(dbPool)
|
|
4744
5567
|
|
|
4745
5568
|
BOOST_AUTO_TEST_CASE(pool)
|
|
4746
5569
|
{
|
|
4747
5570
|
testDbPool();
|
|
4748
5571
|
}
|
|
5572
|
+
|
|
5573
|
+
BOOST_AUTO_TEST_SUITE_END()
|
|
5574
|
+
|
|
5575
|
+
|
|
5576
|
+
BOOST_AUTO_TEST_SUITE(filter)
|
|
5577
|
+
|
|
5578
|
+
BOOST_FIXTURE_TEST_CASE(serverFilter, fixture)
|
|
5579
|
+
{
|
|
5580
|
+
createFilterTestDb(db());
|
|
5581
|
+
testFilterOfServer(db());
|
|
5582
|
+
testFilterOfMatchBy(db());
|
|
5583
|
+
|
|
5584
|
+
}
|
|
5585
|
+
|
|
5586
|
+
BOOST_AUTO_TEST_SUITE_END()
|
|
5587
|
+
|
|
5588
|
+
BOOST_AUTO_TEST_SUITE(field)
|
|
5589
|
+
|
|
5590
|
+
BOOST_AUTO_TEST_CASE(binary)
|
|
5591
|
+
{
|
|
5592
|
+
testBinaryField();
|
|
5593
|
+
}
|
|
5594
|
+
|
|
4749
5595
|
BOOST_AUTO_TEST_CASE(fuga)
|
|
4750
5596
|
{
|
|
4751
5597
|
BOOST_CHECK_EQUAL(2 * 3, 6);
|
|
4752
5598
|
}
|
|
4753
5599
|
|
|
4754
5600
|
BOOST_AUTO_TEST_SUITE_END()
|
|
5601
|
+
|
|
4755
5602
|
|
|
4756
5603
|
// ------------------------------------------------------------------------
|