transactd 2.0.1 → 2.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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +16 -16
  4. data/README-JA +16 -16
  5. data/bin/common/tdclc_32_2_1.dll +0 -0
  6. data/bin/common/tdclc_64_2_1.dll +0 -0
  7. data/build/common/transactd_cl_common.cmake +0 -1
  8. data/build/common/transactd_common.cmake +28 -38
  9. data/build/swig/ruby/ruby.swg +36 -30
  10. data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
  11. data/build/swig/tdcl.i +217 -62
  12. data/build/tdclc/CMakeLists.txt +14 -26
  13. data/build/tdclc/libtdclcm.map +4 -0
  14. data/build/tdclc/tdclc.cbproj +1 -1
  15. data/build/tdclc/tdclc.rc +0 -0
  16. data/build/tdclcpp/CMakeLists.txt +7 -22
  17. data/build/tdclcpp/tdclcpp.rc +0 -0
  18. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  19. data/build/tdclrb/CMakeLists.txt +7 -49
  20. data/build/tdclrb/tdclrb.rc +62 -0
  21. data/source/bzs/db/blobBuffer.h +5 -0
  22. data/source/bzs/db/blobStructs.h +2 -0
  23. data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
  24. data/source/bzs/db/engine/mysql/database.cpp +391 -169
  25. data/source/bzs/db/engine/mysql/database.h +178 -40
  26. data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
  27. data/source/bzs/db/engine/mysql/dbManager.h +3 -39
  28. data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
  29. data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
  30. data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
  31. data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
  32. data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
  33. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  34. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
  35. data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
  36. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
  37. data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
  38. data/source/bzs/db/protocol/tdap/client/client.h +52 -25
  39. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
  40. data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
  41. data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
  42. data/source/bzs/db/protocol/tdap/client/database.h +1 -1
  43. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
  44. data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
  45. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
  46. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
  47. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
  48. data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
  49. data/source/bzs/db/protocol/tdap/client/field.h +7 -3
  50. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
  51. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
  52. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  53. data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
  54. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
  55. data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
  56. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
  57. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
  58. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
  59. data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
  60. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
  61. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
  62. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
  63. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
  64. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
  65. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
  66. data/source/bzs/db/protocol/tdap/client/request.h +84 -26
  67. data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
  68. data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
  69. data/source/bzs/db/protocol/tdap/client/table.h +48 -5
  70. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
  71. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
  72. data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
  73. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
  74. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
  75. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
  76. data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
  77. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
  78. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  79. data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
  80. data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
  81. data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
  82. data/source/bzs/db/transactd/appModule.h +1 -1
  83. data/source/bzs/db/transactd/connManager.cpp +2 -0
  84. data/source/bzs/db/transactd/transactd.cpp +1 -0
  85. data/source/bzs/env/compiler.h +10 -0
  86. data/source/bzs/env/mbcswchrLinux.cpp +42 -6
  87. data/source/bzs/env/mbcswchrLinux.h +40 -12
  88. data/source/bzs/example/queryData.cpp +33 -4
  89. data/source/bzs/netsvc/client/iconnection.h +107 -0
  90. data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
  91. data/source/bzs/netsvc/client/tcpClient.h +96 -87
  92. data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
  93. data/source/bzs/rtl/benchmark.cpp +2 -2
  94. data/source/bzs/rtl/stringBuffers.cpp +3 -3
  95. data/source/bzs/rtl/stringBuffers.h +2 -2
  96. data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
  97. data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
  98. data/source/bzs/test/tdclphp/bench.php +126 -101
  99. data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
  100. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
  101. data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
  102. data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
  103. data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
  104. data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
  105. data/source/bzs/test/transactdBench/workerBase.h +46 -0
  106. data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
  107. data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
  108. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
  109. data/source/global/ormsrcgen/main.cpp +2 -0
  110. data/source/global/tdclatl/Database.cpp +2 -2
  111. data/source/global/tdclatl/Database.h +1 -1
  112. data/source/global/tdclatl/FieldDefs.cpp +0 -3
  113. data/source/global/tdclatl/PooledDbManager.cpp +2 -2
  114. data/source/global/tdclatl/PooledDbManager.h +1 -1
  115. data/source/global/tdclatl/PreparedQuery.cpp +53 -0
  116. data/source/global/tdclatl/PreparedQuery.h +61 -0
  117. data/source/global/tdclatl/QueryBase.cpp +2 -1
  118. data/source/global/tdclatl/QueryBase.h +1 -1
  119. data/source/global/tdclatl/Record.cpp +3 -15
  120. data/source/global/tdclatl/Recordset.cpp +15 -10
  121. data/source/global/tdclatl/Recordset.h +3 -0
  122. data/source/global/tdclatl/Table.cpp +42 -7
  123. data/source/global/tdclatl/Table.h +3 -1
  124. data/source/global/tdclatl/activeTable.cpp +264 -76
  125. data/source/global/tdclatl/activeTable.h +12 -3
  126. data/source/global/tdclatl/tdclatl.idl +92 -10
  127. data/source/linux/charsetConvert.h +7 -7
  128. data/transactd.gemspec +14 -27
  129. metadata +18 -27
  130. data/bin/common/tdclc_32_2_0.dll +0 -0
  131. data/bin/common/tdclc_64_2_0.dll +0 -0
  132. data/build/swig/php/generate.cmake.in +0 -56
  133. data/build/swig/php/generate.cmd.in +0 -47
  134. data/build/swig/php/php.swg +0 -197
  135. data/build/swig/php/transactd.no_yield.php +0 -4494
  136. data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
  137. data/build/swig/php/transactd.no_yield.php.patch +0 -685
  138. data/build/swig/php/transactd.yield.php +0 -4461
  139. data/build/swig/php/transactd.yield.php.git.patch +0 -652
  140. data/build/swig/php/transactd.yield.php.patch +0 -652
  141. data/build/swig/ruby/generate.cmake.in +0 -35
  142. data/build/swig/ruby/generate.cmd.in +0 -19
  143. data/build/tdclc/BUILDNUMBER.txt +0 -1
  144. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  145. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  146. data/build/tdclrb/GEM_RELEASE_VERSION +0 -1
