transactd 2.0.1 → 2.1.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 +16 -16
- data/README-JA +16 -16
- data/bin/common/tdclc_32_2_1.dll +0 -0
- data/bin/common/tdclc_64_2_1.dll +0 -0
- data/build/common/transactd_cl_common.cmake +0 -1
- data/build/common/transactd_common.cmake +28 -38
- data/build/swig/ruby/ruby.swg +36 -30
- data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
- data/build/swig/tdcl.i +217 -62
- data/build/tdclc/CMakeLists.txt +14 -26
- data/build/tdclc/libtdclcm.map +4 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +0 -0
- data/build/tdclcpp/CMakeLists.txt +7 -22
- data/build/tdclcpp/tdclcpp.rc +0 -0
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/CMakeLists.txt +7 -49
- data/build/tdclrb/tdclrb.rc +62 -0
- data/source/bzs/db/blobBuffer.h +5 -0
- data/source/bzs/db/blobStructs.h +2 -0
- data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
- data/source/bzs/db/engine/mysql/database.cpp +391 -169
- data/source/bzs/db/engine/mysql/database.h +178 -40
- data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
- data/source/bzs/db/engine/mysql/dbManager.h +3 -39
- data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
- data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
- data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
- data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
- data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
- data/source/bzs/db/protocol/tdap/client/client.h +52 -25
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
- data/source/bzs/db/protocol/tdap/client/database.h +1 -1
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
- data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
- data/source/bzs/db/protocol/tdap/client/field.h +7 -3
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
- data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
- data/source/bzs/db/protocol/tdap/client/request.h +84 -26
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
- data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
- data/source/bzs/db/protocol/tdap/client/table.h +48 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
- data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
- data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
- data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
- data/source/bzs/db/transactd/appModule.h +1 -1
- data/source/bzs/db/transactd/connManager.cpp +2 -0
- data/source/bzs/db/transactd/transactd.cpp +1 -0
- data/source/bzs/env/compiler.h +10 -0
- data/source/bzs/env/mbcswchrLinux.cpp +42 -6
- data/source/bzs/env/mbcswchrLinux.h +40 -12
- data/source/bzs/example/queryData.cpp +33 -4
- data/source/bzs/netsvc/client/iconnection.h +107 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
- data/source/bzs/netsvc/client/tcpClient.h +96 -87
- data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
- data/source/bzs/rtl/benchmark.cpp +2 -2
- data/source/bzs/rtl/stringBuffers.cpp +3 -3
- data/source/bzs/rtl/stringBuffers.h +2 -2
- data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
- data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
- data/source/bzs/test/tdclphp/bench.php +126 -101
- data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
- data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
- data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
- data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
- data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
- data/source/bzs/test/transactdBench/workerBase.h +46 -0
- data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
- data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
- data/source/global/ormsrcgen/main.cpp +2 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -1
- data/source/global/tdclatl/FieldDefs.cpp +0 -3
- data/source/global/tdclatl/PooledDbManager.cpp +2 -2
- data/source/global/tdclatl/PooledDbManager.h +1 -1
- data/source/global/tdclatl/PreparedQuery.cpp +53 -0
- data/source/global/tdclatl/PreparedQuery.h +61 -0
- data/source/global/tdclatl/QueryBase.cpp +2 -1
- data/source/global/tdclatl/QueryBase.h +1 -1
- data/source/global/tdclatl/Record.cpp +3 -15
- data/source/global/tdclatl/Recordset.cpp +15 -10
- data/source/global/tdclatl/Recordset.h +3 -0
- data/source/global/tdclatl/Table.cpp +42 -7
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/activeTable.cpp +264 -76
- data/source/global/tdclatl/activeTable.h +12 -3
- data/source/global/tdclatl/tdclatl.idl +92 -10
- data/source/linux/charsetConvert.h +7 -7
- data/transactd.gemspec +14 -27
- metadata +18 -27
- data/bin/common/tdclc_32_2_0.dll +0 -0
- data/bin/common/tdclc_64_2_0.dll +0 -0
- data/build/swig/php/generate.cmake.in +0 -56
- data/build/swig/php/generate.cmd.in +0 -47
- data/build/swig/php/php.swg +0 -197
- data/build/swig/php/transactd.no_yield.php +0 -4494
- data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
- data/build/swig/php/transactd.no_yield.php.patch +0 -685
- data/build/swig/php/transactd.yield.php +0 -4461
- data/build/swig/php/transactd.yield.php.git.patch +0 -652
- data/build/swig/php/transactd.yield.php.patch +0 -652
- data/build/swig/ruby/generate.cmake.in +0 -35
- data/build/swig/ruby/generate.cmd.in +0 -19
- data/build/tdclc/BUILDNUMBER.txt +0 -1
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/GEM_RELEASE_VERSION +0 -1
@@ -18,7 +18,7 @@
|
|
18
18
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
19
19
|
02111-1307, USA.
|
20
20
|
=================================================================*/
|
21
|
-
|
21
|
+
#include <my_config.h>
|
22
22
|
#include <bzs/netsvc/server/IAppModule.h>
|
23
23
|
#include <bzs/db/protocol/ICommandExecuter.h>
|
24
24
|
|
@@ -98,6 +98,7 @@ void connManager::getDatabaseList(const module* mod) const
|
|
98
98
|
const connManager::records& connManager::getRecords(unsigned __int64 conid,
|
99
99
|
int dbid) const
|
100
100
|
{
|
101
|
+
//Lock module count
|
101
102
|
boost::mutex::scoped_lock lck(modulesMutex);
|
102
103
|
|
103
104
|
if (conid == 0)
|
@@ -107,6 +108,7 @@ const connManager::records& connManager::getRecords(unsigned __int64 conid,
|
|
107
108
|
const module* mod = getMod(conid);
|
108
109
|
if (mod)
|
109
110
|
{
|
111
|
+
//Lock module execute
|
110
112
|
boost::try_mutex::scoped_try_lock m(mod->mutex(),
|
111
113
|
boost::try_to_lock_t());
|
112
114
|
if (m.owns_lock())
|
@@ -16,6 +16,7 @@
|
|
16
16
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
17
17
|
02111-1307, USA.
|
18
18
|
=================================================================*/
|
19
|
+
#include <my_config.h>
|
19
20
|
#include <bzs/netsvc/server/serverCpt.h>
|
20
21
|
#include <bzs/netsvc/server/serverTpool.h>
|
21
22
|
#include <bzs/rtl/exception.h>
|
data/source/bzs/env/compiler.h
CHANGED
@@ -132,6 +132,16 @@
|
|
132
132
|
#endif
|
133
133
|
#endif
|
134
134
|
|
135
|
+
//memory leak detector
|
136
|
+
#ifdef _MSC_VER
|
137
|
+
#ifdef _DEBUG
|
138
|
+
#define _CRTDBG_MAP_ALLOC
|
139
|
+
#include <stdlib.h>
|
140
|
+
#include <crtdbg.h>
|
141
|
+
#endif // _DEBUG
|
142
|
+
#endif // _MSC_VER
|
143
|
+
|
144
|
+
|
135
145
|
// compiler name
|
136
146
|
#if (_MSC_VER == 1600)
|
137
147
|
#define COMPILER_VERSTR "vc100"
|
@@ -19,17 +19,53 @@
|
|
19
19
|
|
20
20
|
#include "mbcswchrLinux.h"
|
21
21
|
#include <stdio.h>
|
22
|
+
#include <pthread.h>
|
23
|
+
#include <bzs/env/crosscompile.h>
|
24
|
+
#include <assert.h>
|
25
|
+
|
26
|
+
|
27
|
+
#define CVT_COUNT 6
|
22
28
|
|
23
29
|
namespace bzs
|
24
30
|
{
|
25
31
|
namespace env
|
26
32
|
{
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
|
34
|
+
tls_key g_tls1=0;
|
35
|
+
|
36
|
+
void cleanupTls(void* p)
|
37
|
+
{
|
38
|
+
delete [] ((cvt*)p);
|
39
|
+
}
|
40
|
+
|
41
|
+
void initCvtProcess()
|
42
|
+
{
|
43
|
+
int ret = pthread_key_create(&g_tls1, cleanupTls);
|
44
|
+
assert(ret == 0);
|
45
|
+
}
|
46
|
+
|
47
|
+
void deinitCvtProcess()
|
48
|
+
{
|
49
|
+
pthread_key_delete(g_tls1);
|
50
|
+
}
|
51
|
+
|
52
|
+
cvt& getCvt(int index)
|
53
|
+
{
|
54
|
+
cvt* p = (cvt*)pthread_getspecific(g_tls1);
|
55
|
+
if (p == NULL)
|
56
|
+
{
|
57
|
+
p = new cvt[CVT_COUNT];
|
58
|
+
p[0].setCharset("UTF-16LE", MBC_CHARSETNAME);
|
59
|
+
p[1].setCharset(MBC_CHARSETNAME, "UTF-16LE");
|
60
|
+
p[2].setCharset(MBC_CHARSETNAME, UTF8_CHARSETNAME);
|
61
|
+
p[3].setCharset(UTF8_CHARSETNAME, MBC_CHARSETNAME);
|
62
|
+
p[4].setCharset("UTF-16LE", UTF8_CHARSETNAME);
|
63
|
+
p[5].setCharset(UTF8_CHARSETNAME, "UTF-16LE");
|
64
|
+
pthread_setspecific(g_tls1, p);
|
65
|
+
}
|
66
|
+
return p[index];
|
67
|
+
}
|
68
|
+
|
33
69
|
|
34
70
|
} // namespace env
|
35
71
|
} // namespace bzs
|
@@ -32,12 +32,40 @@ namespace bzs
|
|
32
32
|
{
|
33
33
|
namespace env
|
34
34
|
{
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
|
36
|
+
void initCvtProcess();
|
37
|
+
void deinitCvtProcess();
|
38
|
+
cvt& getCvt(int index);
|
39
|
+
|
40
|
+
inline cvt& mbcscvt()
|
41
|
+
{
|
42
|
+
return getCvt(0);
|
43
|
+
}
|
44
|
+
|
45
|
+
inline cvt& wchrcvt()
|
46
|
+
{
|
47
|
+
return getCvt(1);
|
48
|
+
}
|
49
|
+
|
50
|
+
inline cvt& u8mbcvt()
|
51
|
+
{
|
52
|
+
return getCvt(2);
|
53
|
+
}
|
54
|
+
|
55
|
+
inline cvt& mbu8cvt()
|
56
|
+
{
|
57
|
+
return getCvt(3);
|
58
|
+
}
|
59
|
+
|
60
|
+
inline cvt& u8wccvt()
|
61
|
+
{
|
62
|
+
return getCvt(4);
|
63
|
+
}
|
64
|
+
|
65
|
+
inline cvt& wcu8cvt()
|
66
|
+
{
|
67
|
+
return getCvt(5);
|
68
|
+
}
|
41
69
|
|
42
70
|
inline int WideCharToMultiByte(unsigned int codepage, unsigned int dwFlags,
|
43
71
|
const char16_t* lpWideCharStr, int cchWideChar,
|
@@ -46,9 +74,9 @@ inline int WideCharToMultiByte(unsigned int codepage, unsigned int dwFlags,
|
|
46
74
|
int* lpUsedDefaultChar)
|
47
75
|
{
|
48
76
|
if (codepage == CP_UTF8)
|
49
|
-
return wcu8cvt.conv(lpWideCharStr, (size_t)(cchWideChar + cchWideChar),
|
77
|
+
return wcu8cvt().conv(lpWideCharStr, (size_t)(cchWideChar + cchWideChar),
|
50
78
|
lpMultiByteStr, (size_t)cchMultiByte);
|
51
|
-
return wchrcvt.conv(lpWideCharStr, (size_t)(cchWideChar + cchWideChar),
|
79
|
+
return wchrcvt().conv(lpWideCharStr, (size_t)(cchWideChar + cchWideChar),
|
52
80
|
lpMultiByteStr, (size_t)cchMultiByte);
|
53
81
|
}
|
54
82
|
|
@@ -57,20 +85,20 @@ inline int MultiByteToWideChar(unsigned int codepage, unsigned int dwFlags,
|
|
57
85
|
char16_t* lpWideCharStr, int cchWideChar)
|
58
86
|
{
|
59
87
|
if (codepage == CP_UTF8)
|
60
|
-
return u8wccvt.conv(lpMultiByteStr, (size_t)cchMultiByte, lpWideCharStr,
|
88
|
+
return u8wccvt().conv(lpMultiByteStr, (size_t)cchMultiByte, lpWideCharStr,
|
61
89
|
(size_t)(cchWideChar + cchWideChar));
|
62
|
-
return mbcscvt.conv(lpMultiByteStr, (size_t)cchMultiByte, lpWideCharStr,
|
90
|
+
return mbcscvt().conv(lpMultiByteStr, (size_t)cchMultiByte, lpWideCharStr,
|
63
91
|
(size_t)(cchWideChar + cchWideChar));
|
64
92
|
}
|
65
93
|
|
66
94
|
inline int u8tombc(const char* u8, int u8size, char* mbc, int mbcsize)
|
67
95
|
{
|
68
|
-
return u8mbcvt.conv(u8, (size_t)u8size, mbc, (size_t)mbcsize);
|
96
|
+
return u8mbcvt().conv(u8, (size_t)u8size, mbc, (size_t)mbcsize);
|
69
97
|
}
|
70
98
|
|
71
99
|
inline int mbctou8(const char* mbc, int mbcsize, char* u8, int u8size)
|
72
100
|
{
|
73
|
-
return mbu8cvt.conv(mbc, (size_t)mbcsize, u8, (size_t)u8size);
|
101
|
+
return mbu8cvt().conv(mbc, (size_t)mbcsize, u8, (size_t)u8size);
|
74
102
|
}
|
75
103
|
|
76
104
|
} // namespace env
|
@@ -31,12 +31,12 @@ using namespace bzs::db::protocol::tdap;
|
|
31
31
|
|
32
32
|
#define USER_STRING_TYPE ft_myvarchar
|
33
33
|
#define GROUP_STRING_TYPE ft_myvarbinary
|
34
|
-
|
34
|
+
#define BLOB_TYPE ft_myblob
|
35
35
|
#else
|
36
36
|
|
37
37
|
#define USER_STRING_TYPE ft_zstring
|
38
38
|
#define GROUP_STRING_TYPE ft_zstring
|
39
|
-
|
39
|
+
#define BLOB_TYPE ft_blob
|
40
40
|
#endif
|
41
41
|
|
42
42
|
const _TCHAR* name_field_str(_TCHAR* buf)
|
@@ -206,9 +206,18 @@ bool createUserExtTable(dbdef* def)
|
|
206
206
|
fd = def->insertField(tableid, filedIndex);
|
207
207
|
fd->setName(_T("comment"));
|
208
208
|
fd->type = USER_STRING_TYPE;
|
209
|
-
|
210
209
|
fd->setLenByCharnum(60);
|
211
210
|
|
211
|
+
++filedIndex;
|
212
|
+
fd = def->insertField(tableid, filedIndex);
|
213
|
+
fd->setName(_T("blob"));
|
214
|
+
fd->type = BLOB_TYPE;
|
215
|
+
#ifndef USE_PSQL_DATABASE
|
216
|
+
fd->len = 10;
|
217
|
+
#else
|
218
|
+
fd->len = 16000;
|
219
|
+
#endif
|
220
|
+
|
212
221
|
char keyNum = 0;
|
213
222
|
keydef* kd = def->insertKey(tableid, keyNum);
|
214
223
|
keySegment* seg1 = &kd->segments[0];
|
@@ -323,6 +332,8 @@ bool insertData(database_ptr db, int maxId)
|
|
323
332
|
tbe->setFV((short)0, i);
|
324
333
|
_stprintf_s(tmp, 256, _T("%d comment"), i);
|
325
334
|
tbe->setFV(1, tmp);
|
335
|
+
_stprintf_s(tmp, 256, _T("%d blob"), i);
|
336
|
+
tbe->setFV(2, tmp);
|
326
337
|
tbe->insert();
|
327
338
|
if (tbe->stat() != 0)
|
328
339
|
return showTableError(tbe, _T("extention insert"));
|
@@ -335,6 +346,24 @@ bool insertData(database_ptr db, int maxId)
|
|
335
346
|
return true;
|
336
347
|
}
|
337
348
|
|
349
|
+
bool checkVersion(database_ptr db)
|
350
|
+
{
|
351
|
+
dbdef* def = db->dbDef();
|
352
|
+
if (def)
|
353
|
+
{
|
354
|
+
tabledef* td = def->tableDefs(3);
|
355
|
+
if (td)
|
356
|
+
{
|
357
|
+
if (td->fieldCount == 3)
|
358
|
+
{
|
359
|
+
table_ptr tb = openTable(db, _T("extention"));
|
360
|
+
return (tb->recordCount(false) == 20000);
|
361
|
+
}
|
362
|
+
}
|
363
|
+
}
|
364
|
+
return false;
|
365
|
+
}
|
366
|
+
|
338
367
|
int prebuiltData(database_ptr db, const connectParams& param, bool foceCreate,
|
339
368
|
int maxId)
|
340
369
|
{
|
@@ -342,7 +371,7 @@ int prebuiltData(database_ptr db, const connectParams& param, bool foceCreate,
|
|
342
371
|
{
|
343
372
|
if (db->open(param.uri(), TD_OPEN_NORMAL))
|
344
373
|
{
|
345
|
-
if (foceCreate)
|
374
|
+
if (foceCreate || !checkVersion(db))
|
346
375
|
dropDatabase(db);
|
347
376
|
else
|
348
377
|
return 0;
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#ifndef BZS_NETSVC_CLINET_ICONNECTION_H
|
2
|
+
#define BZS_NETSVC_CLINET_ICONNECTION_H
|
3
|
+
/* =================================================================
|
4
|
+
Copyright (C) 2014 BizStation Corp All rights reserved.
|
5
|
+
|
6
|
+
This program is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU General Public License
|
8
|
+
as published by the Free Software Foundation; either version 2
|
9
|
+
of the License, or (at your option) any later version.
|
10
|
+
|
11
|
+
This program is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU General Public License
|
17
|
+
along with this program; if not, write to the Free Software
|
18
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
19
|
+
02111-1307, USA.
|
20
|
+
================================================================= */
|
21
|
+
#ifdef __BCPLUSPLUS__
|
22
|
+
#pragma warn -8012
|
23
|
+
#endif
|
24
|
+
|
25
|
+
#include <boost/asio/ip/tcp.hpp>
|
26
|
+
#include <boost/asio/buffer.hpp>
|
27
|
+
#include <vector>
|
28
|
+
|
29
|
+
#ifdef __BCPLUSPLUS__
|
30
|
+
#pragma warn +8012
|
31
|
+
#endif
|
32
|
+
|
33
|
+
#ifdef _WIN32
|
34
|
+
#define USE_PIPE_CLIENT
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#ifdef USE_PIPE_CLIENT
|
38
|
+
#include <boost/asio/windows/stream_handle.hpp>
|
39
|
+
using boost::asio::windows::stream_handle;
|
40
|
+
typedef stream_handle platform_stream;
|
41
|
+
typedef HANDLE platform_descriptor;
|
42
|
+
#define PIPE_EOF_ERROR_CODE boost::system::windows_error::broken_pipe
|
43
|
+
typedef DWORD thread_id;
|
44
|
+
#define threadid GetCurrentThreadId
|
45
|
+
#else // NOT USE_PIPE_CLIENT
|
46
|
+
typedef pthread_t thread_id;
|
47
|
+
#define threadid pthread_self
|
48
|
+
#endif // NOT USE_PIPE_CLIENT
|
49
|
+
|
50
|
+
namespace bzs
|
51
|
+
{
|
52
|
+
namespace netsvc
|
53
|
+
{
|
54
|
+
namespace client
|
55
|
+
{
|
56
|
+
|
57
|
+
typedef std::vector<boost::asio::const_buffer> buffers;
|
58
|
+
|
59
|
+
class connection;
|
60
|
+
|
61
|
+
class idirectReadHandler
|
62
|
+
{
|
63
|
+
|
64
|
+
public:
|
65
|
+
/* Call by connection at first 4byte readed.
|
66
|
+
size : The rest of the data size. = TotalSize - 4
|
67
|
+
*/
|
68
|
+
virtual unsigned int onRead(unsigned int size, connection* c) = 0;
|
69
|
+
};
|
70
|
+
|
71
|
+
/** The connection interface
|
72
|
+
*
|
73
|
+
*/
|
74
|
+
class connection
|
75
|
+
{
|
76
|
+
public:
|
77
|
+
virtual ~connection(){};
|
78
|
+
virtual void connect() = 0;
|
79
|
+
virtual void addref() = 0;
|
80
|
+
virtual void release() = 0;
|
81
|
+
virtual int refCount() const = 0;
|
82
|
+
virtual bool isConnected() const = 0;
|
83
|
+
virtual const boost::asio::ip::tcp::endpoint& endpoint() const = 0;
|
84
|
+
virtual thread_id tid() const = 0;
|
85
|
+
virtual char* sendBuffer(size_t size) = 0;
|
86
|
+
virtual unsigned int sendBufferSize() = 0;
|
87
|
+
virtual buffers* optionalBuffers() = 0;
|
88
|
+
virtual char* asyncWriteRead(unsigned int writeSize) = 0;
|
89
|
+
//virtual unsigned int datalen() const = 0; // additinal info at segment read
|
90
|
+
//virtual unsigned short rows() const = 0; // additinal info at segment read
|
91
|
+
virtual void setReadBufferSizeIf(size_t size) = 0;
|
92
|
+
virtual void setDirectReadHandler(idirectReadHandler* p) = 0;
|
93
|
+
virtual unsigned int directRead(void* buf, unsigned int size) = 0;
|
94
|
+
virtual void* directReadRemain(unsigned int size) = 0;
|
95
|
+
virtual bool queryFunction(unsigned int v) = 0;
|
96
|
+
virtual int charsetServer() const = 0;
|
97
|
+
virtual void setCharsetServer(int v) = 0;
|
98
|
+
};
|
99
|
+
|
100
|
+
#define CONNECTION_FUNCTION_DIRECT_READ 1
|
101
|
+
|
102
|
+
|
103
|
+
} // namespace client
|
104
|
+
} // namespace netsvc
|
105
|
+
} // namespace bzs
|
106
|
+
|
107
|
+
#endif // BZS_NETSVC_CLINET_ICONNECTION_H
|
@@ -16,7 +16,6 @@
|
|
16
16
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
17
17
|
02111-1307, USA.
|
18
18
|
================================================================= */
|
19
|
-
|
20
19
|
#include "tcpClient.h"
|
21
20
|
#include <bzs/env/crosscompile.h>
|
22
21
|
#if (!defined(_WIN32))
|
@@ -26,6 +25,7 @@
|
|
26
25
|
#include <boost/property_tree/ini_parser.hpp>
|
27
26
|
#endif
|
28
27
|
#endif
|
28
|
+
|
29
29
|
#pragma package(smart_init)
|
30
30
|
|
31
31
|
using namespace boost;
|
@@ -41,6 +41,12 @@ namespace client
|
|
41
41
|
|
42
42
|
char connections::port[PORTNUMBUF_SIZE] = { "8610" };
|
43
43
|
bool connections::m_usePipedLocal = true;
|
44
|
+
#ifdef _WIN32
|
45
|
+
short connections::timeout = 3000;
|
46
|
+
#else
|
47
|
+
short connections::timeout = 3;
|
48
|
+
#endif
|
49
|
+
|
44
50
|
|
45
51
|
connections::connections(const char* pipeName) : m_pipeName(pipeName)
|
46
52
|
{
|
@@ -57,6 +63,9 @@ connections::connections(const char* pipeName) : m_pipeName(pipeName)
|
|
57
63
|
GetPrivateProfileString("transctd_client", "port", "8610", tmp, 30,
|
58
64
|
buf);
|
59
65
|
strcpy_s(port, PORTNUMBUF_SIZE, tmp);
|
66
|
+
GetPrivateProfileString("transctd_client", "timeout", "3000", tmp, 30,
|
67
|
+
buf);
|
68
|
+
timeout = atol(tmp);
|
60
69
|
}
|
61
70
|
#else // NOT _WIN32
|
62
71
|
#if (BOOST_VERSION > 104900)
|
@@ -77,6 +86,11 @@ connections::connections(const char* pipeName) : m_pipeName(pipeName)
|
|
77
86
|
if (p == "")
|
78
87
|
p = "8610";
|
79
88
|
strcpy_s(port, PORTNUMBUF_SIZE, p.c_str());
|
89
|
+
|
90
|
+
p = pt.get<std::string>("transctd_client.timeout");
|
91
|
+
timeout = atol(p.c_str())/1000;
|
92
|
+
if (timeout == 0)
|
93
|
+
timeout = 3;
|
80
94
|
}
|
81
95
|
catch (...)
|
82
96
|
{
|
@@ -19,45 +19,18 @@
|
|
19
19
|
02111-1307, USA.
|
20
20
|
================================================================= */
|
21
21
|
|
22
|
-
#
|
23
|
-
#pragma warn -8012
|
24
|
-
#endif
|
25
|
-
#include <boost/asio/buffer.hpp>
|
26
|
-
#include <boost/asio/windows/stream_handle.hpp>
|
27
|
-
#include <boost/asio/io_service.hpp>
|
28
|
-
#include <boost/asio/windows/basic_handle.hpp>
|
29
|
-
#include <boost/asio/ip/tcp.hpp>
|
30
|
-
#include <boost/asio/read.hpp>
|
22
|
+
#include <bzs/netsvc/client/iconnection.h>
|
31
23
|
#include <boost/asio/write.hpp>
|
32
|
-
#include <boost/
|
33
|
-
#include <boost/asio/placeholders.hpp>
|
34
|
-
|
24
|
+
#include <boost/asio/read.hpp>
|
35
25
|
#include <boost/system/system_error.hpp>
|
36
26
|
#include <boost/thread/mutex.hpp>
|
37
27
|
#include <stdio.h>
|
38
|
-
|
39
|
-
#ifdef __BCPLUSPLUS__
|
40
|
-
#pragma warn +8012
|
41
|
-
#endif
|
42
28
|
#include <vector>
|
43
|
-
using namespace boost;
|
44
|
-
using namespace boost::system;
|
45
29
|
|
46
|
-
#ifdef _WIN32
|
47
|
-
#define USE_PIPE_CLIENT
|
48
|
-
#endif
|
49
30
|
|
50
|
-
|
51
|
-
using boost
|
52
|
-
|
53
|
-
typedef HANDLE platform_descriptor;
|
54
|
-
#define PIPE_EOF_ERROR_CODE boost::system::windows_error::broken_pipe
|
55
|
-
typedef DWORD thread_id;
|
56
|
-
#define threadid GetCurrentThreadId
|
57
|
-
#else // NOT USE_PIPE_CLIENT
|
58
|
-
typedef pthread_t thread_id;
|
59
|
-
#define threadid pthread_self
|
60
|
-
#endif // NOT USE_PIPE_CLIENT
|
31
|
+
|
32
|
+
using namespace boost;
|
33
|
+
using namespace boost::system;
|
61
34
|
|
62
35
|
#define READBUF_SIZE 66000
|
63
36
|
#define WRITEBUF_SIZE 66000
|
@@ -65,6 +38,9 @@ typedef pthread_t thread_id;
|
|
65
38
|
#define PORTNUMBUF_SIZE 10
|
66
39
|
#define CLIENT_ERROR_CANT_CREATEPIPE 3106
|
67
40
|
#define CLIENT_ERROR_SHAREMEM_DENIED 3104
|
41
|
+
#define CLIENT_ERROR_CONNECTION_FAILURE 3106
|
42
|
+
#define TIMEOUT_MILLISEC 3000
|
43
|
+
|
68
44
|
|
69
45
|
namespace bzs
|
70
46
|
{
|
@@ -73,10 +49,6 @@ namespace netsvc
|
|
73
49
|
namespace client
|
74
50
|
{
|
75
51
|
|
76
|
-
typedef std::vector<boost::asio::const_buffer> buffers;
|
77
|
-
|
78
|
-
class connection;
|
79
|
-
|
80
52
|
class connections
|
81
53
|
{
|
82
54
|
std::vector<connection*> m_conns;
|
@@ -106,33 +78,11 @@ public:
|
|
106
78
|
bool disconnect(connection* c);
|
107
79
|
|
108
80
|
static char port[PORTNUMBUF_SIZE];
|
81
|
+
static short timeout;
|
109
82
|
|
110
83
|
int connectionCount();
|
111
84
|
};
|
112
85
|
|
113
|
-
/** The connection interface
|
114
|
-
*
|
115
|
-
*/
|
116
|
-
class connection
|
117
|
-
{
|
118
|
-
public:
|
119
|
-
virtual ~connection(){};
|
120
|
-
virtual void connect() = 0;
|
121
|
-
virtual void addref() = 0;
|
122
|
-
virtual void release() = 0;
|
123
|
-
virtual int refCount() const = 0;
|
124
|
-
virtual bool isConnected() const = 0;
|
125
|
-
virtual const asio::ip::tcp::endpoint& endpoint() const = 0;
|
126
|
-
virtual thread_id tid() const = 0;
|
127
|
-
virtual char* sendBuffer(size_t size) = 0;
|
128
|
-
virtual unsigned int sendBufferSize() = 0;
|
129
|
-
virtual buffers* optionalBuffers() = 0;
|
130
|
-
virtual char* asyncWriteRead(unsigned int writeSize) = 0;
|
131
|
-
virtual unsigned int datalen() const = 0; // additinal info at segment read
|
132
|
-
virtual unsigned short rows() const = 0; // additinal info at segment read
|
133
|
-
virtual void setReadBufferSizeIf(size_t size) = 0;
|
134
|
-
};
|
135
|
-
|
136
86
|
/** Implementation of Part of the connection interface
|
137
87
|
*/
|
138
88
|
class connectionBase : public connection
|
@@ -142,16 +92,16 @@ protected:
|
|
142
92
|
|
143
93
|
asio::io_service m_ios;
|
144
94
|
asio::ip::tcp::endpoint m_ep;
|
145
|
-
|
146
|
-
int m_refCount;
|
147
|
-
thread_id m_tid;
|
148
|
-
|
149
95
|
std::vector<char> m_readbuf;
|
150
96
|
std::vector<char> m_sendbuf;
|
151
|
-
|
97
|
+
idirectReadHandler* m_reader;
|
152
98
|
size_t m_readLen;
|
99
|
+
int m_refCount;
|
100
|
+
thread_id m_tid;
|
101
|
+
int m_charsetServer;
|
153
102
|
bool m_connected;
|
154
103
|
|
104
|
+
|
155
105
|
void addref() { ++m_refCount; }
|
156
106
|
|
157
107
|
void release() { --m_refCount; }
|
@@ -164,12 +114,19 @@ protected:
|
|
164
114
|
|
165
115
|
thread_id tid() const { return m_tid; };
|
166
116
|
|
117
|
+
int charsetServer() const { return m_charsetServer; };
|
118
|
+
|
119
|
+
void setCharsetServer(int v) { m_charsetServer = v; }
|
120
|
+
|
167
121
|
public:
|
168
122
|
connectionBase(asio::ip::tcp::endpoint& ep)
|
169
|
-
: m_ep(ep), m_refCount(0), m_tid(threadid()),
|
123
|
+
: m_ep(ep), m_reader(NULL), m_refCount(0), m_tid(threadid()),
|
124
|
+
m_charsetServer(-1), m_connected(false)
|
170
125
|
{
|
171
126
|
}
|
172
127
|
|
128
|
+
void setDirectReadHandler(idirectReadHandler* p){ m_reader = p; }
|
129
|
+
|
173
130
|
char* sendBuffer(size_t size)
|
174
131
|
{
|
175
132
|
if (size > m_sendbuf.size())
|
@@ -191,18 +148,18 @@ public:
|
|
191
148
|
template <class T> class connectionImple : public connectionBase
|
192
149
|
{
|
193
150
|
protected:
|
194
|
-
unsigned int m_datalen;
|
195
|
-
unsigned short m_rows;
|
151
|
+
//unsigned int m_datalen;
|
152
|
+
//unsigned short m_rows;
|
196
153
|
T m_socket;
|
197
154
|
buffers m_optionalBuffes;
|
198
155
|
|
199
|
-
unsigned int datalen() const { return m_datalen; }
|
156
|
+
//unsigned int datalen() const { return m_datalen; }
|
200
157
|
|
201
|
-
unsigned short rows() const { return m_rows; }
|
158
|
+
//unsigned short rows() const { return m_rows; }
|
202
159
|
|
203
160
|
// server send any segment of lower than 0xFFFF data by asyncWrite
|
204
161
|
// last 4byte is 0xFFFFFFFF, that is specify end of data
|
205
|
-
void segmentRead()
|
162
|
+
/*void segmentRead()
|
206
163
|
{
|
207
164
|
bool end = false;
|
208
165
|
unsigned short n;
|
@@ -226,6 +183,31 @@ protected:
|
|
226
183
|
boost::asio::transfer_all());
|
227
184
|
boost::asio::read(m_socket, boost::asio::buffer(&m_rows, 2),
|
228
185
|
boost::asio::transfer_all());
|
186
|
+
}*/
|
187
|
+
bool queryFunction(unsigned int v)
|
188
|
+
{
|
189
|
+
if (v == CONNECTION_FUNCTION_DIRECT_READ)
|
190
|
+
return true;
|
191
|
+
return false;
|
192
|
+
}
|
193
|
+
|
194
|
+
unsigned int directRead(void* buf, unsigned int size)
|
195
|
+
{
|
196
|
+
return (unsigned int)boost::asio::read(m_socket,
|
197
|
+
boost::asio::buffer(buf, size),
|
198
|
+
boost::asio::transfer_all());
|
199
|
+
}
|
200
|
+
|
201
|
+
void* directReadRemain(unsigned int size)
|
202
|
+
{
|
203
|
+
if (size > m_readbuf.size())
|
204
|
+
m_readbuf.resize(size);
|
205
|
+
|
206
|
+
m_readLen += boost::asio::read(
|
207
|
+
m_socket,
|
208
|
+
boost::asio::buffer(&m_readbuf[0], size),
|
209
|
+
boost::asio::transfer_all());
|
210
|
+
return &m_readbuf[0];
|
229
211
|
}
|
230
212
|
|
231
213
|
void read()
|
@@ -234,24 +216,40 @@ protected:
|
|
234
216
|
throw system_error(asio::error::not_connected);
|
235
217
|
boost::system::error_code e;
|
236
218
|
m_readLen = 0;
|
237
|
-
m_datalen = 0;
|
238
|
-
m_rows = 0;
|
219
|
+
//m_datalen = 0;
|
220
|
+
//m_rows = 0;
|
239
221
|
unsigned int n;
|
240
|
-
|
241
|
-
|
242
|
-
|
222
|
+
|
223
|
+
//m_readLen += boost::asio::read(m_socket, boost::asio::buffer(&n, 4),
|
224
|
+
// boost::asio::transfer_all());
|
225
|
+
/*if (n == 0xFFFFFFFF)
|
243
226
|
{
|
244
227
|
segmentRead();
|
245
228
|
m_readLen += boost::asio::read(m_socket, boost::asio::buffer(&n, 4),
|
246
229
|
boost::asio::transfer_all());
|
230
|
+
}*/
|
231
|
+
if (m_reader)
|
232
|
+
{
|
233
|
+
m_readLen = boost::asio::read(m_socket, boost::asio::buffer(&n, 4),
|
234
|
+
boost::asio::transfer_all());
|
235
|
+
m_readLen += m_reader->onRead(n - 4, this);
|
236
|
+
}else
|
237
|
+
{
|
238
|
+
m_readLen = boost::asio::read(m_socket,
|
239
|
+
boost::asio::buffer(&m_readbuf[0],m_readbuf.size()),
|
240
|
+
boost::asio::transfer_at_least(4));
|
241
|
+
n = *((unsigned int*)(&m_readbuf[0]));
|
247
242
|
}
|
248
|
-
if (
|
249
|
-
|
250
|
-
|
243
|
+
if (m_readLen < n)
|
244
|
+
{
|
245
|
+
if (n > m_readbuf.size())
|
246
|
+
m_readbuf.resize(n);
|
247
|
+
|
251
248
|
m_readLen += boost::asio::read(
|
252
249
|
m_socket,
|
253
250
|
boost::asio::buffer(&m_readbuf[m_readLen], n - m_readLen),
|
254
251
|
boost::asio::transfer_all());
|
252
|
+
}
|
255
253
|
}
|
256
254
|
|
257
255
|
void write(unsigned int writeSize)
|
@@ -273,15 +271,16 @@ protected:
|
|
273
271
|
|
274
272
|
public:
|
275
273
|
connectionImple(asio::ip::tcp::endpoint& ep)
|
276
|
-
: connectionBase(ep)
|
274
|
+
: connectionBase(ep)/*, m_datalen(0)*/, m_socket(m_ios)
|
277
275
|
{
|
278
276
|
}
|
279
277
|
|
280
278
|
~connectionImple()
|
281
279
|
{
|
282
|
-
|
280
|
+
|
283
281
|
try
|
284
282
|
{
|
283
|
+
m_ios.stop();
|
285
284
|
m_socket.close();
|
286
285
|
}
|
287
286
|
catch (...)
|
@@ -299,7 +298,6 @@ public:
|
|
299
298
|
buffers* optionalBuffers() { return &m_optionalBuffes; }
|
300
299
|
};
|
301
300
|
|
302
|
-
#define TIMEOUT_SEC 3
|
303
301
|
|
304
302
|
/** Implementation of The TCP connection.
|
305
303
|
*/
|
@@ -317,7 +315,7 @@ public:
|
|
317
315
|
void setupTimeouts()
|
318
316
|
{
|
319
317
|
#if defined _WIN32
|
320
|
-
int32_t timeout =
|
318
|
+
int32_t timeout = connections::timeout;
|
321
319
|
setsockopt(m_socket.native(), SOL_SOCKET, SO_RCVTIMEO,
|
322
320
|
(const char*)&timeout, sizeof(timeout));
|
323
321
|
setsockopt(m_socket.native(), SOL_SOCKET, SO_SNDTIMEO,
|
@@ -325,7 +323,7 @@ public:
|
|
325
323
|
#else
|
326
324
|
struct timeval timeout;
|
327
325
|
timeout.tv_usec = 0;
|
328
|
-
timeout.tv_sec =
|
326
|
+
timeout.tv_sec = connections::timeout;
|
329
327
|
setsockopt(m_socket.native(), SOL_SOCKET, SO_RCVTIMEO, &timeout,
|
330
328
|
sizeof(timeout));
|
331
329
|
setsockopt(m_socket.native(), SOL_SOCKET, SO_SNDTIMEO, &timeout,
|
@@ -379,6 +377,13 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
379
377
|
HANDLE m_sendEvent;
|
380
378
|
HANDLE m_mapFile;
|
381
379
|
|
380
|
+
bool queryFunction(unsigned int v)
|
381
|
+
{
|
382
|
+
if (v == CONNECTION_FUNCTION_DIRECT_READ)
|
383
|
+
return false;
|
384
|
+
return false;
|
385
|
+
}
|
386
|
+
|
382
387
|
char* GetErrorMessage(DWORD ErrorCode)
|
383
388
|
{
|
384
389
|
LPVOID lpMsgBuf;
|
@@ -517,10 +522,14 @@ public:
|
|
517
522
|
|
518
523
|
char* asyncWriteRead(unsigned int writeSize)
|
519
524
|
{
|
520
|
-
m_datalen = 0;
|
521
|
-
m_rows = 0;
|
522
|
-
SetEvent(m_sendEvent);
|
523
|
-
|
525
|
+
//m_datalen = 0;
|
526
|
+
//m_rows = 0;
|
527
|
+
BOOL ret = SetEvent(m_sendEvent);
|
528
|
+
if (ret == FALSE)
|
529
|
+
throwException("SetEvent", CLIENT_ERROR_CONNECTION_FAILURE);
|
530
|
+
DWORD r = WaitForSingleObject(m_recvEvent, connections::timeout);
|
531
|
+
if (r == WAIT_TIMEOUT)
|
532
|
+
throwException("SetEvent", CLIENT_ERROR_CONNECTION_FAILURE);
|
524
533
|
return m_readbuf_p;
|
525
534
|
}
|
526
535
|
|