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
@@ -69,7 +69,7 @@ class dbExecuter : public engine::mysql::dbManager
|
|
69
69
|
void releaseDatabase(request& req, int op);
|
70
70
|
std::string makeSQLcreateTable(const request& req);
|
71
71
|
bool connect(request& req);
|
72
|
-
inline
|
72
|
+
inline void doCreateTable(request& req);
|
73
73
|
inline bool doOpenTable(request& req, char* buf, bool reconnect=false);
|
74
74
|
inline void doSeekKey(request& req, int op, engine::mysql::rowLockMode* lock);
|
75
75
|
inline void doMoveFirst(request& req, engine::mysql::rowLockMode* lock);
|
@@ -106,6 +106,7 @@ public:
|
|
106
106
|
*/
|
107
107
|
class connMgrExecuter
|
108
108
|
{
|
109
|
+
friend class safeLockReadChannels;
|
109
110
|
request& m_req;
|
110
111
|
__int64 m_modHandle;
|
111
112
|
blobBuffer* m_blobBuffer;
|
@@ -114,11 +115,15 @@ class connMgrExecuter
|
|
114
115
|
int definedTables(char* buf, size_t& size);
|
115
116
|
int definedViews(char* buf, size_t& size);
|
116
117
|
int slaveStatus(netsvc::server::netWriter* nw);
|
118
|
+
int channels(char* buf, size_t& size);
|
119
|
+
int slaveHosts(netsvc::server::netWriter* nw);
|
117
120
|
int systemVariables(char* buf, size_t& size);
|
118
121
|
int statusVariables(char* buf, size_t& size);
|
122
|
+
int extendedVariables(netsvc::server::netWriter* nw);
|
119
123
|
int read(char* buf, size_t& size);
|
120
124
|
int disconnectOne(char* buf, size_t& size);
|
121
125
|
int disconnectAll(char* buf, size_t& size);
|
126
|
+
void execHaCommand();
|
122
127
|
public:
|
123
128
|
connMgrExecuter(request& req, unsigned __int64 parent, blobBuffer* bb);
|
124
129
|
int commandExec(netsvc::server::netWriter* nw);
|
@@ -145,13 +150,7 @@ public:
|
|
145
150
|
|
146
151
|
bool parse(const char* p, size_t size);
|
147
152
|
|
148
|
-
int execute(netsvc::server::netWriter* nw)
|
149
|
-
{
|
150
|
-
if (m_req.op == TD_STASTISTICS)
|
151
|
-
return connMgrExecuter(m_req, (unsigned __int64)m_dbExec->mod(),
|
152
|
-
m_dbExec->m_blobBuffer).commandExec(nw);
|
153
|
-
return m_dbExec->commandExec(m_req, nw);
|
154
|
-
}
|
153
|
+
int execute(netsvc::server::netWriter* nw);
|
155
154
|
|
156
155
|
bool isShutDown() { return m_dbExec->isShutDown(); }
|
157
156
|
|
@@ -46,25 +46,12 @@ struct BOOKMARK
|
|
46
46
|
};
|
47
47
|
typedef BOOKMARK bookmark_td;
|
48
48
|
|
49
|
-
|
50
|
-
*/
|
51
|
-
#if (defined(__BORLANDC__) && !defined(__clang__))
|
52
|
-
typedef short __stdcall (*dllUnloadCallback)();
|
53
|
-
#else
|
54
|
-
/** @cond INTERNAL */
|
55
|
-
/** Callback function on a record was deleted. */
|
56
|
-
typedef short(__STDCALL* dllUnloadCallback)();
|
57
|
-
/** @endcond */
|
58
|
-
#endif
|
59
|
-
|
49
|
+
/* tdap c interface */
|
60
50
|
#ifdef LIB_TDCLCPP
|
61
51
|
extern __declspec(dllimport) short_td
|
62
52
|
__stdcall BTRCALLID(ushort_td op, void* posb, void* data, uint_td* datalen,
|
63
53
|
void* keybuf, keylen_td keylen, char_td keyNum,
|
64
54
|
uchar_td* clientID);
|
65
|
-
|
66
|
-
extern __declspec(dllimport) short_td
|
67
|
-
__stdcall CallbackRegist(dllUnloadCallback func);
|
68
55
|
#endif
|
69
56
|
|
70
57
|
typedef short_td(__STDCALL* BTRCALLID_PTR)(ushort_td, void*, void*, uint_td*,
|
@@ -73,6 +60,19 @@ typedef short_td(__STDCALL* BTRCALLID_PTR)(ushort_td, void*, void*, uint_td*,
|
|
73
60
|
|
74
61
|
typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
75
62
|
|
63
|
+
/* HA hostname resolver */
|
64
|
+
#if (defined(__BORLANDC__) && !defined(__clang__))
|
65
|
+
typedef const char* __STDCALL (*HANAME_RESOLVER_PTR)(const char* vhost, const char* port, char* retBuf, unsigned int& opt);
|
66
|
+
typedef void __STDCALL (*REGISTER_RESOLVER_PTR)(HANAME_RESOLVER_PTR func);
|
67
|
+
|
68
|
+
#else
|
69
|
+
/* @cond INTERNAL */
|
70
|
+
typedef const char* (__STDCALL* HANAME_RESOLVER_PTR)(const char* vhost, const char* port, char* retBuf, unsigned int& opt);
|
71
|
+
typedef void (__STDCALL* REGISTER_RESOLVER_PTR)(HANAME_RESOLVER_PTR func);
|
72
|
+
|
73
|
+
/* @endcond */
|
74
|
+
#endif
|
75
|
+
|
76
76
|
/** buffer size
|
77
77
|
*/
|
78
78
|
#define POS_BLOCK_SIZE 128
|
@@ -202,6 +202,20 @@ typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
|
202
202
|
#define TD_STSTCS_VIEW_LIST 7
|
203
203
|
#define TD_STSTCS_SLAVE_STATUS 8
|
204
204
|
#define TD_STSTCS_STATUS_VARIABLES 9
|
205
|
+
#define TD_STSTCS_SLAVE_HOSTS 10
|
206
|
+
#define TD_STSTCS_EXTENDED_VARIABLES 11
|
207
|
+
#define TD_STSTCS_SLAVE_CHANNELS 12
|
208
|
+
#define TD_STSTCS_SLAVE_CHANNELS_LOCK 13
|
209
|
+
#define TD_STSTCS_HA_LOCK 14
|
210
|
+
#define TD_STSTCS_HA_UNLOCK 15
|
211
|
+
#define TD_STSTCS_HA_SET_ROLEMASTER 16
|
212
|
+
#define TD_STSTCS_HA_SET_ROLESLAVE 17
|
213
|
+
#define TD_STSTCS_HA_SET_ROLENONE 18
|
214
|
+
#define TD_STSTCS_HA_SET_TRXBLOCK 19
|
215
|
+
#define TD_STSTCS_HA_SET_TRXNOBLOCK 20
|
216
|
+
#define TD_STSTCS_HA_ENABLE_FO 21
|
217
|
+
#define TD_STSTCS_HA_DISBLE_FO 22
|
218
|
+
|
205
219
|
|
206
220
|
/** connect sub operation
|
207
221
|
*/
|
@@ -282,27 +296,27 @@ typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
|
282
296
|
#define ft_mydecimal 62
|
283
297
|
#define ft_nullindicator 255
|
284
298
|
|
285
|
-
/* compair types */
|
286
|
-
enum eCompType
|
287
|
-
{
|
288
|
-
eEqual = 1,
|
289
|
-
eGreater = 2,
|
290
|
-
eLess = 3,
|
291
|
-
eNotEq = 4,
|
292
|
-
eGreaterEq = 5,
|
293
|
-
eLessEq = 6,
|
299
|
+
/* compair types */
|
300
|
+
enum eCompType
|
301
|
+
{
|
302
|
+
eEqual = 1,
|
303
|
+
eGreater = 2,
|
304
|
+
eLess = 3,
|
305
|
+
eNotEq = 4,
|
306
|
+
eGreaterEq = 5,
|
307
|
+
eLessEq = 6,
|
294
308
|
eBitAnd = 8,
|
295
|
-
eNotBitAnd = 9,
|
296
|
-
eIsNull = 10,
|
297
|
-
eIsNotNull = 11
|
309
|
+
eNotBitAnd = 9,
|
310
|
+
eIsNull = 10,
|
311
|
+
eIsNotNull = 11
|
298
312
|
};
|
299
313
|
|
300
|
-
/* filter cobine type */
|
301
|
-
enum combineType
|
302
|
-
{
|
303
|
-
eCend,
|
304
|
-
eCand,
|
305
|
-
eCor
|
314
|
+
/* filter cobine type */
|
315
|
+
enum combineType
|
316
|
+
{
|
317
|
+
eCend,
|
318
|
+
eCand,
|
319
|
+
eCor
|
306
320
|
};
|
307
321
|
|
308
322
|
/** extruct row comp bias
|
@@ -484,13 +498,15 @@ enum combineType
|
|
484
498
|
#define ERROR_TD_NET_TOO_BIGDATA 3802
|
485
499
|
#define ERROR_TD_NET_OTHER 3810
|
486
500
|
#define ERROR_TD_C_CLIENT_UNKNOWN 3811
|
501
|
+
#define ERROR_TD_INVALID_SERVER_ROLE 3812
|
487
502
|
#define ERROR_TD_RECONNECTED 3900
|
488
503
|
|
504
|
+
#define ERROR_TD_RECONNECTED_OFFSET 1000
|
489
505
|
#define MYSQL_ERROR_OFFSET 25000
|
490
506
|
|
491
507
|
inline bool canRecoverNetError(short code)
|
492
508
|
{
|
493
|
-
return (code >=
|
509
|
+
return (code >= ERROR_TD_HOSTNAME_NOT_FOUND) &&
|
494
510
|
(code < ERROR_TD_RECONNECTED) &&
|
495
511
|
(code != ERROR_TD_NET_TOO_BIGDATA);
|
496
512
|
}
|
@@ -588,6 +604,12 @@ struct handshale_t
|
|
588
604
|
};
|
589
605
|
|
590
606
|
#define HST_OPTION_NO_SCRAMBLE 1
|
607
|
+
#define HST_OPTION_ROLE_MASTER 2
|
608
|
+
#define HST_OPTION_ROLE_SLAVE 4
|
609
|
+
#define HST_OPTION_CLEAR_CACHE 8
|
610
|
+
|
611
|
+
|
612
|
+
#define CL_OPTION_CHECK_ROLE 1
|
591
613
|
|
592
614
|
/* server system variables index */
|
593
615
|
#define TD_VER_DB 0
|
@@ -608,7 +630,8 @@ struct handshale_t
|
|
608
630
|
#define TD_VAR_HSLISTENPORT 15
|
609
631
|
#define TD_VAR_USEHS 16
|
610
632
|
#define TD_VAR_TIMESTAMPMODE 17
|
611
|
-
#define
|
633
|
+
#define TD_VAR_STARTUP_HA 18
|
634
|
+
#define TD_VAR_SIZE 19
|
612
635
|
|
613
636
|
/* server status variables index */
|
614
637
|
#define TD_SVAR_TCP_CONNECTIONS 0
|
@@ -618,14 +641,31 @@ struct handshale_t
|
|
618
641
|
#define TD_SVAR_PIPE_CONNECTIONS 4
|
619
642
|
#define TD_SVAR_PIPE_WAIT_THREADS 5
|
620
643
|
#define TD_SVAR_OPEN_DBS 6
|
621
|
-
#define
|
622
|
-
|
644
|
+
#define TD_SVAR_HA 7
|
645
|
+
#define TD_SVAR_SIZE 8
|
646
|
+
|
647
|
+
#define HA_ROLE_SLAVE 0
|
648
|
+
#define HA_ROLE_MASTER 1
|
649
|
+
#define HA_ROLE_NONE 2
|
650
|
+
#define HA_RESTORE_ROLE 4
|
651
|
+
#define HA_ENABLE_FAILOVER 8
|
652
|
+
|
653
|
+
/* server sql variables index */
|
654
|
+
#define TD_EXTENDED_VAR_MYSQL_GTID_MODE 0
|
655
|
+
#define TD_EXTENDED_VAR_BINLOG_FILE 1
|
656
|
+
#define TD_EXTENDED_VAR_BINLOG_POS 2
|
657
|
+
#define TD_EXTENDED_VAR_BINLOG_GTID 3
|
658
|
+
#define TD_EXTENDED_VAR_SIZE 4
|
623
659
|
|
660
|
+
|
661
|
+
#define TD_CLINET_LOGNAME "transactd_clinet_err.log"
|
662
|
+
|
663
|
+
/** @endcond */
|
624
664
|
/* In the case of "tdclcppxxx" library of msvc, The ($TargetName) is not changed automatically.
|
625
665
|
If you change this version then you need change The ($TargetName) project options too.
|
626
666
|
*/
|
627
667
|
#define C_INTERFACE_VER_MAJOR "3"//##1 Build marker! Don't remove
|
628
|
-
#define C_INTERFACE_VER_MINOR "
|
668
|
+
#define C_INTERFACE_VER_MINOR "5"//##2 Build marker! Don't remove
|
629
669
|
#define C_INTERFACE_VER_RELEASE "0"//##3 Build marker! Don't remove
|
630
670
|
|
631
671
|
/* dnamic load library name.
|
@@ -689,8 +729,8 @@ struct handshale_t
|
|
689
729
|
*/
|
690
730
|
|
691
731
|
#define CPP_INTERFACE_VER_MAJOR "3"//##4 Build marker! Don't remove
|
692
|
-
#define CPP_INTERFACE_VER_MINOR "
|
693
|
-
#define CPP_INTERFACE_VER_RELEASE "
|
732
|
+
#define CPP_INTERFACE_VER_MINOR "5"//##5 Build marker! Don't remove
|
733
|
+
#define CPP_INTERFACE_VER_RELEASE "0"//##6 Build marker! Don't remove
|
694
734
|
|
695
735
|
/* use autolink tdclcpp */
|
696
736
|
#if (__BCPLUSPLUS__ || _MSC_VER)
|
@@ -726,7 +766,7 @@ struct handshale_t
|
|
726
766
|
|
727
767
|
|
728
768
|
#define TRANSACTD_VER_MAJOR 3//##7 Build marker! Don't remove
|
729
|
-
#define TRANSACTD_VER_MINOR
|
730
|
-
#define TRANSACTD_VER_RELEASE
|
769
|
+
#define TRANSACTD_VER_MINOR 5//##8 Build marker! Don't remove
|
770
|
+
#define TRANSACTD_VER_RELEASE 0//##9 Build marker! Don't remove
|
731
771
|
|
732
772
|
#endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
|
@@ -33,8 +33,13 @@ extern const char* get_trd_sys_var(int index);
|
|
33
33
|
extern const unsigned int* get_trd_status_var(int index);
|
34
34
|
|
35
35
|
/* implemnts in mysqlProtocol.cpp */
|
36
|
-
extern int getSlaveStatus(THD* thd,
|
37
|
-
|
36
|
+
extern int getSlaveStatus(THD* thd, const char* channel,
|
37
|
+
bzs::db::transactd::connection::records& recs, bzs::db::IblobBuffer* bb);
|
38
|
+
extern int getSlaveHosts(THD* thd, bzs::db::transactd::connection::records& recs,
|
39
|
+
bzs::db::IblobBuffer* bb);
|
40
|
+
extern int getChannels(THD* thd, bzs::db::transactd::connection::records& recs);
|
41
|
+
|
42
|
+
extern short getBinlogPos(THD* thd, binlogPos* bpos, THD* tmpThd, bzs::db::IblobBuffer* bb);
|
38
43
|
|
39
44
|
namespace bzs
|
40
45
|
{
|
@@ -47,9 +52,7 @@ using namespace engine::mysql;
|
|
47
52
|
namespace transactd
|
48
53
|
{
|
49
54
|
|
50
|
-
connManager::~connManager()
|
51
|
-
{
|
52
|
-
}
|
55
|
+
connManager::~connManager(){}
|
53
56
|
|
54
57
|
const module* getMod(unsigned __int64 conid)
|
55
58
|
{
|
@@ -223,6 +226,54 @@ const connection::records& connManager::systemVariables() const
|
|
223
226
|
return m_records;
|
224
227
|
}
|
225
228
|
|
229
|
+
const connection::records& connManager::extendedVariables(blobBuffer* bb) const
|
230
|
+
{
|
231
|
+
m_records.clear();
|
232
|
+
boost::shared_ptr<THD> thd(createThdForThread(), deleteThdForThread);
|
233
|
+
if (thd == NULL)
|
234
|
+
m_stat = 20001;
|
235
|
+
else if (!checkGlobalACL(thd.get(), SUPER_ACL | REPL_CLIENT_ACL))
|
236
|
+
m_stat = STATUS_ACCESS_DENIED;
|
237
|
+
if (m_stat) return m_records;
|
238
|
+
binlogPos bpos;
|
239
|
+
short ret = getBinlogPos(thd.get(), &bpos, thd.get(), bb);
|
240
|
+
if (ret) return m_records;
|
241
|
+
for (int i = 0; i < TD_EXTENDED_VAR_SIZE; ++i)
|
242
|
+
{
|
243
|
+
m_records.push_back(connection::record());
|
244
|
+
connection::record& rec = m_records[m_records.size() - 1];
|
245
|
+
rec.id = i;
|
246
|
+
rec.type = 1;
|
247
|
+
switch (i)
|
248
|
+
{
|
249
|
+
case TD_EXTENDED_VAR_MYSQL_GTID_MODE:
|
250
|
+
{
|
251
|
+
rec.type = 0;
|
252
|
+
#if (defined(MYSQL_5_7))
|
253
|
+
rec.longValue = (long long)get_gtid_mode(GTID_MODE_LOCK_NONE);
|
254
|
+
#else
|
255
|
+
rec.longValue = 0;
|
256
|
+
#endif
|
257
|
+
break;
|
258
|
+
}
|
259
|
+
case TD_EXTENDED_VAR_BINLOG_FILE:
|
260
|
+
strncpy(rec.name, bpos.filename, CON_REC_VALUE_SIZE);
|
261
|
+
break;
|
262
|
+
case TD_EXTENDED_VAR_BINLOG_POS:
|
263
|
+
rec.longValue = bpos.pos;
|
264
|
+
rec.type = 0;
|
265
|
+
break;
|
266
|
+
case TD_EXTENDED_VAR_BINLOG_GTID:
|
267
|
+
if (bpos.type == REPL_POSTYPE_GTID)
|
268
|
+
rec.type = 2;
|
269
|
+
else
|
270
|
+
strncpy(rec.name, bpos.gtid, CON_REC_VALUE_SIZE);
|
271
|
+
break;
|
272
|
+
}
|
273
|
+
}
|
274
|
+
return m_records;
|
275
|
+
}
|
276
|
+
|
226
277
|
const connection::records& connManager::statusVariables() const
|
227
278
|
{
|
228
279
|
m_records.clear();
|
@@ -241,77 +292,38 @@ const connection::records& connManager::statusVariables() const
|
|
241
292
|
return m_records;
|
242
293
|
}
|
243
294
|
|
244
|
-
|
245
295
|
const connection::records& connManager::definedDatabases() const
|
246
296
|
{
|
247
297
|
m_records.clear();
|
248
|
-
|
298
|
+
boost::shared_ptr<THD> thd(createThdForThread(), deleteThdForThread);
|
299
|
+
if (thd != NULL)
|
249
300
|
{
|
250
|
-
|
251
|
-
|
252
|
-
{
|
253
|
-
cp_security_ctx(thd.get())->skip_grants();
|
254
|
-
readDbList(thd.get(), m_records);
|
255
|
-
}
|
256
|
-
}
|
257
|
-
catch (bzs::rtl::exception& e)
|
258
|
-
{
|
259
|
-
const int* code = getCode(e);
|
260
|
-
if (code)
|
261
|
-
m_stat = *code;
|
262
|
-
else
|
263
|
-
{
|
264
|
-
m_stat = 20000;
|
265
|
-
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
266
|
-
}
|
267
|
-
printWarningMessage(code, getMsg(e));
|
268
|
-
}
|
269
|
-
catch (...)
|
270
|
-
{
|
271
|
-
m_stat = 20001;
|
301
|
+
cp_security_ctx(thd.get())->skip_grants();
|
302
|
+
readDbList(thd.get(), m_records);
|
272
303
|
}
|
273
304
|
return m_records;
|
274
305
|
}
|
275
306
|
|
276
307
|
const connection::records& connManager::getTableList(const char* dbname, int type) const
|
277
308
|
{
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
309
|
+
m_records.clear();
|
310
|
+
if (dbname && dbname[0])
|
311
|
+
{
|
312
|
+
boost::shared_ptr<database> db(new database(dbname, 1));
|
313
|
+
if (db)
|
282
314
|
{
|
283
|
-
|
284
|
-
|
315
|
+
std::vector<std::string> tablelist;
|
316
|
+
schemaBuilder::listTable(db.get(), tablelist, type);
|
317
|
+
for (int i = 0; i < (int)tablelist.size(); ++i)
|
285
318
|
{
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
connection::record& rec = m_records[m_records.size() - 1];
|
292
|
-
strncpy(rec.name, tablelist[i].c_str(), 64);
|
293
|
-
rec.name[64] = 0x00;
|
294
|
-
rec.type = (short)type;
|
295
|
-
}
|
319
|
+
m_records.push_back(connection::record());
|
320
|
+
connection::record& rec = m_records[m_records.size() - 1];
|
321
|
+
strncpy(rec.name, tablelist[i].c_str(), 64);
|
322
|
+
rec.name[64] = 0x00;
|
323
|
+
rec.type = 1;
|
296
324
|
}
|
297
325
|
}
|
298
326
|
}
|
299
|
-
catch (bzs::rtl::exception& e)
|
300
|
-
{
|
301
|
-
const int* code = getCode(e);
|
302
|
-
if (code)
|
303
|
-
m_stat = *code;
|
304
|
-
else
|
305
|
-
{
|
306
|
-
m_stat = 20000;
|
307
|
-
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
308
|
-
}
|
309
|
-
printWarningMessage(code, getMsg(e));
|
310
|
-
}
|
311
|
-
catch (...)
|
312
|
-
{
|
313
|
-
m_stat = 20001;
|
314
|
-
}
|
315
327
|
return m_records;
|
316
328
|
}
|
317
329
|
|
@@ -332,44 +344,53 @@ bool connManager::checkGlobalACL(THD* thd, ulong wantAccess) const
|
|
332
344
|
cp_security_ctx(thd)->skip_grants();
|
333
345
|
else
|
334
346
|
::setGrant(thd, mod->host(), mod->user(), NULL);
|
335
|
-
|
347
|
+
bool ret = (cp_masterAccess(thd) & wantAccess) != 0;
|
336
348
|
if (!ret)
|
337
349
|
m_stat = STATUS_ACCESS_DENIED;
|
338
350
|
return ret;
|
339
351
|
}
|
340
352
|
|
341
|
-
const connection::records& connManager::
|
353
|
+
const connection::records& connManager::readByProtocol(int type, blobBuffer* bb,
|
354
|
+
const char* channel) const
|
342
355
|
{
|
343
356
|
m_records.clear();
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
return m_records;
|
351
|
-
}
|
352
|
-
if (!checkGlobalACL(thd.get(), SUPER_ACL | REPL_CLIENT_ACL))
|
353
|
-
return m_records;
|
354
|
-
|
355
|
-
m_stat = errorCode(getSlaveStatus(thd.get(), m_records, bb));
|
356
|
-
}
|
357
|
-
catch (bzs::rtl::exception& e)
|
357
|
+
boost::shared_ptr<THD> thd(createThdForThread(), deleteThdForThread);
|
358
|
+
if (thd == NULL)
|
359
|
+
m_stat = 20001;
|
360
|
+
else if (!checkGlobalACL(thd.get(), SUPER_ACL | REPL_CLIENT_ACL))
|
361
|
+
m_stat = STATUS_ACCESS_DENIED;
|
362
|
+
else
|
358
363
|
{
|
359
|
-
|
360
|
-
if (
|
361
|
-
|
364
|
+
int ret;
|
365
|
+
if (type == TD_STSTCS_SLAVE_STATUS)
|
366
|
+
ret = getSlaveStatus(thd.get(), channel, m_records, bb);
|
362
367
|
else
|
363
|
-
|
364
|
-
|
365
|
-
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
366
|
-
}
|
367
|
-
printWarningMessage(code, getMsg(e));
|
368
|
+
ret = getSlaveHosts(thd.get(), m_records, bb);
|
369
|
+
m_stat = errorCode(ret);
|
368
370
|
}
|
369
|
-
|
370
|
-
|
371
|
+
return m_records;
|
372
|
+
}
|
373
|
+
|
374
|
+
const connection::records& connManager::readSlaveStatus(const char* channel, blobBuffer* bb) const
|
375
|
+
{
|
376
|
+
return readByProtocol(TD_STSTCS_SLAVE_STATUS, bb, channel);
|
377
|
+
}
|
378
|
+
|
379
|
+
const connection::records& connManager::slaveHosts(blobBuffer* bb) const
|
380
|
+
{
|
381
|
+
return readByProtocol(TD_STSTCS_SLAVE_HOSTS, bb);
|
382
|
+
}
|
383
|
+
|
384
|
+
const connection::records& connManager::channels() const
|
385
|
+
{
|
386
|
+
m_records.clear();
|
387
|
+
boost::shared_ptr<THD> thd(createThdForThread(), deleteThdForThread);
|
388
|
+
if (thd == NULL)
|
371
389
|
m_stat = 20001;
|
372
|
-
|
390
|
+
else if (!checkGlobalACL(thd.get(), REPL_CLIENT_ACL))
|
391
|
+
m_stat = STATUS_ACCESS_DENIED;
|
392
|
+
else
|
393
|
+
m_stat = errorCode(getChannels(thd.get(), m_records));
|
373
394
|
return m_records;
|
374
395
|
}
|
375
396
|
|
@@ -381,13 +402,17 @@ void connManager::doDisconnect(unsigned __int64 conid)
|
|
381
402
|
igetDatabases* dbm =
|
382
403
|
dynamic_cast<igetDatabases*>(mod->m_commandExecuter.get());
|
383
404
|
const databases& dbs = dbm->dbs();
|
384
|
-
|
405
|
+
for (size_t i = 0; i < dbs.size(); ++i)
|
385
406
|
{
|
386
|
-
if (dbs[
|
387
|
-
|
388
|
-
|
389
|
-
|
407
|
+
if (dbs[i])
|
408
|
+
{
|
409
|
+
if (!dbs[i]->checkAcl(SHUTDOWN_ACL))
|
410
|
+
m_stat = STATUS_ACCESS_DENIED;
|
411
|
+
break;
|
412
|
+
}
|
390
413
|
}
|
414
|
+
if (m_stat == 0)
|
415
|
+
mod->disconnect();
|
391
416
|
}
|
392
417
|
}
|
393
418
|
|