@@ -112,6 +112,23 @@ Database_Ptr connectionPool<Database_Ptr>::addOne(const connectParams& param)
112
112
  return m_dbs[m_dbs.size() - 1];
113
113
  }
114
114
 
115
+ template <class Database_Ptr>
116
+ int connectionPool<Database_Ptr>::usingCount() const
117
+ {
118
+ boost::mutex::scoped_lock lck(m_mutex, boost::defer_lock);
119
+ #ifdef TRANSACTD_RB_CALL_WITHOUT_GVL
120
+ TRANSACTD_RB_CALL_WITHOUT_GVL(scopedLock, lck);
121
+ #else
122
+ lck.lock();
123
+ #endif
124
+ int n = 0;
125
+ for (size_t i = 0; i < m_dbs.size(); i++)
126
+ {
127
+ if (m_dbs[i].use_count() > 1)
128
+ ++n;
129
+ }
130
+ return n;
131
+ }
115
132
  /** Delivery database instance
116
133
  If a connect error is occured then bzs::rtl::exception exception is
117
134
  thrown.
@@ -76,6 +76,7 @@ public:
76
76
  int maxConnections() const;
77
77
  void releaseOne();
78
78
  bool reset(int waitSec = 5);
79
+ int usingCount() const;
79
80
  };
80
81
 
81
82
  typedef connectionPool<database_ptr> stdDbCconnectionPool;
@@ -180,7 +180,10 @@ void database::create(const _TCHAR* fullpath, short type)
180
180
  void database::drop()
181
181
  {
182
182
  if (m_impl->dbDef == NULL)
183
+ {
183
184
  m_stat = STATUS_DB_YET_OPEN;
185
+ return;
186
+ }
184
187
  _TCHAR FullPath[MAX_PATH];
185
188
  std::vector<std::_tstring> fileNames;
186
189
  for (int i = 0; i <= m_impl->dbDef->tableCount(); i++)
@@ -322,7 +325,8 @@ bool database::open(const _TCHAR* _uri, short type, short mode,
322
325
  create(_uri, TYPE_SCHEMA_BDF);
323
326
  if (m_stat == STATUS_SUCCESS)
324
327
  {
325
- doOpen(_uri, type, mode, ownername);
328
+ //Open mode force normal
329
+ doOpen(_uri, type, TD_OPEN_NORMAL, ownername);
326
330
  if (m_stat == STATUS_SUCCESS)
327
331
  {
328
332
  m_impl->dbDef->autoMakeSchema();
@@ -35,7 +35,7 @@ class database;
35
35
  class table;
36
36
  class dbdef;
37
37
 
38
- #if defined(__BORLANDC__)
38
+ #if (defined(__BORLANDC__) && !defined(__clang__))
39
39
  typedef bool __stdcall (*deleteRecordFn)(database* db, table* tb, bool inkey);
40
40
  typedef short __stdcall (*schemaMgrFn)(database* db);
41
41
  typedef void __stdcall (*copyDataFn)(database* db, int recordCount, int count,
@@ -21,7 +21,11 @@
21
21
 
22
22
  #include "database.h"
23
23
  #include <bzs/rtl/exception.h>
24
- //---------------------------------------------------------------------------
24
+ #ifdef LINUX
25
+ #include <pthread.h>
26
+ #include <bzs/env/crosscompile.h>
27
+ #include <bzs/env/mbcswchrLinux.h>
28
+ #endif
25
29
 
26
30
  #pragma package(smart_init)
27
31
 
@@ -71,9 +75,12 @@ tls_key g_tlsiID_SC3;
71
75
 
72
76
  void initTlsThread()
73
77
  {
74
- tls_setspecific(g_tlsiID_SC1, new wchar_t[256]);
75
- tls_setspecific(g_tlsiID_SC2, new wchar_t[45]);
76
- tls_setspecific(g_tlsiID_SC3, new wchar_t[45]);
78
+ if (tls_getspecific(g_tlsiID_SC1) == NULL)
79
+ tls_setspecific(g_tlsiID_SC1, new wchar_t[256]);
80
+ if (tls_getspecific(g_tlsiID_SC2) == NULL)
81
+ tls_setspecific(g_tlsiID_SC2, new wchar_t[45]);
82
+ if (tls_getspecific(g_tlsiID_SC3) == NULL)
83
+ tls_setspecific(g_tlsiID_SC3, new wchar_t[45]);
77
84
  }
78
85
 
79
86
  void cleanupTls()
@@ -81,36 +88,62 @@ void cleanupTls()
81
88
  delete (char*)tls_getspecific(g_tlsiID_SC1);
82
89
  delete (char*)tls_getspecific(g_tlsiID_SC2);
83
90
  delete (char*)tls_getspecific(g_tlsiID_SC3);
91
+ tls_setspecific(g_tlsiID_SC1, NULL);
92
+ tls_setspecific(g_tlsiID_SC2, NULL);
93
+ tls_setspecific(g_tlsiID_SC3, NULL);
94
+ }
95
+
96
+ void cleanupCharPtr(void* p)
97
+ {
98
+ delete ((char*)p);
84
99
  }
100
+ #endif // USETLS
85
101
 
86
- #ifdef __APPLE__
102
+ #ifdef LINUX
87
103
 
88
104
  #include <pthread.h>
89
-
90
105
  void __attribute__((constructor)) onLoadLibrary(void);
91
106
  void __attribute__((destructor)) onUnloadLibrary(void);
92
107
 
93
108
  void onLoadLibrary(void)
94
109
  {
95
- pthread_key_create(&g_tlsiID_SC1, NULL);
96
- pthread_key_create(&g_tlsiID_SC2, NULL);
97
- pthread_key_create(&g_tlsiID_SC3, NULL);
110
+ bzs::env::initCvtProcess();
111
+ #if (defined(__APPLE__) && defined(USETLS))
112
+ if (tls_getspecific(g_tlsiID_SC1) == NULL)
113
+ pthread_key_create(&g_tlsiID_SC1, cleanupCharPtr);
114
+ if (tls_getspecific(g_tlsiID_SC2) == NULL)
115
+ pthread_key_create(&g_tlsiID_SC2, cleanupCharPtr);
116
+ if (tls_getspecific(g_tlsiID_SC3) == NULL)
117
+ pthread_key_create(&g_tlsiID_SC3, cleanupCharPtr);
118
+
119
+ #endif
98
120
  }
99
121
 
100
122
  void onUnloadLibrary(void)
101
123
  {
124
+ bzs::env::deinitCvtProcess();
125
+ #if (defined(__APPLE__) && defined(USETLS))
102
126
  cleanupTls();
103
127
  pthread_key_delete(g_tlsiID_SC1);
104
128
  pthread_key_delete(g_tlsiID_SC2);
105
129
  pthread_key_delete(g_tlsiID_SC3);
130
+ #endif
106
131
  }
107
132
 
108
- #else
133
+ #endif // LINUX
134
+
135
+ #if (defined(_WIN32) && defined(USETLS))
109
136
 
110
137
  BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
111
138
  {
112
139
  if (reason == DLL_PROCESS_ATTACH)
113
140
  {
141
+ #ifdef _MSC_VER
142
+ _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
143
+ _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
144
+ //_CrtSetBreakAlloc(151);
145
+ #endif
146
+
114
147
  if ((g_tlsiID_SC1 = TlsAlloc()) == TLS_OUT_OF_INDEXES)
115
148
  return FALSE;
116
149
  if ((g_tlsiID_SC2 = TlsAlloc()) == TLS_OUT_OF_INDEXES)
@@ -133,8 +166,12 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
133
166
  TlsFree(g_tlsiID_SC1);
134
167
  TlsFree(g_tlsiID_SC2);
135
168
  TlsFree(g_tlsiID_SC3);
169
+ #ifdef _MSC_VER
170
+ OutputDebugString(_T("After tdclcpp DLL_PROCESS_DETACH \n"));
171
+ _CrtDumpMemoryLeaks();
172
+ #endif
136
173
  }
137
174
  return TRUE;
138
175
  }
139
- #endif
140
- #endif //(_UNICODE && defined(_WIN32) && _MSC_VER)
176
+ #endif //(defined(_WIN32) && defined(USETLS))
177
+
@@ -80,29 +80,43 @@ public:
80
80
  }
81
81
 
82
82
  inline database* db() const { return m_db; }
83
+
83
84
  inline void use(const connectParams* param = NULL)
84
85
  {
85
86
  if (param)
86
87
  connect(*param, false);
87
88
  }
89
+
88
90
  inline void unUse(){};
89
91
 
90
92
  inline void setOption(__int64){};
93
+
91
94
  inline __int64 option() { return 0; };
95
+
92
96
  inline void beginTrn(short bias) { m_db->beginTrn(bias); };
97
+
93
98
  inline void endTrn() { m_db->endTrn(); }
99
+
94
100
  inline void abortTrn() { m_db->abortTrn(); }
101
+
95
102
  inline int enableTrn() { return m_db->enableTrn(); }
96
- inline void beginSnapshot() { m_db->beginSnapshot(); }
103
+
104
+ inline void beginSnapshot(short bias = CONSISTENT_READ) { m_db->beginSnapshot(bias); }
105
+
97
106
  inline void endSnapshot() { m_db->endSnapshot(); }
107
+
98
108
  inline const _TCHAR* uri() const { return m_db->uri(); }
109
+
99
110
  inline char_td mode() const { return m_db->mode(); }
111
+
100
112
  inline bool isOpened() const { return m_db->isOpened(); }
101
113
 
102
114
  inline short_td stat() const { return m_db->stat(); }
115
+
103
116
  inline uchar_td* clientID() const { return m_db->clientID(); }
104
117
  };
105
118
 
119
+ /** @cond INTERNAL */
106
120
  /* multi databases and a single thread inplemantation idatabaseManager
107
121
  */
