transactd 2.4.5 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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)); }
|