transactd 2.4.5 → 3.0.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/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
|
@@ -58,12 +58,13 @@ public:
|
|
|
58
58
|
netsvc::server::netWriter* nw)
|
|
59
59
|
{
|
|
60
60
|
// The result contents is copied or sent allready.
|
|
61
|
-
|
|
62
|
-
paramMask = nw->getParamMask(tb->getBlobFieldCount() != 0);
|
|
63
61
|
unsigned int allreadysent = nw->allreadySent();
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
if (tb)
|
|
63
|
+
{
|
|
64
|
+
paramMask = nw->getParamMask(tb->getBlobFieldCount() != 0);
|
|
65
|
+
nw->writeHeadar(paramMask, result);
|
|
66
|
+
}
|
|
67
|
+
if (paramMask & P_MASK_KEYBUF && tb)
|
|
67
68
|
{
|
|
68
69
|
keylen = tb->keyPackCopy((uchar*)nw->curPtr() + sizeof(keylen_td));
|
|
69
70
|
nw->write((const char*)&keylen, sizeof(keylen_td));
|
|
@@ -140,22 +140,25 @@ std::string getTableName(const std::string& src, bool forSql)
|
|
|
140
140
|
if (pos != std::string::npos)
|
|
141
141
|
{
|
|
142
142
|
pos += strlen(TableNameTitle);
|
|
143
|
-
|
|
143
|
+
if (name.size() > pos)
|
|
144
144
|
{
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
while ((name[pos] == '/') || (name[pos] == '\\'))
|
|
146
|
+
{
|
|
147
|
+
if (++pos == name.size())
|
|
148
|
+
return "";
|
|
149
|
+
}
|
|
150
|
+
size_t pos2 = name.find(".", pos);
|
|
151
|
+
if (pos2 == std::string::npos)
|
|
152
|
+
pos2 = name.size();
|
|
153
|
+
size_t pos3 = name.find("&", pos);
|
|
154
|
+
if (pos3 != std::string::npos && (pos3 < pos2))
|
|
155
|
+
pos2 = pos3;
|
|
156
|
+
|
|
157
|
+
name = name.substr(pos, pos2 - pos);
|
|
158
|
+
if (g_tableNmaeLower)
|
|
159
|
+
toLowerCaseName(name, forSql);
|
|
160
|
+
return name;
|
|
147
161
|
}
|
|
148
|
-
size_t pos2 = name.find(".", pos);
|
|
149
|
-
if (pos2 == std::string::npos)
|
|
150
|
-
pos2 = name.size();
|
|
151
|
-
size_t pos3 = name.find("&", pos);
|
|
152
|
-
if (pos3 != std::string::npos && (pos3 < pos2))
|
|
153
|
-
pos2 = pos3;
|
|
154
|
-
|
|
155
|
-
name = name.substr(pos, pos2 - pos);
|
|
156
|
-
if (g_tableNmaeLower)
|
|
157
|
-
toLowerCaseName(name, forSql);
|
|
158
|
-
return name;
|
|
159
162
|
}
|
|
160
163
|
|
|
161
164
|
return "";
|
|
@@ -343,7 +346,7 @@ bool dbExecuter::getDatabaseWithAuth(request& req, database** db, bool connect)
|
|
|
343
346
|
{
|
|
344
347
|
*db = NULL;
|
|
345
348
|
bool created = false;
|
|
346
|
-
|
|
349
|
+
std::string dbname = getDatabaseName(req);
|
|
347
350
|
bool ret = false;
|
|
348
351
|
if (connect && dbname == "")
|
|
349
352
|
dbname = "mysql";
|
|
@@ -353,11 +356,11 @@ bool dbExecuter::getDatabaseWithAuth(request& req, database** db, bool connect)
|
|
|
353
356
|
{
|
|
354
357
|
*db = getDatabase(dbname.c_str(), req.cid, created);
|
|
355
358
|
if (*db)
|
|
356
|
-
|
|
359
|
+
ret = doAuthentication(req, *db);
|
|
357
360
|
if (connect || (created && !ret))
|
|
358
361
|
{
|
|
359
362
|
dbManager::releaseDatabase(req.cid);
|
|
360
|
-
|
|
363
|
+
*db = NULL;
|
|
361
364
|
}
|
|
362
365
|
}else
|
|
363
366
|
req.result = 1;
|
|
@@ -373,9 +376,9 @@ bool dbExecuter::connect(request& req)
|
|
|
373
376
|
req.paramMask = 0;
|
|
374
377
|
if (req.keyNum == LG_SUBOP_DISCONNECT)
|
|
375
378
|
{
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
+
dbManager::releaseDatabase(req.cid);
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
379
382
|
database* db = NULL;
|
|
380
383
|
bool ret = getDatabaseWithAuth(req, &db, true);
|
|
381
384
|
if (ret && (req.result == 0) && db)
|
|
@@ -401,7 +404,8 @@ inline bool dbExecuter::doCreateTable(request& req)
|
|
|
401
404
|
std::string cmd;
|
|
402
405
|
if (isMetaDb(req))
|
|
403
406
|
{ // for database operation
|
|
404
|
-
if ((req.keyNum ==
|
|
407
|
+
if (((req.keyNum == CR_SUBOP_CREATE_DBONLY) || (req.keyNum == 0)) &&
|
|
408
|
+
(db->existsDatabase() == false))
|
|
405
409
|
{
|
|
406
410
|
req.result = ddl_createDataBase(db->thd(), dbSqlname);
|
|
407
411
|
if (req.result == ER_DB_CREATE_EXISTS + MYSQL_ERROR_OFFSET)
|
|
@@ -451,13 +455,13 @@ inline bool dbExecuter::doCreateTable(request& req)
|
|
|
451
455
|
dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
|
|
452
456
|
tableSqlName /*newName*/);
|
|
453
457
|
}
|
|
454
|
-
else
|
|
458
|
+
else if (req.keyNum != CR_SUBOP_CREATE_DBONLY)
|
|
455
459
|
{ // create
|
|
456
460
|
if (req.data == NULL)
|
|
457
461
|
req.result = 1;
|
|
458
462
|
else
|
|
459
463
|
{ //-1 is overwrite
|
|
460
|
-
if (req.keyNum == CR_SUB_FLAG_EXISTCHECK)
|
|
464
|
+
if (req.keyNum == CR_SUB_FLAG_EXISTCHECK && tableName.size())
|
|
461
465
|
{
|
|
462
466
|
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
463
467
|
tableSqlName);
|
|
@@ -475,14 +479,20 @@ inline bool dbExecuter::doCreateTable(request& req)
|
|
|
475
479
|
return ret;
|
|
476
480
|
}
|
|
477
481
|
|
|
478
|
-
|
|
479
482
|
// open table and assign handle
|
|
480
|
-
inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
|
|
483
|
+
inline bool dbExecuter::doOpenTable(request& req, char* buf, bool reconnect)
|
|
481
484
|
{
|
|
482
485
|
database* db;
|
|
483
486
|
bool ret = getDatabaseWithAuth(req, &db);
|
|
484
487
|
if (ret && req.result == 0)
|
|
485
488
|
{
|
|
489
|
+
short mode = req.keyNum;
|
|
490
|
+
bool getschema = IS_MODE_GETSCHEMA(mode);
|
|
491
|
+
if (getschema)
|
|
492
|
+
mode -= TD_OPEN_MASK_GETSHCHEMA;
|
|
493
|
+
bool getDefaultImage = IS_MODE_GETDEFAULTIMAGE(mode);
|
|
494
|
+
if (getDefaultImage)
|
|
495
|
+
mode -= TD_OPEN_MASK_GETDEFAULTIMAGE;
|
|
486
496
|
table* tb = NULL;
|
|
487
497
|
{// Lock open table by another thread
|
|
488
498
|
boost::mutex::scoped_lock lck(g_mutex_opentable);
|
|
@@ -495,7 +505,7 @@ inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
|
|
|
495
505
|
}
|
|
496
506
|
}
|
|
497
507
|
// if error occured that throw no exception
|
|
498
|
-
tb = db->openTable(getTableName(req),
|
|
508
|
+
tb = db->openTable(getTableName(req), mode, getOwnerName(req));
|
|
499
509
|
if (db->stat())
|
|
500
510
|
req.result = (short_td)errorCode(db->stat());
|
|
501
511
|
}
|
|
@@ -509,15 +519,56 @@ inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
|
|
|
509
519
|
m_tb = getTable(hdl);
|
|
510
520
|
req.pbk->handle = hdl;
|
|
511
521
|
if (!reconnect)
|
|
512
|
-
{
|
|
513
|
-
|
|
522
|
+
{ //return bookmark size
|
|
523
|
+
req.paramMask = P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN;
|
|
524
|
+
unsigned int len = m_tb->posPtrLen();
|
|
525
|
+
unsigned char* p = (unsigned char*)req.data;
|
|
526
|
+
//no primary key
|
|
514
527
|
if ((m_tb->tableFlags() & HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) && !m_tb->primaryKey())
|
|
515
528
|
len = 0xFFFF;
|
|
516
|
-
memcpy(
|
|
529
|
+
memcpy(p, &len , sizeof(ushort_td));
|
|
517
530
|
req.resultLen = sizeof(ushort_td);
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
531
|
+
//copy default record image
|
|
532
|
+
if (getDefaultImage)
|
|
533
|
+
{
|
|
534
|
+
if (!m_tb->isMysqlNull())
|
|
535
|
+
{
|
|
536
|
+
req.result = STATUS_INVALID_NULLMODE;
|
|
537
|
+
return false;
|
|
538
|
+
}
|
|
539
|
+
p += sizeof(ushort_td);
|
|
540
|
+
len = m_tb->writeDefaultImage(p, *req.datalen - req.resultLen);
|
|
541
|
+
req.resultLen += len;
|
|
542
|
+
if (!getschema && *req.datalen != req.resultLen)
|
|
543
|
+
{
|
|
544
|
+
req.result = STATUS_INVALID_DATASIZE;
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
}else if(getschema)
|
|
548
|
+
{
|
|
549
|
+
if (*req.datalen < 4)
|
|
550
|
+
{
|
|
551
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
552
|
+
return false;
|
|
553
|
+
}
|
|
554
|
+
p += sizeof(ushort_td);
|
|
555
|
+
p[0] = 0x00;
|
|
556
|
+
p[1] = 0x00;
|
|
557
|
+
len = 2;
|
|
558
|
+
req.resultLen += len;
|
|
559
|
+
}
|
|
560
|
+
if (getschema)
|
|
561
|
+
{
|
|
562
|
+
p += len;
|
|
563
|
+
len = m_tb->writeSchemaImage(p , *req.datalen - req.resultLen);
|
|
564
|
+
if (len == sizeof(ushort_td))
|
|
565
|
+
{
|
|
566
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
569
|
+
req.resultLen += len;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
521
572
|
}
|
|
522
573
|
catch (bzs::rtl::exception& e)
|
|
523
574
|
{
|
|
@@ -841,42 +892,45 @@ inline short dbExecuter::seekEach(extRequestSeeks* ereq, bool noBookmark)
|
|
|
841
892
|
|
|
842
893
|
for (int i = 0; i < ereq->logicalCount; ++i)
|
|
843
894
|
{
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
895
|
+
/* If NULL even any one segment, all be NULL
|
|
896
|
+
The fd->ptr[0] is null Indicator.
|
|
897
|
+
*/
|
|
898
|
+
if (fd->null == 0)
|
|
847
899
|
{
|
|
848
|
-
|
|
900
|
+
m_tb->setKeyValuesPacked(fd->ptr, fd->len);
|
|
901
|
+
m_tb->seekKey(HA_READ_KEY_EXACT, keyMap);
|
|
902
|
+
if (m_tb->stat() == 0)
|
|
849
903
|
{
|
|
850
|
-
|
|
851
|
-
|
|
904
|
+
if (seg)
|
|
905
|
+
{
|
|
906
|
+
// If duplicate records , bookmark space is request row number.
|
|
907
|
+
stat = m_readHandler->write((uchar*)&i, 4);
|
|
908
|
+
}
|
|
909
|
+
else if (noBookmark)
|
|
910
|
+
stat = m_readHandler->write((const unsigned char *)_T("dummy"), 0);
|
|
911
|
+
else
|
|
912
|
+
stat = m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
|
|
852
913
|
}
|
|
853
|
-
else if (noBookmark)
|
|
854
|
-
stat = m_readHandler->write((const unsigned char *)_T("dummy"), 0);
|
|
855
914
|
else
|
|
856
|
-
stat =
|
|
857
|
-
m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
|
|
858
|
-
}
|
|
859
|
-
else
|
|
860
|
-
stat = m_readHandler->write(NULL, 0);
|
|
861
|
-
if (stat)
|
|
862
|
-
break;
|
|
915
|
+
stat = m_readHandler->write(NULL, 0);
|
|
863
916
|
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
while (m_tb->stat() == 0)
|
|
917
|
+
if (stat) break;
|
|
918
|
+
// for hasMany join
|
|
919
|
+
if (seg)
|
|
868
920
|
{
|
|
869
|
-
m_tb->
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
921
|
+
while (m_tb->stat() == 0)
|
|
922
|
+
{
|
|
923
|
+
m_tb->getNextSame(keyMap);
|
|
924
|
+
if (m_tb->stat() == 0)
|
|
925
|
+
stat = m_readHandler->write(
|
|
926
|
+
(uchar*)&i, 4); // write seek sequential number
|
|
927
|
+
if (stat) break;
|
|
928
|
+
}
|
|
929
|
+
if (stat) break;
|
|
875
930
|
}
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
931
|
+
}else
|
|
932
|
+
stat = m_readHandler->write(NULL, 0);
|
|
933
|
+
if (stat) break;
|
|
880
934
|
fd = fd->next();
|
|
881
935
|
}
|
|
882
936
|
if (stat == 0)
|
|
@@ -1078,7 +1132,7 @@ inline void dbExecuter::doStat(request& req)
|
|
|
1078
1132
|
memcpy((char*)req.data, &len, sizeof(ushort_td));
|
|
1079
1133
|
uint rows = (uint)m_tb->recordCount((req.keyNum != 0));
|
|
1080
1134
|
memcpy((char*)req.data + 6, &rows, sizeof(uint));
|
|
1081
|
-
|
|
1135
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
1082
1136
|
}
|
|
1083
1137
|
else
|
|
1084
1138
|
req.result = STATUS_BUFFERTOOSMALL;
|
|
@@ -1229,10 +1283,12 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1229
1283
|
req.resultLen = m_tb->posPtrLen();
|
|
1230
1284
|
break;
|
|
1231
1285
|
case TD_RECONNECT:
|
|
1232
|
-
|
|
1233
|
-
|
|
1286
|
+
nw->resize(*req.datalen);
|
|
1287
|
+
resultBuffer = nw->ptr();
|
|
1288
|
+
if (!doOpenTable(req, resultBuffer, true))
|
|
1234
1289
|
{
|
|
1235
|
-
req.result
|
|
1290
|
+
if (req.result == 0)
|
|
1291
|
+
req.result = ERROR_TD_INVALID_CLINETHOST;
|
|
1236
1292
|
break;
|
|
1237
1293
|
}
|
|
1238
1294
|
{
|
|
@@ -1348,13 +1404,16 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1348
1404
|
trdVersiton* ver = (trdVersiton*)req.data;
|
|
1349
1405
|
strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
|
|
1350
1406
|
global_system_variables.collation_server->csname);
|
|
1351
|
-
|
|
1352
|
-
ver->
|
|
1353
|
-
ver->
|
|
1407
|
+
|
|
1408
|
+
ver->desc.srvMysqlMajor = MYSQL_VERSION_ID / 10000;
|
|
1409
|
+
ver->desc.srvMysqlMinor = (MYSQL_VERSION_ID / 100) % 100;
|
|
1410
|
+
ver->desc.srvMysqlRelease = MYSQL_VERSION_ID % 100;
|
|
1411
|
+
ver->desc.srvMajor = TRANSACTD_VER_MAJOR;
|
|
1412
|
+
ver->desc.srvMinor = TRANSACTD_VER_MINOR;
|
|
1413
|
+
ver->desc.srvRelease = TRANSACTD_VER_RELEASE;
|
|
1354
1414
|
req.resultLen = sizeof(trdVersiton);
|
|
1355
1415
|
req.paramMask |= P_MASK_DATA | P_MASK_DATALEN;
|
|
1356
|
-
}
|
|
1357
|
-
else
|
|
1416
|
+
}else
|
|
1358
1417
|
req.result = SERVER_CLIENT_NOT_COMPATIBLE;
|
|
1359
1418
|
break;
|
|
1360
1419
|
}
|
|
@@ -1369,15 +1428,20 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1369
1428
|
break;
|
|
1370
1429
|
case TD_AUTOMEKE_SCHEMA:
|
|
1371
1430
|
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
|
1372
|
-
req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
|
|
1431
|
+
req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb, (req.keyNum==1));
|
|
1373
1432
|
break;
|
|
1374
1433
|
case TD_CREATETABLE:
|
|
1375
1434
|
if (!doCreateTable(req))
|
|
1376
1435
|
req.result = ERROR_TD_INVALID_CLINETHOST;
|
|
1377
1436
|
break;
|
|
1378
1437
|
case TD_OPENTABLE:
|
|
1379
|
-
|
|
1380
|
-
|
|
1438
|
+
nw->resize(*req.datalen);
|
|
1439
|
+
resultBuffer = nw->ptr();
|
|
1440
|
+
if (!doOpenTable(req, nw->ptr(), false))
|
|
1441
|
+
{
|
|
1442
|
+
if (req.result == 0)
|
|
1443
|
+
req.result = ERROR_TD_INVALID_CLINETHOST;
|
|
1444
|
+
}
|
|
1381
1445
|
break;
|
|
1382
1446
|
case TD_CLOSETABLE:
|
|
1383
1447
|
m_tb = getTable(req.pbk->handle);
|
|
@@ -1426,19 +1490,23 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1426
1490
|
break;
|
|
1427
1491
|
}
|
|
1428
1492
|
case TD_VERSION:
|
|
1429
|
-
if (*req.datalen >= sizeof(
|
|
1493
|
+
if (*req.datalen >= sizeof(btrVersion)* 3)
|
|
1430
1494
|
{
|
|
1431
|
-
|
|
1495
|
+
btrVersion* v = (btrVersion*)req.data;
|
|
1432
1496
|
++v;
|
|
1433
1497
|
v->majorVersion = MYSQL_VERSION_ID / 10000;
|
|
1434
1498
|
v->minorVersion = (MYSQL_VERSION_ID / 100) % 100;
|
|
1435
|
-
|
|
1499
|
+
#if defined(MARIADB_BASE_VERSION)
|
|
1500
|
+
v->type = MYSQL_TYPE_MARIA;
|
|
1501
|
+
#else
|
|
1502
|
+
v->type = MYSQL_TYPE_MYSQL;
|
|
1503
|
+
#endif
|
|
1436
1504
|
++v;
|
|
1437
1505
|
v->majorVersion = TRANSACTD_VER_MAJOR;
|
|
1438
1506
|
v->minorVersion = TRANSACTD_VER_MINOR;
|
|
1439
|
-
v->
|
|
1507
|
+
v->type = 'T';
|
|
1440
1508
|
req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
|
1441
|
-
req.resultLen = sizeof(
|
|
1509
|
+
req.resultLen = sizeof(btrVersion)* 3;
|
|
1442
1510
|
}
|
|
1443
1511
|
else
|
|
1444
1512
|
req.result = STATUS_BUFFERTOOSMALL;
|
|
@@ -1462,6 +1530,64 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
|
1462
1530
|
case TD_ACL_RELOAD:
|
|
1463
1531
|
req.result = getDatabaseCid(req.cid)->aclReload();
|
|
1464
1532
|
break;
|
|
1533
|
+
case TD_GET_SCHEMA:
|
|
1534
|
+
{
|
|
1535
|
+
database* db = getDatabaseCid(req.cid);
|
|
1536
|
+
nw->setClientBuffferSize(*(req.datalen));
|
|
1537
|
+
nw->beginExt(false);
|
|
1538
|
+
char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
|
|
1539
|
+
schemaBuilder sb;
|
|
1540
|
+
protocol::tdap::tabledef* td = sb.getTabledef(db, getTableName(req).c_str(),
|
|
1541
|
+
(unsigned char*)p, *req.datalen);
|
|
1542
|
+
if (td)
|
|
1543
|
+
{
|
|
1544
|
+
nw->asyncWrite(NULL, td->varSize + sizeof(unsigned short), netsvc::server::netWriter::curSeekOnly);
|
|
1545
|
+
nw->writeHeadar(P_MASK_DATA | P_MASK_DATALEN, (short_td)errorCode(db->stat()));
|
|
1546
|
+
|
|
1547
|
+
}
|
|
1548
|
+
else
|
|
1549
|
+
nw->writeHeadar(0, errorCodeSht(sb.stat()));
|
|
1550
|
+
unsigned int* totalLen = (unsigned int*)nw->ptr();
|
|
1551
|
+
nw->datalen = *totalLen = nw->resultLen();
|
|
1552
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1553
|
+
}
|
|
1554
|
+
case TD_STORE_TEST:
|
|
1555
|
+
{
|
|
1556
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
|
|
1557
|
+
bool ncc = (req.keyNum == -1);
|
|
1558
|
+
m_tb->beginUpdate(req.keyNum);
|
|
1559
|
+
if (m_tb->stat() == 0)
|
|
1560
|
+
{
|
|
1561
|
+
std::vector<std::string> ss;
|
|
1562
|
+
std::string s((const char*)req.data);
|
|
1563
|
+
split(ss, s, "\t");
|
|
1564
|
+
if ( ss.size() >= 2)
|
|
1565
|
+
{
|
|
1566
|
+
for (int i = 0; i < (int)ss.size() ; i+=2)
|
|
1567
|
+
m_tb->setValue((short)atol(ss[i].c_str()), ss[i + 1], 0);
|
|
1568
|
+
m_tb->update(ncc);
|
|
1569
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
1570
|
+
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
|
1571
|
+
if (!m_tb->cursor())
|
|
1572
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
|
1573
|
+
}else
|
|
1574
|
+
req.result = STATUS_INVALID_FIELDVALUE;
|
|
1575
|
+
}else
|
|
1576
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
1577
|
+
|
|
1578
|
+
break;
|
|
1579
|
+
}
|
|
1580
|
+
case TD_SET_TIMESTAMP_MODE:
|
|
1581
|
+
{
|
|
1582
|
+
m_tb = getTable(req.pbk->handle);
|
|
1583
|
+
bool always = req.keyNum == TIMESTAMP_ALWAYS;
|
|
1584
|
+
m_tb->setTimestampAlways(always);
|
|
1585
|
+
req.result = STATUS_SUCCESS;
|
|
1586
|
+
break;
|
|
1587
|
+
}
|
|
1588
|
+
default:
|
|
1589
|
+
req.result = STATUS_NOSUPPORT_OP;
|
|
1590
|
+
break;
|
|
1465
1591
|
}
|
|
1466
1592
|
DEBUG_WRITELOG2(op, req)
|
|
1467
1593
|
DEBUG_ERROR_MEMDUMP(req.result, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
|
@@ -1545,7 +1671,7 @@ void makeRandomKey(unsigned char *buf, unsigned int size)
|
|
|
1545
1671
|
size_t dbExecuter::getAcceptMessage(char* message, size_t size)
|
|
1546
1672
|
{
|
|
1547
1673
|
// make handshake packet
|
|
1548
|
-
|
|
1674
|
+
m_authChecked = false;
|
|
1549
1675
|
assert(size >= sizeof(trdVersiton));
|
|
1550
1676
|
|
|
1551
1677
|
handshale_t* hst = (handshale_t*)message;
|
|
@@ -1555,9 +1681,18 @@ size_t dbExecuter::getAcceptMessage(char* message, size_t size)
|
|
|
1555
1681
|
|
|
1556
1682
|
strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
|
|
1557
1683
|
global_system_variables.collation_server->csname);
|
|
1558
|
-
ver->
|
|
1559
|
-
ver->
|
|
1560
|
-
ver->
|
|
1684
|
+
ver->desc.srvMysqlMajor = MYSQL_VERSION_ID / 10000;
|
|
1685
|
+
ver->desc.srvMysqlMinor = (MYSQL_VERSION_ID / 100) % 100;
|
|
1686
|
+
ver->desc.srvMysqlRelease = MYSQL_VERSION_ID % 100;
|
|
1687
|
+
#if defined(MARIADB_BASE_VERSION)
|
|
1688
|
+
ver->desc.srvMysqlType = MYSQL_TYPE_MARIA;
|
|
1689
|
+
#else
|
|
1690
|
+
ver->desc.srvMysqlType = MYSQL_TYPE_MYSQL;
|
|
1691
|
+
#endif
|
|
1692
|
+
ver->desc.srvMajor = TRANSACTD_VER_MAJOR;
|
|
1693
|
+
ver->desc.srvMinor = TRANSACTD_VER_MINOR;
|
|
1694
|
+
ver->desc.srvRelease = TRANSACTD_VER_RELEASE;
|
|
1695
|
+
|
|
1561
1696
|
hst->transaction_isolation = (unsigned short)getTransactdIsolation();
|
|
1562
1697
|
hst->lock_wait_timeout = getTransactdLockWaitTimeout();
|
|
1563
1698
|
if (strcmp(g_auth_type, AUTH_TYPE_MYSQL_STR) == 0)
|
|
@@ -71,7 +71,7 @@ class dbExecuter : public engine::mysql::dbManager
|
|
|
71
71
|
std::string makeSQLcreateTable(const request& req);
|
|
72
72
|
bool connect(request& req);
|
|
73
73
|
inline bool doCreateTable(request& req);
|
|
74
|
-
inline bool doOpenTable(request& req, bool reconnect=false);
|
|
74
|
+
inline bool doOpenTable(request& req, char* buf, bool reconnect=false);
|
|
75
75
|
inline void doSeekKey(request& req, int op, engine::mysql::rowLockMode* lock);
|
|
76
76
|
inline void doMoveFirst(request& req, engine::mysql::rowLockMode* lock);
|
|
77
77
|
inline void doMoveKey(request& req, int op, engine::mysql::rowLockMode* lock);
|
|
@@ -20,13 +20,15 @@
|
|
|
20
20
|
================================================================= */
|
|
21
21
|
|
|
22
22
|
#include <bzs/db/protocol/tdap/tdapcapi.h>
|
|
23
|
+
#pragma warning(disable : 4005) //BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT redefine bug
|
|
23
24
|
#include <bzs/db/blobBuffer.h>
|
|
25
|
+
#include <boost/asio/buffer.hpp>
|
|
26
|
+
#pragma warning(default : 4005)
|
|
24
27
|
#include <iostream>
|
|
25
28
|
#include <vector>
|
|
26
29
|
#include <string.h>
|
|
27
|
-
#include <boost/asio/buffer.hpp>
|
|
28
|
-
#include <bzs/env/compiler.h>
|
|
29
30
|
|
|
31
|
+
#include <bzs/env/compiler.h>
|
|
30
32
|
namespace bzs
|
|
31
33
|
{
|
|
32
34
|
namespace netsvc
|
|
@@ -100,13 +102,6 @@ typedef void*(__STDCALL* DDBA_PTR)(client::table* tb, uint_td size);
|
|
|
100
102
|
#pragma pack(push, 1)
|
|
101
103
|
pragma_pack1;
|
|
102
104
|
|
|
103
|
-
struct version
|
|
104
|
-
{
|
|
105
|
-
ushort_td majorVersion;
|
|
106
|
-
ushort_td minorVersion;
|
|
107
|
-
uchar_td Type;
|
|
108
|
-
};
|
|
109
|
-
|
|
110
105
|
struct posblk
|
|
111
106
|
{
|
|
112
107
|
posblk() { memset(this, 0, sizeof(posblk)); }
|