108
122
  inline void releaseDatabaseDummy(database* p)
@@ -111,7 +125,9 @@ inline void releaseDatabaseDummy(database* p)
111
125
  inline void releaseDbManagerDummy(idatabaseManager* p)
112
126
  {
113
127
  }
128
+ /** @endcond */
114
129
 
130
+ /** Single thread distribution database manager */
115
131
  class disbDbManager : public idatabaseManager, private boost::noncopyable
116
132
  {
117
133
  std::vector<database_ptr> m_dbs;
@@ -143,6 +159,7 @@ public:
143
159
 
144
160
  disbDbManager(database* db)
145
161
  {
162
+ //No delete , because managing life cycle is db owner.
146
163
  database_ptr d(db, releaseDatabaseDummy);
147
164
  addDb(d);
148
165
  }
@@ -196,6 +213,7 @@ public:
196
213
  else
197
214
  m_db = m_dbs[0].get();
198
215
  }
216
+
199
217
  inline void unUse(){};
200
218
 
201
219
  inline const _TCHAR* uri() const { return m_db->uri(); }
@@ -208,15 +226,34 @@ public:
208
226
 
209
227
  inline __int64 option() { return 0; };
210
228
 
211
- inline void beginTrn(short bias) { m_db->beginTrn(bias); };
229
+ inline void beginTrn(short bias)
230
+ {
231
+ for (size_t i = 0; i < m_dbs.size(); ++i)
232
+ {
233
+ m_dbs[i]->beginTrn(bias);
234
+ if (m_dbs[i]->stat())
235
+ {
236
+ abortTrn();
237
+ nstable::throwError(m_dbs[i]->uri(), m_dbs[i]->stat());
238
+ }
239
+ }
240
+ }
212
241
 
