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
@@ -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;