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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_3_1.dll +0 -0
  3. data/bin/common/tdclc_64_3_1.dll +0 -0
  4. data/build/common/transactd.rc.in +1 -1
  5. data/build/swig/ruby/tdclrb_wrap.cpp +219 -15
  6. data/build/swig/tdcl.i +26 -0
  7. data/build/tdclc/tdclc.cbproj +1 -1
  8. data/build/tdclc/tdclc.rc +5 -5
  9. data/build/tdclcpp/tdclcpp.rc +5 -5
  10. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  11. data/build/tdclrb/tdclrb.rc +5 -5
  12. data/source/bzs/db/engine/mysql/database.cpp +131 -29
  13. data/source/bzs/db/engine/mysql/database.h +8 -6
  14. data/source/bzs/db/engine/mysql/dbManager.cpp +30 -12
  15. data/source/bzs/db/engine/mysql/dbManager.h +1 -1
  16. data/source/bzs/db/engine/mysql/mysqlInternal.h +251 -24
  17. data/source/bzs/db/engine/mysql/mysqlThd.cpp +2 -3
  18. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +2 -2
  19. data/source/bzs/db/protocol/tdap/client/client.h +4 -3
  20. data/source/bzs/db/protocol/tdap/client/connMgr.h +1 -1
  21. data/source/bzs/db/protocol/tdap/client/database.cpp +195 -91
  22. data/source/bzs/db/protocol/tdap/client/database.h +6 -6
  23. data/source/bzs/db/protocol/tdap/client/databaseManager.h +9 -3
  24. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +31 -25
  25. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -2
  26. data/source/bzs/db/protocol/tdap/client/field.cpp +6 -16
  27. data/source/bzs/db/protocol/tdap/client/filter.h +28 -9
  28. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +14 -4
  29. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +20 -2
  30. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +5 -2
  31. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +2 -1
  32. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -16
  33. data/source/bzs/db/protocol/tdap/client/table.cpp +2 -1
  34. data/source/bzs/db/protocol/tdap/client/table.h +1 -1
  35. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -9
  36. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +68 -21
  37. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +3 -7
  38. data/source/bzs/db/protocol/tdap/tdapSchema.h +9 -1
  39. data/source/bzs/db/protocol/tdap/tdapcapi.h +11 -3
  40. data/source/bzs/db/protocol/tdap/uri.h +3 -1
  41. data/source/bzs/env/crosscompile.h +17 -3
  42. data/source/bzs/test/tdclatl/test_v3.js +60 -2
  43. data/source/bzs/test/tdclphp/transactd_Test.php +8 -0
  44. data/source/bzs/test/tdclphp/transactd_blob_Test.php +11 -3
  45. data/source/bzs/test/tdclphp/transactd_v3_Test.php +32 -8
  46. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +7 -7
  47. data/source/bzs/test/tdclrb/transactd_spec.rb +22 -1
  48. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +29 -3
  49. data/source/bzs/test/trdclengn/testField.h +34 -0
  50. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +7 -0
  51. data/source/bzs/test/trdclengn/test_trdclengn.cpp +7 -8
  52. data/source/global/tdclatl/Database.cpp +34 -10
  53. data/source/global/tdclatl/Database.h +5 -5
  54. data/source/global/tdclatl/PooledDbManager.cpp +20 -3
  55. data/source/global/tdclatl/PooledDbManager.h +2 -2
  56. data/source/global/tdclatl/_IDatabaseEvents_CP.h +5 -4
  57. data/source/global/tdclatl/tdclatl.idl +157 -119
  58. metadata +4 -4
  59. data/bin/common/tdclc_32_3_0.dll +0 -0
  60. 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 != 0x00)
812
- return false;
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 ((fd.len == 1) && (fd.type == ft_logical) && fd.nullValue == 0x00);
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 int maxVarDatalen() const
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 "0"//##2 Build marker! Don't remove
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 "0"//##5 Build marker! Don't remove
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 0//##8 Build marker! Don't remove
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
@@ -49,8 +49,10 @@ inline const _TCHAR* protocol(const _TCHAR* uri)
49
49
  else
50
50
  {
51
51
  st = _tcsstr(uri, _T("btrv://"));
52
- return _T("btrv");
52
+ if (st)
53
+ return _T("btrv");
53
54
  }
55
+ return NULL;
54
56
  }
55
57
 
56
58
  inline void endPoint(const _TCHAR* uri,
@@ -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
- var URI = "tdap://" + host + "/test_v3?dbfile=test.bdf";
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
- $db->open($url);
56
- $this->assertEquals($db->stat(), 0);
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("URL", PROTOCOL . USERPART . HOSTNAME . DBNAME . BDFNAME . PASSPART);
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(URL));
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
- $db->open(URL);
82
- $this->assertEquals($db->stat(), 0);
83
- $db->drop();
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(URL);
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(URL);
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(URL, bz\transactd::TYPE_SCHEMA_BDF, bz\transactd::TD_OPEN_NORMAL);
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.getFVlng(FN_ID) != i))
129
- puts("GetEqual Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.getFVlng(FN_ID).to_s}")
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.getFVlng(FN_ID) != i)
155
- puts("findNext Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.getFVlng(FN_ID).to_s}")
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.len = 100
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, 'users', Transactd::TD_OPEN_NORMAL)
298
+ tb = openTable(db, 'user', Transactd::TD_OPEN_NORMAL)
299
299
  if tb == nil
300
- puts "can not open table 'users'"
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
- expect(db2.stat()).to eq 0
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