213
- inline void endTrn() { m_db->endTrn(); }
242
+ inline void endTrn()
243
+ {
244
+ for (size_t i = 0; i < m_dbs.size(); ++i)
245
+ m_dbs[i]->endTrn();
246
+ }
214
247
 
215
- inline void abortTrn() { m_db->abortTrn(); }
248
+ inline void abortTrn()
249
+ {
250
+ for (size_t i = 0; i < m_dbs.size(); ++i)
251
+ m_dbs[i]->abortTrn();
252
+ }
216
253
 
217
254
  inline int enableTrn() { return m_db->enableTrn(); }
218
255
 
219
- inline void beginSnapshot() { m_db->beginSnapshot(); }
256
+ inline void beginSnapshot(short bias = CONSISTENT_READ) { m_db->beginSnapshot(bias); }
220
257
 
221
258
  inline void endSnapshot() { m_db->endSnapshot(); }
222
259
 
@@ -730,6 +730,8 @@ tabledef* dbdef::tableDefs(int index)
730
730
  def->autoIncExSpace = ((database*)nsdb())->defaultAutoIncSpace();
731
731
 
732
732
  setCodePage(def);
733
+ //Fix:Bug of maxRecordLen is mistake value saved, recalculate maxRecordLen.
734
+ setRecordLen(index);
733
735
  }
