transactd 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +20 -18
- data/README-JA +19 -17
- data/RELEASE_NOTE +144 -0
- data/RELEASE_NOTE-JA +153 -0
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/ruby.swg +10 -9
- data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
- data/build/swig/tdcl.i +30 -3
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +85 -41
- data/source/bzs/db/engine/mysql/database.h +35 -5
- data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
- data/source/bzs/db/protocol/tdap/client/client.h +30 -1
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
- data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
- data/source/bzs/db/protocol/tdap/client/field.h +7 -7
- data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
- data/source/bzs/db/protocol/tdap/client/request.h +11 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
- data/source/bzs/db/protocol/tdap/client/table.h +8 -7
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
- data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
- data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
- data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
- data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
- data/source/bzs/db/protocol/tdap/uri.h +4 -4
- data/source/bzs/db/transactd/transactd.cpp +6 -5
- data/source/bzs/env/crosscompile.cpp +17 -0
- data/source/bzs/env/crosscompile.h +4 -1
- data/source/bzs/env/mbcswchrLinux.cpp +3 -0
- data/source/bzs/example/deleteRecords.cpp +13 -0
- data/source/bzs/example/deleteRecords_c.cpp +8 -1
- data/source/bzs/example/insertRecords.cpp +14 -0
- data/source/bzs/example/insertRecords_c.cpp +8 -1
- data/source/bzs/example/ormap_c.cpp +8 -1
- data/source/bzs/example/queryData.cpp +92 -2
- data/source/bzs/example/queryData.h +3 -1
- data/source/bzs/example/readRecords.cpp +13 -0
- data/source/bzs/example/readRecords_c.cpp +8 -1
- data/source/bzs/example/updateRecords.cpp +13 -0
- data/source/bzs/example/updateRecords_c.cpp +8 -1
- data/source/bzs/example/update_with_transaction.cpp +13 -0
- data/source/bzs/example/update_with_transaction_c.cpp +8 -1
- data/source/bzs/example/useORMRecord.cpp +9 -3
- data/source/bzs/netsvc/client/iconnection.h +8 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
- data/source/bzs/netsvc/client/tcpClient.h +430 -214
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
- data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
- data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
- data/source/bzs/test/transactdBench/workerBase.h +2 -2
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
- data/source/global/tdclatl/Database.cpp +12 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/FieldDef.cpp +19 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -16
- data/source/global/tdclatl/GroupQuery.cpp +21 -16
- data/source/global/tdclatl/GroupQuery.h +1 -1
- data/source/global/tdclatl/QueryBase.cpp +14 -0
- data/source/global/tdclatl/QueryBase.h +2 -0
- data/source/global/tdclatl/Record.cpp +41 -10
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Recordset.cpp +117 -31
- data/source/global/tdclatl/Recordset.h +6 -5
- data/source/global/tdclatl/Table.cpp +24 -28
- data/source/global/tdclatl/Table.h +3 -4
- data/source/global/tdclatl/activeTable.cpp +149 -103
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +38 -18
- data/transactd.gemspec +1 -1
- metadata +8 -4
- data/bin/common/tdclc_32_2_2.dll +0 -0
- data/bin/common/tdclc_64_2_2.dll +0 -0
@@ -37,7 +37,7 @@
|
|
37
37
|
#include <random>
|
38
38
|
|
39
39
|
|
40
|
-
extern
|
40
|
+
extern int getTransactdIsolation();
|
41
41
|
extern unsigned int getTransactdLockWaitTimeout();
|
42
42
|
|
43
43
|
namespace bzs
|
@@ -530,7 +530,8 @@ inline void readAfter(request& req, table* tb, dbExecuter* dbm)
|
|
530
530
|
req.paramMask |= P_MASK_BLOBBODY;
|
531
531
|
req.data = tb->record();
|
532
532
|
}
|
533
|
-
}
|
533
|
+
}else if (!tb->cursor())
|
534
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
534
535
|
req.result = dbm->errorCodeSht(tb->stat());
|
535
536
|
}
|
536
537
|
|
@@ -610,57 +611,64 @@ inline int dbExecuter::doReadMultiWithSeek(request& req, int op,
|
|
610
611
|
int ret = 1;
|
611
612
|
m_tb = getTable(req.pbk->handle);
|
612
613
|
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
613
|
-
if (m_tb->setKeyNum(keynum))
|
614
|
+
if (!m_tb->setKeyNum(keynum))
|
614
615
|
{
|
615
|
-
m_tb->
|
616
|
-
|
617
|
-
|
618
|
-
m_tb->keymap());
|
619
|
-
|
620
|
-
extRequest* ereq = (extRequest*)req.data;
|
621
|
-
bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
|
622
|
-
bool execPrepared = (ereq->itype & FILTER_TYPE_SUPPLYVALUE) != 0;
|
623
|
-
// smartReadRecordsHandler scope
|
624
|
-
{
|
625
|
-
smartReadRecordsHandler srrh(m_readHandler);
|
616
|
+
req.result = m_tb->stat();
|
617
|
+
return ret;
|
618
|
+
}
|
626
619
|
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
620
|
+
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
621
|
+
m_tb->seekKey((op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT
|
622
|
+
: HA_READ_KEY_OR_PREV,
|
623
|
+
m_tb->keymap());
|
624
|
+
|
625
|
+
extRequest* ereq = (extRequest*)req.data;
|
626
|
+
bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
|
627
|
+
bool execPrepared = (ereq->itype & FILTER_TYPE_SUPPLYVALUE) != 0;
|
628
|
+
// smartReadRecordsHandler scope
|
629
|
+
{
|
630
|
+
smartReadRecordsHandler srrh(m_readHandler);
|
631
|
+
|
632
|
+
if (execPrepared)
|
633
|
+
{
|
634
|
+
if (m_tb->preparedStatements.size() < ereq->preparedId)
|
635
|
+
req.result = STATUS_INVALID_PREPAREID;
|
636
636
|
else
|
637
|
-
req.result = m_readHandler->
|
638
|
-
|
639
|
-
|
640
|
-
if (req.result != 0)
|
641
|
-
return ret;
|
642
|
-
if (m_tb->stat() == 0)
|
643
|
-
{
|
644
|
-
if (op == TD_KEY_GE_NEXT_MULTI)
|
645
|
-
m_tb->getNextExt(m_readHandler, true, noBookmark);
|
646
|
-
else if (op == TD_KEY_LE_PREV_MULTI)
|
647
|
-
m_tb->getPrevExt(m_readHandler, true, noBookmark);
|
648
|
-
}
|
649
|
-
req.result = errorCodeSht(m_tb->stat());
|
650
|
-
DEBUG_WRITELOG2(op, req);
|
637
|
+
req.result = m_readHandler->beginPreparExecute(m_tb, ereq, true, nw,
|
638
|
+
noBookmark,
|
639
|
+
(prepared*)m_tb->preparedStatements[ereq->preparedId - 1]);
|
651
640
|
}
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
641
|
+
else
|
642
|
+
req.result = m_readHandler->begin(m_tb, ereq, true, nw,
|
643
|
+
(op == TD_KEY_GE_NEXT_MULTI),
|
644
|
+
noBookmark);
|
645
|
+
if (req.result != 0)
|
646
|
+
return ret;
|
647
|
+
if (m_tb->stat() == 0)
|
648
|
+
{
|
649
|
+
if (op == TD_KEY_GE_NEXT_MULTI)
|
650
|
+
m_tb->getNextExt(m_readHandler, true, noBookmark);
|
651
|
+
else if (op == TD_KEY_LE_PREV_MULTI)
|
652
|
+
m_tb->getPrevExt(m_readHandler, true, noBookmark);
|
653
|
+
}
|
654
|
+
req.result = errorCodeSht(m_tb->stat());
|
655
|
+
if (!m_tb->cursor())
|
656
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
657
|
+
DEBUG_WRITELOG2(op, req);
|
663
658
|
}
|
659
|
+
short dummy = 0;
|
660
|
+
size_t& size = nw->datalen;
|
661
|
+
size = req.serializeForExt(m_tb, nw);
|
662
|
+
char* resultBuffer = nw->ptr();
|
663
|
+
netsvc::server::buffers* optionalData = nw->optionalData();
|
664
|
+
if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
|
665
|
+
size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
|
666
|
+
FILE_MAP_SIZE, optionalData, dummy);
|
667
|
+
|
668
|
+
DEBUG_PROFILE_END_OP(1, op)
|
669
|
+
ret = EXECUTE_RESULT_SUCCESS;
|
670
|
+
|
671
|
+
|
664
672
|
if (m_tb)
|
665
673
|
m_tb->unUse();
|
666
674
|
return ret;
|
@@ -682,7 +690,10 @@ inline int dbExecuter::doReadMulti(request& req, int op,
|
|
682
690
|
{
|
683
691
|
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
684
692
|
if (!m_tb->setKeyNum(keynum))
|
693
|
+
{
|
694
|
+
req.result = m_tb->stat();
|
685
695
|
return ret;
|
696
|
+
}
|
686
697
|
}
|
687
698
|
// smartReadRecordsHandler scope
|
688
699
|
{
|
@@ -716,6 +727,8 @@ inline int dbExecuter::doReadMulti(request& req, int op,
|
|
716
727
|
m_tb->stepPrevExt(m_readHandler, incCurrent, noBookmark);
|
717
728
|
req.result = errorCodeSht(m_tb->stat());
|
718
729
|
}
|
730
|
+
if (!m_tb->cursor())
|
731
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
719
732
|
DEBUG_WRITELOG2(op, req);
|
720
733
|
}
|
721
734
|
|
@@ -859,13 +872,18 @@ inline void dbExecuter::doInsert(request& req)
|
|
859
872
|
req.blobHeader);
|
860
873
|
__int64 aincValue = m_tb->insert(ncc);
|
861
874
|
req.result = errorCodeSht(m_tb->stat());
|
862
|
-
if (
|
875
|
+
if (m_tb->stat() == 0)
|
863
876
|
{
|
864
|
-
|
865
|
-
|
877
|
+
if (aincValue)
|
878
|
+
{
|
879
|
+
req.paramMask = P_MASK_INS_AUTOINC;
|
880
|
+
req.data = m_tb->record();
|
881
|
+
}
|
882
|
+
else
|
883
|
+
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
866
884
|
}
|
867
|
-
|
868
|
-
req.paramMask
|
885
|
+
if (!m_tb->cursor())
|
886
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
869
887
|
}
|
870
888
|
|
871
889
|
inline void dbExecuter::doUpdateKey(request& req)
|
@@ -889,6 +907,8 @@ inline void dbExecuter::doUpdateKey(request& req)
|
|
889
907
|
}
|
890
908
|
req.result = errorCodeSht(m_tb->stat());
|
891
909
|
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
910
|
+
if (!m_tb->cursor())
|
911
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
892
912
|
}
|
893
913
|
|
894
914
|
inline void dbExecuter::doUpdate(request& req)
|
@@ -904,6 +924,8 @@ inline void dbExecuter::doUpdate(request& req)
|
|
904
924
|
}
|
905
925
|
req.result = errorCodeSht(m_tb->stat());
|
906
926
|
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
927
|
+
if (!m_tb->cursor())
|
928
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
907
929
|
}
|
908
930
|
|
909
931
|
inline void dbExecuter::doDeleteKey(request& req)
|
@@ -923,6 +945,8 @@ inline void dbExecuter::doDeleteKey(request& req)
|
|
923
945
|
}
|
924
946
|
req.result = errorCodeSht(m_tb->stat());
|
925
947
|
req.paramMask = P_MASK_POSBLK;
|
948
|
+
if (!m_tb->cursor())
|
949
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
926
950
|
}
|
927
951
|
|
928
952
|
inline void dbExecuter::doDelete(request& req)
|
@@ -933,6 +957,8 @@ inline void dbExecuter::doDelete(request& req)
|
|
933
957
|
m_tb->del();
|
934
958
|
req.result = errorCodeSht(m_tb->stat());
|
935
959
|
req.paramMask = P_MASK_POSBLK;
|
960
|
+
if (!m_tb->cursor())
|
961
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
936
962
|
}
|
937
963
|
|
938
964
|
inline void dbExecuter::doInsertBulk(request& req)
|
@@ -981,6 +1007,8 @@ inline void dbExecuter::doInsertBulk(request& req)
|
|
981
1007
|
}
|
982
1008
|
else
|
983
1009
|
req.result = errorCodeSht(m_tb->stat());
|
1010
|
+
if (!m_tb->cursor())
|
1011
|
+
req.paramMask |= P_MASK_PB_ERASE_BM;
|
984
1012
|
}
|
985
1013
|
|
986
1014
|
/**
|
@@ -1004,6 +1032,7 @@ inline void dbExecuter::doStat(request& req)
|
|
1004
1032
|
memcpy((char*)req.data, &len, sizeof(ushort_td));
|
1005
1033
|
uint rows = (uint)m_tb->recordCount((req.keyNum != 0));
|
1006
1034
|
memcpy((char*)req.data + 6, &rows, sizeof(uint));
|
1035
|
+
req.result = errorCodeSht(m_tb->stat());
|
1007
1036
|
}
|
1008
1037
|
else
|
1009
1038
|
req.result = STATUS_BUFFERTOOSMALL;
|
@@ -1072,7 +1101,10 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1072
1101
|
{
|
1073
1102
|
if (op != TD_CONNECT && op != TD_CREATETABLE &&
|
1074
1103
|
op != TD_OPENTABLE && op != TD_GETSERVER_CHARSET)
|
1104
|
+
{
|
1105
|
+
req.result = STATUS_ACCESS_DENIED;
|
1075
1106
|
return EXECUTE_RESULT_ACCESS_DNIED;
|
1107
|
+
}
|
1076
1108
|
}
|
1077
1109
|
switch (op)
|
1078
1110
|
{
|
@@ -1150,14 +1182,39 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1150
1182
|
req.data = (void*)m_tb->position();
|
1151
1183
|
req.resultLen = m_tb->posPtrLen();
|
1152
1184
|
break;
|
1185
|
+
case TD_RECONNECT:
|
1186
|
+
|
1187
|
+
if (!doOpenTable(req))
|
1188
|
+
{
|
1189
|
+
req.result = ERROR_TD_INVALID_CLINETHOST;
|
1190
|
+
break;
|
1191
|
+
}
|
1192
|
+
{
|
1193
|
+
char* p = (char*)req.data;
|
1194
|
+
req.keyNum = *p;
|
1195
|
+
if (*(++p) == 0)
|
1196
|
+
break;
|
1197
|
+
req.data = ((char*)req.data) + 2;
|
1198
|
+
if (m_tb) m_tb->unUse();
|
1199
|
+
}
|
1200
|
+
//fall through restore position
|
1153
1201
|
case TD_MOVE_BOOKMARK:
|
1154
1202
|
{
|
1155
1203
|
rowLockMode lck;
|
1156
1204
|
getRowLockMode(opTrn, &lck);
|
1157
1205
|
m_tb = getTable(req.pbk->handle, lck.lock ? SQLCOM_UPDATE : SQLCOM_SELECT);
|
1158
1206
|
m_tb->setRowLock(&lck);
|
1159
|
-
|
1160
|
-
|
1207
|
+
char keynum = req.keyNum;
|
1208
|
+
if (keynum != -1)
|
1209
|
+
{
|
1210
|
+
keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
1211
|
+
if (!m_tb->keynumCheck(keynum))
|
1212
|
+
{
|
1213
|
+
req.result = STATUS_INVALID_KEYNUM;
|
1214
|
+
break;
|
1215
|
+
}
|
1216
|
+
}
|
1217
|
+
m_tb->movePos((uchar*)req.data, keynum);
|
1161
1218
|
if (lck.lock && m_tb->stat())
|
1162
1219
|
m_tb->setRowLockError();
|
1163
1220
|
readAfter(req, m_tb, this);
|
@@ -1170,7 +1227,8 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1170
1227
|
{
|
1171
1228
|
m_tb = NULL;
|
1172
1229
|
return EXECUTE_RESULT_SUCCESS;
|
1173
|
-
}
|
1230
|
+
}else
|
1231
|
+
resultBuffer = nw->ptr();
|
1174
1232
|
break;
|
1175
1233
|
case TD_KEY_SEEK_MULTI:
|
1176
1234
|
case TD_KEY_NEXT_MULTI:
|
@@ -1182,7 +1240,8 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1182
1240
|
{
|
1183
1241
|
m_tb = NULL;
|
1184
1242
|
return EXECUTE_RESULT_SUCCESS;
|
1185
|
-
}
|
1243
|
+
}else
|
1244
|
+
resultBuffer = nw->ptr();
|
1186
1245
|
break;
|
1187
1246
|
case TD_FILTER_PREPARE:
|
1188
1247
|
m_tb = getTable(req.pbk->handle);
|
@@ -1207,7 +1266,8 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1207
1266
|
*((unsigned short*)req.data) = (unsigned short)m_tb->preparedStatements.size();
|
1208
1267
|
req.resultLen = 2;
|
1209
1268
|
}
|
1210
|
-
}
|
1269
|
+
}else
|
1270
|
+
req.result = m_tb->stat();
|
1211
1271
|
break;
|
1212
1272
|
case TD_MOVE_PER:
|
1213
1273
|
m_tb = getTable(req.pbk->handle);
|
@@ -1221,7 +1281,7 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1221
1281
|
req.result = errorCodeSht(m_tb->stat());
|
1222
1282
|
if (m_tb->stat() == 0)
|
1223
1283
|
{
|
1224
|
-
req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
1284
|
+
req.paramMask = P_MASK_DATA | P_MASK_DATALEN ;
|
1225
1285
|
req.data = m_tb->percentResult();
|
1226
1286
|
req.resultLen = sizeof(int);
|
1227
1287
|
}
|
@@ -1252,6 +1312,7 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1252
1312
|
req.result = SERVER_CLIENT_NOT_COMPATIBLE;
|
1253
1313
|
break;
|
1254
1314
|
}
|
1315
|
+
|
1255
1316
|
case TD_CONNECT:
|
1256
1317
|
if (!connect(req))
|
1257
1318
|
req.result = ERROR_TD_INVALID_CLINETHOST;
|
@@ -1349,13 +1410,11 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1349
1410
|
req.result = getDatabaseCid(req.cid)->aclReload();
|
1350
1411
|
break;
|
1351
1412
|
}
|
1352
|
-
if (m_tb)
|
1353
|
-
m_tb->unUse();
|
1354
1413
|
DEBUG_WRITELOG2(op, req)
|
1355
1414
|
DEBUG_ERROR_MEMDUMP(req.result, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
1356
|
-
|
1357
|
-
|
1358
1415
|
size = req.serialize(m_tb, resultBuffer);
|
1416
|
+
if (m_tb)
|
1417
|
+
m_tb->unUse();
|
1359
1418
|
short dymmy = 0;
|
1360
1419
|
if ((req.result == 0) && (req.paramMask & P_MASK_BLOBBODY) &&
|
1361
1420
|
m_blobBuffer->fieldCount())
|
@@ -1395,13 +1454,17 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1395
1454
|
|
1396
1455
|
catch (...)
|
1397
1456
|
{
|
1398
|
-
clenupNoException();
|
1399
|
-
DEBUG_ERROR_MEMDUMP(20001, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
1400
|
-
req.reset();
|
1401
|
-
req.result = 20001;
|
1402
|
-
dumpStdErr(op, req, m_tb);
|
1403
1457
|
try
|
1404
1458
|
{
|
1459
|
+
try
|
1460
|
+
{
|
1461
|
+
clenupNoException();
|
1462
|
+
DEBUG_ERROR_MEMDUMP(20001, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
|
1463
|
+
req.reset();
|
1464
|
+
req.result = 20001;
|
1465
|
+
dumpStdErr(op, req, m_tb);
|
1466
|
+
}
|
1467
|
+
catch(...){}
|
1405
1468
|
if (m_tb)
|
1406
1469
|
m_tb->close();
|
1407
1470
|
}
|
@@ -1442,7 +1505,7 @@ size_t dbExecuter::getAcceptMessage(char* message, size_t size)
|
|
1442
1505
|
ver->srvMajor = TRANSACTD_VER_MAJOR;
|
1443
1506
|
ver->srvMinor = TRANSACTD_VER_MINOR;
|
1444
1507
|
ver->srvRelease = TRANSACTD_VER_RELEASE;
|
1445
|
-
hst->transaction_isolation = getTransactdIsolation();
|
1508
|
+
hst->transaction_isolation = (unsigned short)getTransactdIsolation();
|
1446
1509
|
hst->lock_wait_timeout = getTransactdLockWaitTimeout();
|
1447
1510
|
if (strcmp(g_auth_type, AUTH_TYPE_MYSQL_STR) == 0)
|
1448
1511
|
{
|
@@ -51,12 +51,18 @@ namespace client {class table;}
|
|
51
51
|
#define P_MASK_DATALEN 4
|
52
52
|
#define P_MASK_KEYBUF 8
|
53
53
|
#define P_MASK_KEYNUM 16
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
|
55
|
+
/** The data length which transmits to a client
|
56
|
+
* is described at 2 bytes of the data buffer head.
|
57
|
+
*/
|
58
|
+
#define P_MASK_EX_SENDLEN 32
|
57
59
|
#define P_MASK_BLOBBODY 64
|
58
|
-
#define P_MASK_FINALRET 128
|
60
|
+
#define P_MASK_FINALRET 128 // server sent final result
|
59
61
|
#define P_MASK_FINALDATALEN 256 // server sent final result
|
62
|
+
#define P_MASK_PB_BOOKMARK 512 // posblk bookmark writen
|
63
|
+
#define P_MASK_PB_ERASE_BM 1024 // posblk bookmark erase command
|
64
|
+
#define P_MASK_PB_LOCKED 2048 // posblk row locked
|
65
|
+
|
60
66
|
|
61
67
|
#define P_MASK_ALL \
|
62
68
|
P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN | P_MASK_KEYBUF | P_MASK_KEYNUM
|
@@ -101,6 +107,9 @@ struct version
|
|
101
107
|
uchar_td Type;
|
102
108
|
};
|
103
109
|
|
110
|
+
#pragma pack(push, 1)
|
111
|
+
pragma_pack1;
|
112
|
+
|
104
113
|
struct posblk
|
105
114
|
{
|
106
115
|
posblk() { memset(this, 0, sizeof(posblk)); }
|
@@ -108,7 +117,12 @@ struct posblk
|
|
108
117
|
unsigned int handle;
|
109
118
|
client::table* tb;
|
110
119
|
DDBA_PTR allocFunc;
|
120
|
+
unsigned char lock;
|
121
|
+
unsigned char bookmarkLen;
|
122
|
+
char bookmark[1]; //dummy array
|
111
123
|
};
|
124
|
+
#pragma pack(pop)
|
125
|
+
pragma_pop;
|
112
126
|
|
113
127
|
struct clientID
|
114
128
|
{
|
@@ -307,18 +307,17 @@ unsigned int fielddef::charNum(/* int index */) const
|
|
307
307
|
|
308
308
|
ushort_td lenByCharnum(uchar_td type, uchar_td charsetIndex, ushort_td charnum)
|
309
309
|
{
|
310
|
-
ushort_td len;
|
311
|
-
if (
|
312
|
-
|
313
|
-
|
310
|
+
ushort_td len = charnum;
|
311
|
+
if ((type == ft_wstring) || (type == ft_wzstring) || (type == ft_mywchar) ||
|
312
|
+
(type == ft_mywvarchar)|| (type == ft_mywvarbinary))
|
313
|
+
len = (ushort_td)(mysql::charsize(CHARSET_UTF16LE) * charnum);
|
314
|
+
else if (charsetIndex && ((type == ft_mychar) || (type == ft_myvarchar)||
|
315
|
+
(type == ft_string) || (type == ft_zstring)|| (type == ft_myvarbinary) ))
|
314
316
|
len = (ushort_td)(mysql::charsize(charsetIndex) * charnum);
|
315
|
-
|
316
|
-
|
317
|
-
else
|
318
|
-
len = std::min<ushort_td>(len, 255);
|
319
|
-
}
|
317
|
+
if ((type == ft_myvarchar) || (type == ft_mywvarchar) || (type == ft_myvarbinary) || (type == ft_mywvarbinary))
|
318
|
+
len += ((len >= 256) ? 2 : 1);
|
320
319
|
else
|
321
|
-
len =
|
320
|
+
len = std::min<ushort_td>(len, 255);
|
322
321
|
return len;
|
323
322
|
}
|
324
323
|
|
@@ -512,25 +511,36 @@ PACKAGE uchar_td getFilterLogicTypeCode(const _TCHAR* cmpstr)
|
|
512
511
|
{
|
513
512
|
if (_tcscmp(cmpstr, _T("=")) == 0)
|
514
513
|
return (uchar_td)eEqual;
|
515
|
-
|
516
|
-
if (_tcscmp(cmpstr, _T(">")) == 0)
|
514
|
+
else if (_tcscmp(cmpstr, _T(">")) == 0)
|
517
515
|
return (uchar_td)eGreater;
|
518
|
-
|
519
|
-
if (_tcscmp(cmpstr, _T("<")) == 0)
|
516
|
+
else if (_tcscmp(cmpstr, _T("<")) == 0)
|
520
517
|
return (uchar_td)eLess;
|
521
|
-
|
522
|
-
if (_tcscmp(cmpstr, _T("<>")) == 0)
|
518
|
+
else if (_tcscmp(cmpstr, _T("<>")) == 0)
|
523
519
|
return (uchar_td)eNotEq;
|
524
|
-
|
525
|
-
if (_tcscmp(cmpstr, _T("=>")) == 0)
|
520
|
+
else if (_tcscmp(cmpstr, _T("=>")) == 0)
|
526
521
|
return (uchar_td)eGreaterEq;
|
527
|
-
if (_tcscmp(cmpstr, _T(">=")) == 0)
|
522
|
+
else if (_tcscmp(cmpstr, _T(">=")) == 0)
|
528
523
|
return (uchar_td)eGreaterEq;
|
529
|
-
|
530
|
-
if (_tcscmp(cmpstr, _T("=<")) == 0)
|
524
|
+
else if (_tcscmp(cmpstr, _T("=<")) == 0)
|
531
525
|
return (uchar_td)eLessEq;
|
532
|
-
if (_tcscmp(cmpstr, _T("<=")) == 0)
|
526
|
+
else if (_tcscmp(cmpstr, _T("<=")) == 0)
|
533
527
|
return (uchar_td)eLessEq;
|
528
|
+
else if (_tcscmp(cmpstr, _T("=i")) == 0)
|
529
|
+
return (uchar_td)eEqual | CMPLOGICAL_CASEINSENSITIVE;
|
530
|
+
else if (_tcscmp(cmpstr, _T(">i")) == 0)
|
531
|
+
return (uchar_td)eGreater | CMPLOGICAL_CASEINSENSITIVE;
|
532
|
+
else if (_tcscmp(cmpstr, _T("<i")) == 0)
|
533
|
+
return (uchar_td)eLess | CMPLOGICAL_CASEINSENSITIVE;
|
534
|
+
else if (_tcscmp(cmpstr, _T("<>i")) == 0)
|
535
|
+
return (uchar_td)eNotEq | CMPLOGICAL_CASEINSENSITIVE;
|
536
|
+
else if (_tcscmp(cmpstr, _T("=>i")) == 0)
|
537
|
+
return (uchar_td)eGreaterEq | CMPLOGICAL_CASEINSENSITIVE;
|
538
|
+
else if (_tcscmp(cmpstr, _T(">=i")) == 0)
|
539
|
+
return (uchar_td)eGreaterEq | CMPLOGICAL_CASEINSENSITIVE;
|
540
|
+
else if (_tcscmp(cmpstr, _T("=<i")) == 0)
|
541
|
+
return (uchar_td)eLessEq | CMPLOGICAL_CASEINSENSITIVE;
|
542
|
+
else if (_tcscmp(cmpstr, _T("<=i")) == 0)
|
543
|
+
return (uchar_td)eLessEq | CMPLOGICAL_CASEINSENSITIVE;
|
534
544
|
return 255;
|
535
545
|
}
|
536
546
|
|
@@ -184,6 +184,12 @@ PACKAGE ushort_td
|
|
184
184
|
/* Is field type string ? */
|
185
185
|
PACKAGE bool isStringType(uchar_td type);
|
186
186
|
|
187
|
+
/** @cond INTERNAL */
|
188
|
+
#define PAD_CHAR_OPTION_SAVED 1
|
189
|
+
#define USE_PAD_CHAR 2
|
190
|
+
#define TRIM_PAD_CHAR 4
|
191
|
+
/** @endcond */
|
192
|
+
|
187
193
|
/* Mark of ** that BizStation Corp internal use only.
|
188
194
|
*/
|
189
195
|
template <int N> struct fielddef_t
|
@@ -225,13 +231,13 @@ public:
|
|
225
231
|
|
226
232
|
protected:
|
227
233
|
uchar_td m_charsetIndex; // charctor set index of this field data
|
228
|
-
|
229
|
-
|
234
|
+
ushort_td m_schemaCodePage;
|
235
|
+
ushort_td m_padCharOptions;
|
230
236
|
public:
|
231
237
|
FLAGS enableFlags; // ** enable flags. see below
|
232
238
|
|
233
239
|
private:
|
234
|
-
inline void setSchemaCodePage(uint_td v) { m_schemaCodePage = v; };
|
240
|
+
inline void setSchemaCodePage(uint_td v) { m_schemaCodePage = (ushort_td)v; };
|
235
241
|
friend class client::dbdef;
|
236
242
|
};
|
237
243
|
|
@@ -370,6 +376,8 @@ public:
|
|
370
376
|
if (((type >= ft_myvarchar) && (type <= ft_mywvarbinary)) ||
|
371
377
|
type == ft_lstring)
|
372
378
|
return len < 256 ? 1 : 2;
|
379
|
+
else if (type == ft_lvar)
|
380
|
+
return 2;
|
373
381
|
return 0;
|
374
382
|
}
|
375
383
|
|
@@ -450,6 +458,33 @@ public:
|
|
450
458
|
return dataLen(ptr);
|
451
459
|
}
|
452
460
|
|
461
|
+
inline void setPadCharSettings(bool set, bool trim)
|
462
|
+
{
|
463
|
+
m_padCharOptions = 0;
|
464
|
+
m_padCharOptions |= PAD_CHAR_OPTION_SAVED;
|
465
|
+
if ((type == ft_mychar) || (type == ft_mywchar))
|
466
|
+
{
|
467
|
+
m_padCharOptions |= USE_PAD_CHAR;
|
468
|
+
if (trim)
|
469
|
+
m_padCharOptions |= TRIM_PAD_CHAR;
|
470
|
+
} // For compatibility with conventional.
|
471
|
+
else if ((type == ft_string) || (type == ft_wstring))
|
472
|
+
{
|
473
|
+
if (set)
|
474
|
+
m_padCharOptions |= USE_PAD_CHAR;
|
475
|
+
if (trim)
|
476
|
+
m_padCharOptions |= TRIM_PAD_CHAR;
|
477
|
+
}
|
478
|
+
}
|
479
|
+
|
480
|
+
/* When ft_string or ft_wstring, fill by pad char at write. */
|
481
|
+
bool usePadChar() const {return (m_padCharOptions & USE_PAD_CHAR) == USE_PAD_CHAR;}
|
482
|
+
|
483
|
+
/* When ft_string or ft_wstring or ft_mychar or ft_mywchar,
|
484
|
+
remove pad char at read.*/
|
485
|
+
bool trimPadChar() const {return (m_padCharOptions & TRIM_PAD_CHAR) == TRIM_PAD_CHAR;}
|
486
|
+
|
487
|
+
|
453
488
|
/** @cond INTERNAL */
|
454
489
|
/* copy key data for send to mysql
|
455
490
|
* return next copy address.
|
@@ -534,6 +569,12 @@ public:
|
|
534
569
|
return *data + size;
|
535
570
|
}
|
536
571
|
|
572
|
+
/* copy blob data for recordset
|
573
|
+
|
574
|
+
@param blobBlock copy to adddres
|
575
|
+
@return new copy to address
|
576
|
+
|
577
|
+
*/
|
537
578
|
inline unsigned char* setBlobFieldPointer(uchar_td* dest, const blobHeader* hd,
|
538
579
|
unsigned char* blobBlock, int fieldNum) const
|
539
580
|
{
|
@@ -552,6 +593,30 @@ public:
|
|
552
593
|
++hd->curRow;
|
553
594
|
return blobBlock + size;
|
554
595
|
}
|
596
|
+
|
597
|
+
inline void setPadCharDefaultSettings()
|
598
|
+
{
|
599
|
+
if (!padCharOptionSaved())
|
600
|
+
{
|
601
|
+
// For compatibility with conventional.
|
602
|
+
if ((type == ft_string) || (type == ft_wstring) ||
|
603
|
+
(type == ft_mychar) || (type == ft_mywchar))
|
604
|
+
{
|
605
|
+
m_padCharOptions |= USE_PAD_CHAR;
|
606
|
+
m_padCharOptions |= TRIM_PAD_CHAR;
|
607
|
+
}
|
608
|
+
}
|
609
|
+
else if ((type == ft_mychar) || (type == ft_mywchar))
|
610
|
+
m_padCharOptions |= USE_PAD_CHAR;
|
611
|
+
}
|
612
|
+
|
613
|
+
/* PadChar options are saved at schema.
|
614
|
+
This is for compatibility with conventional.*/
|
615
|
+
bool padCharOptionSaved() const
|
616
|
+
{
|
617
|
+
return (m_padCharOptions & PAD_CHAR_OPTION_SAVED) == PAD_CHAR_OPTION_SAVED;
|
618
|
+
}
|
619
|
+
|
555
620
|
/** @endcond */
|
556
621
|
};
|
557
622
|
|
@@ -667,7 +732,7 @@ public:
|
|
667
732
|
int autoIncExSpace;
|
668
733
|
uchar_td iconIndex2;
|
669
734
|
uchar_td iconIndex3;
|
670
|
-
uint_td schemaCodePage; // Code page of this schema
|
735
|
+
uint_td schemaCodePage; // Code page of this schema string data.
|
671
736
|
|
672
737
|
private:
|
673
738
|
char formatVersion;
|
@@ -144,6 +144,7 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
|
|
144
144
|
#define TD_STASTISTICS 94
|
145
145
|
#define TD_KEY_SEEK_MULTI 95
|
146
146
|
#define TD_ACL_RELOAD 96
|
147
|
+
#define TD_RECONNECT 97
|
147
148
|
|
148
149
|
/** create sub operations
|
149
150
|
*/
|
@@ -173,8 +174,8 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
|
|
173
174
|
#define LG_SUBOP_CONNECT 0
|
174
175
|
#define LG_SUBOP_DISCONNECT 1
|
175
176
|
#define LG_SUBOP_NEWCONNECT 3
|
176
|
-
|
177
|
-
|
177
|
+
#define LG_SUBOP_RECONNECT 4
|
178
|
+
#define LG_SUBOP_DISCONNECT_EX 5 //for reconnect test
|
178
179
|
/** field types
|
179
180
|
*/
|
180
181
|
#define ft_string 0
|
@@ -386,6 +387,13 @@ typedef short_td(__STDCALL* DLLUNLOADCALLBACK_PTR)(dllUnloadCallback func);
|
|
386
387
|
#define ERROR_TD_HOSTNAME_NOT_FOUND 3103
|
387
388
|
#define ERROR_TD_CONNECTION_FAILURE 3106
|
388
389
|
#define ERROR_TD_NOT_CONNECTED 3110
|
390
|
+
#define ERROR_TD_NET_TIMEOUT 3800
|
391
|
+
#define ERROR_TD_NET_REMOTE_DISCONNECT 3801
|
392
|
+
#define ERROR_TD_NET_TOO_BIGDATA 3802
|
393
|
+
#define ERROR_TD_NET_OTHER 3810
|
394
|
+
#define ERROR_TD_C_CLIENT_UNKNOWN 3811
|
395
|
+
#define ERROR_TD_RECONNECTED 3900
|
396
|
+
|
389
397
|
|
390
398
|
#define TRANSACTD_SCHEMANAME _T("transactd_schema")
|
391
399
|
#define TYPE_SCHEMA_BDF 0
|
@@ -451,7 +459,7 @@ struct handshale_t
|
|
451
459
|
If you change this version then you need change The ($TargetName) project options too.
|
452
460
|
*/
|
453
461
|
#define C_INTERFACE_VER_MAJOR "2"//##1 Build marker! Don't remove
|
454
|
-
#define C_INTERFACE_VER_MINOR "
|
462
|
+
#define C_INTERFACE_VER_MINOR "3"//##2 Build marker! Don't remove
|
455
463
|
#define C_INTERFACE_VER_RELEASE "0"//##3 Build marker! Don't remove
|
456
464
|
|
457
465
|
/* dnamic load library name.
|
@@ -515,7 +523,7 @@ struct handshale_t
|
|
515
523
|
*/
|
516
524
|
|
517
525
|
#define CPP_INTERFACE_VER_MAJOR "2"//##4 Build marker! Don't remove
|
518
|
-
#define CPP_INTERFACE_VER_MINOR "
|
526
|
+
#define CPP_INTERFACE_VER_MINOR "3"//##5 Build marker! Don't remove
|
519
527
|
#define CPP_INTERFACE_VER_RELEASE "0"//##6 Build marker! Don't remove
|
520
528
|
|
521
529
|
/* use autolink tdclcpp */
|
@@ -532,7 +540,7 @@ struct handshale_t
|
|
532
540
|
#endif
|
533
541
|
|
534
542
|
#define TRANSACTD_VER_MAJOR 2//##7 Build marker! Don't remove
|
535
|
-
#define TRANSACTD_VER_MINOR
|
543
|
+
#define TRANSACTD_VER_MINOR 3//##8 Build marker! Don't remove
|
536
544
|
#define TRANSACTD_VER_RELEASE 0//##9 Build marker! Don't remove
|
537
545
|
|
538
546
|
#endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
|