transactd 3.4.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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());
|