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
@@ -221,10 +221,12 @@ extern "C" PACKAGE_OSX short_td __STDCALL
221
221
  case TD_END_TRANSACTION:
222
222
  case TD_BEGIN_TRANSACTION:
223
223
  case TD_ABORT_TRANSACTION:
224
- case TD_BEGIN_SHAPSHOT:
225
224
  case TD_END_SNAPSHOT:
226
225
  client_t->req().paramMask = 0;
227
226
  break;
227
+ case TD_BEGIN_SHAPSHOT:
228
+ client_t->req().paramMask = P_MASK_DATALEN | P_MASK_DATA;
229
+ break;
228
230
  case TD_KEY_FIRST:
229
231
  case TD_KEY_LAST:
230
232
  case TD_KEY_FIRST_KO:
@@ -273,7 +275,7 @@ extern "C" PACKAGE_OSX short_td __STDCALL
273
275
  if (client_t->req().keyNum == ST_SUB_GETSQL_BY_TABLEDEF)
274
276
  {
275
277
  client_t->req().result = 0;
276
- client_t->getSqlCreate();
278
+ client_t->getSqlCreate(CHARSET_UTF8);
277
279
  client_t->cleanup();
278
280
  return client_t->req().result;
279
281
  }
@@ -867,6 +867,7 @@ void field::storeValueDbl(double value)
867
867
  void field::storeValueStrA(const char* data)