734
736
  else if (def == (tabledef*)-1)
735
737
  return NULL;
@@ -806,7 +808,7 @@ void dbdef::create(const _TCHAR* fullpath)
806
808
  fileSpec* fs;
807
809
 
808
810
  fs = (fileSpec*)malloc(512);
809
- memset(fs, 512, 0x00);
811
+ memset(fs, 0x00, 512);
810
812
  fs->recLen = sizeof(tabledef);
811
813
  fs->pageSize = 4096;
812
814
  fs->indexCount = 1;
@@ -840,7 +842,7 @@ ushort_td dbdef::getRecordLen(short TableIndex)
840
842
  short i;
841
843
  tabledef* td = tableDefs(TableIndex);
842
844
  for (i = 0; i < td->fieldCount; i++)
843
- ret += td->fieldDefs[i].len + td->fieldDefs[i].varLenBytes();
845
+ ret += td->fieldDefs[i].len/* + td->fieldDefs[i].varLenBytes()*/;
844
846
  return ret;
845
847
  }
846
848
 
@@ -46,10 +46,26 @@ dllUnloadCallback dllUnloadCallbackFunc = NULL;
46
46
  #ifdef USETLS
47
47
  tls_key g_tlsiID1;
48
48
  tls_key g_tlsiID_SC1;
49
- #else
49
+
50
+ void cleanupClinet(void* p)
51
+ {
52
+ delete ((bzs::db::protocol::tdap::client::client*)(p));
53
+ }
54
+
55
+ void cleanupClientID(void* p)
56
+ {
57
+ delete ((clientID*)(p));
58
+ }
59
+
60
+ void cleanupWChar(void* p)
61
+ {
62
+ delete ((wchar_t*)(p));
63
+ }
64
+
65
+ #else // NOT USETLS
50
66
  __THREAD clientID __THREAD_BCB g_cid;
51
67
  __THREAD bool __THREAD_BCB g_initCid = false;
52
- #endif
68
+ #endif // NOT USETLS
53
69
 
54
70
  #ifdef _WIN32
55
71
 
