transactd 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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