transactd 2.3.0 → 2.4.0

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