transactd 2.3.0 → 2.4.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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
  3. data/CMakeLists.txt +20 -15
  4. data/{README-JA → README-JA.md} +23 -23
  5. data/{README → README.md} +22 -24
  6. data/RELEASE_NOTE +120 -0
  7. data/RELEASE_NOTE-JA +110 -0
  8. data/bin/common/tdclc_32_2_4.dll +0 -0
  9. data/bin/common/tdclc_64_2_4.dll +0 -0
  10. data/build/common/get_ruby_path.cmake +1 -1
  11. data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
  12. data/build/swig/tdcl.i +22 -2
  13. data/build/tdclc/tdclc.cbproj +1 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -1
  17. data/build/tdclrb/CMakeLists.txt +6 -1
  18. data/build/tdclrb/bldgem/extconf.rb +5 -1
  19. data/build/tdclrb/tdclrb.rc +4 -4
  20. data/source/bzs/db/engine/mysql/database.cpp +44 -40
  21. data/source/bzs/db/engine/mysql/database.h +28 -8
  22. data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
  23. data/source/bzs/db/engine/mysql/dbManager.h +2 -7
  24. data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
  25. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
  26. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
  27. data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
  28. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  29. data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
  30. data/source/bzs/db/protocol/tdap/client/client.h +41 -11
  31. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
  32. data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
  33. data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
  34. data/source/bzs/db/protocol/tdap/client/database.h +3 -2
  35. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
  36. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  37. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
  38. data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
  39. data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
  47. data/source/bzs/db/protocol/tdap/client/request.h +28 -11
  48. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
  49. data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
  50. data/source/bzs/db/protocol/tdap/client/table.h +20 -5
  51. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
  52. data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
  53. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
  54. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
  55. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
  56. data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
  57. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
  58. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
  59. data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
  60. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
  61. data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
  62. data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
  63. data/source/bzs/db/protocol/tdap/uri.h +41 -6
  64. data/source/bzs/db/transactd/appModule.cpp +0 -1
  65. data/source/bzs/db/transactd/appModule.h +0 -2
  66. data/source/bzs/db/transactd/connManager.cpp +202 -33
  67. data/source/bzs/db/transactd/connManager.h +11 -4
  68. data/source/bzs/db/transactd/connectionRecord.h +19 -5
  69. data/source/bzs/db/transactd/transactd.cpp +39 -8
  70. data/source/bzs/env/crosscompile.cpp +1 -1
  71. data/source/bzs/example/queryData.cpp +1 -1
  72. data/source/bzs/netsvc/client/iconnection.h +2 -0
  73. data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
  74. data/source/bzs/netsvc/client/tcpClient.h +171 -106
  75. data/source/bzs/netsvc/server/IAppModule.h +0 -1
  76. data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
  77. data/source/bzs/netsvc/server/serverPipe.h +2 -1
  78. data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
  79. data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
  80. data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
  81. data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
  82. data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
  83. data/source/global/tdclatl/Bookmark.cpp +28 -0
  84. data/source/global/tdclatl/Bookmark.h +65 -0
  85. data/source/global/tdclatl/Database.cpp +2 -2
  86. data/source/global/tdclatl/Database.h +1 -3
  87. data/source/global/tdclatl/DbDef.cpp +6 -0
  88. data/source/global/tdclatl/DbDef.h +1 -0
  89. data/source/global/tdclatl/QueryBase.cpp +29 -0
  90. data/source/global/tdclatl/QueryBase.h +4 -0
  91. data/source/global/tdclatl/Record.cpp +14 -2
  92. data/source/global/tdclatl/Record.h +1 -1
  93. data/source/global/tdclatl/Table.cpp +80 -16
  94. data/source/global/tdclatl/Table.h +23 -8
  95. data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
  96. data/source/global/tdclatl/activeTable.cpp +2 -2
  97. data/source/global/tdclatl/activeTable.h +1 -1
  98. data/source/global/tdclatl/tdclatl.idl +64 -14
  99. metadata +12 -12
  100. data/bin/common/tdclc_32_2_3.dll +0 -0
  101. data/bin/common/tdclc_64_2_3.dll +0 -0
  102. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  103. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  104. /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
  105. /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
  106. /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
