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.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +16 -16
- data/README-JA +16 -16
- data/bin/common/tdclc_32_2_1.dll +0 -0
- data/bin/common/tdclc_64_2_1.dll +0 -0
- data/build/common/transactd_cl_common.cmake +0 -1
- data/build/common/transactd_common.cmake +28 -38
- data/build/swig/ruby/ruby.swg +36 -30
- data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
- data/build/swig/tdcl.i +217 -62
- data/build/tdclc/CMakeLists.txt +14 -26
- data/build/tdclc/libtdclcm.map +4 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +0 -0
- data/build/tdclcpp/CMakeLists.txt +7 -22
- data/build/tdclcpp/tdclcpp.rc +0 -0
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/CMakeLists.txt +7 -49
- data/build/tdclrb/tdclrb.rc +62 -0
- data/source/bzs/db/blobBuffer.h +5 -0
- data/source/bzs/db/blobStructs.h +2 -0
- data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
- data/source/bzs/db/engine/mysql/database.cpp +391 -169
- data/source/bzs/db/engine/mysql/database.h +178 -40
- data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
- data/source/bzs/db/engine/mysql/dbManager.h +3 -39
- data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
- data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
- data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
- data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
- data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
- data/source/bzs/db/protocol/tdap/client/client.h +52 -25
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
- data/source/bzs/db/protocol/tdap/client/database.h +1 -1
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
- data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
- data/source/bzs/db/protocol/tdap/client/field.h +7 -3
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
- data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
- data/source/bzs/db/protocol/tdap/client/request.h +84 -26
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
- data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
- data/source/bzs/db/protocol/tdap/client/table.h +48 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
- data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
- data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
- data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
- data/source/bzs/db/transactd/appModule.h +1 -1
- data/source/bzs/db/transactd/connManager.cpp +2 -0
- data/source/bzs/db/transactd/transactd.cpp +1 -0
- data/source/bzs/env/compiler.h +10 -0
- data/source/bzs/env/mbcswchrLinux.cpp +42 -6
- data/source/bzs/env/mbcswchrLinux.h +40 -12
- data/source/bzs/example/queryData.cpp +33 -4
- data/source/bzs/netsvc/client/iconnection.h +107 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
- data/source/bzs/netsvc/client/tcpClient.h +96 -87
- data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
- data/source/bzs/rtl/benchmark.cpp +2 -2
- data/source/bzs/rtl/stringBuffers.cpp +3 -3
- data/source/bzs/rtl/stringBuffers.h +2 -2
- data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
- data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
- data/source/bzs/test/tdclphp/bench.php +126 -101
- data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
- data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
- data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
- data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
- data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
- data/source/bzs/test/transactdBench/workerBase.h +46 -0
- data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
- data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
- data/source/global/ormsrcgen/main.cpp +2 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -1
- data/source/global/tdclatl/FieldDefs.cpp +0 -3
- data/source/global/tdclatl/PooledDbManager.cpp +2 -2
- data/source/global/tdclatl/PooledDbManager.h +1 -1
- data/source/global/tdclatl/PreparedQuery.cpp +53 -0
- data/source/global/tdclatl/PreparedQuery.h +61 -0
- data/source/global/tdclatl/QueryBase.cpp +2 -1
- data/source/global/tdclatl/QueryBase.h +1 -1
- data/source/global/tdclatl/Record.cpp +3 -15
- data/source/global/tdclatl/Recordset.cpp +15 -10
- data/source/global/tdclatl/Recordset.h +3 -0
- data/source/global/tdclatl/Table.cpp +42 -7
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/activeTable.cpp +264 -76
- data/source/global/tdclatl/activeTable.h +12 -3
- data/source/global/tdclatl/tdclatl.idl +92 -10
- data/source/linux/charsetConvert.h +7 -7
- data/transactd.gemspec +14 -27
- metadata +18 -27
- data/bin/common/tdclc_32_2_0.dll +0 -0
- data/bin/common/tdclc_64_2_0.dll +0 -0
- data/build/swig/php/generate.cmake.in +0 -56
- data/build/swig/php/generate.cmd.in +0 -47
- data/build/swig/php/php.swg +0 -197
- data/build/swig/php/transactd.no_yield.php +0 -4494
- data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
- data/build/swig/php/transactd.no_yield.php.patch +0 -685
- data/build/swig/php/transactd.yield.php +0 -4461
- data/build/swig/php/transactd.yield.php.git.patch +0 -652
- data/build/swig/php/transactd.yield.php.patch +0 -652
- data/build/swig/ruby/generate.cmake.in +0 -35
- data/build/swig/ruby/generate.cmd.in +0 -19
- data/build/tdclc/BUILDNUMBER.txt +0 -1
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- 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.
|
|
@@ -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
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
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()
|
|
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()
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
142
|
+
if (m_cons == NULL)
|
|
143
|
+
{
|
|
144
|
+
m_cons = new connections(PIPENAME);
|
|
111
145
|
#ifdef USETLS
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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 (
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
155
|
+
if (m_cons)
|
|
156
|
+
{
|
|
157
|
+
if (dllUnloadCallbackFunc)
|
|
158
|
+
dllUnloadCallbackFunc();
|
|
159
|
+
delete m_cons;
|
|
160
|
+
m_cons = NULL;
|
|
124
161
|
#ifdef USETLS
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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->
|
|
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
|
|