transactd 3.0.0 → 3.1.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_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
|