transactd 2.4.3 → 2.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/RELEASE_NOTE-JA.md +21 -0
- data/RELEASE_NOTE.md +22 -0
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +1225 -1848
- data/build/swig/tdcl.i +77 -13
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +11 -14
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.h +5 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +5 -10
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +7 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +5 -5
- data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -1
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -1
- data/source/bzs/db/protocol/tdap/mysql/request.h +7 -2
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +2 -3
- data/source/bzs/db/protocol/tdap/tdapcapi.h +4 -4
- data/source/bzs/netsvc/client/tcpClient.h +24 -10
- data/source/bzs/test/tdclphp/transactd_Test.php +34 -0
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +0 -6
- data/source/bzs/test/tdclrb/transactd_spec.rb +34 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +4 -1
- data/source/global/tdclatl/Database.cpp +29 -7
- data/source/global/tdclatl/Database.h +6 -0
- data/source/global/tdclatl/DbDef.cpp +49 -45
- data/source/global/tdclatl/DbDef.h +1 -0
- data/source/global/tdclatl/FieldDef.cpp +14 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -0
- data/source/global/tdclatl/FieldDefs.h +4 -0
- data/source/global/tdclatl/GroupQuery.cpp +15 -0
- data/source/global/tdclatl/GroupQuery.h +4 -0
- data/source/global/tdclatl/KeyDef.cpp +1 -1
- data/source/global/tdclatl/KeyDef.h +1 -1
- data/source/global/tdclatl/PooledDbManager.cpp +15 -0
- data/source/global/tdclatl/PooledDbManager.h +4 -0
- data/source/global/tdclatl/PreparedQuery.cpp +15 -0
- data/source/global/tdclatl/PreparedQuery.h +4 -0
- data/source/global/tdclatl/QueryBase.cpp +15 -0
- data/source/global/tdclatl/QueryBase.h +4 -0
- data/source/global/tdclatl/Record.cpp +30 -0
- data/source/global/tdclatl/Record.h +8 -0
- data/source/global/tdclatl/Recordset.cpp +18 -3
- data/source/global/tdclatl/Recordset.h +5 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +15 -1
- data/source/global/tdclatl/RecordsetQuery.h +5 -1
- data/source/global/tdclatl/Table.cpp +29 -3
- data/source/global/tdclatl/Table.h +5 -0
- data/source/global/tdclatl/TableDef.cpp +15 -0
- data/source/global/tdclatl/TableDef.h +4 -0
- data/source/global/tdclatl/activeTable.cpp +15 -0
- data/source/global/tdclatl/activeTable.h +4 -0
- data/source/global/tdclatl/tdclatl.idl +16 -10
- metadata +2 -2
data/build/swig/tdcl.i
CHANGED
@@ -359,6 +359,7 @@ using namespace bzs::db::protocol::tdap::client;
|
|
359
359
|
%ignore bzs::db::protocol::tdap::client::dbdef::pushBackup;
|
360
360
|
%ignore bzs::db::protocol::tdap::client::dbdef::relateData;
|
361
361
|
%ignore bzs::db::protocol::tdap::client::dbdef::setStat;
|
362
|
+
%ignore bzs::db::protocol::tdap::client::dbdef::tdapErr;
|
362
363
|
|
363
364
|
// * bzs/db/protocol/tdap/client/field.h *
|
364
365
|
%ignore bzs::db::protocol::tdap::client::compBlob;
|
@@ -585,6 +586,8 @@ using namespace bzs::db::protocol::tdap::client;
|
|
585
586
|
%ignore bzs::db::protocol::tdap::client::nsdatabase::getTrnsctdEntryPoint;
|
586
587
|
%ignore bzs::db::protocol::tdap::client::nsdatabase::getBtrvEntryPoint;
|
587
588
|
%ignore bzs::db::protocol::tdap::client::nsdatabase::setBtrvEntryPoint;
|
589
|
+
%ignore bzs::db::protocol::tdap::client::nsdatabase::tdapErr;
|
590
|
+
|
588
591
|
|
589
592
|
// * bzs/db/protocol/tdap/client/nsTable.h *
|
590
593
|
%ignore bzs::db::protocol::tdap::client::nstable::buflen;
|
@@ -595,7 +598,9 @@ using namespace bzs::db::protocol::tdap::client;
|
|
595
598
|
%ignore bzs::db::protocol::tdap::client::nstable::tdap;
|
596
599
|
%ignore bzs::db::protocol::tdap::client::nstable::test;
|
597
600
|
%ignore bzs::db::protocol::tdap::client::nstable::throwError;
|
598
|
-
%
|
601
|
+
%ignore bzs::db::protocol::tdap::client::nstable::tdapErr(HWND hWnd, _TCHAR* retbuf=NULL);
|
602
|
+
%ignore bzs::db::protocol::tdap::client::nstable::tdapErr(HWND hWnd, short_td status, const _TCHAR* tableName = NULL, _TCHAR* retbuf = NULL);
|
603
|
+
|
599
604
|
|
600
605
|
// * bzs/db/protocol/tdap/client/pooledDatabaseManager.h *
|
601
606
|
%ignore bzs::db::protocol::tdap::client::xaTransaction;
|
@@ -751,21 +756,21 @@ using namespace bzs::db::protocol::tdap::client;
|
|
751
756
|
%ignore bzs::db::protocol::tdap::client::filterdIterator::operator==;
|
752
757
|
%ignore bzs::db::protocol::tdap::client::filterdIterator::operator!=;
|
753
758
|
%ignore bzs::db::protocol::tdap::client::filterdIterator::operator*;
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
+
//%ignore bzs::db::protocol::tdap::client::filterdIterator::operator->;
|
760
|
+
//%ignore bzs::db::protocol::tdap::client::find;
|
761
|
+
//%ignore bzs::db::protocol::tdap::client::findRv;
|
762
|
+
//%ignore bzs::db::protocol::tdap::client::for_each;
|
763
|
+
//%ignore bzs::db::protocol::tdap::client::getFindIterator;
|
759
764
|
%ignore bzs::db::protocol::tdap::client::getTable;
|
760
765
|
%ignore bzs::db::protocol::tdap::client::insertField;
|
761
766
|
%ignore bzs::db::protocol::tdap::client::insertKey;
|
762
767
|
%ignore bzs::db::protocol::tdap::client::insertRecord;
|
763
768
|
%ignore bzs::db::protocol::tdap::client::insertTable;
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
+
//%ignore bzs::db::protocol::tdap::client::deleteTable
|
770
|
+
//%ignore bzs::db::protocol::tdap::client::renumberTable
|
771
|
+
//%ignore bzs::db::protocol::tdap::client::deleteField
|
772
|
+
//%ignore bzs::db::protocol::tdap::client::deleteKey
|
773
|
+
//%ignore bzs::db::protocol::tdap::client::validateTableDef
|
769
774
|
%ignore bzs::db::protocol::tdap::client::isSameUri;
|
770
775
|
%ignore bzs::db::protocol::tdap::client::lexical_cast;
|
771
776
|
%ignore bzs::db::protocol::tdap::client::openDatabase;
|
@@ -1043,19 +1048,78 @@ using namespace bzs::db::protocol::tdap::client;
|
|
1043
1048
|
#undef pragma_pop
|
1044
1049
|
#define pragma_pop
|
1045
1050
|
%include bzs/db/protocol/tdap/tdapcapi.h
|
1051
|
+
|
1052
|
+
// -- typemap for tabledef::toChar
|
1053
|
+
%typemap(in, numinputs=0) (char* buf, const char* s, int size)
|
1054
|
+
{
|
1055
|
+
int n = 0;
|
1056
|
+
if (s) n = strlen(s)*2;
|
1057
|
+
$3 = n;
|
1058
|
+
if (n) $1 = new char[n];
|
1059
|
+
}
|
1060
|
+
%typemap(freearg) (char* buf, const char* s, int size)
|
1061
|
+
{
|
1062
|
+
delete [] $1;
|
1063
|
+
}
|
1046
1064
|
%include bzs/db/protocol/tdap/tdapSchema.h
|
1065
|
+
%clear char* buf, const char* s, int size;
|
1066
|
+
// --
|
1067
|
+
|
1068
|
+
// -- typemap for nstable::getFilename, getDirUri, statMsg
|
1069
|
+
%typemap(in, numinputs=0) (_TCHAR* retbuf)
|
1070
|
+
{
|
1071
|
+
_TCHAR tmpbuf[1024];
|
1072
|
+
$1=tmpbuf;
|
1073
|
+
}
|
1047
1074
|
%include bzs/db/protocol/tdap/client/nsTable.h
|
1075
|
+
%clear char * retbuf;
|
1076
|
+
// --
|
1077
|
+
|
1078
|
+
|
1079
|
+
|
1080
|
+
// -- typemap for dbdef::statMsg
|
1081
|
+
%typemap(in, numinputs=0) (_TCHAR* retbuf)
|
1082
|
+
{
|
1083
|
+
_TCHAR tmpbuf[1024];
|
1084
|
+
$1=tmpbuf;
|
1085
|
+
}
|
1048
1086
|
%include bzs/db/protocol/tdap/client/dbDef.h
|
1087
|
+
%clear char * retbuf;
|
1088
|
+
// --
|
1089
|
+
|
1090
|
+
|
1049
1091
|
%include bzs/db/protocol/tdap/client/table.h
|
1092
|
+
|
1093
|
+
// -- typemap for nsDatabase::readDatabaseDirectory
|
1094
|
+
%typemap(in, numinputs=0) (_TCHAR* retbuf, uchar_td len)
|
1095
|
+
{
|
1096
|
+
char tmpbuf[255];
|
1097
|
+
$1=tmpbuf;
|
1098
|
+
$2=255;
|
1099
|
+
}
|
1100
|
+
// nsDatabase::statMsg
|
1101
|
+
%typemap(in, numinputs=0) (_TCHAR* retbuf)
|
1102
|
+
{
|
1103
|
+
_TCHAR tmpbuf[1024];
|
1104
|
+
$1=tmpbuf;
|
1105
|
+
}
|
1106
|
+
|
1050
1107
|
%include bzs/db/protocol/tdap/client/nsDatabase.h
|
1108
|
+
%clear _TCHAR* retBuf, uchar_td len;
|
1109
|
+
%clear _TCHAR* retbuf;
|
1110
|
+
// --
|
1111
|
+
|
1112
|
+
|
1051
1113
|
%include bzs/db/protocol/tdap/client/database.h
|
1052
1114
|
%include bzs/rtl/benchmark.h
|
1053
1115
|
%include bzs/db/protocol/tdap/mysql/characterset.h
|
1054
|
-
|
1116
|
+
|
1117
|
+
// -- typemap for btrTimeStamp::toString/btrdtoa/btrttoa/btrstoa
|
1055
1118
|
%typemap(in,numinputs=0) (char * retbuf) (char tmpbuf[255]) { $1=tmpbuf; }
|
1056
1119
|
%include bzs/db/protocol/tdap/btrDate.h
|
1057
1120
|
%clear char * retbuf;
|
1058
|
-
//
|
1121
|
+
// --
|
1122
|
+
|
1059
1123
|
%include bzs/db/protocol/tdap/client/field.h
|
1060
1124
|
%include bzs/db/protocol/tdap/client/fields.h
|
1061
1125
|
%include bzs/db/protocol/tdap/client/memRecord.h
|
data/build/tdclc/tdclc.rc
CHANGED
@@ -29,8 +29,8 @@
|
|
29
29
|
//
|
30
30
|
|
31
31
|
VS_VERSION_INFO VERSIONINFO
|
32
|
-
FILEVERSION 2,4,
|
33
|
-
PRODUCTVERSION 2,4,
|
32
|
+
FILEVERSION 2,4,4,97
|
33
|
+
PRODUCTVERSION 2,4,4,97
|
34
34
|
FILEFLAGSMASK 0x3fL
|
35
35
|
#ifdef _DEBUG
|
36
36
|
FILEFLAGS 0x1L
|
@@ -47,9 +47,9 @@ BEGIN
|
|
47
47
|
BEGIN
|
48
48
|
VALUE "CompanyName", "BizStation Corp."
|
49
49
|
VALUE "FileDescription", "Transactd C client"
|
50
|
-
VALUE "FileVersion", "2.4.
|
50
|
+
VALUE "FileVersion", "2.4.4.97"
|
51
51
|
VALUE "LegalCopyright", "Copyright(C) 2014 BizStation Corp"
|
52
|
-
VALUE "ProductVersion", "2.4.
|
52
|
+
VALUE "ProductVersion", "2.4.4.97"
|
53
53
|
VALUE "ProductName", "Transactd Client (GPL V2)"
|
54
54
|
END
|
55
55
|
END
|
data/build/tdclcpp/tdclcpp.rc
CHANGED
@@ -29,8 +29,8 @@
|
|
29
29
|
//
|
30
30
|
|
31
31
|
VS_VERSION_INFO VERSIONINFO
|
32
|
-
FILEVERSION 2,4,
|
33
|
-
PRODUCTVERSION 2,4,
|
32
|
+
FILEVERSION 2,4,4,97
|
33
|
+
PRODUCTVERSION 2,4,4,97
|
34
34
|
FILEFLAGSMASK 0x3fL
|
35
35
|
#ifdef _DEBUG
|
36
36
|
FILEFLAGS 0x1L
|
@@ -47,9 +47,9 @@ BEGIN
|
|
47
47
|
BEGIN
|
48
48
|
VALUE "CompanyName", "BizStation Corp."
|
49
49
|
VALUE "FileDescription", "Transactd C++ client"
|
50
|
-
VALUE "FileVersion", "2.4.
|
50
|
+
VALUE "FileVersion", "2.4.4.97"
|
51
51
|
VALUE "LegalCopyright", "Copyright(C) 2014 BizStation Corp"
|
52
|
-
VALUE "ProductVersion", "2.4.
|
52
|
+
VALUE "ProductVersion", "2.4.4.97"
|
53
53
|
VALUE "ProductName", "Transactd Client (GPL V2)"
|
54
54
|
END
|
55
55
|
END
|
data/build/tdclrb/tdclrb.rc
CHANGED
@@ -29,8 +29,8 @@
|
|
29
29
|
//
|
30
30
|
|
31
31
|
VS_VERSION_INFO VERSIONINFO
|
32
|
-
FILEVERSION 2,4,
|
33
|
-
PRODUCTVERSION 2,4,
|
32
|
+
FILEVERSION 2,4,4,97
|
33
|
+
PRODUCTVERSION 2,4,4,97
|
34
34
|
FILEFLAGSMASK 0x3fL
|
35
35
|
#ifdef _DEBUG
|
36
36
|
FILEFLAGS 0x1L
|
@@ -47,9 +47,9 @@ BEGIN
|
|
47
47
|
BEGIN
|
48
48
|
VALUE "CompanyName", "BizStation Corp."
|
49
49
|
VALUE "FileDescription", "Transactd Ruby client"
|
50
|
-
VALUE "FileVersion", "2.4.
|
50
|
+
VALUE "FileVersion", "2.4.4.97"
|
51
51
|
VALUE "LegalCopyright", "Copyright(C) 2014 BizStation Corp"
|
52
|
-
VALUE "ProductVersion", "2.4.
|
52
|
+
VALUE "ProductVersion", "2.4.4.97"
|
53
53
|
VALUE "ProductName", "Transactd Client (GPL V2)"
|
54
54
|
END
|
55
55
|
END
|
@@ -71,12 +71,6 @@ void busyWait(busyWaitArguments* args)
|
|
71
71
|
}
|
72
72
|
#endif // TRANSACTD_RB_CALL_WITHOUT_GVL
|
73
73
|
|
74
|
-
short __STDCALL dllUnloadCallbackFunc()
|
75
|
-
{
|
76
|
-
cpool.reset(0);
|
77
|
-
cpool.m_regitfunc = NULL;
|
78
|
-
return 0;
|
79
|
-
}
|
80
74
|
|
81
75
|
void releaseConnection(stdDbmCconnectionPool* pool)
|
82
76
|
{
|
@@ -87,19 +81,22 @@ template <class Database_Ptr>
|
|
87
81
|
connectionPool<Database_Ptr>::connectionPool(int maxConnections)
|
88
82
|
: m_maxConnections(maxConnections)
|
89
83
|
{
|
90
|
-
#ifdef
|
91
|
-
|
92
|
-
if (m_regitfunc)
|
93
|
-
m_regitfunc(dllUnloadCallbackFunc);
|
84
|
+
#ifdef _WIN32
|
85
|
+
m_shutdownFunc = nsdatabase::getWinTPoolShutdownFunc();
|
94
86
|
#else
|
95
|
-
|
87
|
+
m_shutdownFunc = NULL;
|
96
88
|
#endif
|
97
89
|
}
|
98
90
|
|
99
91
|
template <class Database_Ptr> connectionPool<Database_Ptr>::~connectionPool()
|
100
92
|
{
|
101
|
-
if (
|
102
|
-
|
93
|
+
if (m_shutdownFunc)
|
94
|
+
{
|
95
|
+
m_shutdownFunc();
|
96
|
+
#ifndef SWIGRUBY
|
97
|
+
reset(0);
|
98
|
+
#endif
|
99
|
+
}
|
103
100
|
}
|
104
101
|
|
105
102
|
template <class Database_Ptr>
|
@@ -231,7 +228,7 @@ bool connectionPool<Database_Ptr>::reset(int waitSec)
|
|
231
228
|
lck.lock();
|
232
229
|
#endif
|
233
230
|
bool flag = true;
|
234
|
-
for (int j = 0; j < waitSec *
|
231
|
+
for (int j = 0; j < waitSec * 10; j++)
|
235
232
|
{
|
236
233
|
flag = false;
|
237
234
|
for (size_t i = 0; i < m_dbs.size(); i++)
|
@@ -60,12 +60,7 @@ template <class Database_Ptr> class connectionPool
|
|
60
60
|
mutable boost::condition m_busy;
|
61
61
|
int m_maxConnections;
|
62
62
|
Database_Ptr addOne(const connectParams& param);
|
63
|
-
|
64
|
-
public:
|
65
|
-
#endif
|
66
|
-
DLLUNLOADCALLBACK_PTR m_regitfunc;
|
67
|
-
friend short __STDCALL dllUnloadCallbackFunc();
|
68
|
-
|
63
|
+
WIN_TPOOL_SHUTDOWN_PTR m_shutdownFunc;
|
69
64
|
public:
|
70
65
|
connectionPool(int maxConnections = 0);
|
71
66
|
~connectionPool();
|
@@ -126,6 +126,11 @@ public:
|
|
126
126
|
{
|
127
127
|
return nstable::tdapErr(hWnd, retbuf);
|
128
128
|
}
|
129
|
+
inline _TCHAR* statMsg(_TCHAR* retbuf)
|
130
|
+
{
|
131
|
+
nstable::tdapErr(0, retbuf);
|
132
|
+
return retbuf;
|
133
|
+
}
|
129
134
|
|
130
135
|
void reopen(char_td mode = TD_OPEN_READONLY);
|
131
136
|
using nstable::setStat;
|
@@ -41,7 +41,7 @@ using namespace bzs::netsvc::client;
|
|
41
41
|
#endif
|
42
42
|
|
43
43
|
void writeErrorLog(int err, const char* msg);
|
44
|
-
|
44
|
+
bool win_thread_pool_shutdown = false;
|
45
45
|
|
46
46
|
#ifdef USETLS
|
47
47
|
tls_key g_tlsiID1;
|
@@ -105,9 +105,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
|
|
105
105
|
{
|
106
106
|
try
|
107
107
|
{
|
108
|
-
|
109
|
-
dllUnloadCallbackFunc();
|
110
|
-
delete m_cons;
|
108
|
+
delete m_cons;
|
111
109
|
}
|
112
110
|
catch(...){}
|
113
111
|
m_cons = NULL;
|
@@ -154,8 +152,6 @@ void onUnloadLibrary(void)
|
|
154
152
|
{
|
155
153
|
if (m_cons)
|
156
154
|
{
|
157
|
-
if (dllUnloadCallbackFunc)
|
158
|
-
dllUnloadCallbackFunc();
|
159
155
|
delete m_cons;
|
160
156
|
m_cons = NULL;
|
161
157
|
#ifdef USETLS
|
@@ -286,7 +282,6 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
286
282
|
client_t->req().paramMask = P_MASK_POSBLK | P_MASK_DATA |
|
287
283
|
P_MASK_DATALEN | P_MASK_EX_SENDLEN;
|
288
284
|
break;
|
289
|
-
case TD_GETDIRECTORY:
|
290
285
|
case TD_SETDIRECTORY:
|
291
286
|
break;
|
292
287
|
case TD_VERSION:
|
@@ -353,6 +348,7 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
353
348
|
P_MASK_DATALEN | P_MASK_KEYBUF | P_MASK_KEYNUM;
|
354
349
|
break;
|
355
350
|
case TD_RESET_CLIENT:
|
351
|
+
case TD_GETDIRECTORY:
|
356
352
|
client_t->req().paramMask = P_MASK_KEYONLY;
|
357
353
|
break;
|
358
354
|
case TD_BUILD_INDEX:
|
@@ -507,8 +503,7 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
507
503
|
return BTRCALLID(op, pbk, data, datalen, keybuf, keylen, keyNum, cid);
|
508
504
|
}
|
509
505
|
|
510
|
-
extern "C" PACKAGE_OSX
|
506
|
+
extern "C" PACKAGE_OSX void __STDCALL BeginWinThreadPoolShutdown()
|
511
507
|
{
|
512
|
-
|
513
|
-
return 0;
|
508
|
+
win_thread_pool_shutdown = true;
|
514
509
|
}
|
@@ -760,13 +760,13 @@ bool nsdatabase::isUseTransactd() const
|
|
760
760
|
return (m_btrcallid == getTrnsctdEntryPoint());
|
761
761
|
}
|
762
762
|
|
763
|
-
void nsdatabase::readDatabaseDirectory(_TCHAR*
|
763
|
+
void nsdatabase::readDatabaseDirectory(_TCHAR* retbuf, uchar_td buflen)
|
764
764
|
{
|
765
765
|
// keynum is drive name A=1 B=2 C=3 0=default
|
766
766
|
char tmp[128];
|
767
767
|
m_stat = m_btrcallid(TD_GETDIRECTORY, NULL, NULL, NULL, tmp, 128, 0,
|
768
768
|
m_nsimpl->cidPtr);
|
769
|
-
|
769
|
+
toTCharCopy(retbuf, tmp, buflen);
|
770
770
|
}
|
771
771
|
|
772
772
|
bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
@@ -982,14 +982,15 @@ void nsdatabase::setCheckTablePtr(bool v)
|
|
982
982
|
g_checkTablePtr = v;
|
983
983
|
}
|
984
984
|
|
985
|
-
|
985
|
+
WIN_TPOOL_SHUTDOWN_PTR nsdatabase::getWinTPoolShutdownFunc()
|
986
986
|
{
|
987
987
|
if (hTrsdDLL == NULL)
|
988
988
|
hTrsdDLL = LoadLibraryA(LIB_PREFIX TDCLC_LIBNAME);
|
989
989
|
if (hTrsdDLL)
|
990
|
-
return (
|
991
|
-
"
|
990
|
+
return (WIN_TPOOL_SHUTDOWN_PTR)GetProcAddress((HINSTANCE)hTrsdDLL,
|
991
|
+
"BeginWinThreadPoolShutdown");
|
992
992
|
return NULL;
|
993
|
+
|
993
994
|
}
|
994
995
|
|
995
996
|
} // namespace client
|
@@ -114,13 +114,18 @@ public:
|
|
114
114
|
ushort_td trxIsolationServer() const ;
|
115
115
|
ushort_td trxLockWaitTimeoutServer() const ;
|
116
116
|
short_td tdapErr(HWND hWnd, _TCHAR* retbuf = NULL);
|
117
|
+
inline _TCHAR* statMsg(_TCHAR* retbuf)
|
118
|
+
{
|
119
|
+
tdapErr(0, retbuf);
|
120
|
+
return retbuf;
|
121
|
+
}
|
117
122
|
bool useLongFilename();
|
118
123
|
void setUseLongFilename(bool value);
|
119
124
|
void getBtrVersion(btrVersions* versions, uchar_td* posblk);
|
120
125
|
bool setUseTransactd();
|
121
126
|
bool isTransactdUri(const _TCHAR* uri);
|
122
127
|
bool isUseTransactd() const;
|
123
|
-
void readDatabaseDirectory(_TCHAR*
|
128
|
+
void readDatabaseDirectory(_TCHAR* retbuf, uchar_td len);
|
124
129
|
bool connect(const _TCHAR* uri, bool newConnection = false);
|
125
130
|
bool disconnect(const _TCHAR* uri = _T(""));
|
126
131
|
bool disconnectForReconnectTest(); //for connection brokn emulate
|
@@ -134,7 +139,7 @@ public:
|
|
134
139
|
/** @cond INTERNAL */
|
135
140
|
void setTestPtrIgnore(bool v);
|
136
141
|
bool isTestPtrIgnore() const;
|
137
|
-
static
|
142
|
+
static WIN_TPOOL_SHUTDOWN_PTR getWinTPoolShutdownFunc();
|
138
143
|
static bool testTablePtr(nstable* ptr);
|
139
144
|
static void setCheckTablePtr(bool v);
|
140
145
|
/** @endcond */
|
@@ -957,12 +957,12 @@ _TCHAR* nstable::getDirURI(const _TCHAR* path, _TCHAR* buf)
|
|
957
957
|
/* Get file name from full path name.
|
958
958
|
*
|
959
959
|
*/
|
960
|
-
_TCHAR* nstable::getFileName(const _TCHAR* path, _TCHAR*
|
960
|
+
_TCHAR* nstable::getFileName(const _TCHAR* path, _TCHAR* retbuf)
|
961
961
|
{
|
962
962
|
|
963
963
|
_TUCHAR* p = (_TUCHAR*)_tcsmrchr((const _TUCHAR*)path, PSEPARATOR_C);
|
964
964
|
_TUCHAR* p2 = (_TUCHAR*)_tcsmrchr((const _TUCHAR*)path, '=');
|
965
|
-
|
965
|
+
retbuf[0] = 0x00;
|
966
966
|
if (p2 > p)
|
967
967
|
p = p2;
|
968
968
|
|
@@ -970,12 +970,12 @@ _TCHAR* nstable::getFileName(const _TCHAR* path, _TCHAR* filename)
|
|
970
970
|
{
|
971
971
|
p++;
|
972
972
|
if (*p)
|
973
|
-
_tcscpy(
|
973
|
+
_tcscpy(retbuf, (_TCHAR*)p);
|
974
974
|
}
|
975
975
|
else
|
976
|
-
_tcscpy(
|
976
|
+
_tcscpy(retbuf, path);
|
977
977
|
|
978
|
-
return
|
978
|
+
return retbuf;
|
979
979
|
}
|
980
980
|
|
981
981
|
bool nstable::existsFile(const _TCHAR* filename)
|
@@ -186,6 +186,11 @@ public:
|
|
186
186
|
{
|
187
187
|
return doBtrvErr(hWnd, retbuf);
|
188
188
|
}
|
189
|
+
inline _TCHAR* statMsg(_TCHAR* retbuf)
|
190
|
+
{
|
191
|
+
doBtrvErr(0, retbuf);
|
192
|
+
return retbuf;
|
193
|
+
}
|
189
194
|
|
190
195
|
void beginBulkInsert(int maxBuflen);
|
191
196
|
void abortBulkInsert() { doAbortBulkInsert(); }
|
@@ -220,7 +225,7 @@ public:
|
|
220
225
|
void unlock(bookmark_td& bm);
|
221
226
|
void unlock();
|
222
227
|
char_td mode() const;
|
223
|
-
static _TCHAR* getFileName(const _TCHAR* uri, _TCHAR*
|
228
|
+
static _TCHAR* getFileName(const _TCHAR* uri, _TCHAR* retbuf);
|
224
229
|
static short_td tdapErr(HWND hWnd, short_td status,
|
225
230
|
const _TCHAR* tableName = NULL,
|
226
231
|
_TCHAR* retbuf = NULL);
|
@@ -133,9 +133,14 @@ public:
|
|
133
133
|
if (P_MASK_DATALEN & paramMask)
|
134
134
|
memcpy(datalenPtr, (const char*)&resultLen, sizeof(uint_td));
|
135
135
|
|
136
|
-
if (
|
136
|
+
if (P_MASK_KEYBUF & paramMask)
|
137
137
|
{
|
138
|
-
|
138
|
+
if (tb)
|
139
|
+
keylen = tb->keyPackCopy((uchar*)p + sizeof(keylen_td));
|
140
|
+
else if (keylen && keylen < MAX_KEYLEN)
|
141
|
+
memcpy((uchar*)p + sizeof(keylen_td), keybuf, keylen);
|
142
|
+
else
|
143
|
+
keylen = 0;
|
139
144
|
memcpy(p, (const char*)&keylen, sizeof(keylen_td));
|
140
145
|
p += sizeof(keylen_td);
|
141
146
|
p += keylen;
|
@@ -264,9 +264,8 @@ const char* tabledef::toChar(char* buf, const char* s, int size)
|
|
264
264
|
#ifdef LINUX
|
265
265
|
if (schemaCodePage != CP_UTF8)
|
266
266
|
{
|
267
|
-
|
268
|
-
|
269
|
-
return p;
|
267
|
+
u8tombc(s, strlen(s), buf, size);
|
268
|
+
return buf;
|
270
269
|
}
|
271
270
|
#endif
|
272
271
|
strncpy_s(buf, size, s, size - 1);
|
@@ -71,7 +71,7 @@ typedef short_td(__STDCALL* BTRCALLID_PTR)(ushort_td, void*, void*, uint_td*,
|
|
71
71
|
void*, keylen_td, char_td,
|
72
72
|
uchar_td*);
|
73
73
|
|
74
|
-
typedef
|
74
|
+
typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
75
75
|
|
76
76
|
/** buffer size
|
77
77
|
*/
|
@@ -503,7 +503,7 @@ struct handshale_t
|
|
503
503
|
*/
|
504
504
|
#define C_INTERFACE_VER_MAJOR "2"//##1 Build marker! Don't remove
|
505
505
|
#define C_INTERFACE_VER_MINOR "4"//##2 Build marker! Don't remove
|
506
|
-
#define C_INTERFACE_VER_RELEASE "
|
506
|
+
#define C_INTERFACE_VER_RELEASE "4"//##3 Build marker! Don't remove
|
507
507
|
|
508
508
|
/* dnamic load library name.
|
509
509
|
The default extention of Mac is ".boudle", Therefore ".so" is popular. */
|
@@ -567,7 +567,7 @@ struct handshale_t
|
|
567
567
|
|
568
568
|
#define CPP_INTERFACE_VER_MAJOR "2"//##4 Build marker! Don't remove
|
569
569
|
#define CPP_INTERFACE_VER_MINOR "4"//##5 Build marker! Don't remove
|
570
|
-
#define CPP_INTERFACE_VER_RELEASE "
|
570
|
+
#define CPP_INTERFACE_VER_RELEASE "4"//##6 Build marker! Don't remove
|
571
571
|
|
572
572
|
/* use autolink tdclcpp */
|
573
573
|
#if (__BCPLUSPLUS__ || _MSC_VER)
|
@@ -584,6 +584,6 @@ struct handshale_t
|
|
584
584
|
|
585
585
|
#define TRANSACTD_VER_MAJOR 2//##7 Build marker! Don't remove
|
586
586
|
#define TRANSACTD_VER_MINOR 4//##8 Build marker! Don't remove
|
587
|
-
#define TRANSACTD_VER_RELEASE
|
587
|
+
#define TRANSACTD_VER_RELEASE 4//##9 Build marker! Don't remove
|
588
588
|
|
589
589
|
#endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
|
@@ -58,6 +58,10 @@ using namespace boost::system;
|
|
58
58
|
#define ERROR_TD_NET_TOO_BIGDATA 3802
|
59
59
|
#define MAX_DATA_SIZE 10485760 // 10MB
|
60
60
|
|
61
|
+
#ifdef _WIN32
|
62
|
+
extern bool win_thread_pool_shutdown;
|
63
|
+
#endif
|
64
|
+
|
61
65
|
namespace bzs
|
62
66
|
{
|
63
67
|
namespace netsvc
|
@@ -149,7 +153,7 @@ class connectionBase : public connection
|
|
149
153
|
protected:
|
150
154
|
friend class connections;
|
151
155
|
|
152
|
-
asio::io_service m_ios;
|
156
|
+
asio::io_service* m_ios;
|
153
157
|
asio::ip::tcp::endpoint m_ep;
|
154
158
|
idirectReadHandler* m_reader;
|
155
159
|
size_t m_readLen;
|
@@ -175,10 +179,20 @@ protected:
|
|
175
179
|
|
176
180
|
public:
|
177
181
|
connectionBase(asio::ip::tcp::endpoint& ep)
|
178
|
-
:
|
182
|
+
: m_ios(new asio::io_service),
|
183
|
+
m_ep(ep), m_reader(NULL), m_refCount(0),
|
179
184
|
m_charsetServer(-1), m_connected(false), m_isHandShakable(true)
|
180
185
|
{
|
181
186
|
}
|
187
|
+
virtual ~connectionBase()
|
188
|
+
{
|
189
|
+
#ifdef _WIN32
|
190
|
+
if (!win_thread_pool_shutdown)
|
191
|
+
delete m_ios;
|
192
|
+
#else
|
193
|
+
delete m_ios;
|
194
|
+
#endif
|
195
|
+
}
|
182
196
|
void setDirectReadHandler(idirectReadHandler* p){ m_reader = p; }
|
183
197
|
bool isHandShakable() const {return m_isHandShakable;};
|
184
198
|
const boost::system::error_code& error() const { return m_e; };
|
@@ -358,9 +372,9 @@ protected:
|
|
358
372
|
{
|
359
373
|
try
|
360
374
|
{
|
361
|
-
m_ios
|
375
|
+
m_ios->stop();
|
362
376
|
m_socket.close();
|
363
|
-
m_ios
|
377
|
+
m_ios->reset();
|
364
378
|
}
|
365
379
|
catch (...)
|
366
380
|
{
|
@@ -390,14 +404,14 @@ protected:
|
|
390
404
|
void reconnect(asio::ip::tcp::endpoint& ep)
|
391
405
|
{
|
392
406
|
cleanup();
|
393
|
-
m_ios
|
407
|
+
m_ios->reset();
|
394
408
|
m_ep = ep;
|
395
409
|
connect();
|
396
410
|
}
|
397
411
|
|
398
412
|
public:
|
399
413
|
connectionImple(asio::ip::tcp::endpoint& ep)
|
400
|
-
: connectionBase(ep)/*, m_datalen(0)*/, m_socket(m_ios)
|
414
|
+
: connectionBase(ep)/*, m_datalen(0)*/, m_socket(*m_ios)
|
401
415
|
{
|
402
416
|
}
|
403
417
|
};
|
@@ -512,8 +526,8 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
512
526
|
setTimer(connections::connectTimeout);
|
513
527
|
m_socket.async_connect(m_ep,
|
514
528
|
bind(&tcpConnection::on_connect, this, _error_holder));
|
515
|
-
m_ios
|
516
|
-
m_ios
|
529
|
+
m_ios->run();
|
530
|
+
m_ios->reset();
|
517
531
|
}
|
518
532
|
|
519
533
|
void connect()
|
@@ -522,7 +536,7 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
522
536
|
m_socket.connect(m_ep);
|
523
537
|
m_e = error_code(getErrorCode(), SYSTEM_CATEGORY);
|
524
538
|
on_connect(m_e);
|
525
|
-
m_ios
|
539
|
+
m_ios->reset();
|
526
540
|
}
|
527
541
|
#endif
|
528
542
|
|
@@ -595,7 +609,7 @@ public:
|
|
595
609
|
tcpConnection(asio::ip::tcp::endpoint& ep)
|
596
610
|
: connectionImple<asio::ip::tcp::socket>(ep),s_io(m_socket)
|
597
611
|
#ifdef USE_CONNECT_TIMER
|
598
|
-
, m_timer(m_ios)
|
612
|
+
, m_timer(*m_ios)
|
599
613
|
#endif
|
600
614
|
{
|
601
615
|
m_readbuf.resize(READBUF_SIZE);
|