@@ -57,6 +73,12 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
57
73
  {
58
74
  if (reason == DLL_PROCESS_ATTACH)
59
75
  {
76
+ #ifdef _MSC_VER
77
+ _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
78
+ _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
79
+ //_CrtSetBreakAlloc(155);
80
+ #endif
81
+
60
82
  #ifdef USETLS
61
83
  if ((g_tlsiID = TlsAlloc()) == TLS_OUT_OF_INDEXES)
62
84
  return FALSE;
@@ -71,9 +93,9 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
71
93
  else if (reason == DLL_THREAD_DETACH)
72
94
  {
73
95
  #ifdef USETLS
74
- delete (bzs::db::protocol::tdap::client::client*)tls_getspecific(
75
- g_tlsiID);
76
- tls_setspecific(g_tlsiID1, 0);
96
+ cleanupClinet(tls_getspecific(g_tlsiID));
97
+ cleanupClientID(tls_getspecific(g_tlsiID1));
98
+ cleanupWChar(tls_getspecific(g_tlsiID_SC1));
77
99
  #else
78
100
  delete g_client;
79
101
  g_client = NULL;
@@ -81,16 +103,26 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
81
103
  }
82
104
  else if (reason == DLL_PROCESS_DETACH)
83
105
  {
106
+ try
107
+ {
84
108
  if (dllUnloadCallbackFunc)
85
109
  dllUnloadCallbackFunc();
86
-
87
110
  delete m_cons;
111
+ }
112
+ catch(...){}
88
113
  m_cons = NULL;
89
114
 
90
115
  #ifdef USETLS
116
+ cleanupClinet(tls_getspecific(g_tlsiID));
117
+ cleanupClientID(tls_getspecific(g_tlsiID1));
118
+ cleanupWChar(tls_getspecific(g_tlsiID_SC1));
91
119
  TlsFree(g_tlsiID);
92
120
  TlsFree(g_tlsiID1);
93
121
  TlsFree(g_tlsiID_SC1);
122
+ #endif
123
+ #ifdef _MSC_VER
124
+ OutputDebugString(_T("After tdclc DLL_PROCESS_DETACH \n"));
125
+ _CrtDumpMemoryLeaks();
94
126
  #endif
95
127
  }
96
128
  return TRUE;
@@ -107,24 +139,30 @@ void __attribute__((destructor)) onUnloadLibrary(void);
107
139
 
108
140
  void onLoadLibrary(void)
109
141
  {
110
- m_cons = new connections(PIPENAME);
142
+ if (m_cons == NULL)
143
+ {
144
+ m_cons = new connections(PIPENAME);
111
145
  #ifdef USETLS
112
- pthread_key_create(&g_tlsiID, NULL);
113
- pthread_key_create(&g_tlsiID1, NULL);
114
- pthread_key_create(&g_tlsiID_SC1, NULL);
146
+ pthread_key_create(&g_tlsiID, cleanupClinet);
147
+ pthread_key_create(&g_tlsiID1, cleanupClientID);
148
+ pthread_key_create(&g_tlsiID_SC1, cleanupWChar);
115
149
  #endif
150
+ }
116
151
  }
117
152
 
118
153
  void onUnloadLibrary(void)
119
154
  {
120
- if (dllUnloadCallbackFunc)
121
- dllUnloadCallbackFunc();
122
- delete m_cons;
123
- m_cons = NULL;
155
+ if (m_cons)
156
+ {
157
+ if (dllUnloadCallbackFunc)
158
+ dllUnloadCallbackFunc();
159
+ delete m_cons;
160
+ m_cons = NULL;
124
161
  #ifdef USETLS
125
- pthread_key_delete(g_tlsiID);
126
- pthread_key_delete(g_tlsiID1);
127
- pthread_key_delete(g_tlsiID_SC1);
162
+ pthread_key_delete(g_tlsiID);
163
+ pthread_key_delete(g_tlsiID1);
164
+ pthread_key_delete(g_tlsiID_SC1);
165
+ }
128
166
  #endif
129
167
  }
130
168
  #endif // NOT _WIN32
@@ -138,19 +176,21 @@ extern "C" PACKAGE_OSX short_td __STDCALL
138
176
  short_td ret;
139
177
  try
140
178
  {
141
-
142
179
  if ((TD_GET_BLOB_BUF != op) && (TD_ADD_SENDBLOB != op))
180
+ {
181
+ if (cid == NULL) return 1;
182
+
143
183
  client_t->setParam(op, pbk, data, datalen, keybuf, keylen, keyNum,
144
184
  cid);
145
185
 
146
- if (client_t->stop_if())
147
- {
148
- client_t->cleanup();
149
- return 0;
186
+ if (client_t->stop_if())
187
+ {
188
+ client_t->cleanup();
189
+ return 0;
190
+ }
150
191
  }
151
- if (cid == NULL)
152
- return 1;
153
192
 
193
+ op = op % 100;
154
194
  switch (op)
155
195
  {
156
196
  case TD_GET_BLOB_BUF:
@@ -165,7 +205,7 @@ extern "C" PACKAGE_OSX short_td __STDCALL
165
205
  {
166
206
  if (op == TD_CREATETABLE)
167
207
  {
168
- if (client_t->readServerCharsetIndex())
208
+ if (client_t->getServerCharsetIndex() != -1)
169
209
  client_t->create();
170
210
  else
171
211
  {
@@ -211,6 +251,8 @@ extern "C" PACKAGE_OSX short_td __STDCALL
211
251
  client_t->req().paramMask = P_MASK_NOKEYBUF;
212
252
  break;
213
253
  case TD_UNLOCK:
254
+ client_t->req().paramMask = P_MASK_POSBLK | P_MASK_KEYNUM;
255
+ break;
214
256
  case TD_UPDATE_PART:
215
257
  client_t->cleanup();
216
258
  return 0;
@@ -255,6 +297,8 @@ extern "C" PACKAGE_OSX short_td __STDCALL
255
297
  break;
256
298
  case TD_KEY_NEXT_MULTI:
257
299
  case TD_KEY_PREV_MULTI:
300
+ case TD_KEY_SEEK_MULTI:
301
+ case TD_FILTER_PREPARE:
258
302
  client_t->req().paramMask = P_MASK_POSBLK | P_MASK_DATA |
259
303
  P_MASK_DATALEN | P_MASK_EX_SENDLEN |
260
304
  P_MASK_KEYNUM;
@@ -282,11 +326,6 @@ extern "C" PACKAGE_OSX short_td __STDCALL
282
326
  client_t->req().paramMask = P_MASK_POSBLK | P_MASK_DATA |
283
327
  P_MASK_DATALEN | P_MASK_EX_SENDLEN;
284
328
  break;
285
- case TD_KEY_SEEK_MULTI:
286
- client_t->req().paramMask = P_MASK_POSBLK | P_MASK_DATA |
287
- P_MASK_KEYNUM | P_MASK_DATALEN |
288
- P_MASK_EX_SENDLEN;
289
- break;
290
329
  case TD_GETDIRECTORY:
291
330
  case TD_SETDIRECTORY:
292
331
  break;
@@ -412,13 +451,6 @@ inline clientID* getCid()
412
451
  }
413
452
  return p;
414
453
  #else
415
- return &g_cid;
416
- #endif
417
- }
418
-
419
- void initCid()
420
- {
421
- #ifndef USETLS
422
454
  if (!g_initCid)
423
455
  {
424
456
  g_initCid = true;
@@ -427,10 +459,11 @@ void initCid()
427
459
  g_cid.aid[0] = 'G';
428
460
  g_cid.aid[1] = 'X';
429
461
  }
462
+ return &g_cid;
430
463
  #endif
431
464
  }
432
465
 
433
- extern "C" PACKAGE_OSX short_td BTRVID(ushort_td op, posblk* pbk, void_td* data,
466
+ extern "C" PACKAGE_OSX short_td __STDCALL BTRVID(ushort_td op, posblk* pbk, void_td* data,
434
467
  uint_td* datalen, void_td* keybuf,
435
468
  char_td keyNum, clientID* cid)
436
469
  {
@@ -444,7 +477,6 @@ extern "C" PACKAGE_OSX short_td __STDCALL BTRV(ushort_td op, posblk* pbk,
444
477
  void_td* data, uint_td* datalen,
445
478
  void_td* keybuf, char_td keyNum)
446
479
  {
447
- initCid();
448
480
  return BTRVID(op, pbk, data, datalen, keybuf, keyNum, getCid());
449
481
  }
450
482
 
@@ -452,7 +484,6 @@ extern "C" PACKAGE_OSX short_td __STDCALL
452
484
  BTRCALL(ushort_td op, posblk* pbk, void_td* data, uint_td* datalen,
453
485
  void_td* keybuf, keylen_td keylen, char_td keyNum)
454
486
  {
455
- initCid();
456
487
  return BTRCALLID(op, pbk, data, datalen, keybuf, keylen, keyNum, getCid());
457
488
  }
458
489
 
@@ -460,7 +491,6 @@ extern "C" PACKAGE_OSX short_td __STDCALL
460
491
  BTRCALL32(ushort_td op, posblk* pbk, void_td* data, uint_td* datalen,
461
492
  void_td* keybuf, keylen_td keylen, char_td keyNum)
462
493
  {
463
- initCid();
464
494
  return BTRCALLID(op, pbk, data, datalen, keybuf, keylen, keyNum, getCid());
465
495
  }
466
496