transactd 2.1.0 → 2.2.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/bin/common/tdclc_32_2_2.dll +0 -0
- data/bin/common/tdclc_64_2_2.dll +0 -0
- data/build/swig/ruby/generate.cmd +45 -0
- data/build/swig/ruby/generate.sh +40 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +406 -969
- data/build/swig/tdcl.i +88 -0
- data/build/tdclc/CMakeLists.txt +5 -1
- 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 +1 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +165 -74
- data/source/bzs/db/engine/mysql/database.h +19 -5
- data/source/bzs/db/engine/mysql/dbManager.cpp +33 -11
- data/source/bzs/db/engine/mysql/dbManager.h +6 -1
- data/source/bzs/db/engine/mysql/mydebuglog.h +12 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +10 -3
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +20 -8
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +12 -7
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
- data/source/bzs/db/protocol/tdap/client/client.cpp +17 -15
- data/source/bzs/db/protocol/tdap/client/client.h +102 -30
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +32 -10
- data/source/bzs/db/protocol/tdap/client/database.h +1 -0
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +0 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +47 -42
- data/source/bzs/db/protocol/tdap/client/fields.h +3 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +3 -3
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +18 -2
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +3 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +14 -6
- data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -12
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -3
- data/source/bzs/db/protocol/tdap/client/request.h +1 -0
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +101 -64
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +9 -13
- data/source/bzs/db/protocol/tdap/client/table.cpp +73 -56
- data/source/bzs/db/protocol/tdap/client/table.h +8 -8
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +52 -100
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +8 -1
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +349 -189
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +28 -12
- data/source/bzs/db/protocol/tdap/tdapRequest.h +5 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +29 -4
- data/source/bzs/db/protocol/tdap/uri.h +297 -0
- data/source/bzs/db/transactd/appModule.cpp +41 -16
- data/source/bzs/db/transactd/appModule.h +1 -2
- data/source/bzs/db/transactd/transactd.cpp +37 -14
- data/source/bzs/env/crosscompile.h +1 -3
- data/source/bzs/example/queryData.cpp +2 -2
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.cpp +75 -28
- data/source/bzs/netsvc/client/tcpClient.h +94 -62
- data/source/bzs/netsvc/server/IAppModule.h +2 -2
- data/source/bzs/netsvc/server/serverCpt.cpp +17 -10
- data/source/bzs/netsvc/server/serverPipe.cpp +26 -19
- data/source/bzs/netsvc/server/serverTpool.cpp +8 -2
- data/source/bzs/rtl/debuglog.cpp +21 -5
- data/source/bzs/rtl/debuglog.h +1 -1
- data/source/bzs/test/tdclphp/transactd_Test.php +183 -37
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +1 -2
- data/source/bzs/test/tdclrb/transactd_spec.rb +183 -39
- data/source/bzs/test/transactdBench/scaling_bench.cpp +3 -3
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +172 -57
- data/source/global/boost/sha1.hpp +223 -0
- data/source/global/tdclatl/ConnectParams.cpp +2 -2
- data/source/global/tdclatl/ConnectParams.h +1 -1
- data/source/global/tdclatl/Database.cpp +18 -0
- data/source/global/tdclatl/Database.h +5 -0
- data/source/global/tdclatl/tdclatl.idl +23 -1
- data/source/linux/linuxTypes.h +2 -0
- metadata +8 -6
- data/bin/common/tdclc_32_2_1.dll +0 -0
- data/bin/common/tdclc_64_2_1.dll +0 -0
- data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +0 -448
- data/source/bzs/db/protocol/tdap/client/memRecordset.h +0 -159
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
#include "databaseSchema.h"
|
|
35
35
|
#include <bzs/db/transactd/connManager.h>
|
|
36
36
|
#include <bzs/rtl/exception.h>
|
|
37
|
+
#include <random>
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
extern unsigned int getTransactdIsolation();
|
|
41
|
+
extern unsigned int getTransactdLockWaitTimeout();
|
|
37
42
|
|
|
38
43
|
namespace bzs
|
|
39
44
|
{
|
|
@@ -205,11 +210,12 @@ void dumpStdErr(int op, request& req, table* tb)
|
|
|
205
210
|
//-------------------------------------------------------------
|
|
206
211
|
// class dbExecuter
|
|
207
212
|
//-------------------------------------------------------------
|
|
208
|
-
|
|
209
|
-
dbExecuter::dbExecuter()
|
|
213
|
+
#define MYSQL_ERROR_OFFSET 25000
|
|
214
|
+
dbExecuter::dbExecuter(netsvc::server::IAppModule* mod)
|
|
210
215
|
: dbManager(), m_readHandler(new ReadRecordsHandler()),
|
|
211
|
-
m_blobBuffer(new blobBuffer())
|
|
216
|
+
m_blobBuffer(new blobBuffer()), m_mod(mod)
|
|
212
217
|
{
|
|
218
|
+
m_scramble[0] = 0x00;
|
|
213
219
|
}
|
|
214
220
|
|
|
215
221
|
dbExecuter::~dbExecuter()
|
|
@@ -218,25 +224,6 @@ dbExecuter::~dbExecuter()
|
|
|
218
224
|
delete m_readHandler;
|
|
219
225
|
}
|
|
220
226
|
|
|
221
|
-
void dbExecuter::connect(request& req)
|
|
222
|
-
{
|
|
223
|
-
req.paramMask = 0;
|
|
224
|
-
if (req.keyNum == LG_SUBOP_DISCONNECT)
|
|
225
|
-
dbManager::releaseDatabase(req.cid);
|
|
226
|
-
else
|
|
227
|
-
{
|
|
228
|
-
std::string dbname = getDatabaseName(req);
|
|
229
|
-
std::string dbSqlname = getDatabaseName(req, FOR_SQL);
|
|
230
|
-
// exec SQL use database
|
|
231
|
-
if (dbname != "")
|
|
232
|
-
{
|
|
233
|
-
database* db = getDatabase(dbname.c_str(), req.cid);
|
|
234
|
-
dbSqlname.insert(0, "use ");
|
|
235
|
-
req.result = ddl_execSql(db->thd(), dbSqlname);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
227
|
void dbExecuter::releaseDatabase(request& req, int op)
|
|
241
228
|
{
|
|
242
229
|
req.paramMask = 0;
|
|
@@ -249,11 +236,10 @@ void dbExecuter::releaseDatabase(request& req, int op)
|
|
|
249
236
|
std::string dbExecuter::makeSQLcreateTable(const request& req)
|
|
250
237
|
{
|
|
251
238
|
return (const char*)req.data;
|
|
252
|
-
// return sql;
|
|
253
239
|
}
|
|
254
240
|
|
|
255
241
|
int dbExecuter::errorCode(int ha_error)
|
|
256
|
-
{ // see mysqld_error.h or my_base.h or dbManager.h
|
|
242
|
+
{ // see mysqld_error.h or my_base.h or dbManager.h share/errmsg.txt
|
|
257
243
|
|
|
258
244
|
if (ha_error < HA_ERR_FIRST)
|
|
259
245
|
return ha_error;
|
|
@@ -281,12 +267,13 @@ int dbExecuter::errorCode(int ha_error)
|
|
|
281
267
|
return STATUS_TABLE_EXISTS_ERROR;
|
|
282
268
|
else if (ha_error == DBM_ERROR_TABLE_USED)
|
|
283
269
|
return STATUS_CANNOT_LOCK_TABLE;
|
|
284
|
-
|
|
270
|
+
else if(ha_error == ER_BAD_DB_ERROR)
|
|
271
|
+
return ERROR_NO_DATABASE;
|
|
272
|
+
return MYSQL_ERROR_OFFSET + ha_error;
|
|
285
273
|
}
|
|
286
274
|
|
|
287
275
|
bool isMetaDb(const request& req)
|
|
288
276
|
{
|
|
289
|
-
|
|
290
277
|
char buf[MAX_PATH];
|
|
291
278
|
strncpy(buf, (char*)req.keybuf, MAX_PATH);
|
|
292
279
|
_strlwr(buf);
|
|
@@ -296,31 +283,136 @@ bool isMetaDb(const request& req)
|
|
|
296
283
|
return (st != NULL);
|
|
297
284
|
}
|
|
298
285
|
|
|
299
|
-
inline
|
|
286
|
+
inline bool getUserPasswd(request& req, char* &user, char* &pwd)
|
|
300
287
|
{
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
288
|
+
char* p = strchr((char*)req.keybuf, '\t');
|
|
289
|
+
if (p)
|
|
290
|
+
{
|
|
291
|
+
p = strchr(++p, '\t');
|
|
292
|
+
if (p)
|
|
293
|
+
{
|
|
294
|
+
pwd = ++p;
|
|
295
|
+
user = pwd + MYSQL_SCRAMBLE_LENGTH;
|
|
296
|
+
while (p < user)
|
|
297
|
+
if (*p++) return true;
|
|
298
|
+
}
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
inline bool dbExecuter::doAuthentication(request& req, database* db)
|
|
305
|
+
{
|
|
306
|
+
if (m_authChecked) return true;
|
|
307
|
+
bool ret = true;
|
|
308
|
+
if (strcmp(g_auth_type, AUTH_TYPE_MYSQL_STR)==0)
|
|
309
|
+
{
|
|
310
|
+
ret = false;
|
|
311
|
+
char host[MAX_HOSTNAME];
|
|
312
|
+
char *user = 0x00;
|
|
313
|
+
char *pwd = 0x00;
|
|
314
|
+
bool pwdRecieved = getUserPasswd(req, user, pwd);
|
|
315
|
+
if (user && user[0] && m_mod->checkHost(user, host, MAX_HOSTNAME))
|
|
316
|
+
{
|
|
317
|
+
//uint8* p = find_acl_user_(host, user, FALSE);
|
|
318
|
+
unsigned char buf[22];
|
|
319
|
+
unsigned char* p = db->getUserSha1Passwd(host, user, buf);
|
|
320
|
+
if (!pwdRecieved && !p)
|
|
321
|
+
ret = true;
|
|
322
|
+
else if (p && pwdRecieved)
|
|
323
|
+
ret = (FALSE == check_scramble((const unsigned char*)pwd, (const char*)m_scramble, p));
|
|
324
|
+
if (ret)
|
|
325
|
+
{
|
|
326
|
+
m_user = user;
|
|
327
|
+
m_host = host;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
m_authChecked = ret;
|
|
332
|
+
return ret;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/*
|
|
336
|
+
@param connect Is connect command, The database name is not required
|
|
337
|
+
@return 0 auth failed
|
|
338
|
+
1 success but see req.result
|
|
339
|
+
*/
|
|
340
|
+
bool dbExecuter::getDatabaseWithAuth(request& req, database** db, bool connect)
|
|
341
|
+
{
|
|
342
|
+
*db = NULL;
|
|
343
|
+
bool created = false;
|
|
344
|
+
std::string dbname = getDatabaseName(req);
|
|
345
|
+
bool ret = false;
|
|
346
|
+
if (connect && dbname == "")
|
|
347
|
+
dbname = "mysql";
|
|
348
|
+
else
|
|
349
|
+
connect = false;
|
|
305
350
|
if (dbname != "")
|
|
306
351
|
{
|
|
307
|
-
|
|
308
|
-
|
|
352
|
+
*db = getDatabase(dbname.c_str(), req.cid, created);
|
|
353
|
+
if (*db)
|
|
354
|
+
ret = doAuthentication(req, *db);
|
|
355
|
+
if (connect || (created && !ret))
|
|
356
|
+
{
|
|
357
|
+
dbManager::releaseDatabase(req.cid);
|
|
358
|
+
*db = NULL;
|
|
359
|
+
}
|
|
360
|
+
}else
|
|
361
|
+
req.result = 1;
|
|
362
|
+
|
|
363
|
+
return ret;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* When connect failed, Delete database object.
|
|
367
|
+
|
|
368
|
+
*/
|
|
369
|
+
bool dbExecuter::connect(request& req)
|
|
370
|
+
{
|
|
371
|
+
req.paramMask = 0;
|
|
372
|
+
if (req.keyNum == LG_SUBOP_DISCONNECT)
|
|
373
|
+
{
|
|
374
|
+
dbManager::releaseDatabase(req.cid);
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
database* db = NULL;
|
|
378
|
+
bool ret = getDatabaseWithAuth(req, &db, true);
|
|
379
|
+
if (ret && (req.result == 0) && db)
|
|
380
|
+
{
|
|
381
|
+
std::string dbSqlname = getDatabaseName(req, FOR_SQL);
|
|
382
|
+
dbSqlname.insert(0, "use ");
|
|
383
|
+
req.result = ddl_execSql(db->thd(), dbSqlname);
|
|
384
|
+
}
|
|
385
|
+
if (db && (!ret || req.result))
|
|
386
|
+
dbManager::releaseDatabase(req.cid);
|
|
387
|
+
return ret;
|
|
388
|
+
}
|
|
309
389
|
|
|
390
|
+
inline bool dbExecuter::doCreateTable(request& req)
|
|
391
|
+
{
|
|
392
|
+
// if table name is mata table and database is nothing
|
|
393
|
+
// then cretate database too.
|
|
394
|
+
database* db;
|
|
395
|
+
bool ret = getDatabaseWithAuth(req, &db);
|
|
396
|
+
if (ret && req.result == 0)
|
|
397
|
+
{
|
|
398
|
+
std::string dbSqlname = getDatabaseName(req, FOR_SQL);
|
|
399
|
+
std::string cmd;
|
|
310
400
|
if (isMetaDb(req))
|
|
311
401
|
{ // for database operation
|
|
312
402
|
if ((req.keyNum == 0) && (db->existsDatabase() == false))
|
|
403
|
+
{
|
|
313
404
|
req.result = ddl_createDataBase(db->thd(), dbSqlname);
|
|
405
|
+
if (req.result == ER_DB_CREATE_EXISTS + MYSQL_ERROR_OFFSET)
|
|
406
|
+
req.result = 0;
|
|
407
|
+
}
|
|
314
408
|
else if (req.keyNum == CR_SUBOP_DROP)
|
|
315
409
|
{
|
|
316
|
-
std::string tableName = getTableName(req);
|
|
317
|
-
if (db->existsTable(tableName))
|
|
318
|
-
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
319
|
-
getTableName(req, FOR_SQL));
|
|
320
410
|
if (req.result == 0)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
411
|
+
{
|
|
412
|
+
req.result = ddl_dropDataBase(db->thd(), db->name(), dbSqlname);
|
|
413
|
+
if (ER_DB_DROP_EXISTS+ MYSQL_ERROR_OFFSET == req.result) req.result = 0;
|
|
414
|
+
}
|
|
415
|
+
return ret;
|
|
324
416
|
}
|
|
325
417
|
}
|
|
326
418
|
if (req.result == 0)
|
|
@@ -331,10 +423,10 @@ inline void dbExecuter::doCreateTable(request& req)
|
|
|
331
423
|
std::string tableName = getTableName(req);
|
|
332
424
|
if (req.keyNum == CR_SUBOP_DROP) // -128 is delete
|
|
333
425
|
{
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
426
|
+
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
427
|
+
tableSqlName);
|
|
428
|
+
if (req.result == ER_BAD_TABLE_ERROR + MYSQL_ERROR_OFFSET)
|
|
429
|
+
req.result = 0;
|
|
338
430
|
}
|
|
339
431
|
else if (req.keyNum == CR_SUBOP_RENAME)
|
|
340
432
|
{ // rename new is keybuf
|
|
@@ -342,10 +434,8 @@ inline void dbExecuter::doCreateTable(request& req)
|
|
|
342
434
|
reqold.keybuf = req.data;
|
|
343
435
|
reqold.keylen = *req.datalen;
|
|
344
436
|
req.result = ddl_renameTable(
|
|
345
|
-
db, getTableName(reqold) /*oldname*/
|
|
346
|
-
,
|
|
347
|
-
dbSqlname, getTableName(reqold, FOR_SQL) /*oldname*/
|
|
348
|
-
,
|
|
437
|
+
db, getTableName(reqold), /*oldname*/
|
|
438
|
+
dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
|
|
349
439
|
tableSqlName /*newName*/);
|
|
350
440
|
}
|
|
351
441
|
else if (req.keyNum == CR_SUBOP_SWAPNAME)
|
|
@@ -354,12 +444,9 @@ inline void dbExecuter::doCreateTable(request& req)
|
|
|
354
444
|
reqold.keybuf = req.data;
|
|
355
445
|
reqold.keylen = *req.datalen;
|
|
356
446
|
req.result = ddl_replaceTable(
|
|
357
|
-
db, getTableName(reqold) /*oldname*/
|
|
358
|
-
,
|
|
359
|
-
|
|
360
|
-
,
|
|
361
|
-
dbSqlname, getTableName(reqold, FOR_SQL) /*oldname*/
|
|
362
|
-
,
|
|
447
|
+
db, getTableName(reqold), /*oldname*/
|
|
448
|
+
tableName, /*newName*/
|
|
449
|
+
dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
|
|
363
450
|
tableSqlName /*newName*/);
|
|
364
451
|
}
|
|
365
452
|
else
|
|
@@ -368,10 +455,13 @@ inline void dbExecuter::doCreateTable(request& req)
|
|
|
368
455
|
req.result = 1;
|
|
369
456
|
else
|
|
370
457
|
{ //-1 is overwrite
|
|
371
|
-
if (
|
|
372
|
-
|
|
458
|
+
if (req.keyNum == CR_SUB_FLAG_EXISTCHECK)
|
|
459
|
+
{
|
|
373
460
|
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
374
461
|
tableSqlName);
|
|
462
|
+
if (req.result == ER_BAD_TABLE_ERROR + MYSQL_ERROR_OFFSET)
|
|
463
|
+
req.result = 0;
|
|
464
|
+
}
|
|
375
465
|
if (req.result == 0)
|
|
376
466
|
req.result =
|
|
377
467
|
ddl_execSql(db->thd(), makeSQLcreateTable(req));
|
|
@@ -380,51 +470,51 @@ inline void dbExecuter::doCreateTable(request& req)
|
|
|
380
470
|
}
|
|
381
471
|
}
|
|
382
472
|
}
|
|
383
|
-
|
|
384
|
-
req.result = 1;
|
|
385
|
-
req.result = errorCodeSht(req.result);
|
|
473
|
+
return ret;
|
|
386
474
|
}
|
|
387
475
|
|
|
476
|
+
|
|
388
477
|
// open table and assign handle
|
|
389
|
-
inline
|
|
478
|
+
inline bool dbExecuter::doOpenTable(request& req)
|
|
390
479
|
{
|
|
391
|
-
|
|
392
|
-
|
|
480
|
+
database* db;
|
|
481
|
+
bool ret = getDatabaseWithAuth(req, &db);
|
|
482
|
+
if (ret && req.result == 0)
|
|
393
483
|
{
|
|
394
|
-
|
|
484
|
+
table* tb = NULL;
|
|
395
485
|
{// Lock open table by another thread
|
|
396
486
|
boost::mutex::scoped_lock lck(g_mutex_opentable);
|
|
397
487
|
if (req.keyNum == TD_OPEN_EXCLUSIVE/* && isMetaDb(req)*/)
|
|
398
488
|
{
|
|
399
|
-
if (database::tableRef.count(
|
|
400
|
-
|
|
401
|
-
|
|
489
|
+
if (database::tableRef.count(db->name(), getTableName(req)))
|
|
490
|
+
{
|
|
491
|
+
req.result = STATUS_CANNOT_LOCK_TABLE;
|
|
492
|
+
return ret;
|
|
493
|
+
}
|
|
402
494
|
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
getTableName(req), req.keyNum,
|
|
406
|
-
getOwnerName(req)); // if error occured that throw exception
|
|
495
|
+
// if error occured that throw no exception
|
|
496
|
+
tb = db->openTable(getTableName(req), req.keyNum, getOwnerName(req));
|
|
407
497
|
req.result = db->stat();
|
|
408
498
|
}
|
|
409
499
|
|
|
410
|
-
if (
|
|
500
|
+
if (tb)
|
|
411
501
|
{
|
|
502
|
+
tb->setBlobBuffer(m_blobBuffer);
|
|
412
503
|
try
|
|
413
504
|
{
|
|
414
|
-
|
|
415
|
-
m_tb = getTable(
|
|
416
|
-
|
|
505
|
+
uint hdl = addHandle(getDatabaseID(req.cid), tb->id());
|
|
506
|
+
m_tb = getTable(hdl);
|
|
507
|
+
req.pbk->handle = hdl;
|
|
417
508
|
req.paramMask = P_MASK_POSBLK;
|
|
418
509
|
}
|
|
419
510
|
catch (bzs::rtl::exception& e)
|
|
420
511
|
{
|
|
421
|
-
|
|
512
|
+
tb->close();
|
|
422
513
|
throw e;
|
|
423
514
|
}
|
|
424
515
|
}
|
|
425
516
|
}
|
|
426
|
-
|
|
427
|
-
req.result = 1;
|
|
517
|
+
return ret;
|
|
428
518
|
}
|
|
429
519
|
|
|
430
520
|
inline void readAfter(request& req, table* tb, dbExecuter* dbm)
|
|
@@ -767,7 +857,6 @@ inline void dbExecuter::doInsert(request& req)
|
|
|
767
857
|
m_tb->clearBuffer();
|
|
768
858
|
m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
|
|
769
859
|
req.blobHeader);
|
|
770
|
-
smartBulkInsert sbi(m_tb, 1);
|
|
771
860
|
__int64 aincValue = m_tb->insert(ncc);
|
|
772
861
|
req.result = errorCodeSht(m_tb->stat());
|
|
773
862
|
if (aincValue)
|
|
@@ -894,6 +983,11 @@ inline void dbExecuter::doInsertBulk(request& req)
|
|
|
894
983
|
req.result = errorCodeSht(m_tb->stat());
|
|
895
984
|
}
|
|
896
985
|
|
|
986
|
+
/**
|
|
987
|
+
@result
|
|
988
|
+
2byte recordLength
|
|
989
|
+
4byte esitimate recordCount
|
|
990
|
+
*/
|
|
897
991
|
inline void dbExecuter::doStat(request& req)
|
|
898
992
|
{
|
|
899
993
|
m_tb = getTable(req.pbk->handle);
|
|
@@ -938,10 +1032,10 @@ inline short getTrnsactionType(int op)
|
|
|
938
1032
|
|
|
939
1033
|
inline rowLockMode* getRowLockMode(int op, rowLockMode* lck)
|
|
940
1034
|
{
|
|
941
|
-
|
|
1035
|
+
lck->lock = false;
|
|
942
1036
|
lck->read = (op > ROW_LOCK_S);
|
|
943
1037
|
if (op > 1000)
|
|
944
|
-
|
|
1038
|
+
op = op % 1000;
|
|
945
1039
|
if (op < NOWAIT_WRITE)
|
|
946
1040
|
{
|
|
947
1041
|
if (op >= LOCK_SINGLE_NOWAIT && op < LOCK_MULTI_NOWAIT)
|
|
@@ -974,54 +1068,14 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
974
1068
|
if (pbk == NULL)
|
|
975
1069
|
pbk = &tmp;
|
|
976
1070
|
req.reset();
|
|
977
|
-
|
|
978
|
-
{
|
|
979
|
-
case TD_GETSERVER_CHARSET:
|
|
1071
|
+
if (!m_authChecked)
|
|
980
1072
|
{
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
|
|
985
|
-
global_system_variables.collation_server->csname);
|
|
986
|
-
ver->srvMajor = TRANSACTD_VER_MAJOR;
|
|
987
|
-
ver->srvMinor = TRANSACTD_VER_MINOR;
|
|
988
|
-
ver->srvRelease = TRANSACTD_VER_RELEASE;
|
|
989
|
-
req.resultLen = sizeof(trdVersiton);
|
|
990
|
-
// req.data = (void*)
|
|
991
|
-
// global_system_variables.collation_server->csname;
|
|
992
|
-
// req.resultLen = (uint_td)strlen(
|
|
993
|
-
// global_system_variables.collation_server->csname);
|
|
994
|
-
req.paramMask |= P_MASK_DATA | P_MASK_DATALEN;
|
|
995
|
-
}
|
|
996
|
-
else
|
|
997
|
-
req.result = SERVER_CLIENT_NOT_COMPATIBLE;
|
|
998
|
-
break;
|
|
1073
|
+
if (op != TD_CONNECT && op != TD_CREATETABLE &&
|
|
1074
|
+
op != TD_OPENTABLE && op != TD_GETSERVER_CHARSET)
|
|
1075
|
+
return EXECUTE_RESULT_ACCESS_DNIED;
|
|
999
1076
|
}
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
break;
|
|
1003
|
-
case TD_RESET_CLIENT:
|
|
1004
|
-
case TD_STOP_ENGINE: // close all table
|
|
1005
|
-
releaseDatabase(req, op);
|
|
1006
|
-
break;
|
|
1007
|
-
case TD_AUTOMEKE_SCHEMA:
|
|
1008
|
-
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
|
1009
|
-
req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
|
|
1010
|
-
break;
|
|
1011
|
-
case TD_CREATETABLE:
|
|
1012
|
-
doCreateTable(req);
|
|
1013
|
-
break;
|
|
1014
|
-
case TD_OPENTABLE:
|
|
1015
|
-
doOpenTable(req);
|
|
1016
|
-
break;
|
|
1017
|
-
case TD_CLOSETABLE:
|
|
1018
|
-
m_tb = getTable(req.pbk->handle);
|
|
1019
|
-
if (m_tb)
|
|
1020
|
-
{
|
|
1021
|
-
m_tb->close();
|
|
1022
|
-
m_tb = NULL;
|
|
1023
|
-
}
|
|
1024
|
-
break;
|
|
1077
|
+
switch (op)
|
|
1078
|
+
{
|
|
1025
1079
|
case TD_KEY_SEEK:
|
|
1026
1080
|
case TD_KEY_AFTER:
|
|
1027
1081
|
case TD_KEY_OR_AFTER:
|
|
@@ -1109,64 +1163,6 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1109
1163
|
readAfter(req, m_tb, this);
|
|
1110
1164
|
break;
|
|
1111
1165
|
}
|
|
1112
|
-
case TD_GETDIRECTORY:
|
|
1113
|
-
{
|
|
1114
|
-
database* db = getDatabaseCid(req.cid);
|
|
1115
|
-
if (db->name().size() < 64)
|
|
1116
|
-
{
|
|
1117
|
-
req.keylen = (uchar_td)db->name().size() + 1;
|
|
1118
|
-
req.keybuf = (void*)db->name().c_str();
|
|
1119
|
-
req.paramMask = P_MASK_KEYBUF;
|
|
1120
|
-
}
|
|
1121
|
-
else
|
|
1122
|
-
req.result = STATUS_BUFFERTOOSMALL;
|
|
1123
|
-
break;
|
|
1124
|
-
}
|
|
1125
|
-
case TD_VERSION:
|
|
1126
|
-
if (*req.datalen >= sizeof(version) * 3)
|
|
1127
|
-
{
|
|
1128
|
-
version* v = (version*)req.data;
|
|
1129
|
-
++v;
|
|
1130
|
-
v->majorVersion = MYSQL_VERSION_ID / 10000;
|
|
1131
|
-
v->minorVersion = (MYSQL_VERSION_ID / 100) % 100;
|
|
1132
|
-
v->Type = 'M';
|
|
1133
|
-
++v;
|
|
1134
|
-
v->majorVersion = TRANSACTD_VER_MAJOR;
|
|
1135
|
-
v->minorVersion = TRANSACTD_VER_MINOR;
|
|
1136
|
-
v->Type = 'T';
|
|
1137
|
-
req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
|
1138
|
-
req.resultLen = sizeof(version) * 3;
|
|
1139
|
-
}
|
|
1140
|
-
else
|
|
1141
|
-
req.result = STATUS_BUFFERTOOSMALL;
|
|
1142
|
-
break;
|
|
1143
|
-
case TD_CLEAR_OWNERNAME:
|
|
1144
|
-
req.keybuf = (void_td*)"";
|
|
1145
|
-
case TD_SET_OWNERNAME:
|
|
1146
|
-
{
|
|
1147
|
-
database* db = getDatabaseCid(req.cid);
|
|
1148
|
-
m_tb = getTable(req.pbk->handle);
|
|
1149
|
-
int num = (req.keyNum > 1) ? req.keyNum - 2 : req.keyNum;
|
|
1150
|
-
num += '0';
|
|
1151
|
-
std::string s("%@%");
|
|
1152
|
-
s += (const char*)#
|
|
1153
|
-
s += (const char*)req.keybuf;
|
|
1154
|
-
req.result = ddl_execSql(
|
|
1155
|
-
db->thd(),
|
|
1156
|
-
makeSQLChangeTableComment(db->name(), m_tb->name(), s.c_str()));
|
|
1157
|
-
break;
|
|
1158
|
-
}
|
|
1159
|
-
case TD_DROP_INDEX:
|
|
1160
|
-
{ // Key name of multi byte charctord is not supported. Use only ascii.
|
|
1161
|
-
database* db = getDatabaseCid(req.cid);
|
|
1162
|
-
m_tb = getTable(req.pbk->handle);
|
|
1163
|
-
req.result = ddl_execSql(
|
|
1164
|
-
db->thd(),
|
|
1165
|
-
makeSQLDropIndex(
|
|
1166
|
-
db->name(), m_tb->name(),
|
|
1167
|
-
m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
|
|
1168
|
-
break;
|
|
1169
|
-
}
|
|
1170
1166
|
case TD_KEY_GE_NEXT_MULTI:
|
|
1171
1167
|
case TD_KEY_LE_PREV_MULTI:
|
|
1172
1168
|
nw->setClientBuffferSize(*(req.datalen));
|
|
@@ -1237,10 +1233,128 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1237
1233
|
m_tb = getTable(req.pbk->handle);
|
|
1238
1234
|
req.result = m_tb->unlock() ? STATUS_NO_CURRENT : 0;
|
|
1239
1235
|
break;
|
|
1236
|
+
/* ddl or once at connection
|
|
1237
|
+
*/
|
|
1238
|
+
case TD_GETSERVER_CHARSET:
|
|
1239
|
+
{
|
|
1240
|
+
if (*req.datalen == sizeof(trdVersiton))
|
|
1241
|
+
{
|
|
1242
|
+
trdVersiton* ver = (trdVersiton*)req.data;
|
|
1243
|
+
strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
|
|
1244
|
+
global_system_variables.collation_server->csname);
|
|
1245
|
+
ver->srvMajor = TRANSACTD_VER_MAJOR;
|
|
1246
|
+
ver->srvMinor = TRANSACTD_VER_MINOR;
|
|
1247
|
+
ver->srvRelease = TRANSACTD_VER_RELEASE;
|
|
1248
|
+
req.resultLen = sizeof(trdVersiton);
|
|
1249
|
+
req.paramMask |= P_MASK_DATA | P_MASK_DATALEN;
|
|
1250
|
+
}
|
|
1251
|
+
else
|
|
1252
|
+
req.result = SERVER_CLIENT_NOT_COMPATIBLE;
|
|
1253
|
+
break;
|
|
1254
|
+
}
|
|
1255
|
+
case TD_CONNECT:
|
|
1256
|
+
if (!connect(req))
|
|
1257
|
+
req.result = ERROR_TD_INVALID_CLINETHOST;
|
|
1258
|
+
break;
|
|
1259
|
+
case TD_RESET_CLIENT:
|
|
1260
|
+
case TD_STOP_ENGINE: // close all table
|
|
1261
|
+
releaseDatabase(req, op);
|
|
1262
|
+
break;
|
|
1263
|
+
case TD_AUTOMEKE_SCHEMA:
|
|
1264
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
|
1265
|
+
req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
|
|
1266
|
+
break;
|
|
1267
|
+
case TD_CREATETABLE:
|
|
1268
|
+
if (!doCreateTable(req))
|
|
1269
|
+
req.result = ERROR_TD_INVALID_CLINETHOST;
|
|
1270
|
+
break;
|
|
1271
|
+
case TD_OPENTABLE:
|
|
1272
|
+
if (!doOpenTable(req))
|
|
1273
|
+
req.result = ERROR_TD_INVALID_CLINETHOST;
|
|
1274
|
+
break;
|
|
1275
|
+
case TD_CLOSETABLE:
|
|
1276
|
+
m_tb = getTable(req.pbk->handle);
|
|
1277
|
+
if (m_tb)
|
|
1278
|
+
{
|
|
1279
|
+
m_tb->close();
|
|
1280
|
+
m_tb = NULL;
|
|
1281
|
+
}
|
|
1282
|
+
break;
|
|
1283
|
+
case TD_BUILD_INDEX:
|
|
1284
|
+
{
|
|
1285
|
+
database* db = getDatabaseCid(req.cid);
|
|
1286
|
+
m_tb = getTable(req.pbk->handle);
|
|
1287
|
+
std::string cmd((const char*)req.data);
|
|
1288
|
+
std::string tbname = m_tb->name();
|
|
1289
|
+
req.result = ddl_addIndex(db, tbname, cmd);
|
|
1290
|
+
break;
|
|
1291
|
+
}
|
|
1292
|
+
case TD_DROP_INDEX:
|
|
1293
|
+
{ // Key name of multi byte charctor is not supported. Use only ascii.
|
|
1294
|
+
database* db = getDatabaseCid(req.cid);
|
|
1295
|
+
m_tb = getTable(req.pbk->handle);
|
|
1296
|
+
req.result = ddl_execSql(db->thd(),
|
|
1297
|
+
makeSQLDropIndex(db->name(), m_tb->name(),
|
|
1298
|
+
m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
|
|
1299
|
+
break;
|
|
1300
|
+
}
|
|
1301
|
+
case TD_GETDIRECTORY:
|
|
1302
|
+
{
|
|
1303
|
+
database* db = getDatabaseCid(req.cid);
|
|
1304
|
+
if (db->name().size() < 64)
|
|
1305
|
+
{
|
|
1306
|
+
req.keylen = (uchar_td)db->name().size() + 1;
|
|
1307
|
+
req.keybuf = (void*)db->name().c_str();
|
|
1308
|
+
req.paramMask = P_MASK_KEYBUF;
|
|
1309
|
+
}
|
|
1310
|
+
else
|
|
1311
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
1312
|
+
break;
|
|
1313
|
+
}
|
|
1314
|
+
case TD_VERSION:
|
|
1315
|
+
if (*req.datalen >= sizeof(version) * 3)
|
|
1316
|
+
{
|
|
1317
|
+
version* v = (version*)req.data;
|
|
1318
|
+
++v;
|
|
1319
|
+
v->majorVersion = MYSQL_VERSION_ID / 10000;
|
|
1320
|
+
v->minorVersion = (MYSQL_VERSION_ID / 100) % 100;
|
|
1321
|
+
v->Type = 'M';
|
|
1322
|
+
++v;
|
|
1323
|
+
v->majorVersion = TRANSACTD_VER_MAJOR;
|
|
1324
|
+
v->minorVersion = TRANSACTD_VER_MINOR;
|
|
1325
|
+
v->Type = 'T';
|
|
1326
|
+
req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
|
1327
|
+
req.resultLen = sizeof(version) * 3;
|
|
1328
|
+
}
|
|
1329
|
+
else
|
|
1330
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
1331
|
+
break;
|
|
1332
|
+
case TD_CLEAR_OWNERNAME:
|
|
1333
|
+
req.keybuf = (void_td*)"";
|
|
1334
|
+
case TD_SET_OWNERNAME:
|
|
1335
|
+
{
|
|
1336
|
+
database* db = getDatabaseCid(req.cid);
|
|
1337
|
+
m_tb = getTable(req.pbk->handle);
|
|
1338
|
+
int num = (req.keyNum > 1) ? req.keyNum - 2 : req.keyNum;
|
|
1339
|
+
num += '0';
|
|
1340
|
+
std::string s("%@%");
|
|
1341
|
+
s += (const char*)#
|
|
1342
|
+
s += (const char*)req.keybuf;
|
|
1343
|
+
req.result = ddl_execSql(
|
|
1344
|
+
db->thd(),
|
|
1345
|
+
makeSQLChangeTableComment(db->name(), m_tb->name(), s.c_str()));
|
|
1346
|
+
break;
|
|
1347
|
+
}
|
|
1348
|
+
case TD_ACL_RELOAD:
|
|
1349
|
+
req.result = getDatabaseCid(req.cid)->aclReload();
|
|
1350
|
+
break;
|
|
1240
1351
|
}
|
|
1241
1352
|
if (m_tb)
|
|
1242
1353
|
m_tb->unUse();
|
|
1243
1354
|
DEBUG_WRITELOG2(op, req)
|
|
1355
|
+
DEBUG_ERROR_MEMDUMP(req.result, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
|
1356
|
+
|
|
1357
|
+
|
|
1244
1358
|
size = req.serialize(m_tb, resultBuffer);
|
|
1245
1359
|
short dymmy = 0;
|
|
1246
1360
|
if ((req.result == 0) && (req.paramMask & P_MASK_BLOBBODY) &&
|
|
@@ -1255,15 +1369,20 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1255
1369
|
return EXECUTE_RESULT_FORCSE_SYNC;
|
|
1256
1370
|
return EXECUTE_RESULT_FORCSE_ASYNC;
|
|
1257
1371
|
}
|
|
1372
|
+
if (req.result == ERROR_TD_INVALID_CLINETHOST)
|
|
1373
|
+
return EXECUTE_RESULT_ACCESS_DNIED;
|
|
1258
1374
|
DEBUG_PROFILE_END_OP(1, op)
|
|
1259
1375
|
return EXECUTE_RESULT_SUCCESS;
|
|
1260
1376
|
}
|
|
1261
1377
|
|
|
1262
1378
|
catch (bzs::rtl::exception& e)
|
|
1263
1379
|
{
|
|
1380
|
+
const int* code = getCode(e);
|
|
1264
1381
|
clenupNoException();
|
|
1382
|
+
DEBUG_ERROR_MEMDUMP(*code, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
|
1383
|
+
|
|
1265
1384
|
req.reset();
|
|
1266
|
-
|
|
1385
|
+
|
|
1267
1386
|
if (code)
|
|
1268
1387
|
req.result = *code;
|
|
1269
1388
|
else
|
|
@@ -1277,6 +1396,7 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1277
1396
|
catch (...)
|
|
1278
1397
|
{
|
|
1279
1398
|
clenupNoException();
|
|
1399
|
+
DEBUG_ERROR_MEMDUMP(20001, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
|
1280
1400
|
req.reset();
|
|
1281
1401
|
req.result = 20001;
|
|
1282
1402
|
dumpStdErr(op, req, m_tb);
|
|
@@ -1297,8 +1417,48 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1297
1417
|
return EXECUTE_RESULT_SUCCESS;
|
|
1298
1418
|
}
|
|
1299
1419
|
|
|
1420
|
+
void makeRandomKey(unsigned char *buf, unsigned int size)
|
|
1421
|
+
{
|
|
1422
|
+
unsigned char *end= buf + size;
|
|
1423
|
+
std::random_device rnd;
|
|
1424
|
+
for (; buf < end; buf++)
|
|
1425
|
+
*buf = (unsigned char)(rnd() * 94 + 33);
|
|
1426
|
+
*buf= 0x00;
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
size_t dbExecuter::getAcceptMessage(char* message, size_t size)
|
|
1430
|
+
{
|
|
1431
|
+
// make handshake packet
|
|
1432
|
+
m_authChecked = false;
|
|
1433
|
+
assert(size >= sizeof(trdVersiton));
|
|
1434
|
+
|
|
1435
|
+
handshale_t* hst = (handshale_t*)message;
|
|
1436
|
+
hst->options = 0;
|
|
1437
|
+
trdVersiton* ver = &hst->ver;
|
|
1438
|
+
hst->size = sizeof(handshale_t);
|
|
1439
|
+
|
|
1440
|
+
strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
|
|
1441
|
+
global_system_variables.collation_server->csname);
|
|
1442
|
+
ver->srvMajor = TRANSACTD_VER_MAJOR;
|
|
1443
|
+
ver->srvMinor = TRANSACTD_VER_MINOR;
|
|
1444
|
+
ver->srvRelease = TRANSACTD_VER_RELEASE;
|
|
1445
|
+
hst->transaction_isolation = getTransactdIsolation();
|
|
1446
|
+
hst->lock_wait_timeout = getTransactdLockWaitTimeout();
|
|
1447
|
+
if (strcmp(g_auth_type, AUTH_TYPE_MYSQL_STR) == 0)
|
|
1448
|
+
{
|
|
1449
|
+
makeRandomKey(m_scramble, MYSQL_SCRAMBLE_LENGTH);
|
|
1450
|
+
memcpy(hst->scramble, m_scramble, sizeof(hst->scramble));
|
|
1451
|
+
|
|
1452
|
+
}else
|
|
1453
|
+
{
|
|
1454
|
+
hst->scramble[0] = 0x00;
|
|
1455
|
+
hst->options |= HST_OPTION_NO_SCRAMBLE;
|
|
1456
|
+
hst->size -= sizeof(m_scramble);
|
|
1457
|
+
}
|
|
1458
|
+
return hst->size;
|
|
1459
|
+
}
|
|
1300
1460
|
// ---------------------------------------------------------------------------
|
|
1301
|
-
//
|
|
1461
|
+
// class connMgrExecuter
|
|
1302
1462
|
// ---------------------------------------------------------------------------
|
|
1303
1463
|
connMgrExecuter::connMgrExecuter(request& req, unsigned __int64 parent)
|
|
1304
1464
|
: m_req(req), m_modHandle(parent)
|
|
@@ -1354,11 +1514,11 @@ int connMgrExecuter::commandExec(netsvc::server::netWriter* nw)
|
|
|
1354
1514
|
}
|
|
1355
1515
|
|
|
1356
1516
|
// ---------------------------------------------------------------------------
|
|
1357
|
-
//
|
|
1517
|
+
// class commandExecuter
|
|
1358
1518
|
// ---------------------------------------------------------------------------
|
|
1359
|
-
commandExecuter::commandExecuter(
|
|
1519
|
+
commandExecuter::commandExecuter(netsvc::server::IAppModule* mod)
|
|
1360
1520
|
{
|
|
1361
|
-
m_dbExec.reset(new dbExecuter());
|
|
1521
|
+
m_dbExec.reset(new dbExecuter(mod));
|
|
1362
1522
|
}
|
|
1363
1523
|
|
|
1364
1524
|
commandExecuter::~commandExecuter()
|