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.
- checksums.yaml +4 -4
- data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
- data/CMakeLists.txt +20 -15
- data/{README-JA → README-JA.md} +23 -23
- data/{README → README.md} +22 -24
- data/RELEASE_NOTE +120 -0
- data/RELEASE_NOTE-JA +110 -0
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
- data/build/swig/tdcl.i +22 -2
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -1
- data/build/tdclrb/CMakeLists.txt +6 -1
- data/build/tdclrb/bldgem/extconf.rb +5 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +44 -40
- data/source/bzs/db/engine/mysql/database.h +28 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
- data/source/bzs/db/engine/mysql/dbManager.h +2 -7
- data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
- data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
- data/source/bzs/db/protocol/tdap/client/client.h +41 -11
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
- data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
- data/source/bzs/db/protocol/tdap/client/database.h +3 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
- data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
- data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
- data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
- data/source/bzs/db/protocol/tdap/client/request.h +28 -11
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
- data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
- data/source/bzs/db/protocol/tdap/client/table.h +20 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
- data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
- data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
- data/source/bzs/db/protocol/tdap/uri.h +41 -6
- data/source/bzs/db/transactd/appModule.cpp +0 -1
- data/source/bzs/db/transactd/appModule.h +0 -2
- data/source/bzs/db/transactd/connManager.cpp +202 -33
- data/source/bzs/db/transactd/connManager.h +11 -4
- data/source/bzs/db/transactd/connectionRecord.h +19 -5
- data/source/bzs/db/transactd/transactd.cpp +39 -8
- data/source/bzs/env/crosscompile.cpp +1 -1
- data/source/bzs/example/queryData.cpp +1 -1
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
- data/source/bzs/netsvc/client/tcpClient.h +171 -106
- data/source/bzs/netsvc/server/IAppModule.h +0 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
- data/source/bzs/netsvc/server/serverPipe.h +2 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
- data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
- data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
- data/source/global/tdclatl/Bookmark.cpp +28 -0
- data/source/global/tdclatl/Bookmark.h +65 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -3
- data/source/global/tdclatl/DbDef.cpp +6 -0
- data/source/global/tdclatl/DbDef.h +1 -0
- data/source/global/tdclatl/QueryBase.cpp +29 -0
- data/source/global/tdclatl/QueryBase.h +4 -0
- data/source/global/tdclatl/Record.cpp +14 -2
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Table.cpp +80 -16
- data/source/global/tdclatl/Table.h +23 -8
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
- data/source/global/tdclatl/activeTable.cpp +2 -2
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +64 -14
- metadata +12 -12
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
- /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
- /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
|
@@ -20,6 +20,12 @@
|
|
|
20
20
|
#include "appModule.h"
|
|
21
21
|
#include <bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h>
|
|
22
22
|
#include "connManager.h"
|
|
23
|
+
#include <bzs/db/engine/mysql/mysqlThd.h>
|
|
24
|
+
#include <bzs/db/protocol/tdap/mysql/databaseSchema.h>
|
|
25
|
+
#include <bzs/db/engine/mysql/errorMessage.h>
|
|
26
|
+
|
|
27
|
+
/* implemnts in transactd.cpp */
|
|
28
|
+
extern const char* get_trd_sys_var(int index);
|
|
23
29
|
|
|
24
30
|
namespace bzs
|
|
25
31
|
{
|
|
@@ -47,11 +53,8 @@ const module* getMod(unsigned __int64 conid)
|
|
|
47
53
|
return NULL;
|
|
48
54
|
}
|
|
49
55
|
|
|
50
|
-
const database* connManager::getDatabase(
|
|
56
|
+
const database* connManager::getDatabase(igetDatabases* dbm, int dbid) const
|
|
51
57
|
{
|
|
52
|
-
|
|
53
|
-
igetDatabases* dbm =
|
|
54
|
-
dynamic_cast<igetDatabases*>(mod->m_commandExecuter.get());
|
|
55
58
|
const databases& dbs = dbm->dbs();
|
|
56
59
|
if (dbid < (int)dbs.size())
|
|
57
60
|
return dbs[dbid].get();
|
|
@@ -75,21 +78,43 @@ void connManager::getConnectionList() const
|
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
80
|
|
|
78
|
-
void connManager::getDatabaseList(const module* mod) const
|
|
81
|
+
void connManager::getDatabaseList(igetDatabases* dbm, const module* mod) const
|
|
79
82
|
{
|
|
80
|
-
igetDatabases* dbm =
|
|
81
|
-
dynamic_cast<igetDatabases*>(mod->m_commandExecuter.get());
|
|
82
83
|
const databases& dbs = dbm->dbs();
|
|
83
84
|
for (size_t j = 0; j < dbs.size(); j++)
|
|
84
85
|
{
|
|
85
|
-
|
|
86
86
|
if (dbs[j])
|
|
87
87
|
{
|
|
88
|
+
const database* db = dbs[j].get();
|
|
88
89
|
m_records.push_back(connection::record());
|
|
89
90
|
connection::record& rec = m_records[m_records.size() - 1];
|
|
90
91
|
rec.conId = (unsigned __int64)mod;
|
|
91
|
-
rec.cid =
|
|
92
|
+
rec.cid = db->clientID();
|
|
92
93
|
rec.dbid = (unsigned short)j;
|
|
94
|
+
rec.status = 0;
|
|
95
|
+
rec.inTransaction = db->inTransaction();
|
|
96
|
+
rec.inSnapshot = db->inSnapshot();
|
|
97
|
+
if (rec.inTransaction)
|
|
98
|
+
{
|
|
99
|
+
if (db->transactionIsolation() == ISO_REPEATABLE_READ)
|
|
100
|
+
rec.trnType = MULTILOCK_GAP;
|
|
101
|
+
else if (db->transactionIsolation() == ISO_READ_COMMITTED)
|
|
102
|
+
{
|
|
103
|
+
if (db->transactionType() == TRN_RECORD_LOCK_SINGLE)
|
|
104
|
+
rec.trnType = SINGLELOCK_NOGAP;
|
|
105
|
+
else
|
|
106
|
+
rec.trnType = MULTILOCK_NOGAP;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (rec.inSnapshot)
|
|
110
|
+
{
|
|
111
|
+
if (db->transactionIsolation() == 0)
|
|
112
|
+
rec.trnType = CONSISTENT_READ;
|
|
113
|
+
else if (db->transactionIsolation() == ISO_REPEATABLE_READ)
|
|
114
|
+
rec.trnType = MULTILOCK_GAP_SHARE;
|
|
115
|
+
else if (db->transactionIsolation() == ISO_READ_COMMITTED)
|
|
116
|
+
rec.trnType = MULTILOCK_NOGAP_SHARE;
|
|
117
|
+
}
|
|
93
118
|
strncpy_s(rec.name, 64, dbs[j]->name().c_str(), 64);
|
|
94
119
|
}
|
|
95
120
|
}
|
|
@@ -108,33 +133,44 @@ const connManager::records& connManager::getRecords(unsigned __int64 conid,
|
|
|
108
133
|
const module* mod = getMod(conid);
|
|
109
134
|
if (mod)
|
|
110
135
|
{
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
136
|
+
igetDatabases* dbm =
|
|
137
|
+
dynamic_cast<igetDatabases*>(mod->m_commandExecuter.get());
|
|
138
|
+
|
|
139
|
+
//Lock database add remove
|
|
140
|
+
boost::mutex::scoped_lock lck(dbm->mutex());
|
|
141
|
+
|
|
142
|
+
if (dbid < 0)
|
|
143
|
+
getDatabaseList(dbm, mod);
|
|
144
|
+
else
|
|
115
145
|
{
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
else
|
|
146
|
+
const database* db = getDatabase(dbm, dbid);
|
|
147
|
+
if (db)
|
|
119
148
|
{
|
|
120
|
-
const
|
|
121
|
-
|
|
149
|
+
const std::vector<boost::shared_ptr<table> >& tables =
|
|
150
|
+
db->tables();
|
|
151
|
+
|
|
152
|
+
//Lock table add release in the db
|
|
153
|
+
boost::mutex::scoped_lock lckt(database::tableRef.mutex());
|
|
154
|
+
for (size_t k = 0; k < tables.size(); k++)
|
|
122
155
|
{
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
for (size_t k = 0; k < tables.size(); k++)
|
|
156
|
+
const table* tb = tables[k].get();
|
|
157
|
+
if (tb)
|
|
126
158
|
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
159
|
+
m_records.push_back(connection::record());
|
|
160
|
+
connection::record& rec =
|
|
161
|
+
m_records[m_records.size() - 1];
|
|
162
|
+
rec.conId = (unsigned __int64)mod;
|
|
163
|
+
rec.cid = tb->id();
|
|
164
|
+
rec.readCount = tb->readCount();
|
|
165
|
+
rec.updCount = tb->updCount();
|
|
166
|
+
rec.delCount = tb->delCount();
|
|
167
|
+
rec.insCount = tb->insCount();
|
|
168
|
+
rec.status = 0;
|
|
169
|
+
rec.openNormal = (tb->mode() == TD_OPEN_NORMAL);
|
|
170
|
+
rec.openReadOnly = (tb->mode() == TD_OPEN_READONLY);
|
|
171
|
+
rec.openEx = (tb->mode() == TD_OPEN_EXCLUSIVE);
|
|
172
|
+
rec.openReadOnlyEx = (tb->mode() == TD_OPEN_READONLY_EXCLUSIVE);
|
|
173
|
+
strncpy_s(rec.name, 64, tb->name().c_str(), 64);
|
|
138
174
|
}
|
|
139
175
|
}
|
|
140
176
|
}
|
|
@@ -144,6 +180,138 @@ const connManager::records& connManager::getRecords(unsigned __int64 conid,
|
|
|
144
180
|
return m_records;
|
|
145
181
|
}
|
|
146
182
|
|
|
183
|
+
const connManager::records& connManager::systemVariables() const
|
|
184
|
+
{
|
|
185
|
+
m_records.clear();
|
|
186
|
+
for (int i = 0 ; i < TD_VAR_SIZE; ++i)
|
|
187
|
+
{
|
|
188
|
+
const char* p = ::get_trd_sys_var(i);
|
|
189
|
+
if (p)
|
|
190
|
+
{
|
|
191
|
+
m_records.push_back(connection::record());
|
|
192
|
+
connection::record& rec = m_records[m_records.size() - 1];
|
|
193
|
+
rec.value_id = i;
|
|
194
|
+
switch(i)
|
|
195
|
+
{
|
|
196
|
+
case TD_VER_DB:
|
|
197
|
+
case TD_VAR_LISTENADDRESS:
|
|
198
|
+
case TD_VAR_LISTENPORT:
|
|
199
|
+
case TD_VAR_HOSTCHECKNAME:
|
|
200
|
+
case TD_VAR_ISOLATION:
|
|
201
|
+
case TD_VAR_AUTHTYPE:
|
|
202
|
+
case TD_VAR_HSLISTENPORT:
|
|
203
|
+
strncpy(rec.value, p , 65);
|
|
204
|
+
break;
|
|
205
|
+
case TD_VER_SERVER:
|
|
206
|
+
sprintf_s(rec.value, 65, "%d.%d.%d", TRANSACTD_VER_MAJOR, TRANSACTD_VER_MINOR, TRANSACTD_VER_RELEASE);
|
|
207
|
+
break;
|
|
208
|
+
default:
|
|
209
|
+
_ltoa_s(*((unsigned int*)p), rec.value, 65, 10);
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return m_records;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
inline void appenDbList(connManager::records& recs, LEX_STRING* db_name)
|
|
218
|
+
{
|
|
219
|
+
recs.push_back(connection::record());
|
|
220
|
+
connection::record& rec = recs[recs.size() - 1];
|
|
221
|
+
strncpy(rec.name, db_name->str, 64);
|
|
222
|
+
rec.name[64] = 0x00;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const connManager::records& connManager::getDefinedDatabaseList() const
|
|
226
|
+
{
|
|
227
|
+
m_records.clear();
|
|
228
|
+
THD* thd = createThdForThread();
|
|
229
|
+
try
|
|
230
|
+
{
|
|
231
|
+
if (thd)
|
|
232
|
+
{
|
|
233
|
+
cp_security_ctx(thd)->skip_grants();
|
|
234
|
+
SQL_Strings files;
|
|
235
|
+
db_list(thd, &files);
|
|
236
|
+
#ifdef MARIADDB_10_0
|
|
237
|
+
for (int i = 0; i < (int)files.elements(); ++i)
|
|
238
|
+
appenDbList(m_records, files.at(i));
|
|
239
|
+
#else
|
|
240
|
+
List_iterator_fast<LEX_STRING> it(files);
|
|
241
|
+
LEX_STRING* db_name;
|
|
242
|
+
while ((db_name = it++))
|
|
243
|
+
appenDbList(m_records, db_name);
|
|
244
|
+
#endif
|
|
245
|
+
deleteThdForThread(thd);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (bzs::rtl::exception& e)
|
|
249
|
+
{
|
|
250
|
+
if (thd)
|
|
251
|
+
deleteThdForThread(thd);
|
|
252
|
+
const int* code = getCode(e);
|
|
253
|
+
if (code)
|
|
254
|
+
m_stat = *code;
|
|
255
|
+
else
|
|
256
|
+
{
|
|
257
|
+
m_stat = 20000;
|
|
258
|
+
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
|
259
|
+
}
|
|
260
|
+
printWarningMessage(code, getMsg(e));
|
|
261
|
+
}
|
|
262
|
+
catch (...)
|
|
263
|
+
{
|
|
264
|
+
try
|
|
265
|
+
{
|
|
266
|
+
m_stat = 20001;
|
|
267
|
+
deleteThdForThread(thd);
|
|
268
|
+
}
|
|
269
|
+
catch(...){}
|
|
270
|
+
}
|
|
271
|
+
return m_records;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const connManager::records& connManager::schemaTableList(const char* dbname)
|
|
275
|
+
{
|
|
276
|
+
try
|
|
277
|
+
{
|
|
278
|
+
m_records.clear();
|
|
279
|
+
if (dbname && dbname[0])
|
|
280
|
+
{
|
|
281
|
+
boost::shared_ptr<database> db(new database(dbname, 1));
|
|
282
|
+
if (db)
|
|
283
|
+
{
|
|
284
|
+
std::vector<std::string> tablelist;
|
|
285
|
+
schemaBuilder::listSchemaTable(db.get(), tablelist);
|
|
286
|
+
for (int i = 0; i < (int)tablelist.size(); ++i)
|
|
287
|
+
{
|
|
288
|
+
m_records.push_back(connection::record());
|
|
289
|
+
connection::record& rec = m_records[m_records.size() - 1];
|
|
290
|
+
strncpy(rec.name, tablelist[i].c_str(), 64);
|
|
291
|
+
rec.name[64] = 0x00;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (bzs::rtl::exception& e)
|
|
297
|
+
{
|
|
298
|
+
const int* code = getCode(e);
|
|
299
|
+
if (code)
|
|
300
|
+
m_stat = *code;
|
|
301
|
+
else
|
|
302
|
+
{
|
|
303
|
+
m_stat = 20000;
|
|
304
|
+
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
|
305
|
+
}
|
|
306
|
+
printWarningMessage(code, getMsg(e));
|
|
307
|
+
}
|
|
308
|
+
catch (...)
|
|
309
|
+
{
|
|
310
|
+
m_stat = 20001;
|
|
311
|
+
}
|
|
312
|
+
return m_records;
|
|
313
|
+
}
|
|
314
|
+
|
|
147
315
|
void connManager::doDisconnect(unsigned __int64 conid)
|
|
148
316
|
{
|
|
149
317
|
module* mod = const_cast<module*>(getMod(conid));
|
|
@@ -179,7 +347,8 @@ void connManager::doDisconnectAll()
|
|
|
179
347
|
for (size_t i = 0; i < modules.size(); i++)
|
|
180
348
|
{
|
|
181
349
|
const module* mod = dynamic_cast<module*>(modules[i]);
|
|
182
|
-
|
|
350
|
+
if (mod && ((unsigned __int64)mod != m_me))
|
|
351
|
+
doDisconnect((unsigned __int64)mod);
|
|
183
352
|
}
|
|
184
353
|
}
|
|
185
354
|
|
|
@@ -30,6 +30,7 @@ namespace engine
|
|
|
30
30
|
namespace mysql
|
|
31
31
|
{
|
|
32
32
|
class database;
|
|
33
|
+
class igetDatabases;
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
namespace transactd
|
|
@@ -45,19 +46,25 @@ public:
|
|
|
45
46
|
private:
|
|
46
47
|
mutable records m_records;
|
|
47
48
|
unsigned __int64 m_me;
|
|
49
|
+
mutable short m_stat;
|
|
48
50
|
void getConnectionList() const;
|
|
49
|
-
void getDatabaseList(
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
void getDatabaseList(bzs::db::engine::mysql::igetDatabases* dbm,
|
|
52
|
+
const module* mod) const;
|
|
53
|
+
const bzs::db::engine::mysql::database* getDatabase(
|
|
54
|
+
bzs::db::engine::mysql::igetDatabases* dbm, int dbid) const;
|
|
52
55
|
void doDisconnect(unsigned __int64 conid);
|
|
53
56
|
void doDisconnectAll();
|
|
54
57
|
|
|
55
58
|
public:
|
|
56
|
-
connManager(unsigned __int64 me) : m_me(me){};
|
|
59
|
+
connManager(unsigned __int64 me) : m_me(me), m_stat(0){};
|
|
57
60
|
virtual ~connManager();
|
|
61
|
+
const connManager::records& systemVariables() const;
|
|
58
62
|
const records& getRecords(unsigned __int64 conid, int dbid) const;
|
|
63
|
+
const records& getDefinedDatabaseList() const;
|
|
64
|
+
const records& schemaTableList(const char* dbname);
|
|
59
65
|
void disconnect(unsigned __int64 conid);
|
|
60
66
|
void disconnectAll();
|
|
67
|
+
short stat() const {return m_stat;}
|
|
61
68
|
};
|
|
62
69
|
|
|
63
70
|
} // namespace transactd
|
|
@@ -34,15 +34,24 @@ namespace connection
|
|
|
34
34
|
{
|
|
35
35
|
struct record
|
|
36
36
|
{
|
|
37
|
-
record() : conId(0), cid(0), dbid(0)
|
|
37
|
+
record() : conId(0), cid(0), dbid(0), trnType(0), status(0), readCount(0),
|
|
38
|
+
updCount(0), delCount(0), insCount(0)
|
|
38
39
|
{
|
|
39
40
|
name[0] = 0x00;
|
|
40
|
-
status = 0;
|
|
41
41
|
}
|
|
42
42
|
__int64 conId;
|
|
43
|
-
|
|
43
|
+
union
|
|
44
|
+
{
|
|
45
|
+
unsigned int cid;
|
|
46
|
+
unsigned int value_id;
|
|
47
|
+
};
|
|
44
48
|
unsigned short dbid;
|
|
45
|
-
|
|
49
|
+
short trnType;
|
|
50
|
+
union
|
|
51
|
+
{
|
|
52
|
+
char name[67];
|
|
53
|
+
char value[67];
|
|
54
|
+
};
|
|
46
55
|
union
|
|
47
56
|
{
|
|
48
57
|
char status;
|
|
@@ -53,9 +62,14 @@ struct record
|
|
|
53
62
|
char openNormal : 1;
|
|
54
63
|
char openReadOnly : 1;
|
|
55
64
|
char openEx : 1;
|
|
56
|
-
char
|
|
65
|
+
char openReadOnlyEx : 1;
|
|
66
|
+
char dummy : 2;
|
|
57
67
|
};
|
|
58
68
|
};
|
|
69
|
+
unsigned int readCount;
|
|
70
|
+
unsigned int updCount;
|
|
71
|
+
unsigned int delCount;
|
|
72
|
+
unsigned int insCount;
|
|
59
73
|
};
|
|
60
74
|
|
|
61
75
|
} // connection
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
#include <bzs/netsvc/server/serverTpool.h>
|
|
22
22
|
#include <bzs/rtl/exception.h>
|
|
23
23
|
#include <bzs/rtl/debuglog.h>
|
|
24
|
+
#include <bzs/db/protocol/tdap/tdapcapi.h>
|
|
24
25
|
#include <stdio.h>
|
|
25
26
|
#include <iostream>
|
|
26
27
|
#include <string>
|
|
@@ -46,16 +47,14 @@ using namespace bzs::netsvc::server;
|
|
|
46
47
|
static char* g_listenAddress = NULL;
|
|
47
48
|
static char* g_listenPort = NULL;
|
|
48
49
|
static char* g_hostCheckUserName = NULL;
|
|
49
|
-
|
|
50
50
|
static unsigned int g_tcpServerType = TCP_CPT_SERVER;
|
|
51
|
-
|
|
52
51
|
static unsigned int g_maxTcpConnections = 200;
|
|
53
52
|
static unsigned int g_pool_threads = 20;
|
|
54
|
-
unsigned int g_pipeCommSharememSize = PIPE_SHARE_MEM_SIZE;
|
|
55
53
|
int g_tableNmaeLower = 1; // defined in btrvProtocol.h
|
|
56
54
|
unsigned int g_lock_wait_timeout = 1;
|
|
57
55
|
char* g_transaction_isolation = NULL;
|
|
58
56
|
char* g_auth_type = NULL;
|
|
57
|
+
unsigned int g_pipeCommSharememSize = PIPE_SHARE_MEM_SIZE;
|
|
59
58
|
//int g_grant_apply = 0;//skip
|
|
60
59
|
|
|
61
60
|
|
|
@@ -145,7 +144,9 @@ static int transactd_plugin_init(void* p)
|
|
|
145
144
|
{
|
|
146
145
|
boost::shared_ptr<IAppModuleBuilder> app(new transctionalIF(
|
|
147
146
|
PROTOCOL_TYPE_BTRV | PROTOCOL_TYPE_MEMBUFFER));
|
|
148
|
-
srv_p.reset(new pipe::server(app, PIPE_NAME,
|
|
147
|
+
srv_p.reset(new pipe::server(app, PIPE_NAME,
|
|
148
|
+
((strcmp(g_listenPort, "8610") == 0) ? "": g_listenPort),
|
|
149
|
+
g_maxPipeConnections,
|
|
149
150
|
g_pipeCommSharememSize,
|
|
150
151
|
g_hostCheckUserName));
|
|
151
152
|
srv_p->registerErrorHandler(&srvErh);
|
|
@@ -226,7 +227,7 @@ static struct st_mysql_daemon transactd_info = {
|
|
|
226
227
|
MYSQL_DAEMON_INTERFACE_VERSION
|
|
227
228
|
};
|
|
228
229
|
|
|
229
|
-
/** system
|
|
230
|
+
/** system variables define
|
|
230
231
|
*/
|
|
231
232
|
static MYSQL_SYSVAR_STR(address, g_listenAddress,
|
|
232
233
|
PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC,
|
|
@@ -300,9 +301,39 @@ static struct st_mysql_sys_var* g_systemVariables[] =
|
|
|
300
301
|
0
|
|
301
302
|
};
|
|
302
303
|
|
|
303
|
-
|
|
304
|
+
const char* get_trd_sys_var(int index)
|
|
305
|
+
{
|
|
306
|
+
switch(index)
|
|
307
|
+
{
|
|
308
|
+
case TD_VAR_LISTENADDRESS:return g_listenAddress;
|
|
309
|
+
case TD_VAR_LISTENPORT:return g_listenPort;
|
|
310
|
+
case TD_VAR_HOSTCHECKNAME:return g_hostCheckUserName;
|
|
311
|
+
case TD_VAR_MAXTCPCONNECTIONS:return (const char*)&g_maxTcpConnections;
|
|
312
|
+
case TD_VAR_TABLENAMELOWER:return (const char*)&g_tableNmaeLower;
|
|
313
|
+
case TD_VAR_POOLTHREADS:return (const char*)&g_pool_threads;
|
|
314
|
+
case TD_VAR_TCPSERVERTYPE:return (const char*)&g_tcpServerType;
|
|
315
|
+
case TD_VAR_LOCKWAITTIMEOUT:return (const char*)&g_lock_wait_timeout;
|
|
316
|
+
case TD_VAR_ISOLATION:return g_transaction_isolation;
|
|
317
|
+
case TD_VAR_AUTHTYPE:return g_auth_type;
|
|
318
|
+
#ifdef PIPE_SERVER
|
|
319
|
+
case TD_VAR_PIPESHAREMEMSIZE:return (const char*)&g_pipeCommSharememSize;
|
|
320
|
+
case TD_VAR_MAXPIPECONNECTIONS:return (const char*)&g_maxPipeConnections;
|
|
321
|
+
case TD_VAR_USEPIPE:return (const char*)&g_usePipedLocal;
|
|
322
|
+
#endif
|
|
323
|
+
#ifdef USE_HANDLERSOCKET
|
|
324
|
+
case TD_VAR_HSLISTENPORT:return g_hs_listenPort;
|
|
325
|
+
case TD_VAR_USEHS:return (const char*)&g_use_hs;
|
|
326
|
+
#endif
|
|
327
|
+
case TD_VER_DB: return MYSQL_SERVER_VERSION;
|
|
328
|
+
case TD_VER_SERVER:return "";
|
|
329
|
+
|
|
330
|
+
};
|
|
331
|
+
return NULL;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/** show status struct.
|
|
304
335
|
*/
|
|
305
|
-
static st_mysql_show_var
|
|
336
|
+
static st_mysql_show_var g_statusVariables[] = {
|
|
306
337
|
{ "trnsctd_tcp_connections", (char*)&cpt::g_connections, SHOW_INT },
|
|
307
338
|
{ "trnsctd_tcp_wait_threads", (char*)&cpt::g_waitThread, SHOW_INT },
|
|
308
339
|
{ "trnsctd_tpool_connections", (char*)&tpool::g_connections, SHOW_INT },
|
|
@@ -329,7 +360,7 @@ mysql_declare_plugin(transactd)
|
|
|
329
360
|
transactd_plugin_init,
|
|
330
361
|
transactd_plugin_deinit,
|
|
331
362
|
0x0100,
|
|
332
|
-
|
|
363
|
+
g_statusVariables,
|
|
333
364
|
g_systemVariables,
|
|
334
365
|
NULL
|
|
335
366
|
}
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
#include <boost/asio/ip/tcp.hpp>
|
|
30
30
|
#include <boost/asio/buffer.hpp>
|
|
31
31
|
#endif
|
|
32
|
+
#include <boost/system/system_error.hpp>
|
|
32
33
|
#include <vector>
|
|
33
34
|
|
|
34
35
|
|
|
@@ -105,6 +106,7 @@ public:
|
|
|
105
106
|
virtual void write(unsigned int writeSize) = 0;
|
|
106
107
|
virtual char* read() = 0;
|
|
107
108
|
virtual bool isHandShakable() const = 0;
|
|
109
|
+
virtual const boost::system::error_code& error() const = 0;
|
|
108
110
|
};
|
|
109
111
|
|
|
110
112
|
#define CONNECTION_FUNCTION_DIRECT_READ 1
|
|
@@ -39,7 +39,7 @@ namespace netsvc
|
|
|
39
39
|
namespace client
|
|
40
40
|
{
|
|
41
41
|
|
|
42
|
-
char connections::
|
|
42
|
+
char connections::m_port[PORTNUMBUF_SIZE] = { "8610" };
|
|
43
43
|
bool connections::m_usePipedLocal = true;
|
|
44
44
|
#ifdef _WIN32
|
|
45
45
|
int connections::connectTimeout = 20000;
|
|
@@ -68,7 +68,7 @@ connections::connections(const char* pipeName) : m_pipeName(pipeName),m_resolver
|
|
|
68
68
|
m_usePipedLocal = (atol(tmp) != 0);
|
|
69
69
|
GetPrivateProfileString("transctd_client", "port", "8610", tmp, 30,
|
|
70
70
|
buf);
|
|
71
|
-
strcpy_s(
|
|
71
|
+
strcpy_s(m_port, PORTNUMBUF_SIZE, tmp);
|
|
72
72
|
GetPrivateProfileString("transctd_client", "connectTimeout",
|
|
73
73
|
DEFAULT_CONNECT_TIMEOUT, tmp, 30, buf);
|
|
74
74
|
connectTimeout = atoi(tmp)*1000;
|
|
@@ -93,7 +93,7 @@ connections::connections(const char* pipeName) : m_pipeName(pipeName),m_resolver
|
|
|
93
93
|
std::string p = pt.get<std::string>("transctd_client.port");
|
|
94
94
|
if (p == "")
|
|
95
95
|
p = "8610";
|
|
96
|
-
strcpy_s(
|
|
96
|
+
strcpy_s(m_port, PORTNUMBUF_SIZE, p.c_str());
|
|
97
97
|
|
|
98
98
|
p = pt.get<std::string>("transctd_client.connectTimeout");
|
|
99
99
|
connectTimeout = atol(p.c_str());
|
|
@@ -137,8 +137,11 @@ connection* connections::getConnection(asio::ip::tcp::endpoint& ep)
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
asio::ip::tcp::endpoint connections::endpoint(const std::string& host,
|
|
140
|
+
const char* port,
|
|
140
141
|
boost::system::error_code& ec)
|
|
141
142
|
{
|
|
143
|
+
|
|
144
|
+
if (!port || port[0] == 0x00) port = m_port;
|
|
142
145
|
tcp::resolver::query query(host, port);
|
|
143
146
|
|
|
144
147
|
tcp::resolver::iterator dest = m_resolver.resolve(query, ec);
|
|
@@ -156,11 +159,11 @@ asio::ip::tcp::endpoint connections::endpoint(const std::string& host,
|
|
|
156
159
|
return endpoint;
|
|
157
160
|
}
|
|
158
161
|
|
|
159
|
-
connection* connections::getConnection(const std::string& host)
|
|
162
|
+
connection* connections::getConnection(const std::string& host, const char* port)
|
|
160
163
|
{
|
|
161
164
|
mutex::scoped_lock lck(m_mutex);
|
|
162
165
|
boost::system::error_code ec;
|
|
163
|
-
tcp::endpoint ep = endpoint(host, ec);
|
|
166
|
+
tcp::endpoint ep = endpoint(host, port, ec);
|
|
164
167
|
if (!ec)
|
|
165
168
|
return getConnection(ep);
|
|
166
169
|
return NULL;
|
|
@@ -204,14 +207,14 @@ bool connections::disconnect(connection* c)
|
|
|
204
207
|
*/
|
|
205
208
|
bool connections::isUseNamedPipe(asio::ip::tcp::endpoint& ep)
|
|
206
209
|
{
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (!ec && (local == ep))
|
|
210
|
+
asio::ip::tcp::endpoint local(ip::address::from_string("127.0.0.1"), ep.port());
|
|
211
|
+
if (local == ep)
|
|
210
212
|
return true;
|
|
211
213
|
char buf[MAX_PATH];
|
|
212
214
|
if (::gethostname(buf, MAX_PATH) == 0)
|
|
213
215
|
{
|
|
214
|
-
|
|
216
|
+
boost::system::error_code ec;
|
|
217
|
+
local = endpoint(buf, m_port, ec);
|
|
215
218
|
if (local == ep)
|
|
216
219
|
return true;
|
|
217
220
|
}
|
|
@@ -238,27 +241,35 @@ inline connection* connections::doConnect(connection* c)
|
|
|
238
241
|
try
|
|
239
242
|
{
|
|
240
243
|
c->connect();
|
|
241
|
-
|
|
244
|
+
if (c->isConnected())
|
|
245
|
+
return c;
|
|
246
|
+
m_e = c->error();
|
|
247
|
+
delete c;
|
|
248
|
+
return NULL;
|
|
242
249
|
}
|
|
243
250
|
catch (bzs::netsvc::client::exception& e)
|
|
244
251
|
{
|
|
252
|
+
m_e = boost::system::error_code(e.error(), get_system_category());
|
|
245
253
|
delete c;
|
|
246
|
-
|
|
254
|
+
return NULL;
|
|
247
255
|
}
|
|
248
256
|
catch (boost::system::system_error& e)
|
|
249
257
|
{
|
|
258
|
+
m_e = e.code();
|
|
250
259
|
delete c;
|
|
251
|
-
|
|
260
|
+
return NULL;
|
|
252
261
|
}
|
|
253
|
-
catch (std::exception& e)
|
|
262
|
+
catch (std::exception& /*e*/)
|
|
254
263
|
{
|
|
264
|
+
m_e = boost::system::error_code(1, get_system_category());
|
|
255
265
|
delete c;
|
|
256
|
-
|
|
266
|
+
return NULL;
|
|
257
267
|
}
|
|
258
268
|
catch (...)
|
|
259
269
|
{
|
|
270
|
+
m_e = boost::system::error_code(1, get_system_category());
|
|
260
271
|
delete c;
|
|
261
|
-
|
|
272
|
+
return NULL;
|
|
262
273
|
}
|
|
263
274
|
}
|
|
264
275
|
|
|
@@ -272,34 +283,42 @@ inline bool connections::doHandShake(connection* c, handshake f, void* data)
|
|
|
272
283
|
{
|
|
273
284
|
if (!f)
|
|
274
285
|
c->read();
|
|
275
|
-
else
|
|
286
|
+
else
|
|
276
287
|
ret = f(c, data);
|
|
288
|
+
if (c->error())
|
|
289
|
+
m_e = asio::error::connection_refused;
|
|
290
|
+
else if (!ret)
|
|
291
|
+
m_e = asio::error::no_permission;
|
|
277
292
|
if (!ret)
|
|
278
293
|
delete c;
|
|
279
294
|
}
|
|
280
295
|
return ret;
|
|
281
296
|
}
|
|
282
|
-
catch (bzs::netsvc::client::exception&
|
|
297
|
+
catch (bzs::netsvc::client::exception& e)
|
|
283
298
|
{
|
|
284
299
|
delete c;
|
|
285
|
-
|
|
300
|
+
m_e = boost::system::error_code(e.error(), get_system_category());
|
|
301
|
+
return false;
|
|
286
302
|
}
|
|
287
|
-
catch (boost::system::system_error&
|
|
303
|
+
catch (boost::system::system_error& e)
|
|
288
304
|
{
|
|
305
|
+
m_e = e.code();
|
|
289
306
|
delete c;
|
|
290
|
-
|
|
307
|
+
return false;
|
|
291
308
|
}
|
|
292
309
|
}
|
|
293
310
|
|
|
311
|
+
#if defined(__BCPLUSPLUS__)
|
|
312
|
+
#pragma warn -8004
|
|
313
|
+
#endif
|
|
294
314
|
// The connection of found from connection list of same address is returned.
|
|
295
|
-
connection* connections::connect(const std::string& host, handshake f, void* data, bool newConnection)
|
|
315
|
+
connection* connections::connect(const std::string& host, const char* port, handshake f, void* data, bool newConnection)
|
|
296
316
|
{
|
|
297
317
|
bool namedPipe = false;
|
|
298
|
-
boost::system::error_code ec;
|
|
299
318
|
connection* c;
|
|
300
319
|
mutex::scoped_lock lck(m_mutex);
|
|
301
|
-
asio::ip::tcp::endpoint ep = endpoint(host,
|
|
302
|
-
if (
|
|
320
|
+
asio::ip::tcp::endpoint ep = endpoint(host, port, m_e);
|
|
321
|
+
if (m_e)
|
|
303
322
|
return NULL;
|
|
304
323
|
#ifdef USE_PIPE_CLIENT
|
|
305
324
|
namedPipe = (m_usePipedLocal && isUseNamedPipe(ep));
|
|
@@ -319,13 +338,16 @@ connection* connections::connect(const std::string& host, handshake f, void* dat
|
|
|
319
338
|
c->addref();
|
|
320
339
|
return c;
|
|
321
340
|
}
|
|
341
|
+
#if defined(__BCPLUSPLUS__)
|
|
342
|
+
#pragma warn .8004
|
|
343
|
+
#endif
|
|
322
344
|
|
|
323
|
-
bool connections::reconnect(connection* c, const std::string& host,
|
|
345
|
+
bool connections::reconnect(connection* c, const std::string& host, const char* port,
|
|
324
346
|
handshake f, void* data)
|
|
325
347
|
{
|
|
326
348
|
boost::system::error_code ec;
|
|
327
349
|
mutex::scoped_lock lck(m_mutex);
|
|
328
|
-
asio::ip::tcp::endpoint ep = endpoint(host, ec);
|
|
350
|
+
asio::ip::tcp::endpoint ep = endpoint(host, port, ec);
|
|
329
351
|
if (ec)
|
|
330
352
|
return false;
|
|
331
353
|
c->reconnect(ep);
|