@@ -269,6 +269,8 @@ int dbExecuter::errorCode(int ha_error)
269
269
  return STATUS_CANNOT_LOCK_TABLE;
270
270
  else if(ha_error == ER_BAD_DB_ERROR)
271
271
  return ERROR_NO_DATABASE;
272
+ else if(ha_error == ER_NO_SUCH_TABLE)
273
+ return STATUS_TABLE_NOTOPEN;
272
274
  return MYSQL_ERROR_OFFSET + ha_error;
273
275
  }
274
276
 
@@ -475,7 +477,7 @@ inline bool dbExecuter::doCreateTable(request& req)
475
477
 
476
478
 
477
479
  // open table and assign handle
478
- inline bool dbExecuter::doOpenTable(request& req)
480
+ inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
479
481
  {
480
482
  database* db;
481
483
  bool ret = getDatabaseWithAuth(req, &db);
@@ -494,7 +496,8 @@ inline bool dbExecuter::doOpenTable(request& req)
494
496
  }
495
497
  // if error occured that throw no exception
496
498
  tb = db->openTable(getTableName(req), req.keyNum, getOwnerName(req));
497
- req.result = db->stat();
499
+ if (db->stat())
500
+ req.result = (short_td)errorCode(db->stat());
498
501
  }
499
502
 
500
503
  if (tb)
@@ -505,7 +508,16 @@ inline bool dbExecuter::doOpenTable(request& req)
505
508
  uint hdl = addHandle(getDatabaseID(req.cid), tb->id());
506
509
  m_tb = getTable(hdl);
507
510
  req.pbk->handle = hdl;
508
- req.paramMask = P_MASK_POSBLK;
511
+ if (!reconnect)
512
+ {
513
+ ushort_td len = m_tb->posPtrLen();
514
+ if ((m_tb->tableFlags() & HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) && !m_tb->primaryKey())
515
+ len = 0xFFFF;
516
+ memcpy(req.data, &len , sizeof(ushort_td));
517
+ req.resultLen = sizeof(ushort_td);
518
+ req.paramMask = P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN;
519
+ }else
520
+ req.paramMask = P_MASK_POSBLK;
509
521
  }
510
522
  catch (bzs::rtl::exception& e)
