transactd 3.4.1 → 3.5.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 +2 -2
- data/bin/common/tdclc_32_3_5.dll +0 -0
- data/bin/common/tdclc_64_3_5.dll +0 -0
- data/build/common/options.cmake +12 -0
- data/build/common/transactd_cl_common.cmake +1 -0
- data/build/common/transactd_required.cmake +5 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +1029 -130
- data/build/swig/tdcl.i +60 -5
- data/build/tdclc/CMakeLists.txt +30 -32
- data/build/tdclc/libtdclcm.map +1 -1
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/CMakeLists.txt +39 -48
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +4 -1
- data/build/tdclrb/CMakeLists.txt +5 -4
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +45 -35
- data/source/bzs/db/engine/mysql/database.h +6 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +11 -0
- data/source/bzs/db/engine/mysql/dbManager.h +1 -0
- data/source/bzs/db/engine/mysql/ha.cpp +174 -0
- data/source/bzs/db/engine/mysql/ha.h +50 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +18 -1
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +222 -9
- data/source/bzs/db/engine/mysql/mysqlProtocol.h +5 -0
- data/source/bzs/db/protocol/tdap/client/client.cpp +23 -9
- data/source/bzs/db/protocol/tdap/client/client.h +125 -94
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +139 -30
- data/source/bzs/db/protocol/tdap/client/connMgr.h +40 -8
- data/source/bzs/db/protocol/tdap/client/database.cpp +17 -17
- data/source/bzs/db/protocol/tdap/client/database.h +15 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -4
- data/source/bzs/db/protocol/tdap/client/haNameResolver.cpp +486 -0
- data/source/bzs/db/protocol/tdap/client/haNameResolver.h +74 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +102 -71
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +15 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/table.cpp +1 -2
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +9 -7
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +2 -2
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +328 -117
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +7 -8
- data/source/bzs/db/protocol/tdap/tdapcapi.h +81 -41
- data/source/bzs/db/transactd/connManager.cpp +118 -93
- data/source/bzs/db/transactd/connManager.h +6 -1
- data/source/bzs/db/transactd/connectionRecord.h +27 -7
- data/source/bzs/db/transactd/transactd.cpp +24 -13
- data/source/bzs/env/crosscompile.h +2 -0
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +45 -14
- data/source/bzs/netsvc/client/tcpClient.h +21 -4
- data/source/bzs/netsvc/server/IAppModule.h +1 -0
- data/source/bzs/netsvc/server/serverCpt.cpp +1 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +3 -5
- data/source/bzs/test/tdclatl/test_v3.js +91 -3
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +89 -3
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +69 -2
- data/source/bzs/test/trdclengn/testField.h +19 -1
- data/source/bzs/test/trdclengn/test_tdclcpp_ha.cpp +388 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +6 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1 -0
- data/source/bzs/test/trdclengn/testbase.h +7 -1
- data/source/global/replication/haCommand.cpp +843 -0
- data/source/global/replication/haCommand.h +78 -0
- data/source/global/replication/haMgr.cpp +321 -0
- data/source/global/replication/replCommand.cpp +696 -0
- data/source/global/replication/replCommand.h +161 -0
- data/source/global/tdclatl/BinlogPos.cpp +10 -0
- data/source/global/tdclatl/BinlogPos.h +1 -0
- data/source/global/tdclatl/ConnMgr.cpp +89 -2
- data/source/global/tdclatl/ConnMgr.h +13 -1
- data/source/global/tdclatl/ConnRecord.cpp +8 -2
- data/source/global/tdclatl/ConnRecord.h +4 -3
- data/source/global/tdclatl/Database.cpp +13 -0
- data/source/global/tdclatl/Database.h +2 -0
- data/source/global/tdclatl/HaNameREsolver.cpp +54 -0
- data/source/global/tdclatl/HaNameREsolver.h +68 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +76 -5
- metadata +16 -6
- data/bin/common/tdclc_32_3_4.dll +0 -0
- data/bin/common/tdclc_64_3_4.dll +0 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +0 -423
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +0 -116
@@ -56,16 +56,21 @@ private:
|
|
56
56
|
void doDisconnectAll();
|
57
57
|
const connection::records& getTableList(const char* dbname, int type) const;
|
58
58
|
bool checkGlobalACL(THD* thd, ulong wantAccess) const;
|
59
|
+
const connection::records& readByProtocol(int type, blobBuffer* bb,
|
60
|
+
const char* channel=NULL) const;
|
59
61
|
public:
|
60
62
|
connManager(unsigned __int64 me) : m_me(me), m_stat(0){};
|
61
63
|
virtual ~connManager();
|
62
64
|
const connection::records& systemVariables() const;
|
65
|
+
const connection::records& extendedVariables(blobBuffer* bb) const;
|
63
66
|
const connection::records& statusVariables() const;
|
64
67
|
const connection::records& getRecords(unsigned __int64 conid, int dbid) const;
|
65
68
|
const connection::records& definedDatabases() const;
|
66
69
|
const connection::records& schemaTables(const char* dbname) const;
|
67
70
|
const connection::records& definedTables(const char* dbname, int type) const;
|
68
|
-
const connection::records& readSlaveStatus(blobBuffer* bb) const;
|
71
|
+
const connection::records& readSlaveStatus(const char* channel, blobBuffer* bb) const;
|
72
|
+
const connection::records& slaveHosts(blobBuffer* bb) const;
|
73
|
+
const connection::records& channels() const;
|
69
74
|
void disconnect(unsigned __int64 conid);
|
70
75
|
void disconnectAll();
|
71
76
|
short stat() const {return m_stat;}
|
@@ -129,6 +129,15 @@ struct record
|
|
129
129
|
{
|
130
130
|
name[0] = 0x00;
|
131
131
|
}
|
132
|
+
void reset()
|
133
|
+
{
|
134
|
+
name[0] = 0x00;
|
135
|
+
conId = 0;
|
136
|
+
id = 0;
|
137
|
+
db = 0;
|
138
|
+
updCount = 0;
|
139
|
+
status = 0;
|
140
|
+
}
|
132
141
|
union
|
133
142
|
{
|
134
143
|
__int64 conId; // 8 byte
|
@@ -143,7 +152,8 @@ struct record
|
|
143
152
|
union
|
144
153
|
{
|
145
154
|
unsigned int db;
|
146
|
-
unsigned int readCount;
|
155
|
+
unsigned int readCount;
|
156
|
+
unsigned int port; // 4 byte
|
147
157
|
};
|
148
158
|
union
|
149
159
|
{
|
@@ -188,22 +198,32 @@ struct record
|
|
188
198
|
MultiByteToWideChar(CP_UTF8, 0, (char*)longValue, -1, buf, size);
|
189
199
|
return buf;
|
190
200
|
}
|
191
|
-
#
|
192
|
-
inline const char* t_name(char*
|
201
|
+
#endif
|
202
|
+
/*inline const char* t_name(char* buf, int size) const
|
193
203
|
{
|
194
204
|
return name;
|
195
|
-
}
|
205
|
+
}*/
|
196
206
|
const char* value(char* buf, int size) const
|
197
207
|
{
|
198
208
|
if (type == 0)
|
199
209
|
{
|
200
210
|
_i64toa_s(longValue, buf, size, 10);
|
201
|
-
|
211
|
+
|
202
212
|
}else if (type == 1)
|
213
|
+
strcpy_s(buf, size, name);
|
214
|
+
else
|
215
|
+
strcpy_s(buf, size, (char*)longValue);
|
216
|
+
return buf;
|
217
|
+
}
|
218
|
+
const char* value_ptr() const
|
219
|
+
{
|
220
|
+
if (type == 0)
|
221
|
+
return (const char*)&longValue;
|
222
|
+
else if(type == 1)
|
203
223
|
return name;
|
204
|
-
return (char*)longValue;
|
224
|
+
return (const char*)longValue;
|
205
225
|
}
|
206
|
-
|
226
|
+
|
207
227
|
}; // 20 + 68 = 88
|
208
228
|
|
209
229
|
#ifdef MYSQL_DYNAMIC_PLUGIN
|
@@ -32,12 +32,14 @@
|
|
32
32
|
#pragma warning(default : 4800)
|
33
33
|
|
34
34
|
#include <bzs/db/engine/mysql/mysqlThd.h>
|
35
|
+
#include <bzs/db/engine/mysql/ha.h>
|
35
36
|
#include "appBuilderImple.h"
|
36
37
|
|
37
38
|
/** tcp server type
|
38
39
|
*/
|
39
40
|
#define TCP_CPT_SERVER 1
|
40
41
|
#define TCP_TPOOL_SERVER 2
|
42
|
+
|
41
43
|
#define PIPE_SHARE_MEM_SIZE 6292480 // 6Mbyte + 1024
|
42
44
|
|
43
45
|
using namespace bzs::netsvc::server;
|
@@ -47,7 +49,7 @@ using namespace bzs::netsvc::server;
|
|
47
49
|
static char* g_listenAddress = NULL;
|
48
50
|
static char* g_listenPort = NULL;
|
49
51
|
static char* g_hostCheckUserName = NULL;
|
50
|
-
|
52
|
+
unsigned int g_tcpServerType = TCP_CPT_SERVER;
|
51
53
|
static unsigned int g_maxTcpConnections = 200;
|
52
54
|
static unsigned int g_pool_threads = 20;
|
53
55
|
int g_tableNmaeLower = 1; // defined in btrvProtocol.h
|
@@ -56,7 +58,8 @@ char* g_transaction_isolation = NULL;
|
|
56
58
|
char* g_auth_type = NULL;
|
57
59
|
unsigned int g_pipeCommSharememSize = PIPE_SHARE_MEM_SIZE;
|
58
60
|
unsigned int g_timestamp_always = 1;
|
59
|
-
|
61
|
+
unsigned int g_startup_ha = 0;
|
62
|
+
extern unsigned int g_ha;// defined in srvrole.cpp
|
60
63
|
|
61
64
|
|
62
65
|
/** tcp server
|
@@ -101,6 +104,7 @@ static int transactd_plugin_init(void* p)
|
|
101
104
|
{
|
102
105
|
try
|
103
106
|
{
|
107
|
+
bzs::db::engine::mysql::initHa();
|
104
108
|
if (g_tcpServerType == TCP_CPT_SERVER)
|
105
109
|
{
|
106
110
|
boost::shared_ptr<IAppModuleBuilder> app(new transctionalIF(
|
@@ -255,6 +259,12 @@ static MYSQL_SYSVAR_STR(transaction_isolation, g_transaction_isolation,
|
|
255
259
|
static MYSQL_SYSVAR_STR(auth_type, g_auth_type,
|
256
260
|
PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC, NULL, NULL,
|
257
261
|
NULL, "none"); //or "mysql_native"
|
262
|
+
static MYSQL_SYSVAR_UINT(timestamp_always, g_timestamp_always, PLUGIN_VAR_READONLY, "", 0,
|
263
|
+
0, 1, 0, 1, 0);
|
264
|
+
static MYSQL_SYSVAR_UINT(startup_ha, g_startup_ha,
|
265
|
+
PLUGIN_VAR_READONLY, "0...7", 0, 0, 0, 0, 7, 0);
|
266
|
+
|
267
|
+
|
258
268
|
/*static MYSQL_SYSVAR_INT(grant_apply, g_grant_apply,
|
259
269
|
PLUGIN_VAR_READONLY, "0..1 0:none 1:all", 0, 0, 0, 0, 1, 0);
|
260
270
|
*/
|
@@ -275,9 +285,6 @@ static MYSQL_SYSVAR_STR(hs_port, g_hs_listenPort,
|
|
275
285
|
static MYSQL_SYSVAR_INT(use_handlersocket, g_use_hs, PLUGIN_VAR_READONLY, "", 0,
|
276
286
|
0, 0, 0, 1, 0);
|
277
287
|
|
278
|
-
static MYSQL_SYSVAR_UINT(timestamp_always, g_timestamp_always, PLUGIN_VAR_READONLY, "", 0,
|
279
|
-
0, 1, 0, 1, 0);
|
280
|
-
|
281
288
|
#endif
|
282
289
|
|
283
290
|
/** system valiables struct.
|
@@ -295,6 +302,7 @@ static struct st_mysql_sys_var* g_systemVariables[] =
|
|
295
302
|
MYSQL_SYSVAR(transaction_isolation),
|
296
303
|
MYSQL_SYSVAR(auth_type),
|
297
304
|
MYSQL_SYSVAR(timestamp_always),
|
305
|
+
MYSQL_SYSVAR(startup_ha),
|
298
306
|
#ifdef PIPE_SERVER
|
299
307
|
MYSQL_SYSVAR(pipe_comm_sharemem_size),
|
300
308
|
MYSQL_SYSVAR(max_pipe_connections),
|
@@ -321,7 +329,8 @@ const char* get_trd_sys_var(int index)
|
|
321
329
|
case TD_VAR_LOCKWAITTIMEOUT:return (const char*)&g_lock_wait_timeout;
|
322
330
|
case TD_VAR_ISOLATION:return g_transaction_isolation;
|
323
331
|
case TD_VAR_AUTHTYPE:return g_auth_type;
|
324
|
-
case TD_VAR_TIMESTAMPMODE:return (const char*)&g_timestamp_always;
|
332
|
+
case TD_VAR_TIMESTAMPMODE:return (const char*)&g_timestamp_always;
|
333
|
+
case TD_VAR_STARTUP_HA:return (const char*)&g_startup_ha;
|
325
334
|
#ifdef PIPE_SERVER
|
326
335
|
case TD_VAR_PIPESHAREMEMSIZE:return (const char*)&g_pipeCommSharememSize;
|
327
336
|
case TD_VAR_MAXPIPECONNECTIONS:return (const char*)&g_maxPipeConnections;
|
@@ -347,6 +356,7 @@ const unsigned int* get_trd_status_var(int index)
|
|
347
356
|
case TD_SVAR_TCP_WAIT_THREADS:return &cpt::g_waitThread;
|
348
357
|
case TD_SVAR_TPOOL_CONNECTIONS:return &tpool::g_connections;
|
349
358
|
case TD_SVAR_TPOOL_WAIT_THREADS:return &tpool::server::m_threadPoolSize;
|
359
|
+
case TD_SVAR_HA:return &g_ha;
|
350
360
|
#ifdef PIPE_SERVER
|
351
361
|
case TD_SVAR_PIPE_CONNECTIONS:return &pipe::g_connections;
|
352
362
|
case TD_SVAR_PIPE_WAIT_THREADS:return &pipe::g_waitThread;
|
@@ -359,16 +369,17 @@ const unsigned int* get_trd_status_var(int index)
|
|
359
369
|
/** show status struct.
|
360
370
|
*/
|
361
371
|
static st_mysql_show_var g_statusVariables[] = {
|
362
|
-
{ "
|
363
|
-
{ "
|
364
|
-
{ "
|
365
|
-
{ "
|
372
|
+
{ "Transactd_tcp_connections", (char*)&cpt::g_connections, SHOW_INT STATUS_VAR_SCOPE },
|
373
|
+
{ "Transactd_tcp_wait_threads", (char*)&cpt::g_waitThread, SHOW_INT },
|
374
|
+
{ "Transactd_tpool_connections", (char*)&tpool::g_connections, SHOW_INT STATUS_VAR_SCOPE },
|
375
|
+
{ "Transactd_tpool_threads", (char*)&tpool::server::m_threadPoolSize, SHOW_INT STATUS_VAR_SCOPE },
|
376
|
+
{ "Transactd_ha", (char*)&g_ha, SHOW_INT STATUS_VAR_SCOPE },
|
366
377
|
|
367
378
|
#ifdef PIPE_SERVER
|
368
|
-
{ "
|
369
|
-
{ "
|
379
|
+
{ "Transactd_pipe_connections", (char*)&pipe::g_connections, SHOW_INT STATUS_VAR_SCOPE },
|
380
|
+
{ "Transactd_pipe_wait_threads", (char*)&pipe::g_waitThread, SHOW_INT STATUS_VAR_SCOPE },
|
370
381
|
#endif
|
371
|
-
{ "
|
382
|
+
{ "Transactd_cur_open_databases", (char*)&g_openDatabases, SHOW_INT STATUS_VAR_SCOPE },
|
372
383
|
{ NULL, NULL, (enum_mysql_show_type)0 }
|
373
384
|
};
|
374
385
|
|
@@ -58,6 +58,7 @@ int gettimeofday(struct timeval*, struct timezone*);
|
|
58
58
|
#endif
|
59
59
|
|
60
60
|
#define _strnicmp strncasecmp
|
61
|
+
#define _stricmp strcasecmp
|
61
62
|
#define _atoi64 atoll
|
62
63
|
#define _access access
|
63
64
|
#define sprintf_s snprintf
|
@@ -217,6 +218,7 @@ typedef unsigned __int32 char32_t; // 32bit
|
|
217
218
|
#if defined(__BORLANDC__)
|
218
219
|
#define _strupr strupr
|
219
220
|
#define _strnicmp strnicmp
|
221
|
+
#define _stricmp stricmp
|
220
222
|
#endif
|
221
223
|
|
222
224
|
#define wcsnicmp16(A, B, C) \
|
@@ -109,6 +109,8 @@ public:
|
|
109
109
|
virtual bool isHandShakable() const = 0;
|
110
110
|
virtual const boost::system::error_code& error() const = 0;
|
111
111
|
virtual void* versions() = 0;
|
112
|
+
virtual unsigned int userOptions() const = 0;
|
113
|
+
virtual void setUserOptions(unsigned int v) = 0;
|
112
114
|
};
|
113
115
|
|
114
116
|
#define CONNECTION_FUNCTION_DIRECT_READ 1
|
@@ -52,8 +52,11 @@ int connections::netTimeout = 180;
|
|
52
52
|
#define DEFAULT_CONNECT_TIMEOUT "20"
|
53
53
|
#define DEFAULT_NET_TIMEOUT "180"
|
54
54
|
|
55
|
+
/* redefine tdapapi.h */
|
56
|
+
#define HST_OPTION_CLEAR_CACHE 8
|
55
57
|
|
56
|
-
connections::connections(const char* pipeName) : m_pipeName(pipeName),
|
58
|
+
connections::connections(const char* pipeName) : m_pipeName(pipeName),
|
59
|
+
m_resolver(m_ios), m_haNameResolver(NULL)
|
57
60
|
{
|
58
61
|
|
59
62
|
#ifdef _WIN32
|
@@ -159,16 +162,6 @@ asio::ip::tcp::endpoint connections::endpoint(const std::string& host,
|
|
159
162
|
return endpoint;
|
160
163
|
}
|
161
164
|
|
162
|
-
connection* connections::getConnection(const std::string& host, const char* port)
|
163
|
-
{
|
164
|
-
mutex::scoped_lock lck(m_mutex);
|
165
|
-
boost::system::error_code ec;
|
166
|
-
tcp::endpoint ep = endpoint(host, port, ec);
|
167
|
-
if (!ec)
|
168
|
-
return getConnection(ep);
|
169
|
-
return NULL;
|
170
|
-
}
|
171
|
-
|
172
165
|
#ifdef USE_PIPE_CLIENT
|
173
166
|
|
174
167
|
connection* connections::getConnectionPipe(unsigned short port)
|
@@ -313,10 +306,25 @@ inline bool connections::doHandShake(connection* c, handshake f, void* data)
|
|
313
306
|
#pragma warn -8004
|
314
307
|
#endif
|
315
308
|
// The connection of found from connection list of same address is returned.
|
316
|
-
connection* connections::connect(const std::string&
|
309
|
+
connection* connections::connect(const std::string& hst, const char* port,
|
310
|
+
handshake f, void* data, bool newConnection, bool clearNRCache)
|
317
311
|
{
|
318
312
|
bool namedPipe = false;
|
319
313
|
connection* c;
|
314
|
+
std::string host = hst;
|
315
|
+
unsigned int opt = clearNRCache ? HST_OPTION_CLEAR_CACHE : 0;
|
316
|
+
char buf[MAX_PATH];
|
317
|
+
if (m_haNameResolver)
|
318
|
+
{
|
319
|
+
m_haNameResolver(hst.c_str(), port, buf, opt);
|
320
|
+
char* p = strchr(buf, ':');
|
321
|
+
if (p)
|
322
|
+
{
|
323
|
+
*p = 0x00;
|
324
|
+
port = p + 1;
|
325
|
+
}
|
326
|
+
host = buf;
|
327
|
+
}
|
320
328
|
mutex::scoped_lock lck(m_mutex);
|
321
329
|
asio::ip::tcp::endpoint ep = endpoint(host, port, m_e);
|
322
330
|
if (m_e)
|
@@ -330,7 +338,8 @@ connection* connections::connect(const std::string& host, const char* port, hand
|
|
330
338
|
c = newConnection ? NULL : getConnection(ep);
|
331
339
|
if (newConnection || !c)
|
332
340
|
{
|
333
|
-
c = createConnection(ep, namedPipe);
|
341
|
+
c = createConnection(ep, namedPipe);
|
342
|
+
c->setUserOptions(opt);
|
334
343
|
c = doConnect(c);
|
335
344
|
if (!c || !doHandShake(c, f, data))
|
336
345
|
return NULL;
|
@@ -343,14 +352,29 @@ connection* connections::connect(const std::string& host, const char* port, hand
|
|
343
352
|
#pragma warn .8004
|
344
353
|
#endif
|
345
354
|
|
346
|
-
bool connections::reconnect(connection* c, const std::string&
|
355
|
+
bool connections::reconnect(connection* c, const std::string& hst, const char* port,
|
347
356
|
handshake f, void* data)
|
348
357
|
{
|
349
358
|
boost::system::error_code ec;
|
359
|
+
std::string host = hst;
|
360
|
+
unsigned int opt = HST_OPTION_CLEAR_CACHE;
|
361
|
+
char buf[MAX_PATH];
|
362
|
+
if (m_haNameResolver)
|
363
|
+
{
|
364
|
+
m_haNameResolver(hst.c_str(), port, buf, opt);
|
365
|
+
char* p = strchr(buf, ':');
|
366
|
+
if (p)
|
367
|
+
{
|
368
|
+
*p = 0x00;
|
369
|
+
port = p + 1;
|
370
|
+
}
|
371
|
+
host = buf;
|
372
|
+
}
|
350
373
|
mutex::scoped_lock lck(m_mutex);
|
351
374
|
asio::ip::tcp::endpoint ep = endpoint(host, port, ec);
|
352
375
|
if (ec)
|
353
376
|
return false;
|
377
|
+
c->setUserOptions(opt);
|
354
378
|
c->reconnect(ep);
|
355
379
|
if (!c || !doHandShake(c, f, data))
|
356
380
|
return false;
|
@@ -362,6 +386,13 @@ int connections::connectionCount()
|
|
362
386
|
return (int)m_conns.size();
|
363
387
|
}
|
364
388
|
|
389
|
+
void connections::registHaNameResolver(HANAME_RESOLVER_PTR func)
|
390
|
+
{
|
391
|
+
mutex::scoped_lock lck(m_mutex);
|
392
|
+
m_haNameResolver = func;
|
393
|
+
}
|
394
|
+
|
395
|
+
|
365
396
|
} // namespace client
|
366
397
|
} // namespace netsvc
|
367
398
|
} // namespace bzs
|
@@ -45,7 +45,7 @@
|
|
45
45
|
#include <pthread.h>
|
46
46
|
#include <signal.h>
|
47
47
|
#endif
|
48
|
-
|
48
|
+
#include <bzs/env/compiler.h>
|
49
49
|
|
50
50
|
using namespace boost;
|
51
51
|
using namespace boost::system;
|
@@ -64,6 +64,16 @@ using namespace boost::system;
|
|
64
64
|
extern bool win_thread_pool_shutdown;
|
65
65
|
#endif
|
66
66
|
|
67
|
+
/* HA hostname resolver */
|
68
|
+
/* @cond INTERNAL */
|
69
|
+
#if (defined(__BORLANDC__) && !defined(__clang__))
|
70
|
+
typedef const char* __STDCALL (*HANAME_RESOLVER_PTR)(const char* vhost, const char* port, char* retBuf, unsigned int& opt);
|
71
|
+
#else
|
72
|
+
typedef const char* (__STDCALL* HANAME_RESOLVER_PTR)(const char* vhost, const char* port, char* retBuf, unsigned int& opt);
|
73
|
+
#endif
|
74
|
+
/* @endcond */
|
75
|
+
|
76
|
+
|
67
77
|
namespace bzs
|
68
78
|
{
|
69
79
|
namespace netsvc
|
@@ -118,6 +128,7 @@ class connections
|
|
118
128
|
boost::asio::ip::tcp::resolver m_resolver;
|
119
129
|
mutex m_mutex;
|
120
130
|
boost::system::error_code m_e;
|
131
|
+
HANAME_RESOLVER_PTR m_haNameResolver;
|
121
132
|
static bool m_usePipedLocal;
|
122
133
|
|
123
134
|
connection* getConnection(asio::ip::tcp::endpoint& ep);
|
@@ -135,14 +146,15 @@ public:
|
|
135
146
|
connections(const char* pipeName);
|
136
147
|
~connections();
|
137
148
|
connection* connect(const std::string& host, const char* port, handshake f,
|
138
|
-
void* data, bool newConnection
|
149
|
+
void* data, bool newConnection, bool clearNRCache);
|
139
150
|
bool reconnect(connection* c, const std::string& host, const char* port,
|
140
151
|
handshake f, void* data);
|
141
152
|
|
142
|
-
connection* getConnection(const std::string& host, const char* port);
|
143
153
|
bool disconnect(connection* c);
|
144
154
|
int connectionCount();
|
145
155
|
const boost::system::error_code& connectError() const { return m_e; };
|
156
|
+
void registHaNameResolver(HANAME_RESOLVER_PTR func);
|
157
|
+
HANAME_RESOLVER_PTR haNameResolver() const {return m_haNameResolver;}
|
146
158
|
static char m_port[PORTNUMBUF_SIZE];
|
147
159
|
static int connectTimeout;
|
148
160
|
static int netTimeout;
|
@@ -151,6 +163,7 @@ public:
|
|
151
163
|
/** Implementation of Part of the connection interface
|
152
164
|
*/
|
153
165
|
#define VER_ST_SIZE 12
|
166
|
+
|
154
167
|
class connectionBase : public connection
|
155
168
|
{
|
156
169
|
protected:
|
@@ -162,6 +175,7 @@ protected:
|
|
162
175
|
size_t m_readLen;
|
163
176
|
int m_refCount;
|
164
177
|
int m_charsetServer;
|
178
|
+
unsigned int m_options;
|
165
179
|
char m_vers[VER_ST_SIZE];
|
166
180
|
bool m_connected;
|
167
181
|
bool m_isHandShakable;
|
@@ -203,6 +217,9 @@ public:
|
|
203
217
|
const boost::system::error_code& error() const { return m_e; };
|
204
218
|
|
205
219
|
void* versions() {return (void*)m_vers;};
|
220
|
+
unsigned int userOptions() const {return m_options;}
|
221
|
+
void setUserOptions(unsigned int v) { m_options = v;}
|
222
|
+
|
206
223
|
};
|
207
224
|
|
208
225
|
|
@@ -493,10 +510,10 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
493
510
|
|
494
511
|
void on_connect(const boost::system::error_code& e)
|
495
512
|
{
|
513
|
+
m_e = e;
|
496
514
|
#ifdef USE_CONNECT_TIMER
|
497
515
|
m_timer.cancel();
|
498
516
|
#endif
|
499
|
-
m_e = e;
|
500
517
|
if (!checkError(e))
|
501
518
|
return ;
|
502
519
|
s_io.on_connected();
|
@@ -46,6 +46,7 @@ class iconnection;
|
|
46
46
|
#define EXECUTE_RESULT_FORCSE_ASYNC 2
|
47
47
|
#define EXECUTE_RESULT_FORCSE_SYNC 3
|
48
48
|
#define EXECUTE_RESULT_ACCESS_DNIED 4
|
49
|
+
#define EXECUTE_RESULT_SEND_QUIT 5
|
49
50
|
typedef std::vector<boost::asio::const_buffer> buffers;
|
50
51
|
typedef std::vector<char> vector_buffer;
|
51
52
|
|
@@ -88,7 +88,7 @@ class connection : public iconnection, private boost::noncopyable
|
|
88
88
|
int ret = m_module->execute(buf, size, &m_optionalBuffes);
|
89
89
|
if (ret == EXECUTE_RESULT_QUIT)
|
90
90
|
return;
|
91
|
-
else if(ret == EXECUTE_RESULT_ACCESS_DNIED)
|
91
|
+
else if(ret == EXECUTE_RESULT_ACCESS_DNIED || ret == EXECUTE_RESULT_SEND_QUIT)
|
92
92
|
{
|
93
93
|
boost::asio::write(m_socket, buffer(&m_result[0], size),
|
94
94
|
boost::asio::transfer_all());
|