868
868
  {
869
869
  char* p = (char*)m_ptr + m_fd->pos;
870
+ m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
870
871
  switch (m_fd->type)
871
872
  {
872
873
  case ft_string:
@@ -910,6 +911,7 @@ void field::storeValueStrA(const char* data)
910
911
  const char* field::readValueStrA() const
911
912
  {
912
913
  char* data = (char*)m_ptr + m_fd->pos;
914
+ m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
913
915
  switch (m_fd->type)
914
916
  {
915
917
  case ft_string:
@@ -957,6 +959,7 @@ const char* field::readValueStrA() const
957
959
  void field::storeValueStrW(const WCHAR* data)
958
960
  {
959
961
  char* p = (char*)m_ptr + m_fd->pos;
962
+ m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
960
963
  switch (m_fd->type)
961
964
  {
962
965
  case ft_string:
@@ -1003,6 +1006,7 @@ void field::storeValueStrW(const WCHAR* data)
1003
1006
  const WCHAR* field::readValueStrW() const
1004
1007
  {
1005
1008
  char* data = (char*)m_ptr + m_fd->pos;
1009
+ m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
1006
1010
  switch (m_fd->type)
1007
1011
  {
1008
1012
  case ft_string:
@@ -1727,6 +1731,7 @@ void field::setFV(const void* data, uint_td size)
1727
1731
  case ft_mywvarbinary:
1728
1732
  case ft_mywvarchar:
1729
1733
  case ft_lstring:
1734
+ case ft_lvar:
1730
1735
  {
1731
1736
  int sizeByte = m_fd->varLenBytes();
1732
1737
  size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
@@ -1746,15 +1751,6 @@ void field::setFV(const void* data, uint_td size)
1746
1751
  memcpy(p + sizeByte, &data, sizeof(char*));
1747
1752
  break;
1748
1753
  }
1749
- case ft_lvar:
1750
- {
1751
- int sizeByte = 2;
1752
- size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
1753
- memset(p, 0, m_fd->len);
1754
- memcpy(p, &size, sizeByte);
1755
- memcpy(p + sizeByte, data, size);
1756
- break;
1757
- }
1758
1754
  default:
1759
1755
  size = std::min<uint_td>((uint_td)m_fd->len, size);
1760
1756
  memset(p, 0, m_fd->len);
@@ -2134,6 +2130,7 @@ void* field::getFVbin(uint_td& size) const
2134
2130
  case ft_mywvarbinary:
2135
2131
  case ft_mywvarchar:
2136
2132
  case ft_lstring:
2133
+ case ft_lvar:
2137
2134
  {
2138
2135
  int sizeByte = m_fd->varLenBytes();
2139
2136
  size = 0;
@@ -2155,13 +2152,6 @@ void* field::getFVbin(uint_td& size) const
2155
2152
  }
2156
2153
  return NULL;
2157
2154
  }
2158
- case ft_lvar:
2159
- {
2160
- int sizeByte = 2;
2161
- size = 0;
2162
- memcpy(&size, p, sizeByte);
2163
- return (void*)(p + sizeByte);
2164
- }
2165
2155
  default:
2166
2156
  size = m_fd->len;
2167
2157
  return (void*)(p);
@@ -571,6 +571,8 @@ class filter
571
571
  uchar_td* m_buftmp;
572
572
 
573
573
  int m_extendBuflen;
574
+ int m_limitRows;
575
+ int m_readedRows;
574
576
  short m_stat;
575
577
  ushort_td m_preparedId;
576
578
  table::eFindType m_direction;
@@ -638,8 +640,8 @@ class filter
638
640
  m_selectFieldIndexes.push_back(fieldNum);
639
641
  bsize.select += r.size();
640
642
  bsize.retRowSize += r.len;
641
-
642
- if (m_tb->tableDef()->fieldDefs[fieldNum].isNullable())
643
+ const fielddef& fd = m_tb->tableDef()->fieldDefs[fieldNum];
644
+ if (fd.nullbytes() && fd.isNullable())
643
645
  {
644
646
  ++bsize.nullfields;
645
647
  bsize.nullbytes = (bsize.nullfields + 7) / 8;
@@ -838,7 +840,9 @@ class filter
838
840
  m_withBookmark = q->isBookmarkAlso();
839
841
  m_cachedOptimize = q->getOptimize();
840
842
  m_stopAtLimit = q->isStopAtLimit();
841
- m_seekByBookmarks = q->isSeekByBookmarks();
843
+ m_limitRows = m_stopAtLimit ? q->getLimit() : 0;
844
+ m_readedRows = 0;
845
+ m_seekByBookmarks = q->isSeekByBookmarks();
842
846
 
843
847
  if (q->isAll())
844
848
  addAllFields();
@@ -958,7 +962,9 @@ class filter
958
962
  m_ret.maxRows =
959
963
  (unsigned short)std::min<int>(calcMaxResultRows(), USHRT_MAX);
960
964
  else if (resultBufferNeedSize() > maxDataBuffer())
961
- m_ret.maxRows = calcMaxResultRows();
965
+ m_ret.maxRows = calcMaxResultRows();
966
+ if (m_stopAtLimit && (m_limitRows - m_readedRows < m_ret.maxRows))
967
+ m_ret.maxRows = m_limitRows - m_readedRows;
962
968
  }
963
969
 
964
970
  return len;
@@ -974,7 +980,6 @@ class filter
974
980
  return true;
975
981
  }
976
982
 
977
-
978
983
  int doWriteBuffer()
979
984
  {
980
985
  #ifdef _DEBUG
@@ -1016,10 +1021,11 @@ class filter
1016
1021
 
1017
1022
 
1018
1023
  filter(table* tb)
1019
- : m_tb(tb), m_seeksWritedCount(0), m_extendBuflen(0), m_stat(0),
1020
- m_preparedId(0),m_ignoreFields(false), m_seeksMode(false),
1021
- m_useOptimize(true),m_withBookmark(true), m_hasManyJoin(false),
1022
- m_preparingMode(false),m_ddba(false),m_stopAtLimit(false)
1024
+ : m_tb(tb), m_seeksWritedCount(0), m_extendBuflen(0),
1025
+ m_limitRows(0), m_readedRows(0), m_stat(0),
1026
+ m_preparedId(0), m_ignoreFields(false), m_seeksMode(false),
1027
+ m_useOptimize(true), m_withBookmark(true), m_hasManyJoin(false),
1028
+ m_preparingMode(false), m_ddba(false), m_stopAtLimit(false)
1023
1029
  {
1024
1030
  m_isTransactd = m_tb->isUseTransactd();
1025
1031
  m_ddba = m_isTransactd;
@@ -1045,6 +1051,8 @@ public:
1045
1051
  m_preparingMode = false;
1046
1052
  m_preparedId = 0;
1047
1053
  m_stat = 0;
1054
+ m_limitRows = 0;
1055
+ m_readedRows = 0;
1048
1056
  bsize.clear();
1049
1057
  }
1050
1058
 
@@ -1345,6 +1353,17 @@ public:
1345
1353
 
1346
1354
  bool withBookmark() const { return m_withBookmark; }
1347
1355
 
1356
+ bool isReadLimit(int readed)
1357
+ {
1358
+ if (m_stopAtLimit)
1359
+ {
1360
+ m_readedRows += readed;
1361
+ return (m_limitRows - m_readedRows <= 0);
1362
+ }
1363
+ return false;
1364
+ }
1365
+ void resetReaded() { m_readedRows = 0;}
1366
+
1348
1367
  static filter* create(table* tb)
1349
1368
  {
1350
1369
  return new filter(tb);
@@ -1,5 +1,5 @@
1
1
  /* =================================================================
2
- Copyright (C) 2000-2013 BizStation Corp All rights reserved.
2
+ Copyright (C) 2000-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
@@ -546,6 +546,7 @@ bool nsdatabase::findTable(nstable* tb)
546
546
  void nsdatabase::reset()
547
547
  {
548
548
  int i;
549
+ resetSnapshot();
549
550
 
550
551
  if (m_nsimpl->tranCount)
551
552
  {
@@ -592,11 +593,21 @@ void nsdatabase::reset()
592
593
  m_btrcallid = getBtrvEntryPoint();
593
594
  }
594
595
 
595
- void nsdatabase::beginSnapshot(short bias)
596
+ void nsdatabase::resetSnapshot()
597
+ {
598
+ if (m_nsimpl->snapShotCount)
599
+ {
600
+ m_nsimpl->snapShotCount = 1;
601
+ endSnapshot();
602
+ }
603
+ }
604
+
605
+ void nsdatabase::beginSnapshot(short bias, binlogPos* bpos)
596
606
  {
597
607
  if (m_nsimpl->snapShotCount == 0)
598
608
  {
599
- m_stat = m_btrcallid(TD_BEGIN_SHAPSHOT + bias, NULL, NULL, NULL, NULL, 0, 0,
609
+ uint_td datalen = (bias == CONSISTENT_READ_WITH_BINLOG_POS) ? sizeof(binlogPos) : 0;
610
+ m_stat = m_btrcallid(TD_BEGIN_SHAPSHOT + bias, NULL, bpos, &datalen, NULL, 0, 0,
600
611
  m_nsimpl->cidPtr);
601
612
  #ifdef TEST_RECONNECT
602
613
  if (canRecoverNetError(m_stat))
@@ -780,7 +791,6 @@ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
780
791
  m_stat = 0;
781
792
  if (_tcsstr(URI, _T("://")) == NULL)
782
793
  return true;
783
-
784
794
  }
785
795
  uint_td datalen = 0;
786
796
 
@@ -1,7 +1,7 @@
1
1
  #ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_NSDATABASE_H
2
2
  #define BZS_DB_PROTOCOL_TDAP_CLIENT_NSDATABASE_H
3
3
  /* =================================================================
4
- Copyright (C) 2000-2013 BizStation Corp All rights reserved.
4
+ Copyright (C) 2000-2016 BizStation Corp All rights reserved.
5
5
 
6
6
  This program is free software; you can redistribute it and/or
7
7
  modify it under the terms of the GNU General Public License
@@ -52,6 +52,23 @@ DLLLIB void setTrnsctdEntryPoint(BTRCALLID_PTR p);
52
52
  DLLLIB BTRCALLID_PTR getTrnsctdEntryPoint();
53
53
  /** @endcond */
54
54
 
55
+
56
+ #pragma pack(push, 1)
57
+ pragma_pack1
58
+ #define BINLOGNAME_SIZE 119
59
+ #define GTID_SIZE 64
60
+ struct binlogPos
61
+ {
62
+ unsigned long long pos;
63
+ char type;
64
+ char filename[BINLOGNAME_SIZE];
65
+ char gtid[GTID_SIZE];
66
+ };
67
+
68
+
69
+ #pragma pack(pop)
70
+ pragma_pop
71
+
55
72
  class DLLLIB nsdatabase
56
73
  {
57
74
  friend class nstable;
@@ -71,6 +88,7 @@ protected:
71
88
  bool trd);
72
89
  virtual bool setUri(const _TCHAR* uri);
73
90
  void reset();
91
+ void resetSnapshot();
74
92
  nstable** tables();
75
93
  nsdatabase* clone() const;
76
94
  nsdatabase& operator=(const nsdatabase&);
@@ -112,7 +130,7 @@ public:
112
130
  NOWAIT_WRITE); // NoWit SingleLock
113
131
  void endTrn();
114
132
  void abortTrn();
115
- void beginSnapshot(short bias = CONSISTENT_READ);
133
+ void beginSnapshot(short bias = CONSISTENT_READ, binlogPos* bpos=NULL);
116
134
  void endSnapshot();
117
135
  ushort_td trxIsolationServer() const ;
118
136
  ushort_td trxLockWaitTimeoutServer() const ;
@@ -3,7 +3,7 @@
3
3
  #define BZS_DB_PROTOCOL_TDAP_CLIENT_POOLEDDATABASEMANAGER_H
4
4
 
5
5
  /* =================================================================
6
- Copyright (C) 2014 BizStation Corp All rights reserved.
6
+ Copyright (C) 2014 2016 BizStation Corp All rights reserved.
7
7
 
8
8
  This program is free software; you can redistribute it and/or
9
9
  modify it under the terms of the GNU General Public License
@@ -165,7 +165,10 @@ public:
165
165
 
166
166
  inline int enableTrn() { return m_db->enableTrn(); }
167
167
 
168
- inline void beginSnapshot(short bias = CONSISTENT_READ) { m_db->beginSnapshot(bias); }
168
+ inline void beginSnapshot(short bias = CONSISTENT_READ, binlogPos* bpos = NULL)
169
+ {
170
+ m_db->beginSnapshot(bias, bpos);
171
+ }
169
172
 
170
173
  inline void endSnapshot() { m_db->endSnapshot(); }
171
174
 
@@ -657,13 +657,14 @@ public:
657
657
  {
658
658
  assert(m_fds->size());
659
659
 
660
- fielddef fd((*m_fds)[0]);
660
+ fielddef fd;
661
661
  memset(&fd, 0, sizeof(fielddef));
662
662
  fd.len = len;
663
663
  fd.pos = 0;
664
664
  fd.type = type;
665
665
  fd.decimals = decimals;
666
666
  fd.setName(name);
667
+ fd.setCharsetIndex((*m_fds)[0].charsetIndex());
667
668
  if (blobLenBytes(fd))
668
669
  THROW_BZS_ERROR_WITH_MSG(_T("Can not append Blob or Text field."));
669
670
  m_fds->push_back(&fd);
@@ -526,7 +526,7 @@ void makeSuffixNamesList(const tabledef* table, std::vector<std::string>& fds)
526
526
  }
527
527
  }
528
528
 
529
- std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* table,
529
+ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* td,
530
530
  uchar_td charsetIndexServer, const clsrv_ver* ver)
531
531
  {
532
532
  // Duplication of a name is inspected and, in duplication, _1 is added.
@@ -534,10 +534,10 @@ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* ta
534
534
  std::string s = "CREATE TABLE `";
535
535
 
536
536
  std::vector<std::string> fds;// suffix added names list
537
- makeSuffixNamesList(table, fds);
537
+ makeSuffixNamesList(td, fds);
538
538
 
539
539
  uint_td schemaCodePage =
540
- table->schemaCodePage ? table->schemaCodePage : GetACP();
540
+ td->schemaCodePage ? td->schemaCodePage : GetACP();
541
541
  if ((name && name[0]))
542
542
  {
543
543
  std::string name2 = name;
@@ -546,14 +546,17 @@ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* ta
546
546
  s += getFileName(name2.c_str()) + "` (";
547
547
  }
548
548
  else
549
- s += getFileName(table->fileNameA()) + "` (";
550
- s += getFieldList(table, fds, ver);
551
- insertNisFields(table, fds, s);
552
- s += getKeyList(table, fds);
549
+ s += getFileName(td->fileNameA()) + "` (";
550
+ s += getFieldList(td, fds, ver);
551
+ insertNisFields(td, fds, s);
552
+ s += getKeyList(td, fds);
553
553
  if (s[s.size() - 1] == ',')
554
554
  s.erase(s.end() - 1);
555
- s += ") ENGINE=InnoDB default charset=" +
556
- std::string(mysql::charsetName(table->charsetIndex));
555
+ std::string compress;
556
+ if (td->flags.bit3)
557
+ compress = "ROW_FORMAT=COMPRESSED ";
558
+ s += ") ENGINE=InnoDB " + compress + "default charset=" + std::string(mysql::charsetName(td->charsetIndex));
559
+
557
560
 
558
561
  // create statement charset must be server default charset.
559
562
  // server default charset writen in my.cnf.
@@ -563,20 +566,20 @@ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* ta
563
566
  return s;
564
567
  }
565
568
 
566
- std::string sqlBuilder::sqlCreateIndex(const tabledef* table, int keyNum,
569
+ std::string sqlBuilder::sqlCreateIndex(const tabledef* td, int keyNum,
567
570
  bool specifyKeyNum, uchar_td charsetIndexServer, const clsrv_ver* ver)
568
571
  {
569
572
  std::string s;
570
573
  std::vector<std::string> fds;// suffix added names list
571
- makeSuffixNamesList(table, fds);
574
+ makeSuffixNamesList(td, fds);
572
575
  uint_td schemaCodePage =
573
- table->schemaCodePage ? table->schemaCodePage : GetACP();
574
- s += getFieldList(table, fds, ver);
575
- insertNisFields(table, fds, s);
576
+ td->schemaCodePage ? td->schemaCodePage : GetACP();
577
+ s += getFieldList(td, fds, ver);
578
+ insertNisFields(td, fds, s);
576
579
  s = "`";
577
- s+= getFileName(table->fileNameA());
580
+ s+= getFileName(td->fileNameA());
578
581
  s += "` ADD";
579
- getKey(table, fds, keyNum, s, specifyKeyNum);
582
+ getKey(td, fds, keyNum, s, specifyKeyNum);
580
583
  s.erase(s.end() - 1);
581
584
  // create statement charset must be server default charset.
582
585
  // server default charset writen in my.cnf.
@@ -822,7 +822,7 @@ bool table::isReadContinue(ushort_td& op)
822
822
  // limit count control
823
823
  if (isContinue)
824
824
  {
825
- if (filter->isStopAtLimit() && m_impl->rc->rowCount() == filter->maxRows())
825
+ if (filter->isReadLimit(m_impl->rc->rowCount()))
826
826
  {
827
827
  m_stat = STATUS_LIMMIT_OF_REJECT;
828
828
  return false;
@@ -1181,6 +1181,7 @@ void table::setPrepare(const pq_handle stmt)
1181
1181
  m_impl->resetBookmarks();
1182
1182
  if (m_impl->filterPtr != stmt)
1183
1183
  m_impl->filterPtr = stmt;
1184
+ m_impl->filterPtr->resetReaded();
1184
1185
  if (nsdb()->isReconnected())
1185
1186
  m_impl->filterPtr->setServerPreparedId(0);
1186
1187
  }
@@ -44,7 +44,7 @@ class fields;
44
44
  class table;
45
45
  /** @endcond */
46
46
 
47
- #if (defined(__BORLANDC__) && !defined(__clang__))
47
+ #if (defined(__BORLANDC__) && !defined(__APPLE__) && !defined(__clang__))
48
48
  typedef void __stdcall(* recordCountFn)(table* tb, int count, bool& complate);
49
49
  #else
50
50
  /** @cond INTERNAL */
@@ -1,7 +1,7 @@
1
1
  #ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_TRDBOOSTAPI_H
2
2
  #define BZS_DB_PROTOCOL_TDAP_CLIENT_TRDBOOSTAPI_H
3
3
  /*=================================================================
4
- Copyright (C) 2013 2014 BizStation Corp All rights reserved.
4
+ Copyright (C) 2013-2016 BizStation Corp All rights reserved.
5
5
 
6
6
  This program is free software; you can redistribute it and/or
7
7
  modify it under the terms of the GNU General Public License
@@ -135,7 +135,7 @@ public:
135
135
  m_type = v;
136
136
  }
137
137
 
138
- inline const _TCHAR* uri(bool noPasswd=false) const
138
+ inline const _TCHAR* uri() const
139
139
  {
140
140
  return m_buf;
141
141
  }
@@ -168,7 +168,7 @@ public:
168
168
  virtual void endTrn() = 0;
169
169
  virtual void abortTrn() = 0;
170
170
  virtual int enableTrn() = 0;
171
- virtual void beginSnapshot(short bias = CONSISTENT_READ) = 0;
171
+ virtual void beginSnapshot(short bias = CONSISTENT_READ, binlogPos* bpos = NULL) = 0;
172
172
  virtual void endSnapshot() = 0;
173
173
  virtual const _TCHAR* uri() const = 0;
174
174
  virtual char_td mode() const = 0;
@@ -844,15 +844,16 @@ inline void connect(Database_Ptr db, const ConnectParam_type& connPrams,
844
844
  template <class Database_Ptr>
845
845
  inline void createDatabase(Database_Ptr db, const connectParams& connPrams)
846
846
  {
847
- db->create(connPrams.uri());
847
+ db->create(connPrams.uri(), connPrams.type());
848
848
  if (db->stat())
849
849
  throwDbError(db, _T("Create database : "), connPrams.uri());
850
850
  }
851
851
 
852
852
  template <class Database_Ptr>
853
- inline void createDatabase(Database_Ptr db, const _TCHAR* uri)
853
+ inline void createDatabase(Database_Ptr db, const _TCHAR* uri,
854
+ short type = TYPE_SCHEMA_BDF)
854
855
  {
855
- db->create(uri);
856
+ db->create(uri, type);
856
857
  if (db->stat())
857
858
  throwDbError(db, _T("Create database : "), uri);
858
859
  }
@@ -885,9 +886,9 @@ inline void connectOpen(Database_Ptr db, const connectParams& connPrams,
885
886
  openDatabase(db, connPrams);
886
887
  }
887
888
 
888
- template <class Database_Ptr> inline void dropDatabase(Database_Ptr db)
889
+ template <class Database_Ptr> inline void dropDatabase(Database_Ptr db, const _TCHAR* uri=NULL)
889
890
  {
890
- db->drop();
891
+ db->drop(uri);
891
892
  if (db->stat())
892
893
  nstable::throwError(std::_tstring(_T("Drop database ")).c_str(),
893
894
  db->stat());
@@ -1265,7 +1266,10 @@ template <class DB> class snapshot
1265
1266
  DB m_db;
1266
1267
 
1267
1268
  public:
1268
- snapshot(DB db, short bias = CONSISTENT_READ) : m_db(db) { m_db->beginSnapshot(bias); }
1269
+ snapshot(DB db, short bias = CONSISTENT_READ, binlogPos* bpos=NULL) : m_db(db)
1270
+ {
1271
+ m_db->beginSnapshot(bias, bpos);
1272
+ }
1269
1273
 
1270
1274
  ~snapshot() { m_db->endSnapshot(); }
1271
1275
  };
@@ -101,9 +101,10 @@ std::string getDatabaseName(const request& req, bool forSql)
101
101
  {
102
102
  std::vector<std::string> ssc;
103
103
  std::vector<std::string> ss;
104
- if (req.keybuf)
104
+ const char* p = (const char*)req.keybuf;
105
+ if (p && p[0])
105
106
  {
106
- std::string s((const char*)req.keybuf);
107
+ std::string s(p);
107
108
  split(ssc, s, "\t");
108
109
  if (ssc.size())
109
110
  {
@@ -265,7 +266,7 @@ int dbExecuter::errorCode(int ha_error)
265
266
  else if (ha_error == HA_ERR_AUTOINC_ERANGE)
266
267
  return STATUS_DUPPLICATE_KEYVALUE;
267
268
  else if (ha_error == ER_PARSE_ERROR)
268
- return STATUS_CANT_CREATE;
269
+ return STATUS_SQL_PARSE_ERROR;
269
270
  else if (ha_error == ER_TABLE_EXISTS_ERROR)
270
271
  return STATUS_TABLE_EXISTS_ERROR;
271
272
  else if (ha_error == DBM_ERROR_TABLE_USED)
@@ -274,18 +275,25 @@ int dbExecuter::errorCode(int ha_error)
274
275
  return ERROR_NO_DATABASE;
275
276
  else if(ha_error == ER_NO_SUCH_TABLE)
276
277
  return STATUS_TABLE_NOTOPEN;
278
+ else if(ha_error == ER_SPECIFIC_ACCESS_DENIED_ERROR)
279
+ return STATUS_ACCESS_DENIED;
277
280
  return MYSQL_ERROR_OFFSET + ha_error;
278
281
  }
279
282
 
280
283
  bool isMetaDb(const request& req)
281
284
  {
282
285
  char buf[MAX_PATH];
283
- strncpy(buf, (char*)req.keybuf, MAX_PATH);
284
- _strlwr(buf);
285
- char_m* st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
286
- if (st == NULL)
287
- st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
288
- return (st != NULL);
286
+ const char* p = (const char*)req.keybuf;
287
+ char_m* st = NULL;
288
+ if (p && p[0])
289
+ {
290
+ strncpy(buf, p, MAX_PATH);
291
+ _strlwr(buf);
292
+ st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
293
+ if (st == NULL)
294
+ st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
295
+ }
296
+ return (st != NULL);
289
297
  }
290
298
 
291
299
  inline bool getUserPasswd(request& req, char* &user, char* &pwd)
@@ -415,7 +423,7 @@ inline bool dbExecuter::doCreateTable(request& req)
415
423
  {
416
424
  if (req.result == 0)
417
425
  {
418
- req.result = ddl_dropDataBase(db->thd(), db->name(), dbSqlname);
426
+ req.result = ddl_dropDataBase(db->thd(), db->name(), dbSqlname, req.cid);
419
427
  if (ER_DB_DROP_EXISTS+ MYSQL_ERROR_OFFSET == req.result) req.result = 0;
420
428
  }
421
429
  return ret;
@@ -1075,7 +1083,7 @@ inline void dbExecuter::doInsertBulk(request& req)
1075
1083
  smartBulkInsert sbi(m_tb, *n);
1076
1084
  for (ushort_td i = 0; i < *n; i++)
1077
1085
  {
1078
- ushort_td len = *((ushort_td*)pos);
1086
+ ushort_td len = *((ushort_td*)pos);
1079
1087
  if (pos + len > (const uchar*)req.data + *req.datalen)
1080
1088
  {
1081
1089
  ret = STATUS_BUFFERTOOSMALL;
@@ -1149,6 +1157,11 @@ inline enum_tx_isolation getIsolationLevel(int op)
1149
1157
  return ISO_READ_COMMITTED;
1150
1158
  }
1151
1159
 
1160
+ inline bool snapshotWithBinlogPos(int op)
1161
+ {
1162
+ return (op == CONSISTENT_READ_WITH_BINLOG_POS+TD_BEGIN_SHAPSHOT);
1163
+ }
1164
+
1152
1165
  inline short getTrnsactionType(int op)
1153
1166
  {
1154
1167
  op = op % 1000;
@@ -1248,22 +1261,57 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1248
1261
  doDelete(req);
1249
1262
  break;
1250
1263
  case TD_BEGIN_TRANSACTION:
1251
- transactionResult =
1252
- getDatabaseCid(req.cid)->beginTrn(getTrnsactionType(opTrn)
1264
+ {
1265
+ database* db = getDatabaseCid(req.cid);
1266
+ transactionResult = db->beginTrn(getTrnsactionType(opTrn)
1253
1267
  ,getIsolationLevel(opTrn));
1268
+ req.result = errorCodeSht(db->stat());
1254
1269
  break;
1270
+ }
1255
1271
  case TD_END_TRANSACTION:
1256
- transactionResult = getDatabaseCid(req.cid)->commitTrn();
1272
+ {
1273
+ database* db = getDatabaseCid(req.cid);
1274
+ transactionResult = db->commitTrn();
1275
+ req.result = errorCodeSht(db->stat());
1257
1276
  break;
1277
+ }
1258
1278
  case TD_ABORT_TRANSACTION:
1259
- transactionResult = getDatabaseCid(req.cid)->abortTrn();
1279
+ {
1280
+ database* db = getDatabaseCid(req.cid);
1281
+ transactionResult = db->abortTrn();
1282
+ req.result = errorCodeSht(db->stat());
1260
1283
  break;
1284
+ }
1261
1285
  case TD_BEGIN_SHAPSHOT:
1262
- transactionResult = getDatabaseCid(req.cid)->beginSnapshot(getIsolationLevel(opTrn));
1286
+ {
1287
+ bool withSnapshot = snapshotWithBinlogPos(opTrn);
1288
+ if (withSnapshot && *req.datalen < sizeof(binlogPos))
1289
+ req.result = STATUS_BUFFERTOOSMALL;
1290
+ else
1291
+ {
1292
+ binlogPos bpos;
1293
+ memset(&bpos, 0, sizeof(binlogPos));
1294
+ database* db = getDatabaseCid(req.cid);
1295
+ transactionResult = db->beginSnapshot(
1296
+ getIsolationLevel(opTrn), withSnapshot ? &bpos : NULL);
1297
+ req.result = errorCodeSht(db->stat());
1298
+ if (transactionResult && withSnapshot)
1299
+ {
1300
+ // return binlog position for replication.
1301
+ req.paramMask = P_MASK_STAT;
1302
+ memcpy(req.data, &bpos, sizeof(binlogPos));
1303
+ req.resultLen = sizeof(binlogPos);
1304
+ }
1305
+ }
1263
1306
  break;
1307
+ }
1264
1308
  case TD_END_SNAPSHOT:
1265
- transactionResult = getDatabaseCid(req.cid)->endSnapshot();
1309
+ {
1310
+ database* db = getDatabaseCid(req.cid);
1311
+ transactionResult = db->endSnapshot();
1312
+ req.result = errorCodeSht(db->stat());
1266
1313
  break;
1314
+ }
1267
1315
  case TD_TABLE_INFO: // support recordlen and recordCount only.
1268
1316
  doStat(req);
1269
1317
  break;
@@ -1450,12 +1498,11 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1450
1498
  std::string tbname = m_tb->name();
1451
1499
  m_tb->close();
1452
1500
  m_tb = NULL;
1453
- if ((req.keyNum == CR_SUBOP_DROP) && (tbname == TRANSACTD_SCHEMANAME))
1501
+ if (req.keyNum == CR_SUBOP_DROP)
1454
1502
  {
1455
1503
  database* db = getDatabaseCid(req.cid);
1456
1504
  req.result = ddl_dropTable(db, tbname, db->name(), tbname);
1457
1505
  }
1458
-
1459
1506
  }
1460
1507
  break;
1461
1508
  case TD_BUILD_INDEX:
@@ -1604,8 +1651,8 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1604
1651
  if (transactionResult)
1605
1652
  {
1606
1653
  if ((op == TD_BEGIN_TRANSACTION) || (op == TD_BEGIN_SHAPSHOT))
1607
- return EXECUTE_RESULT_FORCSE_SYNC;
1608
- return EXECUTE_RESULT_FORCSE_ASYNC;
1654
+ return EXECUTE_RESULT_FORCSE_SYNC; // this is begin
1655
+ return EXECUTE_RESULT_FORCSE_ASYNC; // this is end
1609
1656
  }
1610
1657
  if (req.result == ERROR_TD_INVALID_CLINETHOST)
1611
1658
  return EXECUTE_RESULT_ACCESS_DNIED;