511
523
  {
@@ -686,7 +698,7 @@ inline int dbExecuter::doReadMulti(request& req, int op,
686
698
  bool execPrepared = (ereq->itype & FILTER_TYPE_SUPPLYVALUE) != 0;
687
699
 
688
700
  bool forword = (op == TD_KEY_NEXT_MULTI) || (op == TD_POS_NEXT_MULTI);
689
- if (op == TD_KEY_SEEK_MULTI)
701
+ if (op == TD_KEY_SEEK_MULTI && !(ereq->itype & FILTER_TYPE_SEEKS_BOOKMARKS))
690
702
  {
691
703
  char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
692
704
  if (!m_tb->setKeyNum(keynum))
@@ -713,8 +725,14 @@ inline int dbExecuter::doReadMulti(request& req, int op,
713
725
  if (req.result != 0)
714
726
  return ret;
715
727
  if (op == TD_KEY_SEEK_MULTI)
716
- req.result =
717
- errorCodeSht(seekEach((extRequestSeeks*)req.data, noBookmark));
728
+ {
729
+ if (ereq->itype & FILTER_TYPE_SEEKS_BOOKMARKS)
730
+ req.result =
731
+ errorCodeSht(seekBookmarkEach((extRequestSeeks*)req.data, noBookmark));
732
+ else
733
+ req.result =
734
+ errorCodeSht(seekEach((extRequestSeeks*)req.data, noBookmark));
735
+ }
718
736
  else
719
737
  {
720
738
  if (op == TD_KEY_NEXT_MULTI)
@@ -769,6 +787,34 @@ inline __int64 intValue(const unsigned char* p, int len)
769
787
  return 0;
770
788
  }
771
789
 
790
+ //FILTER_TYPE_SEEKS_BOOKMARKS
791
+ inline short dbExecuter::seekBookmarkEach(extRequestSeeks* ereq, bool noBookmark)
792
+ {
793
+ short stat = 0;
794
+ seek* fd = &ereq->seekData;
795
+
796
+ for (int i = 0; i < ereq->logicalCount; ++i)
797
+ {
798
+ m_tb->movePos((uchar*)fd->ptr, -1);
799
+ if (m_tb->stat() == 0)
800
+ {
801
+ if (noBookmark)
802
+ stat = m_readHandler->write((const unsigned char *)_T("dummy"), 0);
803
+ else
804
+ stat =
805
+ m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
806
+ }
807
+ else
808
+ stat = m_readHandler->write(NULL, 0);
809
+ if (stat)
810
+ break;
811
+ fd = fd->next();
812
+ }
813
+ if (stat == 0)
814
+ stat = STATUS_REACHED_FILTER_COND;
815
+ return stat;
816
+ }
817
+
772
818
  inline short dbExecuter::seekEach(extRequestSeeks* ereq, bool noBookmark)
773
819
  {
774
820
 
@@ -1184,7 +1230,7 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1184
1230
  break;
1185
1231
  case TD_RECONNECT:
1186
1232
 
1187
- if (!doOpenTable(req))
1233
+ if (!doOpenTable(req, true))
1188
1234
  {
1189
1235
  req.result = ERROR_TD_INVALID_CLINETHOST;
1190
1236
  break;
@@ -1337,8 +1383,15 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1337
1383
  m_tb = getTable(req.pbk->handle);
1338
1384
  if (m_tb)
1339
1385
  {
1386
+ std::string tbname = m_tb->name();
1340
1387
  m_tb->close();
1341
1388
  m_tb = NULL;
1389
+ if ((req.keyNum == CR_SUBOP_DROP) && (tbname == TRANSACTD_SCHEMANAME))
1390
+ {
1391
+ database* db = getDatabaseCid(req.cid);
1392
+ req.result = ddl_dropTable(db, tbname, db->name(), tbname);
1393
+ }
1394
+
1342
1395
  }
1343
1396
  break;
1344
1397
  case TD_BUILD_INDEX:
@@ -1528,21 +1581,43 @@ connMgrExecuter::connMgrExecuter(request& req, unsigned __int64 parent)
1528
1581
  {
1529
1582
  }
1530
1583
 
1584
+ int serialize(request& req, char* buf, size_t& size, const connManager::records& records, short stat)
1585
+ {
1586
+ req.reset();
1587
+ req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1588
+ if (records.size())
1589
+ req.data = (void*)&records[0];
1590
+ else
1591
+ req.paramMask = P_MASK_DATALEN;
1592
+ req.resultLen = (uint_td)(sizeof(record) * records.size());
1593
+ req.result = stat;
1594
+ size = req.serialize(NULL, buf);
1595
+ return EXECUTE_RESULT_SUCCESS;
1596
+ }
1597
+
1531
1598
  int connMgrExecuter::read(char* buf, size_t& size)
1532
1599
  {
1533
1600
  connManager st(m_modHandle);
1534
1601
  unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
1602
+ return serialize(m_req, buf, size, st.getRecords(mod[0], (int)mod[1]), st.stat());
1603
+ }
1535
1604
 
1536
- const connManager::records& records = st.getRecords(mod[0], (int)mod[1]);
1537
- m_req.reset();
1538
- m_req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1539
- if (records.size())
1540
- m_req.data = (void*)&records[0];
1541
- else
1542
- m_req.paramMask = P_MASK_DATALEN;
1543
- m_req.resultLen = (uint_td)(sizeof(record) * records.size());
1544
- size = m_req.serialize(NULL, buf);
1545
- return EXECUTE_RESULT_SUCCESS;
1605
+ int connMgrExecuter::definedDatabaseList(char* buf, size_t& size)
1606
+ {
1607
+ connManager st(m_modHandle);
1608
+ return serialize(m_req, buf, size, st.getDefinedDatabaseList(), st.stat());
1609
+ }
1610
+
1611
+ int connMgrExecuter::systemVariables(char* buf, size_t& size)
1612
+ {
1613
+ connManager st(m_modHandle);
1614
+ return serialize(m_req, buf, size, st.systemVariables(), st.stat());
1615
+ }
1616
+
1617
+ int connMgrExecuter::schemaTableList(char* buf, size_t& size)
1618
+ {
1619
+ connManager st(m_modHandle);
1620
+ return serialize(m_req, buf, size, st.schemaTableList((const char*)m_req.keybuf), st.stat());
1546
1621
  }
1547
1622
 
1548
1623
  int connMgrExecuter::disconnectOne(char* buf, size_t& size)
@@ -1558,7 +1633,6 @@ int connMgrExecuter::disconnectOne(char* buf, size_t& size)
1558
1633
  int connMgrExecuter::disconnectAll(char* buf, size_t& size)
1559
1634
  {
1560
1635
  connManager st(m_modHandle);
1561
-
1562
1636
  st.disconnectAll();
1563
1637
  m_req.reset();
1564
1638
  size = m_req.serialize(NULL, buf);
@@ -1573,6 +1647,12 @@ int connMgrExecuter::commandExec(netsvc::server::netWriter* nw)
1573
1647
  return disconnectOne(nw->ptr(), nw->datalen);
1574
1648
  else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
1575
1649
  return disconnectAll(nw->ptr(), nw->datalen);
1650
+ else if(m_req.keyNum == TD_STSTCS_DATABASE_LIST)
1651
+ return definedDatabaseList(nw->ptr(), nw->datalen);
1652
+ else if(m_req.keyNum == TD_STSTCS_SYSTEM_VARIABLES)
1653
+ return systemVariables(nw->ptr(), nw->datalen);
1654
+ else if(m_req.keyNum == TD_STSTCS_SCHEMA_TABLE_LIST)
1655
+ return schemaTableList(nw->ptr(), nw->datalen);
1576
1656
  return 0;
1577
1657
  }
1578
1658
 
@@ -43,7 +43,6 @@ namespace db
43
43
  {
44
44
  class blobBuffer;
45
45
  namespace engine{namespace mysql{class database;}}
46
-
47
46
  namespace protocol
48
47
  {
49
48
  namespace tdap
@@ -72,7 +71,7 @@ class dbExecuter : public engine::mysql::dbManager
72
71
  std::string makeSQLcreateTable(const request& req);
73
72
  bool connect(request& req);
74
73
  inline bool doCreateTable(request& req);
75
- inline bool doOpenTable(request& req);
74
+ inline bool doOpenTable(request& req, bool reconnect=false);
76
75
  inline void doSeekKey(request& req, int op, engine::mysql::rowLockMode* lock);
77
76
  inline void doMoveFirst(request& req, engine::mysql::rowLockMode* lock);
78
77
  inline void doMoveKey(request& req, int op, engine::mysql::rowLockMode* lock);
@@ -89,6 +88,7 @@ class dbExecuter : public engine::mysql::dbManager
89
88
  inline void doInsertBulk(request& req);
90
89
  inline void doStat(request& req);
91
90
  inline short seekEach(extRequestSeeks* ereq, bool noBookMark);
91
+ inline short seekBookmarkEach(extRequestSeeks* ereq, bool noBookmark);
92
92
  inline bool doAuthentication(request& req, engine::mysql::database* db);
93
93
  bool getDatabaseWithAuth(request& req, engine::mysql::database** db, bool connect=false);
94
94
  public:
@@ -97,7 +97,7 @@ public:
97
97
  int commandExec(request& req, netsvc::server::netWriter* nw);
98
98
  size_t getAcceptMessage(char* message, size_t size);
99
99
  int errorCode(int ha_error);
100
- short_td errorCodeSht(int ha_error)
100
+ inline short_td errorCodeSht(int ha_error)
101
101
  {
102
102
  return (short_td)errorCode(ha_error);
103
103
  }
@@ -111,11 +111,14 @@ class connMgrExecuter
111
111
  request& m_req;
112
112
  __int64 m_modHandle;
113
113
 
114
- public:
115
- connMgrExecuter(request& req, unsigned __int64 parent);
114
+ int definedDatabaseList(char* buf, size_t& size);
115
+ int schemaTableList(char* buf, size_t& size);
116
+ int systemVariables(char* buf, size_t& size);
116
117
  int read(char* buf, size_t& size);
117
118
  int disconnectOne(char* buf, size_t& size);
118
119
  int disconnectAll(char* buf, size_t& size);
120
+ public:
121
+ connMgrExecuter(request& req, unsigned __int64 parent);
119
122
  int commandExec(netsvc::server::netWriter* nw);
120
123
  };
121
124
 
@@ -150,9 +153,11 @@ public:
150
153
 
151
154
  bool isShutDown() { return m_dbExec->isShutDown(); }
152
155
 
153
- void cleanup(){};
156
+ void cleanup(){}
157
+
158
+ const engine::mysql::databases& dbs() const { return m_dbExec->dbs(); }
154
159
 
155
- const engine::mysql::databases& dbs() const { return m_dbExec->dbs(); };
160
+ boost::mutex& mutex() { return m_dbExec->mutex(); }
156
161
  };
157
162
 
158
163
  } // namespace mysql
@@ -82,8 +82,6 @@ namespace client {class table;}
82
82
  P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN | P_MASK_KEYBUF
83
83
  #define P_MASK_INS_AUTOINC P_MASK_MOVPOS
84
84
 
85
- #pragma pack(push, 1)
86
- pragma_pack1;
87
85
 
88
86
 
89
87
  #define CLIENTID_SIZE 2
@@ -99,6 +97,8 @@ typedef void*(__STDCALL* DDBA_PTR)(client::table* tb, uint_td size);
99
97
 
100
98
  /** tdap version info struct
101
99
  */
100
+ #pragma pack(push, 1)
101
+ pragma_pack1;
102
102
 
103
103
  struct version
104
104
  {
@@ -107,9 +107,6 @@ struct version
107
107
  uchar_td Type;
108
108
  };
109
109
 
110
- #pragma pack(push, 1)
111
- pragma_pack1;
112
-
113
110
  struct posblk
114
111
  {
115
112
  posblk() { memset(this, 0, sizeof(posblk)); }
@@ -120,9 +117,7 @@ struct posblk
120
117
  unsigned char lock;
121
118
  unsigned char bookmarkLen;
122
119
  char bookmark[1]; //dummy array
123
- };
124
- #pragma pack(pop)
125
- pragma_pop;
120
+ };
126
121
 
127
122
  struct clientID
128
123
  {
@@ -275,15 +275,7 @@ const char* tabledef::toChar(char* buf, const char* s, int size)
275
275
 
276
276
  #endif // NOT _UNICODE
277
277
 
278
- bool isStringType(uchar_td type)
279
- {
280
- return ((type == ft_string) || (type == ft_zstring) ||
281
- (type == ft_wstring) || (type == ft_wzstring) ||
282
- (type == ft_myvarchar) || (type == ft_myvarbinary) ||
283
- (type == ft_mywvarchar) || (type == ft_mywvarbinary) ||
284
- (type == ft_myblob) || (type == ft_mytext) || (type == ft_mychar) ||
285
- (type == ft_mywchar) || (type == ft_lstring) || (type == ft_note));
286
- }
278
+
287
279
 
288
280
  bool fielddef::isStringType() const
289
281
  {
@@ -182,7 +182,37 @@ PACKAGE ushort_td
182
182
  #endif // MYSQL_DYNAMIC_PLUGIN
183
183
 
184
184
  /* Is field type string ? */
185
- PACKAGE bool isStringType(uchar_td type);
185
+ inline bool isStringTypeForIndex(uchar_td type)
186
+ {
187
+ switch (type)
188
+ {
189
+ case ft_string:
190
+ case ft_zstring:
191
+ case ft_wstring:
192
+ case ft_wzstring:
193
+ case ft_mychar:
194
+ case ft_mywchar:
195
+ case ft_myvarchar:
196
+ case ft_myvarbinary:
197
+ case ft_mywvarchar:
198
+ case ft_mywvarbinary:
199
+ return true;
200
+ }
201
+ return false;
202
+ }
203
+
204
+ inline bool isStringType(uchar_td type)
205
+ {
206
+ switch (type)
207
+ {
208
+ case ft_myblob:
209
+ case ft_mytext:
210
+ case ft_lstring:
211
+ case ft_note:
212
+ return true;
213
+ }
214
+ return isStringTypeForIndex(type);
215
+ }
186
216
 
187
217
  /** @cond INTERNAL */
188
218
  #define PAD_CHAR_OPTION_SAVED 1
@@ -29,11 +29,23 @@ typedef void void_td;
29
29
  typedef short short_td;
30
30
  typedef unsigned char uchar_td;
31
31
  typedef char char_td;
32
- typedef uint_td bookmark_td;
33
32
  typedef int percentage_td;
34
-
35
33
  typedef ushort_td keylen_td;
36
34
 
35
+ /* Wnen change MAX_BOOKMARK_SIZE, database.h REF_SIZE_MAX too */
36
+ #define MAX_BOOKMARK_SIZE 112 // innodb unique key max 767 byte
37
+ struct BOOKMARK
38
+ {
39
+ uchar_td val[MAX_BOOKMARK_SIZE];
40
+ bool empty;
41
+ BOOKMARK():empty(true){}
42
+ bool isEmpty()
43
+ {
44
+ return empty;
45
+ }
46
+ };
47
+ typedef BOOKMARK bookmark_td;
48
+
37
49
  /** tdap c interface
38
50
  */
39
51
  #if (defined(__BORLANDC__) && !defined(__clang__))
@@ -64,6 +76,7 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
64
76
  /** buffer size
65
77
  */
66
78
  #define POS_BLOCK_SIZE 128
79
+ #define BTRV_BOOKMARK_SIZE 4
67
80
  #ifndef MAX_KEYLEN
68
81
  #define MAX_KEYLEN 0X3FF // 1023
69
82
  #endif
@@ -167,7 +180,9 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
167
180
  #define TD_STSTCS_READ 0
168
181
  #define TD_STSTCS_DISCONNECT_ONE 1
169
182
  #define TD_STSTCS_DISCONNECT_ALL 2
170
-
183
+ #define TD_STSTCS_DATABASE_LIST 3
184
+ #define TD_STSTCS_SYSTEM_VARIABLES 4
185
+ #define TD_STSTCS_SCHEMA_TABLE_LIST 5
171
186
  /** connect sub operation
172
187
  */
173
188
 
@@ -394,6 +409,13 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
394
409
  #define ERROR_TD_C_CLIENT_UNKNOWN 3811
395
410
  #define ERROR_TD_RECONNECTED 3900
396
411
 
412
+ inline bool canRecoverNetError(short code)
413
+ {
414
+ return (code >= ERROR_TD_CONNECTION_FAILURE) &&
415
+ (code < ERROR_TD_RECONNECTED) &&
416
+ (code != ERROR_TD_NET_TOO_BIGDATA);
417
+ }
418
+
397
419
 
398
420
  #define TRANSACTD_SCHEMANAME _T("transactd_schema")
399
421
  #define TYPE_SCHEMA_BDF 0
@@ -401,6 +423,7 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
401
423
 
402
424
  #define FILTER_CURRENT_TYPE_NOTINC 0
403
425
  #define FILTER_CURRENT_TYPE_INC 1
426
+ #define FILTER_TYPE_SEEKS_BOOKMARKS 1 //with FILTER_TYPE_SEEKS only
404
427
  #define FILTER_CURRENT_TYPE_NOBOOKMARK 2
405
428
  #define FILTER_TYPE_SUPPLYVALUE 4
406
429
  #define FILTER_TYPE_FORWORD 4 //at preparing only
@@ -453,13 +476,33 @@ struct handshale_t
453
476
 
454
477
  #define HST_OPTION_NO_SCRAMBLE 1
455
478
 
479
+ /* server system variables index */
480
+ #define TD_VER_DB 0
481
+ #define TD_VER_SERVER 1
482
+ #define TD_VAR_LISTENADDRESS 2
483
+ #define TD_VAR_LISTENPORT 3
484
+ #define TD_VAR_HOSTCHECKNAME 4
485
+ #define TD_VAR_MAXTCPCONNECTIONS 5
486
+ #define TD_VAR_TABLENAMELOWER 6
487
+ #define TD_VAR_POOLTHREADS 7
488
+ #define TD_VAR_TCPSERVERTYPE 8
489
+ #define TD_VAR_LOCKWAITTIMEOUT 9
490
+ #define TD_VAR_ISOLATION 10
491
+ #define TD_VAR_AUTHTYPE 11
492
+ #define TD_VAR_PIPESHAREMEMSIZE 12
493
+ #define TD_VAR_MAXPIPECONNECTIONS 13
494
+ #define TD_VAR_USEPIPE 14
495
+ #define TD_VAR_HSLISTENPORT 15
496
+ #define TD_VAR_USEHS 16
497
+ #define TD_VAR_SIZE 17
498
+
456
499
  /** @endcond */
457
500
 
458
501
  /* In the case of "tdclcppxxx" library of msvc, The ($TargetName) is not changed automatically.
459
502
  If you change this version then you need change The ($TargetName) project options too.
460
503
  */
461
504
  #define C_INTERFACE_VER_MAJOR "2"//##1 Build marker! Don't remove
462
- #define C_INTERFACE_VER_MINOR "3"//##2 Build marker! Don't remove
505
+ #define C_INTERFACE_VER_MINOR "4"//##2 Build marker! Don't remove
463
506
  #define C_INTERFACE_VER_RELEASE "0"//##3 Build marker! Don't remove
464
507
 
465
508
  /* dnamic load library name.
@@ -523,7 +566,7 @@ struct handshale_t
523
566
  */
524
567
 
525
568
  #define CPP_INTERFACE_VER_MAJOR "2"//##4 Build marker! Don't remove
526
- #define CPP_INTERFACE_VER_MINOR "3"//##5 Build marker! Don't remove
569
+ #define CPP_INTERFACE_VER_MINOR "4"//##5 Build marker! Don't remove
527
570
  #define CPP_INTERFACE_VER_RELEASE "0"//##6 Build marker! Don't remove
528
571
 
529
572
  /* use autolink tdclcpp */
@@ -540,7 +583,7 @@ struct handshale_t
540
583
  #endif
541
584
 
542
585
  #define TRANSACTD_VER_MAJOR 2//##7 Build marker! Don't remove
543
- #define TRANSACTD_VER_MINOR 3//##8 Build marker! Don't remove
586
+ #define TRANSACTD_VER_MINOR 4//##8 Build marker! Don't remove
544
587
  #define TRANSACTD_VER_RELEASE 0//##9 Build marker! Don't remove
545
588
 
546
589
  #endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
@@ -49,12 +49,14 @@ inline const _TCHAR* protocol(const _TCHAR* uri)
49
49
  st = _tcsstr(uri, _T("btrv://"));
50
50
  return _T("btrv");
51
51
  }
52
- return _T("");
53
52
  }
54
53
 
55
- inline const _TCHAR* hostName(const _TCHAR* uri, _TCHAR* buf, size_t size)
54
+ inline void endPoint(const _TCHAR* uri,
55
+ _TCHAR* host, size_t hostSize,
56
+ _TCHAR* port, size_t portSize)
56
57
  {
57
- buf[0] = 0x00;
58
+ if (host) host[0] = 0x00;
59
+ if (port) port[0] = 0x00;
58
60
  const _TCHAR* st = _tcsstr(uri, _T("@"));
59
61
  if (st)
60
62
  ++st;
@@ -65,13 +67,46 @@ inline const _TCHAR* hostName(const _TCHAR* uri, _TCHAR* buf, size_t size)
65
67
  }
66
68
  if (st)
67
69
  {
68
- const _TCHAR* en = _tcsstr(st, _T("/"));
70
+ const _TCHAR* en = _tcsstr(st, _T(":"));
69
71
  if (en && en > st)
70
72
  {
71
- _tcsncpy_s(buf, size, st, en - st);
72
- buf[en - st] = 0x00;
73
+ if (host)
74
+ {
75
+ _tcsncpy_s(host, hostSize, st, en - st);
76
+ host[en - st] = 0x00;
77
+ }
78
+ if (port)
79
+ {
80
+ st = en + 1;
81
+ en = _tcsstr(st, _T("/"));
82
+ if (en && en > st)
83
+ {
84
+ _tcsncpy_s(port, portSize, st, en - st);
85
+ port[en - st] = 0x00;
86
+ }
87
+ }
88
+ }
89
+ else if (host)
90
+ {
91
+ en = _tcsstr(st, _T("/"));
92
+ if (en && en > st)
93
+ {
94
+ _tcsncpy_s(host, hostSize, st, en - st);
95
+ host[en - st] = 0x00;
96
+ }
73
97
  }
74
98
  }
99
+ }
100
+
101
+ inline const _TCHAR* hostName(const _TCHAR* uri, _TCHAR* buf, size_t size)
102
+ {
103
+ endPoint(uri, buf, size, NULL, 0);
104
+ return buf;
105
+ }
106
+
107
+ inline const _TCHAR* port(const _TCHAR* uri, _TCHAR* buf, size_t size)
108
+ {
109
+ endPoint(uri, NULL, 0, buf, size);
75
110
  return buf;
76
111
  }
77
112
 
@@ -442,7 +442,6 @@ int module::execute(netsvc::server::IResultBuffer& result, size_t& size,
442
442
  {
443
443
  m_commandExecuter->parse(m_readBuf, m_readSize);
444
444
  m_nw->reset(&result, optionalData);
445
- boost::mutex::scoped_lock lck(m_mutex);
446
445
  int ret = m_commandExecuter->execute(m_nw);
447
446
  if (m_useThreadPool)
448
447
  cleanup();
@@ -41,7 +41,6 @@ namespace transactd
41
41
  class module : public netsvc::server::IAppModule, private boost::noncopyable
42
42
  {
43
43
  friend class connManager;
44
- mutable boost::mutex m_mutex;
45
44
  boost::shared_ptr<protocol::ICommandExecuter> m_commandExecuter;
46
45
  const boost::asio::ip::tcp::endpoint m_endpoint;
47
46
  bzs::netsvc::server::iconnection* m_connection;
@@ -63,7 +62,6 @@ public:
63
62
  bool isShutDown() { return m_commandExecuter->isShutDown(); }
64
63
  bool checkHost(const char* hostCheckname, /*out*/char* hostName, int size);
65
64
  void disconnect();
66
- boost::mutex& mutex() const { return m_mutex; };
67
65
  };
68
66
 
69
67
  } // namespace transactd