transactd 3.0.0 → 3.1.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/bin/common/tdclc_32_3_1.dll +0 -0
- data/bin/common/tdclc_64_3_1.dll +0 -0
- data/build/common/transactd.rc.in +1 -1
- data/build/swig/ruby/tdclrb_wrap.cpp +219 -15
- data/build/swig/tdcl.i +26 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +5 -5
- data/build/tdclcpp/tdclcpp.rc +5 -5
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/tdclrb.rc +5 -5
- data/source/bzs/db/engine/mysql/database.cpp +131 -29
- data/source/bzs/db/engine/mysql/database.h +8 -6
- data/source/bzs/db/engine/mysql/dbManager.cpp +30 -12
- data/source/bzs/db/engine/mysql/dbManager.h +1 -1
- data/source/bzs/db/engine/mysql/mysqlInternal.h +251 -24
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +2 -3
- data/source/bzs/db/protocol/tdap/client/bulkInsert.h +2 -2
- data/source/bzs/db/protocol/tdap/client/client.h +4 -3
- data/source/bzs/db/protocol/tdap/client/connMgr.h +1 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +195 -91
- data/source/bzs/db/protocol/tdap/client/database.h +6 -6
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +9 -3
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +31 -25
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -2
- data/source/bzs/db/protocol/tdap/client/field.cpp +6 -16
- data/source/bzs/db/protocol/tdap/client/filter.h +28 -9
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +14 -4
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +20 -2
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +5 -2
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +2 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -16
- data/source/bzs/db/protocol/tdap/client/table.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/table.h +1 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -9
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +68 -21
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +3 -7
- data/source/bzs/db/protocol/tdap/tdapSchema.h +9 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +11 -3
- data/source/bzs/db/protocol/tdap/uri.h +3 -1
- data/source/bzs/env/crosscompile.h +17 -3
- data/source/bzs/test/tdclatl/test_v3.js +60 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +8 -0
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +11 -3
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +32 -8
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +7 -7
- data/source/bzs/test/tdclrb/transactd_spec.rb +22 -1
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +29 -3
- data/source/bzs/test/trdclengn/testField.h +34 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +7 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +7 -8
- data/source/global/tdclatl/Database.cpp +34 -10
- data/source/global/tdclatl/Database.h +5 -5
- data/source/global/tdclatl/PooledDbManager.cpp +20 -3
- data/source/global/tdclatl/PooledDbManager.h +2 -2
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +5 -4
- data/source/global/tdclatl/tdclatl.idl +157 -119
- metadata +4 -4
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
@@ -808,10 +808,9 @@ bool tabledef::isNullKey(const keydef& key) const
|
|
808
808
|
for (int j=0;j < key.segmentCount; ++j)
|
809
809
|
{
|
810
810
|
const fielddef& fd = fieldDefs[key.segments[j].fieldNum];
|
811
|
-
if (fd.nullValue
|
812
|
-
return
|
811
|
+
if (fd.nullValue == 0x00)
|
812
|
+
return true;
|
813
813
|
}
|
814
|
-
return true;
|
815
814
|
}
|
816
815
|
return false;
|
817
816
|
}
|
@@ -833,7 +832,7 @@ bool tabledef::isNULLFieldFirstKeySegField(const keydef& key) const
|
|
833
832
|
if ((key.segments[0].flags.bit3 || key.segments[0].flags.bit9) && key.segmentCount == 1)
|
834
833
|
{
|
835
834
|
const fielddef& fd = fieldDefs[key.segments[0].fieldNum];
|
836
|
-
return
|
835
|
+
return fd.isNullKeysegType();
|
837
836
|
}
|
838
837
|
return false;
|
839
838
|
}
|
@@ -1070,7 +1069,6 @@ uint_td tabledef::pack(char* ptr, size_t size) const
|
|
1070
1069
|
memmove(pos, pos + movelen, end - pos);
|
1071
1070
|
}
|
1072
1071
|
}
|
1073
|
-
|
1074
1072
|
}
|
1075
1073
|
return (uint_td)(pos - ptr);
|
1076
1074
|
}
|
@@ -1079,8 +1077,6 @@ int tabledef::size() const
|
|
1079
1077
|
{
|
1080
1078
|
int len = (int)(sizeof(tabledef) + (sizeof(fielddef) * fieldCount) +
|
1081
1079
|
(sizeof(keydef) * keyCount));
|
1082
|
-
const ushort_td* p = &varSize;
|
1083
|
-
*(const_cast<ushort_td*>(p)) = len - 4;
|
1084
1080
|
return len;
|
1085
1081
|
}
|
1086
1082
|
|
@@ -596,6 +596,14 @@ struct PACKAGE fielddef : public fielddef_t_my
|
|
596
596
|
(type == ft_mydatetime) || (type == ft_mytimestamp));
|
597
597
|
}
|
598
598
|
|
599
|
+
inline bool isNullKeysegType() const
|
600
|
+
{
|
601
|
+
return (nullValue == 0x00) && (len <= 8) &&
|
602
|
+
((type == ft_logical) || (type == ft_integer) ||
|
603
|
+
(type == ft_uinteger) || (type == ft_enum)|| (type == ft_set));
|
604
|
+
|
605
|
+
}
|
606
|
+
|
599
607
|
/* Charctor numbers from charset.
|
600
608
|
*/
|
601
609
|
unsigned int charNum() const;
|
@@ -728,7 +736,7 @@ private:
|
|
728
736
|
return v;
|
729
737
|
}
|
730
738
|
|
731
|
-
inline
|
739
|
+
inline uint_td maxVarDatalen() const
|
732
740
|
{
|
733
741
|
if (((type >= ft_myvarchar) && (type <= ft_mywvarbinary)) ||
|
734
742
|
type == ft_lstring)
|
@@ -324,8 +324,15 @@ enum combineType
|
|
324
324
|
#define MULTILOCK_GAP MULTILOCK_REPEATABLE_READ + LOCK_MULTI_NOWAIT
|
325
325
|
// Snapshot
|
326
326
|
#define CONSISTENT_READ 4000
|
327
|
+
#define CONSISTENT_READ_WITH_BINLOG_POS 4200
|
327
328
|
#define MULTILOCK_GAP_SHARE TRN_ISO_REPEATABLE_READ
|
328
329
|
#define MULTILOCK_NOGAP_SHARE 0
|
330
|
+
#define REPL_POSTYPE_NONE 0
|
331
|
+
#define REPL_POSTYPE_MARIA_GTID 1 // like 0-1-50
|
332
|
+
#define REPL_POSTYPE_POS 2 // 12345
|
333
|
+
|
334
|
+
|
335
|
+
|
329
336
|
// Read row lock
|
330
337
|
#define ROW_LOCK_X LOCK_SINGLE_NOWAIT
|
331
338
|
#define ROW_LOCK_S 5000 + LOCK_SINGLE_NOWAIT
|
@@ -403,6 +410,7 @@ enum combineType
|
|
403
410
|
#define STATUS_FIELDTYPE_NOTSUPPORT -42
|
404
411
|
#define STATUS_INVALID_NULLMODE -43
|
405
412
|
#define STATUS_TOO_LARGE_VALUE -44
|
413
|
+
#define STATUS_SQL_PARSE_ERROR -45
|
406
414
|
|
407
415
|
#define STATUS_SUCCESS 0
|
408
416
|
#define STATUS_PROGRAM_ERROR 1
|
@@ -585,7 +593,7 @@ struct handshale_t
|
|
585
593
|
If you change this version then you need change The ($TargetName) project options too.
|
586
594
|
*/
|
587
595
|
#define C_INTERFACE_VER_MAJOR "3"//##1 Build marker! Don't remove
|
588
|
-
#define C_INTERFACE_VER_MINOR "
|
596
|
+
#define C_INTERFACE_VER_MINOR "1"//##2 Build marker! Don't remove
|
589
597
|
#define C_INTERFACE_VER_RELEASE "0"//##3 Build marker! Don't remove
|
590
598
|
|
591
599
|
/* dnamic load library name.
|
@@ -649,7 +657,7 @@ struct handshale_t
|
|
649
657
|
*/
|
650
658
|
|
651
659
|
#define CPP_INTERFACE_VER_MAJOR "3"//##4 Build marker! Don't remove
|
652
|
-
#define CPP_INTERFACE_VER_MINOR "
|
660
|
+
#define CPP_INTERFACE_VER_MINOR "1"//##5 Build marker! Don't remove
|
653
661
|
#define CPP_INTERFACE_VER_RELEASE "0"//##6 Build marker! Don't remove
|
654
662
|
|
655
663
|
/* use autolink tdclcpp */
|
@@ -686,7 +694,7 @@ struct handshale_t
|
|
686
694
|
|
687
695
|
|
688
696
|
#define TRANSACTD_VER_MAJOR 3//##7 Build marker! Don't remove
|
689
|
-
#define TRANSACTD_VER_MINOR
|
697
|
+
#define TRANSACTD_VER_MINOR 1//##8 Build marker! Don't remove
|
690
698
|
#define TRANSACTD_VER_RELEASE 0//##9 Build marker! Don't remove
|
691
699
|
|
692
700
|
#endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
|
@@ -183,6 +183,20 @@ typedef unsigned __int32 char32_t; // 32bit
|
|
183
183
|
/* c c++ runtime library */
|
184
184
|
#include <tchar.h>
|
185
185
|
#if defined(__BORLANDC__) || defined(__MINGW32__)
|
186
|
+
# if defined(__MINGW32__)
|
187
|
+
# undef _ltow_s
|
188
|
+
# undef _ltoa_s
|
189
|
+
# undef _ltot_s
|
190
|
+
# undef _ultot_s
|
191
|
+
# undef _i64tot_s
|
192
|
+
# undef _i64toa_s
|
193
|
+
# undef _i64tow_s
|
194
|
+
# undef _ui64tot_s
|
195
|
+
# undef _ui64toa_s
|
196
|
+
# undef _ui64tow_s
|
197
|
+
# undef _strlwr_s
|
198
|
+
# undef _tcslwr_s
|
199
|
+
# endif //defined(__MINGW32__)
|
186
200
|
|
187
201
|
#define _ltow_s(A, B, C, D) _ltow(A, B, D)
|
188
202
|
#define _ltoa_s(A, B, C, D) _ltoa(A, B, D)
|
@@ -195,9 +209,9 @@ typedef unsigned __int32 char32_t; // 32bit
|
|
195
209
|
#define _ui64toa_s(A, B, C, D) _ui64toa(A, B, D)
|
196
210
|
#define _ui64tow_s(A, B, C, D) _ui64tow(A, B, D)
|
197
211
|
#define _strlwr_s(A, B) strlwr(A)
|
198
|
-
#ifndef _tcslwr_s
|
199
|
-
#define _tcslwr_s(A, B) _tcslwr(A)
|
200
|
-
#endif
|
212
|
+
# ifndef _tcslwr_s
|
213
|
+
# define _tcslwr_s(A, B) _tcslwr(A)
|
214
|
+
# endif
|
201
215
|
#endif
|
202
216
|
|
203
217
|
#if defined(__BORLANDC__)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*=================================================================
|
2
|
-
Copyright (C) 2015 BizStation Corp All rights reserved.
|
2
|
+
Copyright (C) 2015-2016 BizStation Corp All rights reserved.
|
3
3
|
|
4
4
|
This program is free software; you can redistribute it and/or
|
5
5
|
modify it under the terms of the GNU General Public License
|
@@ -31,6 +31,16 @@ var M_NOWAIT_LOCK = 400;
|
|
31
31
|
var CCURR_T_BIAS = 1000;
|
32
32
|
var trans_bias = S_NOWAIT_LOCK + CCURR_T_BIAS;
|
33
33
|
|
34
|
+
var MULTILOCK_NOGAP_SHARE = 0;
|
35
|
+
var MULTILOCK_GAP_SHARE = 2000;
|
36
|
+
var CONSISTENT_READ = 4000;
|
37
|
+
var CONSISTENT_READ_WITH_BINLOG_POS = 4200;
|
38
|
+
|
39
|
+
var REPL_POSTYPE_NONE = 0;
|
40
|
+
var REPL_POSTYPE_MARIA_GTID = 1;
|
41
|
+
var REPL_POSTYPE_POS = 2;
|
42
|
+
|
43
|
+
|
34
44
|
// field type
|
35
45
|
var ft_string = 0;
|
36
46
|
var ft_integer = 1;
|
@@ -252,6 +262,18 @@ function checkNotEqual(a, b, on)
|
|
252
262
|
}else
|
253
263
|
WScript.StdOut.Write(".");
|
254
264
|
}
|
265
|
+
/*--------------------------------------------------------------------------------*/
|
266
|
+
function checkNotNull(a, on)
|
267
|
+
{
|
268
|
+
if (a == null)
|
269
|
+
{
|
270
|
+
WScript.Echo("error null obkect on " + on );
|
271
|
+
return false;
|
272
|
+
}
|
273
|
+
WScript.StdOut.Write(".");
|
274
|
+
return true;
|
275
|
+
}
|
276
|
+
|
255
277
|
/*--------------------------------------------------------------------------------*/
|
256
278
|
function isX86()
|
257
279
|
{
|
@@ -317,6 +339,13 @@ function isMySQL5_5(db)
|
|
317
339
|
var ver = db.GetBtrVersion(1);
|
318
340
|
return (db.Stat == 0) && ((5 == ver.MajorVersion) && (5 == ver.MinorVersion));
|
319
341
|
}
|
342
|
+
/*--------------------------------------------------------------------------------*/
|
343
|
+
function isMariaDbWithGtid(db)
|
344
|
+
{
|
345
|
+
var ver = db.GetBtrVersion(1);
|
346
|
+
return (db.Stat == 0) && (ver.Type == MYSQL_TYPE_MARIA) && (10 == ver.MajorVersion);
|
347
|
+
}
|
348
|
+
|
320
349
|
/*--------------------------------------------------------------------------------*/
|
321
350
|
function isLegacyTimeFormat(db)
|
322
351
|
{
|
@@ -658,6 +687,23 @@ function test_decimal(fd)
|
|
658
687
|
checkEqual(fd.DefaultValue, '4');
|
659
688
|
}
|
660
689
|
|
690
|
+
function testBinlogPos(db)
|
691
|
+
{
|
692
|
+
var bpos = db.beginSnapshot(CONSISTENT_READ_WITH_BINLOG_POS);
|
693
|
+
if (checkNotNull(bpos, "beginSnapshot result "))
|
694
|
+
{
|
695
|
+
if (isMariaDbWithGtid(db))
|
696
|
+
checkEqual(bpos.type, REPL_POSTYPE_MARIA_GTID, "bpos.type");
|
697
|
+
else
|
698
|
+
checkEqual(bpos.type, REPL_POSTYPE_POS, "bpos.type");
|
699
|
+
checkNotEqual(bpos.pos, 0, "bpos.pos");
|
700
|
+
checkNotEqual(bpos.filename, "", "bpos.filename");
|
701
|
+
WScript.Echo("\nBinlog pos = " + bpos.filename + ":" + bpos.pos);
|
702
|
+
}
|
703
|
+
db.endSnapshot();
|
704
|
+
}
|
705
|
+
|
706
|
+
|
661
707
|
/*--------------------------------------------------------------------------------*/
|
662
708
|
function test(atu, ate, db)
|
663
709
|
{
|
@@ -944,6 +990,10 @@ function test(atu, ate, db)
|
|
944
990
|
test_bit(ate, db);
|
945
991
|
test_bitset();
|
946
992
|
test_decimal(ate.TableDef.FieldDef(0));
|
993
|
+
|
994
|
+
//binlogPos
|
995
|
+
testBinlogPos(db);
|
996
|
+
|
947
997
|
//WScript.Echo(" -- End Test -- ");
|
948
998
|
}
|
949
999
|
/*--------------------------------------------------------------------------------*/
|
@@ -951,12 +1001,20 @@ function main()
|
|
951
1001
|
{
|
952
1002
|
var isCreate = 1;
|
953
1003
|
var host = "localhost";
|
1004
|
+
var user = "root";
|
1005
|
+
var pwd = "";
|
1006
|
+
|
954
1007
|
if (WScript.arguments.length > 0)
|
955
1008
|
isCreate = parseInt(WScript.arguments(0), 10);
|
956
1009
|
|
957
1010
|
if (WScript.arguments.length > 1)
|
958
1011
|
host = WScript.arguments(1);
|
959
|
-
|
1012
|
+
if (WScript.arguments.length > 2)
|
1013
|
+
user = WScript.arguments(2);
|
1014
|
+
if (WScript.arguments.length > 3)
|
1015
|
+
pwd = WScript.arguments(3);
|
1016
|
+
|
1017
|
+
var URI = "tdap://" + user + "@" + host + "/test_v3?dbfile=test.bdf&pwd=" + pwd;
|
960
1018
|
|
961
1019
|
|
962
1020
|
WScript.Echo(URI);
|
@@ -2086,6 +2086,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2086
2086
|
$db->open(URL_VAR);
|
2087
2087
|
$this->assertEquals($db->stat(), 0);
|
2088
2088
|
}
|
2089
|
+
$db->close();
|
2089
2090
|
}
|
2090
2091
|
private function setGetVar($tb, $unicodeField, $varCharField)
|
2091
2092
|
{
|
@@ -2267,6 +2268,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2267
2268
|
$this->assertEquals($db->stat(), 0);
|
2268
2269
|
// utf8 varchar
|
2269
2270
|
$this->setGetVar($tb, true, true);
|
2271
|
+
$db->close();
|
2270
2272
|
}
|
2271
2273
|
private function doVarInsert($db, $name, $codePage, $str, $startid, $endid, $bulk)
|
2272
2274
|
{
|
@@ -2321,6 +2323,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2321
2323
|
$this->doVarInsert($db, 'user4', Bz\transactd::CP_ACP, '', $startid, $endid, $bulk);
|
2322
2324
|
$this->doVarInsert($db, 'user5', Bz\transactd::CP_UTF8, '', $startid, $endid, $bulk);
|
2323
2325
|
}
|
2326
|
+
$db->close();
|
2324
2327
|
}
|
2325
2328
|
private function doVarRead($db, $name, $codePage, $str, $num, $ky)
|
2326
2329
|
{
|
@@ -2383,6 +2386,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2383
2386
|
$this->doVarRead($db, 'user4', Bz\transactd::CP_ACP, '120', 120, $ky);
|
2384
2387
|
$this->doVarRead($db, 'user5', Bz\transactd::CP_UTF8, '120', 120, $ky);
|
2385
2388
|
}
|
2389
|
+
$db->close();
|
2386
2390
|
}
|
2387
2391
|
private function doVarFilter($db, $name, $codePage, $str, $num, $ky)
|
2388
2392
|
{
|
@@ -2472,6 +2476,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2472
2476
|
$this->doVarFilter($db, 'user4', Bz\transactd::CP_ACP, '120', 120, $ky);
|
2473
2477
|
$this->doVarFilter($db, 'user5', Bz\transactd::CP_UTF8, '120', 120, $ky);
|
2474
2478
|
}
|
2479
|
+
$db->close();
|
2475
2480
|
}
|
2476
2481
|
public function testDropDatabaseVar()
|
2477
2482
|
{
|
@@ -2480,6 +2485,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2480
2485
|
$this->assertEquals($db->stat(), 0);
|
2481
2486
|
$db->drop();
|
2482
2487
|
$this->assertEquals($db->stat(), 0);
|
2488
|
+
$db->close();
|
2483
2489
|
}
|
2484
2490
|
|
2485
2491
|
//-----------------------------------------------------
|
@@ -2753,6 +2759,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2753
2759
|
else
|
2754
2760
|
$this->doTestStringFilter($db, 2, 'myvarchar', Bz\transactd::ft_myvarchar, Bz\transactd::ft_myvarchar);
|
2755
2761
|
$this->doTestStringFilter($db, 3, 'mytext', Bz\transactd::ft_mytext, Bz\transactd::ft_myblob);
|
2762
|
+
$db->close();
|
2756
2763
|
}
|
2757
2764
|
|
2758
2765
|
public function testDropDatabaseStringFilter()
|
@@ -2762,6 +2769,7 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
2762
2769
|
$this->assertEquals($db->stat(), 0);
|
2763
2770
|
$db->drop();
|
2764
2771
|
$this->assertEquals($db->stat(), 0);
|
2772
|
+
$db->close();
|
2765
2773
|
}
|
2766
2774
|
|
2767
2775
|
public function testQuery()
|
@@ -52,9 +52,9 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
52
52
|
{
|
53
53
|
private function dropDatabase($db, $url)
|
54
54
|
{
|
55
|
-
|
56
|
-
|
57
|
-
$db->drop();
|
55
|
+
//$db->open($url);
|
56
|
+
//$this->assertEquals($db->stat(), 0);
|
57
|
+
$db->drop($url);
|
58
58
|
$this->assertEquals($db->stat(), 0);
|
59
59
|
}
|
60
60
|
private function createDatabase($db, $url)
|
@@ -64,6 +64,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
64
64
|
{
|
65
65
|
$this->dropDatabase($db, $url);
|
66
66
|
$db->create($url);
|
67
|
+
$this->assertEquals($db->stat(), 0);
|
67
68
|
}
|
68
69
|
$this->assertEquals($db->stat(), 0);
|
69
70
|
}
|
@@ -145,6 +146,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
145
146
|
$this->openDatabase($db, URL);
|
146
147
|
$this->createTable($db, 1, TABLENAME);
|
147
148
|
$tb = $this->openTable($db, TABLENAME);
|
149
|
+
$db->close();
|
148
150
|
}
|
149
151
|
public function testInsert()
|
150
152
|
{
|
@@ -176,6 +178,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
176
178
|
$tb->setFV(FDI_IMAGE, $str, strlen($str));
|
177
179
|
$tb->insert();
|
178
180
|
$this->assertEquals($tb->stat(), 0);
|
181
|
+
$db->close();
|
179
182
|
}
|
180
183
|
public function testSeek()
|
181
184
|
{
|
@@ -210,6 +213,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
210
213
|
$this->assertEquals($tb->getFVint(FDI_USER_ID), 1);
|
211
214
|
$this->assertEquals($tb->getFVstr(FDI_BODY), "2\ntest\nテスト\n\nあいうえおあいうえお");
|
212
215
|
$this->assertEquals($tb->getFVbin(FDI_IMAGE), "2\ntest\nテスト\n\nあいうえおあいうえお");
|
216
|
+
$db->close();
|
213
217
|
}
|
214
218
|
public function testFind()
|
215
219
|
{
|
@@ -237,6 +241,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
237
241
|
// 3... but not found because filtered
|
238
242
|
$tb->findNext(true);
|
239
243
|
$this->assertEquals($tb->stat(), Bz\transactd::STATUS_EOF);
|
244
|
+
$db->close();
|
240
245
|
}
|
241
246
|
public function testUpdate()
|
242
247
|
{
|
@@ -274,6 +279,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
274
279
|
$this->assertEquals($tb->getFVint(FDI_ID), 2);
|
275
280
|
$this->assertEquals($tb->getFVint(FDI_USER_ID), 1);
|
276
281
|
$this->assertEquals($tb->getFVstr(FDI_BODY), "2\nテスト\ntest\n\nABCDEFG");
|
282
|
+
$db->close();
|
277
283
|
}
|
278
284
|
public function testDelete()
|
279
285
|
{
|
@@ -303,6 +309,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
303
309
|
// eof
|
304
310
|
$tb->seekNext();
|
305
311
|
$this->assertEquals($tb->stat(), Bz\transactd::STATUS_EOF);
|
312
|
+
$db->close();
|
306
313
|
}
|
307
314
|
public function testRecord()
|
308
315
|
{
|
@@ -316,6 +323,7 @@ class transactdBlobTest extends PHPUnit_Framework_TestCase
|
|
316
323
|
$this->assertEquals(count($rs), 1);
|
317
324
|
$f = $rs[0]->getField(FDI_IMAGE);
|
318
325
|
$this->assertEquals($f->getBin(), $image);
|
326
|
+
$db->close();
|
319
327
|
}
|
320
328
|
public function testDrop()
|
321
329
|
{
|
@@ -46,7 +46,7 @@ define("DBNAME", "test_v3");
|
|
46
46
|
define("TABLENAME", "user");
|
47
47
|
define("PROTOCOL", "tdap://");
|
48
48
|
define("BDFNAME", "?dbfile=test.bdf");
|
49
|
-
define("
|
49
|
+
define("URI", PROTOCOL . USERPART . HOSTNAME . DBNAME . BDFNAME . PASSPART);
|
50
50
|
|
51
51
|
// multi thread test if `php_pthreads` exists.
|
52
52
|
if(class_exists('Thread')){
|
@@ -58,7 +58,7 @@ if(class_exists('Thread')){
|
|
58
58
|
}
|
59
59
|
public function run()
|
60
60
|
{
|
61
|
-
$dbm = new bz\pooledDbManager(new bz\connectParams(
|
61
|
+
$dbm = new bz\pooledDbManager(new bz\connectParams(URI));
|
62
62
|
$tb = $dbm->table('user');
|
63
63
|
$tb->setFV(FDI_ID, 300000);
|
64
64
|
$tb->seekLessThan(false, bz\transactd::ROW_LOCK_X);
|
@@ -78,24 +78,25 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
78
78
|
{
|
79
79
|
private function dropDatabase($db)
|
80
80
|
{
|
81
|
-
|
82
|
-
|
83
|
-
$db->
|
81
|
+
// Version 3.1 or later is support drop by uri.
|
82
|
+
//$db->open(URI);
|
83
|
+
//$this->assertEquals($db->stat(), 0);
|
84
|
+
$db->drop(URI);
|
84
85
|
$this->assertEquals($db->stat(), 0);
|
85
86
|
}
|
86
87
|
private function createDatabase($db)
|
87
88
|
{
|
88
|
-
$db->create(
|
89
|
+
$db->create(URI);
|
89
90
|
if ($db->stat() == bz\transactd::STATUS_TABLE_EXISTS_ERROR)
|
90
91
|
{
|
91
92
|
$this->dropDatabase($db);
|
92
|
-
$db->create(
|
93
|
+
$db->create(URI);
|
93
94
|
}
|
94
95
|
$this->assertEquals($db->stat(), 0);
|
95
96
|
}
|
96
97
|
private function openDatabase($db)
|
97
98
|
{
|
98
|
-
return $db->open(
|
99
|
+
return $db->open(URI, bz\transactd::TYPE_SCHEMA_BDF, bz\transactd::TD_OPEN_NORMAL);
|
99
100
|
}
|
100
101
|
private function isMySQL5_5($db)
|
101
102
|
{
|
@@ -106,6 +107,15 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
106
107
|
((5 == $server_ver->majorVersion) &&
|
107
108
|
(5 == $server_ver->minorVersion));
|
108
109
|
}
|
110
|
+
private function isMariaDBWithGtid($db)
|
111
|
+
{
|
112
|
+
$vv = new bz\btrVersions();
|
113
|
+
$db->getBtrVersion($vv);
|
114
|
+
$server_ver = $vv->version(1);
|
115
|
+
return ($db->stat() == 0) &&
|
116
|
+
(10 == $server_ver->majorVersion) &&
|
117
|
+
($server_ver->type == bz\transactd::MYSQL_TYPE_MARIA);
|
118
|
+
}
|
109
119
|
private function isLegacyTimeFormat($db)
|
110
120
|
{
|
111
121
|
$vv = new bz\btrVersions();
|
@@ -740,4 +750,18 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
740
750
|
$fd->setDefaultValue($bits1);
|
741
751
|
$this->assertEquals($fd->defaultValue(), '4');
|
742
752
|
}
|
753
|
+
public function test_snapshot()
|
754
|
+
{
|
755
|
+
$db = new bz\database();
|
756
|
+
$this->openDatabase($db);
|
757
|
+
$bpos = $db->beginSnapshot(bz\transactd::CONSISTENT_READ_WITH_BINLOG_POS);
|
758
|
+
if ($this->isMariaDBWithGtid($db))
|
759
|
+
$this->assertEquals($bpos->type, bz\transactd::REPL_POSTYPE_MARIA_GTID);
|
760
|
+
else
|
761
|
+
$this->assertEquals($bpos->type, bz\transactd::REPL_POSTYPE_POS);
|
762
|
+
$this->assertNotEquals($bpos->pos, 0);
|
763
|
+
$this->assertNotEquals($bpos->filename, "");
|
764
|
+
echo PHP_EOL.'binlog pos = '.$bpos->filename.':'.$bpos->pos.PHP_EOL;
|
765
|
+
$db->endSnapshot();
|
766
|
+
}
|
743
767
|
}
|
@@ -125,8 +125,8 @@ def Read(db, tb, start, endid, shapshot)
|
|
125
125
|
for i in start..(endid - 1) do
|
126
126
|
tb.setFV(FN_ID, i)
|
127
127
|
tb.seek()
|
128
|
-
if ((tb.stat() != 0) || (tb.
|
129
|
-
puts("GetEqual Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.
|
128
|
+
if ((tb.stat() != 0) || (tb.getFVint(FN_ID) != i))
|
129
|
+
puts("GetEqual Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.getFVint(FN_ID).to_s}")
|
130
130
|
ret = false
|
131
131
|
break
|
132
132
|
end
|
@@ -151,8 +151,8 @@ def Reads(db, tb, start, endid, unit, shapshot)
|
|
151
151
|
while (en != endid)
|
152
152
|
en = st + unit
|
153
153
|
for i in st..(en - 1) do
|
154
|
-
if (tb.
|
155
|
-
puts("findNext Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.
|
154
|
+
if (tb.getFVint(FN_ID) != i)
|
155
|
+
puts("findNext Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.getFVint(FN_ID).to_s}")
|
156
156
|
ret = false
|
157
157
|
break
|
158
158
|
end
|
@@ -220,7 +220,7 @@ def createTestDataBase(db, uri)
|
|
220
220
|
fd = dbdef.insertField(td.id, 1)
|
221
221
|
fd.setName('name')
|
222
222
|
fd.type = Transactd::Ft_myvarchar
|
223
|
-
fd.
|
223
|
+
fd.setLenByCharnum(20)
|
224
224
|
dbdef.updateTableDef(td.id)
|
225
225
|
|
226
226
|
kd = dbdef.insertKey(td.id, 0)
|
@@ -295,9 +295,9 @@ def main(argv)
|
|
295
295
|
if (!db.open(uri, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL, '', ''))
|
296
296
|
puts("open table erorr No:#{db.stat().to_s}")
|
297
297
|
else
|
298
|
-
tb = openTable(db, '
|
298
|
+
tb = openTable(db, 'user', Transactd::TD_OPEN_NORMAL)
|
299
299
|
if tb == nil
|
300
|
-
puts "can not open table '
|
300
|
+
puts "can not open table 'user'"
|
301
301
|
db.close()
|
302
302
|
return
|
303
303
|
end
|
@@ -1489,6 +1489,14 @@ def testConflict()
|
|
1489
1489
|
db.close()
|
1490
1490
|
end
|
1491
1491
|
|
1492
|
+
def isMySQL5_7(db)
|
1493
|
+
vv = Transactd::BtrVersions.new()
|
1494
|
+
db.getBtrVersion(vv)
|
1495
|
+
return (db.stat() == 0) &&
|
1496
|
+
((vv.version(1).majorVersion == 5) &&
|
1497
|
+
(vv.version(1).minorVersion == 7))
|
1498
|
+
end
|
1499
|
+
|
1492
1500
|
def testExclusive()
|
1493
1501
|
# db mode exclusive
|
1494
1502
|
db = Transactd::Database.new()
|
@@ -1507,6 +1515,10 @@ def testExclusive()
|
|
1507
1515
|
db2.open(URL, Transactd::TYPE_SCHEMA_BDF)
|
1508
1516
|
# database open error. Check database::stat()
|
1509
1517
|
expect(db2.stat()).to eq Transactd::STATUS_CANNOT_LOCK_TABLE
|
1518
|
+
dd = db.dbDef()
|
1519
|
+
td = dd.tableDefs(1)
|
1520
|
+
dd.updateTableDef(1)
|
1521
|
+
expect(dd.stat()).to eq 0
|
1510
1522
|
tb.close()
|
1511
1523
|
db.close()
|
1512
1524
|
db2.close()
|
@@ -1519,15 +1531,24 @@ def testExclusive()
|
|
1519
1531
|
tb = db.openTable(TABLENAME, Transactd::TD_OPEN_READONLY_EXCLUSIVE)
|
1520
1532
|
expect(db.stat()).to eq 0
|
1521
1533
|
|
1534
|
+
# read mysql version
|
1535
|
+
mySQL5_7 = isMySQL5_7(db)
|
1536
|
+
|
1522
1537
|
# Read only open
|
1523
1538
|
db2.open(URL, Transactd::TYPE_SCHEMA_BDF)
|
1524
1539
|
expect(db2.stat()).to eq 0
|
1525
1540
|
db2.close()
|
1526
1541
|
|
1527
1542
|
# Normal open
|
1543
|
+
# Since MySQL 5.7 : D_OPEN_READONLY_EXCLUSIVE + TD_OPEN_NORMAL is fail,
|
1544
|
+
# It's correct.
|
1528
1545
|
db2.connect(URL_DB, true)
|
1529
1546
|
db2.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
|
1530
|
-
|
1547
|
+
if (mySQL5_7)
|
1548
|
+
expect(db2.stat()).to eq Transactd::STATUS_CANNOT_LOCK_TABLE
|
1549
|
+
else
|
1550
|
+
expect(db2.stat()).to eq 0
|
1551
|
+
end
|
1531
1552
|
db2.close()
|
1532
1553
|
|
1533
1554
|
# Write Exclusive open
|
@@ -111,9 +111,10 @@ INSERT_SEB_TABLE_SQL = <<'EOS'
|
|
111
111
|
EOS
|
112
112
|
|
113
113
|
def dropDatabase(db)
|
114
|
-
db.open(URL)
|
115
|
-
expect(db.stat()).to eq 0
|
116
|
-
db.drop()
|
114
|
+
#db.open(URL)
|
115
|
+
#expect(db.stat()).to eq 0
|
116
|
+
#db.drop()
|
117
|
+
db.drop(URL)
|
117
118
|
expect(db.stat()).to eq 0
|
118
119
|
end
|
119
120
|
|
@@ -143,6 +144,16 @@ def isMySQL5_5(db)
|
|
143
144
|
(5 == server_ver.minorVersion)
|
144
145
|
end
|
145
146
|
|
147
|
+
def isMariaDBWithGtid(db)
|
148
|
+
vv = Transactd::BtrVersions.new()
|
149
|
+
db.getBtrVersion(vv)
|
150
|
+
server_ver = vv.version(1)
|
151
|
+
return (db.stat() == 0) &&
|
152
|
+
(10 == server_ver.majorVersion) &&
|
153
|
+
(server_ver.type == Transactd::MYSQL_TYPE_MARIA)
|
154
|
+
end
|
155
|
+
|
156
|
+
|
146
157
|
def isLegacyTimeFormat(db)
|
147
158
|
vv = Transactd::BtrVersions.new()
|
148
159
|
db.getBtrVersion(vv)
|
@@ -745,4 +756,19 @@ describe Transactd, 'V3Features' do
|
|
745
756
|
ats.release()
|
746
757
|
db.close()
|
747
758
|
end
|
759
|
+
it 'snapshot' do
|
760
|
+
db = Transactd::Database.new()
|
761
|
+
openDatabase(db)
|
762
|
+
bpos = db.beginSnapshot(Transactd::CONSISTENT_READ_WITH_BINLOG_POS)
|
763
|
+
if (isMariaDBWithGtid(db))
|
764
|
+
expect(bpos.type).to eq Transactd::REPL_POSTYPE_MARIA_GTID
|
765
|
+
else
|
766
|
+
expect(bpos.type).to eq Transactd::REPL_POSTYPE_POS
|
767
|
+
end
|
768
|
+
expect(bpos.pos).not_to eq 0
|
769
|
+
expect(bpos.filename).not_to eq ""
|
770
|
+
print "\nbinlog pos = ", bpos.filename, ":", bpos.pos, "\n"
|
771
|
+
db.endSnapshot();
|
772
|
+
db.close()
|
773
|
+
end
|
748
774
|
end
|
@@ -3300,6 +3300,40 @@ void testCompDecimal()
|
|
3300
3300
|
|
3301
3301
|
}
|
3302
3302
|
|
3303
|
+
void testSnapshotWithbinlog()
|
3304
|
+
{
|
3305
|
+
nsdatabase::setCheckTablePtr(true);
|
3306
|
+
database_ptr db = createDatabaseObject();
|
3307
|
+
openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF,TD_OPEN_READONLY);
|
3308
|
+
BOOST_CHECK(db->stat() == 0);
|
3309
|
+
table* tb = db->openTable(1, TD_OPEN_READONLY);
|
3310
|
+
BOOST_CHECK(db->stat() == 0);
|
3311
|
+
|
3312
|
+
btrVersions vs;
|
3313
|
+
db->getBtrVersion(&vs);
|
3314
|
+
BOOST_CHECK(db->stat() == 0);
|
3315
|
+
btrVersion ver = vs.versions[1];
|
3316
|
+
|
3317
|
+
binlogPos bpos;
|
3318
|
+
db->beginSnapshot(CONSISTENT_READ_WITH_BINLOG_POS, &bpos);
|
3319
|
+
BOOST_CHECK_MESSAGE(db->stat() == 0, "stat = " << db->stat());
|
3320
|
+
BOOST_CHECK(strlen(bpos.filename) >= 5);
|
3321
|
+
BOOST_CHECK(bpos.pos != 0);
|
3322
|
+
if (ver.isMariaDB() && ver.majorVersion > 5)
|
3323
|
+
{
|
3324
|
+
BOOST_CHECK(bpos.type == REPL_POSTYPE_MARIA_GTID);
|
3325
|
+
BOOST_CHECK(strlen(bpos.gtid) >= 5);
|
3326
|
+
}
|
3327
|
+
else
|
3328
|
+
BOOST_CHECK(bpos.type == REPL_POSTYPE_POS);
|
3329
|
+
|
3330
|
+
//Test invalid close
|
3331
|
+
tb->close();
|
3332
|
+
BOOST_CHECK(tb->stat() == STATUS_ALREADY_INSNAPSHOT);
|
3333
|
+
|
3334
|
+
db->endSnapshot();
|
3335
|
+
}
|
3336
|
+
|
3303
3337
|
#pragma warning(default : 4996)
|
3304
3338
|
|
3305
3339
|
#endif // BZS_TEST_TRDCLENGN_TESTFIELD_H
|