transactd 3.1.0 → 3.2.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/bin/common/tdclc_32_3_2.dll +0 -0
- data/bin/common/{tdclc_64_3_1.dll → tdclc_64_3_2.dll} +0 -0
- data/build/swig/ruby/ruby.swg +3 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +2413 -126
- data/build/swig/tdcl.i +120 -9
- data/build/tdclc/tdclc.cbproj +4 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +8 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +138 -130
- data/source/bzs/db/engine/mysql/database.h +43 -48
- data/source/bzs/db/engine/mysql/dbManager.cpp +81 -96
- data/source/bzs/db/engine/mysql/dbManager.h +13 -22
- data/source/bzs/db/engine/mysql/mysqlInternal.h +157 -291
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +425 -0
- data/source/bzs/db/engine/mysql/mysqlProtocol.h +72 -0
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +8 -6
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +7 -3
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -0
- data/source/bzs/db/protocol/tdap/client/client.h +22 -8
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +225 -21
- data/source/bzs/db/protocol/tdap/client/connMgr.h +42 -16
- data/source/bzs/db/protocol/tdap/client/database.cpp +58 -15
- data/source/bzs/db/protocol/tdap/client/database.h +3 -3
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +93 -85
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +9 -5
- data/source/bzs/db/protocol/tdap/client/filter.h +2 -2
- data/source/bzs/db/protocol/tdap/client/groupComp.h +2 -2
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +71 -12
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +7 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +35 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -1
- data/source/bzs/db/protocol/tdap/client/recordset.h +15 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +21 -16
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +32 -11
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +3 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +18 -14
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +8 -3
- data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +83 -43
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +7 -7
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +247 -137
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +9 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.h +3 -7
- data/source/bzs/db/protocol/tdap/tdapcapi.h +23 -3
- data/source/bzs/db/protocol/tdap/uri.h +40 -0
- data/source/bzs/db/transactd/appModule.cpp +14 -5
- data/source/bzs/db/transactd/appModule.h +10 -1
- data/source/bzs/db/transactd/connManager.cpp +93 -48
- data/source/bzs/db/transactd/connManager.h +10 -7
- data/source/bzs/db/transactd/connectionRecord.h +114 -19
- data/source/bzs/env/tstring.h +2 -0
- data/source/bzs/example/changeSchema.cpp +1 -1
- data/source/bzs/example/changeSchema_c.cpp +1 -1
- data/source/bzs/example/insertRecords.cpp +2 -1
- data/source/bzs/example/insertRecords_c.cpp +2 -1
- data/source/bzs/example/queryData.cpp +5 -2
- data/source/bzs/netsvc/server/IAppModule.h +6 -0
- data/source/bzs/test/tdclatl/test_v3.js +75 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +104 -7
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +84 -0
- data/source/bzs/test/trdclengn/testField.h +66 -6
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +10 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +85 -0
- data/source/bzs/test/trdclengn/testbase.h +1 -1
- data/source/global/tdclatl/BinlogPos.cpp +64 -0
- data/source/global/tdclatl/BinlogPos.h +84 -0
- data/source/global/tdclatl/ConnMgr.cpp +285 -0
- data/source/global/tdclatl/ConnMgr.h +83 -0
- data/source/global/tdclatl/ConnRecord.cpp +123 -0
- data/source/global/tdclatl/ConnRecord.h +69 -0
- data/source/global/tdclatl/ConnRecords.cpp +57 -0
- data/source/global/tdclatl/ConnRecords.h +55 -0
- data/source/global/tdclatl/Database.cpp +36 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/Table.cpp +14 -1
- data/source/global/tdclatl/Table.h +1 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +148 -4
- metadata +14 -4
- data/bin/common/tdclc_32_3_1.dll +0 -0
|
@@ -185,6 +185,11 @@ typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
|
|
185
185
|
*/
|
|
186
186
|
#define TD_ASBLOB_ENDROW -125
|
|
187
187
|
|
|
188
|
+
/** TD_GET_SCHEMA sub operations
|
|
189
|
+
*/
|
|
190
|
+
#define SC_SUBOP_BY_SQL -1
|
|
191
|
+
#define SC_SUBOP_VIEW_BY_SQL -2
|
|
192
|
+
|
|
188
193
|
/** TD_GET_STASTISTICS sub operations
|
|
189
194
|
*/
|
|
190
195
|
#define TD_STSTCS_READ 0
|
|
@@ -193,6 +198,10 @@ typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
|
|
193
198
|
#define TD_STSTCS_DATABASE_LIST 3
|
|
194
199
|
#define TD_STSTCS_SYSTEM_VARIABLES 4
|
|
195
200
|
#define TD_STSTCS_SCHEMA_TABLE_LIST 5
|
|
201
|
+
#define TD_STSTCS_TABLE_LIST 6
|
|
202
|
+
#define TD_STSTCS_VIEW_LIST 7
|
|
203
|
+
#define TD_STSTCS_SLAVE_STATUS 8
|
|
204
|
+
|
|
196
205
|
/** connect sub operation
|
|
197
206
|
*/
|
|
198
207
|
|
|
@@ -201,6 +210,14 @@ typedef void(__STDCALL* WIN_TPOOL_SHUTDOWN_PTR)();
|
|
|
201
210
|
#define LG_SUBOP_NEWCONNECT 3
|
|
202
211
|
#define LG_SUBOP_RECONNECT 4
|
|
203
212
|
#define LG_SUBOP_DISCONNECT_EX 5 //for reconnect test
|
|
213
|
+
#define LG_SUBOP_ASSOCIATE 6
|
|
214
|
+
|
|
215
|
+
/** TD_STSTCS_TABLE_LIST type list
|
|
216
|
+
*/
|
|
217
|
+
#define TABLE_TYPE_NORMAL_TABLE 1
|
|
218
|
+
#define TABLE_TYPE_VIEW 2
|
|
219
|
+
#define TABLE_TYPE_TD_SCHEMA 4
|
|
220
|
+
|
|
204
221
|
|
|
205
222
|
/** TIMESTAMP_MODE
|
|
206
223
|
*/
|
|
@@ -455,6 +472,7 @@ enum combineType
|
|
|
455
472
|
#define STATUS_LMIT_OF_PREPAREED 203
|
|
456
473
|
#define STATUS_ALREADY_INSNAPSHOT 204
|
|
457
474
|
#define STATUS_ALREADY_INTRANSACTION 205
|
|
475
|
+
#define STATUS_ALREADY_INEXCLUSIVE 206
|
|
458
476
|
#define SERVER_CLIENT_NOT_COMPATIBLE 3003
|
|
459
477
|
#define NET_BAD_SRB_FORMAT 3021
|
|
460
478
|
#define ERROR_TD_HOSTNAME_NOT_FOUND 3103
|
|
@@ -478,6 +496,8 @@ inline bool canRecoverNetError(short code)
|
|
|
478
496
|
#define TRANSACTD_SCHEMANAME _T("transactd_schema")
|
|
479
497
|
#define TYPE_SCHEMA_BDF 0
|
|
480
498
|
#define TYPE_SCHEMA_DDF 1
|
|
499
|
+
#define TYPE_SCHEMA_BDF_NOPRELOAD 2
|
|
500
|
+
|
|
481
501
|
|
|
482
502
|
#define FILTER_CURRENT_TYPE_NOTINC 0
|
|
483
503
|
#define FILTER_CURRENT_TYPE_INC 1
|
|
@@ -593,7 +613,7 @@ struct handshale_t
|
|
|
593
613
|
If you change this version then you need change The ($TargetName) project options too.
|
|
594
614
|
*/
|
|
595
615
|
#define C_INTERFACE_VER_MAJOR "3"//##1 Build marker! Don't remove
|
|
596
|
-
#define C_INTERFACE_VER_MINOR "
|
|
616
|
+
#define C_INTERFACE_VER_MINOR "2"//##2 Build marker! Don't remove
|
|
597
617
|
#define C_INTERFACE_VER_RELEASE "0"//##3 Build marker! Don't remove
|
|
598
618
|
|
|
599
619
|
/* dnamic load library name.
|
|
@@ -657,7 +677,7 @@ struct handshale_t
|
|
|
657
677
|
*/
|
|
658
678
|
|
|
659
679
|
#define CPP_INTERFACE_VER_MAJOR "3"//##4 Build marker! Don't remove
|
|
660
|
-
#define CPP_INTERFACE_VER_MINOR "
|
|
680
|
+
#define CPP_INTERFACE_VER_MINOR "2"//##5 Build marker! Don't remove
|
|
661
681
|
#define CPP_INTERFACE_VER_RELEASE "0"//##6 Build marker! Don't remove
|
|
662
682
|
|
|
663
683
|
/* use autolink tdclcpp */
|
|
@@ -694,7 +714,7 @@ struct handshale_t
|
|
|
694
714
|
|
|
695
715
|
|
|
696
716
|
#define TRANSACTD_VER_MAJOR 3//##7 Build marker! Don't remove
|
|
697
|
-
#define TRANSACTD_VER_MINOR
|
|
717
|
+
#define TRANSACTD_VER_MINOR 2//##8 Build marker! Don't remove
|
|
698
718
|
#define TRANSACTD_VER_RELEASE 0//##9 Build marker! Don't remove
|
|
699
719
|
|
|
700
720
|
#endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
|
|
@@ -130,6 +130,8 @@ inline const _TCHAR* dbname(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
|
130
130
|
{
|
|
131
131
|
_tcsncpy_s(buf, size, st, en - st);
|
|
132
132
|
buf[en - st] = 0x00;
|
|
133
|
+
int n = (int)(en - st -1);
|
|
134
|
+
if (n >= 0 && buf[n] == '/') buf[n] = 0x00;
|
|
133
135
|
}
|
|
134
136
|
}
|
|
135
137
|
}
|
|
@@ -185,6 +187,27 @@ inline const _TCHAR* passwd(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
|
185
187
|
return buf;
|
|
186
188
|
}
|
|
187
189
|
|
|
190
|
+
|
|
191
|
+
{
|
|
192
|
+
_TCHAR pwd[MAX_PATH];
|
|
193
|
+
passwd(uri, pwd, MAX_PATH);
|
|
194
|
+
|
|
195
|
+
buf[0] = 0x00;
|
|
196
|
+
const _TCHAR* st = _tcsstr(uri, _T("://"));
|
|
197
|
+
if (st)
|
|
198
|
+
{
|
|
199
|
+
st = _tcsstr(st + 3, _T("/"));
|
|
200
|
+
_tcsncpy_s(buf, size, uri, ++st - uri);
|
|
201
|
+
buf[st - uri] = 0x00;
|
|
202
|
+
if (pwd[0])
|
|
203
|
+
{
|
|
204
|
+
_tcscat_s(buf, MAX_PATH, _T("?pwd="));
|
|
205
|
+
_tcscat_s(buf, MAX_PATH, pwd);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
return buf;
|
|
210
|
+
}
|
|
188
211
|
|
|
189
212
|
inline _TCHAR* stripParam(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
190
213
|
{
|
|
@@ -239,6 +262,23 @@ inline const _TCHAR* stripAuth(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
|
239
262
|
return buf;
|
|
240
263
|
}
|
|
241
264
|
|
|
265
|
+
inline const _TCHAR* appendAuth(const _TCHAR* uri, const _TCHAR* user, const _TCHAR* passwd,
|
|
266
|
+
_TCHAR* buf, size_t size)
|
|
267
|
+
{
|
|
268
|
+
memset(buf, 0, size);
|
|
269
|
+
if (_tcslen(uri) + _tcslen(user) + _tcslen(passwd) + _tcslen(_T("@&pwd=")) > size -1)
|
|
270
|
+
return buf;
|
|
271
|
+
|
|
272
|
+
const _TCHAR* st = _tcsstr(uri, _T("://"));
|
|
273
|
+
_tcsncpy_s(buf, size, uri, st + 3 - uri);
|
|
274
|
+
_tcscat_s(buf, size, user);
|
|
275
|
+
_tcscat_s(buf, size, _T("@"));
|
|
276
|
+
_tcscat_s(buf, size, st+3);
|
|
277
|
+
_tcscat_s(buf, size, _T("&pwd="));
|
|
278
|
+
_tcscat_s(buf, size, passwd);
|
|
279
|
+
return buf;
|
|
280
|
+
}
|
|
281
|
+
|
|
242
282
|
inline void reorder_digest(boost::uuids::detail::sha1::digest_type val)
|
|
243
283
|
{
|
|
244
284
|
for (int i=0;i<5;++i)
|
|
@@ -305,7 +305,7 @@ public:
|
|
|
305
305
|
*/
|
|
306
306
|
module::module(const boost::asio::ip::tcp::endpoint& endpoint,
|
|
307
307
|
iconnection* connection, bool tpool, int type)
|
|
308
|
-
: m_endpoint(endpoint), m_connection(connection), m_useThreadPool(tpool)
|
|
308
|
+
: m_endpoint(endpoint), m_connection(connection), m_useThreadPool(tpool), m_skipGrants(false)
|
|
309
309
|
{
|
|
310
310
|
if (type & PROTOCOL_TYPE_BTRV)
|
|
311
311
|
m_commandExecuter.reset(new protocol::tdap::mysql::commandExecuter(this));
|
|
@@ -325,10 +325,12 @@ module::module(const boost::asio::ip::tcp::endpoint& endpoint,
|
|
|
325
325
|
|
|
326
326
|
module::~module(void)
|
|
327
327
|
{
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
328
|
+
{
|
|
329
|
+
boost::mutex::scoped_lock lck(modulesMutex);
|
|
330
|
+
modules.erase(find(modules.begin(), modules.end(), this));
|
|
331
|
+
delete m_nw;
|
|
332
|
+
m_commandExecuter.reset();
|
|
333
|
+
}
|
|
332
334
|
if (m_useThreadPool == false)
|
|
333
335
|
{
|
|
334
336
|
my_thread_end();
|
|
@@ -434,6 +436,13 @@ bool module::checkHost(const char* hostCheckname, /*out*/char* hostName, int siz
|
|
|
434
436
|
p = "localhost";
|
|
435
437
|
strcpy(hostName, p);
|
|
436
438
|
}
|
|
439
|
+
if (ret)
|
|
440
|
+
{
|
|
441
|
+
if (hostCheckname && hostCheckname[0])
|
|
442
|
+
setUser(hostCheckname);
|
|
443
|
+
if (hostName && hostName[0])
|
|
444
|
+
setHost(hostName);
|
|
445
|
+
}
|
|
437
446
|
return ret;
|
|
438
447
|
}
|
|
439
448
|
|
|
@@ -41,13 +41,17 @@ namespace transactd
|
|
|
41
41
|
class module : public netsvc::server::IAppModule, private boost::noncopyable
|
|
42
42
|
{
|
|
43
43
|
friend class connManager;
|
|
44
|
+
friend class dbExecuter;
|
|
44
45
|
boost::shared_ptr<protocol::ICommandExecuter> m_commandExecuter;
|
|
45
46
|
const boost::asio::ip::tcp::endpoint m_endpoint;
|
|
46
47
|
bzs::netsvc::server::iconnection* m_connection;
|
|
47
48
|
const char* m_readBuf;
|
|
48
49
|
size_t m_readSize;
|
|
49
50
|
netsvc::server::netWriter* m_nw;
|
|
51
|
+
std::string m_user;
|
|
52
|
+
std::string m_host;
|
|
50
53
|
bool m_useThreadPool;
|
|
54
|
+
bool m_skipGrants;
|
|
51
55
|
bool perseLineEnd(const char* p, size_t size) const;
|
|
52
56
|
size_t onRead(const char* data, size_t size, bool& complete);
|
|
53
57
|
size_t onAccept(char* message, size_t bufsize);
|
|
@@ -62,8 +66,13 @@ public:
|
|
|
62
66
|
bool isShutDown() { return m_commandExecuter->isShutDown(); }
|
|
63
67
|
bool checkHost(const char* hostCheckname, /*out*/char* hostName, int size);
|
|
64
68
|
void disconnect();
|
|
69
|
+
const char* user() const {return m_user.c_str();}
|
|
70
|
+
const char* host() const {return m_host.c_str();}
|
|
71
|
+
void setUser(const char* v) { m_user = v;}
|
|
72
|
+
void setHost(const char* v) { m_host = v;}
|
|
73
|
+
void skipGrants(bool v) {m_skipGrants = v;}
|
|
74
|
+
bool isSkipGrants() const {return m_skipGrants;}
|
|
65
75
|
};
|
|
66
|
-
|
|
67
76
|
} // namespace transactd
|
|
68
77
|
} // namespace db
|
|
69
78
|
} // namespace bzs
|
|
@@ -21,12 +21,17 @@
|
|
|
21
21
|
#include <bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h>
|
|
22
22
|
#include "connManager.h"
|
|
23
23
|
#include <bzs/db/engine/mysql/mysqlThd.h>
|
|
24
|
+
#include <bzs/db/engine/mysql/mysqlProtocol.h>
|
|
24
25
|
#include <bzs/db/protocol/tdap/mysql/databaseSchema.h>
|
|
25
26
|
#include <bzs/db/engine/mysql/errorMessage.h>
|
|
26
27
|
|
|
28
|
+
|
|
27
29
|
/* implemnts in transactd.cpp */
|
|
28
30
|
extern const char* get_trd_sys_var(int index);
|
|
29
31
|
|
|
32
|
+
|
|
33
|
+
extern int getSlaveStatus(THD* thd, bzs::db::transactd::connection::records& recs);
|
|
34
|
+
|
|
30
35
|
namespace bzs
|
|
31
36
|
{
|
|
32
37
|
using namespace netsvc::server;
|
|
@@ -89,38 +94,38 @@ void connManager::getDatabaseList(igetDatabases* dbm, const module* mod) const
|
|
|
89
94
|
m_records.push_back(connection::record());
|
|
90
95
|
connection::record& rec = m_records[m_records.size() - 1];
|
|
91
96
|
rec.conId = (unsigned __int64)mod;
|
|
92
|
-
rec.
|
|
93
|
-
rec.
|
|
97
|
+
rec.id = db->clientID();
|
|
98
|
+
rec.db = (unsigned short)j;
|
|
94
99
|
rec.status = 0;
|
|
95
100
|
rec.inTransaction = db->inTransaction();
|
|
96
101
|
rec.inSnapshot = db->inSnapshot();
|
|
97
102
|
if (rec.inTransaction)
|
|
98
103
|
{
|
|
99
104
|
if (db->transactionIsolation() == ISO_REPEATABLE_READ)
|
|
100
|
-
rec.
|
|
105
|
+
rec.type = MULTILOCK_GAP;
|
|
101
106
|
else if (db->transactionIsolation() == ISO_READ_COMMITTED)
|
|
102
107
|
{
|
|
103
108
|
if (db->transactionType() == TRN_RECORD_LOCK_SINGLE)
|
|
104
|
-
rec.
|
|
109
|
+
rec.type = SINGLELOCK_NOGAP;
|
|
105
110
|
else
|
|
106
|
-
rec.
|
|
111
|
+
rec.type = MULTILOCK_NOGAP;
|
|
107
112
|
}
|
|
108
113
|
}
|
|
109
114
|
if (rec.inSnapshot)
|
|
110
115
|
{
|
|
111
116
|
if (db->transactionIsolation() == 0)
|
|
112
|
-
rec.
|
|
117
|
+
rec.type = CONSISTENT_READ;
|
|
113
118
|
else if (db->transactionIsolation() == ISO_REPEATABLE_READ)
|
|
114
|
-
rec.
|
|
119
|
+
rec.type = MULTILOCK_GAP_SHARE;
|
|
115
120
|
else if (db->transactionIsolation() == ISO_READ_COMMITTED)
|
|
116
|
-
rec.
|
|
121
|
+
rec.type = MULTILOCK_NOGAP_SHARE;
|
|
117
122
|
}
|
|
118
123
|
strncpy_s(rec.name, 64, dbs[j]->name().c_str(), 64);
|
|
119
124
|
}
|
|
120
125
|
}
|
|
121
126
|
}
|
|
122
127
|
|
|
123
|
-
const
|
|
128
|
+
const connection::records& connManager::getRecords(unsigned __int64 conid,
|
|
124
129
|
int dbid) const
|
|
125
130
|
{
|
|
126
131
|
//Lock module count
|
|
@@ -159,8 +164,7 @@ const connManager::records& connManager::getRecords(unsigned __int64 conid,
|
|
|
159
164
|
m_records.push_back(connection::record());
|
|
160
165
|
connection::record& rec =
|
|
161
166
|
m_records[m_records.size() - 1];
|
|
162
|
-
rec.
|
|
163
|
-
rec.cid = tb->id();
|
|
167
|
+
rec.id = tb->id();
|
|
164
168
|
rec.readCount = tb->readCount();
|
|
165
169
|
rec.updCount = tb->updCount();
|
|
166
170
|
rec.delCount = tb->delCount();
|
|
@@ -180,7 +184,7 @@ const connManager::records& connManager::getRecords(unsigned __int64 conid,
|
|
|
180
184
|
return m_records;
|
|
181
185
|
}
|
|
182
186
|
|
|
183
|
-
const
|
|
187
|
+
const connection::records& connManager::systemVariables() const
|
|
184
188
|
{
|
|
185
189
|
m_records.clear();
|
|
186
190
|
for (int i = 0 ; i < TD_VAR_SIZE; ++i)
|
|
@@ -190,7 +194,7 @@ const connManager::records& connManager::systemVariables() const
|
|
|
190
194
|
{
|
|
191
195
|
m_records.push_back(connection::record());
|
|
192
196
|
connection::record& rec = m_records[m_records.size() - 1];
|
|
193
|
-
rec.
|
|
197
|
+
rec.id = i;
|
|
194
198
|
switch(i)
|
|
195
199
|
{
|
|
196
200
|
case TD_VER_DB:
|
|
@@ -214,41 +218,20 @@ const connManager::records& connManager::systemVariables() const
|
|
|
214
218
|
return m_records;
|
|
215
219
|
}
|
|
216
220
|
|
|
217
|
-
|
|
218
|
-
{
|
|
219
|
-
recs.push_back(connection::record());
|
|
220
|
-
connection::record& rec = recs[recs.size() - 1];
|
|
221
|
-
strncpy(rec.name, db_name->str, 64);
|
|
222
|
-
rec.name[64] = 0x00;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const connManager::records& connManager::getDefinedDatabaseList() const
|
|
221
|
+
const connection::records& connManager::definedDatabases() const
|
|
226
222
|
{
|
|
227
223
|
m_records.clear();
|
|
228
|
-
THD* thd = createThdForThread();
|
|
229
224
|
try
|
|
230
225
|
{
|
|
231
|
-
|
|
226
|
+
boost::shared_ptr<THD> thd(createThdForThread(), deleteThdForThread);
|
|
227
|
+
if (thd != NULL)
|
|
232
228
|
{
|
|
233
|
-
cp_security_ctx(thd)->skip_grants();
|
|
234
|
-
|
|
235
|
-
db_list(thd, &files);
|
|
236
|
-
#if (defined(MARIADDB_10_0) || defined(MARIADDB_10_1))
|
|
237
|
-
for (int i = 0; i < (int)files.elements(); ++i)
|
|
238
|
-
appenDbList(m_records, files.at(i));
|
|
239
|
-
#else
|
|
240
|
-
List_iterator_fast<LEX_STRING> it(files);
|
|
241
|
-
LEX_STRING* db_name;
|
|
242
|
-
while ((db_name = it++))
|
|
243
|
-
appenDbList(m_records, db_name);
|
|
244
|
-
#endif
|
|
245
|
-
deleteThdForThread(thd);
|
|
229
|
+
cp_security_ctx(thd.get())->skip_grants();
|
|
230
|
+
readDbList(thd.get(), m_records);
|
|
246
231
|
}
|
|
247
232
|
}
|
|
248
233
|
catch (bzs::rtl::exception& e)
|
|
249
234
|
{
|
|
250
|
-
if (thd)
|
|
251
|
-
deleteThdForThread(thd);
|
|
252
235
|
const int* code = getCode(e);
|
|
253
236
|
if (code)
|
|
254
237
|
m_stat = *code;
|
|
@@ -261,17 +244,12 @@ const connManager::records& connManager::getDefinedDatabaseList() const
|
|
|
261
244
|
}
|
|
262
245
|
catch (...)
|
|
263
246
|
{
|
|
264
|
-
|
|
265
|
-
{
|
|
266
|
-
m_stat = 20001;
|
|
267
|
-
deleteThdForThread(thd);
|
|
268
|
-
}
|
|
269
|
-
catch(...){}
|
|
247
|
+
m_stat = 20001;
|
|
270
248
|
}
|
|
271
249
|
return m_records;
|
|
272
250
|
}
|
|
273
251
|
|
|
274
|
-
const
|
|
252
|
+
const connection::records& connManager::getTableList(const char* dbname, int type) const
|
|
275
253
|
{
|
|
276
254
|
try
|
|
277
255
|
{
|
|
@@ -282,13 +260,14 @@ const connManager::records& connManager::schemaTableList(const char* dbname)
|
|
|
282
260
|
if (db)
|
|
283
261
|
{
|
|
284
262
|
std::vector<std::string> tablelist;
|
|
285
|
-
schemaBuilder::
|
|
263
|
+
schemaBuilder::listTable(db.get(), tablelist, type);
|
|
286
264
|
for (int i = 0; i < (int)tablelist.size(); ++i)
|
|
287
265
|
{
|
|
288
266
|
m_records.push_back(connection::record());
|
|
289
267
|
connection::record& rec = m_records[m_records.size() - 1];
|
|
290
268
|
strncpy(rec.name, tablelist[i].c_str(), 64);
|
|
291
269
|
rec.name[64] = 0x00;
|
|
270
|
+
rec.type = (short)type;
|
|
292
271
|
}
|
|
293
272
|
}
|
|
294
273
|
}
|
|
@@ -312,6 +291,64 @@ const connManager::records& connManager::schemaTableList(const char* dbname)
|
|
|
312
291
|
return m_records;
|
|
313
292
|
}
|
|
314
293
|
|
|
294
|
+
const connection::records& connManager::definedTables(const char* dbname, int type) const
|
|
295
|
+
{
|
|
296
|
+
return getTableList(dbname, type);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const connection::records& connManager::schemaTables(const char* dbname) const
|
|
300
|
+
{
|
|
301
|
+
return getTableList(dbname, TABLE_TYPE_TD_SCHEMA);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
bool connManager::checkGlobalACL(THD* thd, ulong wantAccess) const
|
|
305
|
+
{
|
|
306
|
+
const module* mod = reinterpret_cast<const module*>(m_me);
|
|
307
|
+
if (mod->isSkipGrants())
|
|
308
|
+
cp_security_ctx(thd)->skip_grants();
|
|
309
|
+
else
|
|
310
|
+
::setGrant(thd, mod->host(), mod->user(), NULL);
|
|
311
|
+
bool ret = (cp_masterAccess(thd) & wantAccess) != 0;
|
|
312
|
+
if (!ret)
|
|
313
|
+
m_stat = STATUS_ACCESS_DENIED;
|
|
314
|
+
return ret;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const connection::records& connManager::readSlaveStatus() const
|
|
318
|
+
{
|
|
319
|
+
m_records.clear();
|
|
320
|
+
try
|
|
321
|
+
{
|
|
322
|
+
boost::shared_ptr<THD> thd(createThdForThread(), deleteThdForThread);
|
|
323
|
+
if (thd == NULL)
|
|
324
|
+
{
|
|
325
|
+
m_stat = 20001;
|
|
326
|
+
return m_records;
|
|
327
|
+
}
|
|
328
|
+
if (!checkGlobalACL(thd.get(), SUPER_ACL | REPL_CLIENT_ACL))
|
|
329
|
+
return m_records;
|
|
330
|
+
|
|
331
|
+
m_stat = errorCode(getSlaveStatus(thd.get(), m_records));
|
|
332
|
+
}
|
|
333
|
+
catch (bzs::rtl::exception& e)
|
|
334
|
+
{
|
|
335
|
+
const int* code = getCode(e);
|
|
336
|
+
if (code)
|
|
337
|
+
m_stat = *code;
|
|
338
|
+
else
|
|
339
|
+
{
|
|
340
|
+
m_stat = 20000;
|
|
341
|
+
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
|
342
|
+
}
|
|
343
|
+
printWarningMessage(code, getMsg(e));
|
|
344
|
+
}
|
|
345
|
+
catch (...)
|
|
346
|
+
{
|
|
347
|
+
m_stat = 20001;
|
|
348
|
+
}
|
|
349
|
+
return m_records;
|
|
350
|
+
}
|
|
351
|
+
|
|
315
352
|
void connManager::doDisconnect(unsigned __int64 conid)
|
|
316
353
|
{
|
|
317
354
|
module* mod = const_cast<module*>(getMod(conid));
|
|
@@ -321,7 +358,12 @@ void connManager::doDisconnect(unsigned __int64 conid)
|
|
|
321
358
|
dynamic_cast<igetDatabases*>(mod->m_commandExecuter.get());
|
|
322
359
|
const databases& dbs = dbm->dbs();
|
|
323
360
|
if (dbs.size())
|
|
324
|
-
|
|
361
|
+
{
|
|
362
|
+
if (dbs[0]->checkAcl(SHUTDOWN_ACL))
|
|
363
|
+
mod->disconnect();
|
|
364
|
+
else
|
|
365
|
+
m_stat = STATUS_ACCESS_DENIED;
|
|
366
|
+
}
|
|
325
367
|
}
|
|
326
368
|
}
|
|
327
369
|
|
|
@@ -344,12 +386,15 @@ void connManager::disconnect(unsigned __int64 conid)
|
|
|
344
386
|
|
|
345
387
|
void connManager::doDisconnectAll()
|
|
346
388
|
{
|
|
389
|
+
short stat = 0;
|
|
347
390
|
for (size_t i = 0; i < modules.size(); i++)
|
|
348
391
|
{
|
|
349
392
|
const module* mod = dynamic_cast<module*>(modules[i]);
|
|
350
393
|
if (mod && ((unsigned __int64)mod != m_me))
|
|
351
394
|
doDisconnect((unsigned __int64)mod);
|
|
395
|
+
if (stat == 0) stat = m_stat;
|
|
352
396
|
}
|
|
397
|
+
m_stat = stat;
|
|
353
398
|
}
|
|
354
399
|
|
|
355
400
|
void connManager::disconnectAll()
|
|
@@ -41,10 +41,10 @@ class module;
|
|
|
41
41
|
class connManager
|
|
42
42
|
{
|
|
43
43
|
public:
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
|
|
46
46
|
private:
|
|
47
|
-
mutable records m_records;
|
|
47
|
+
mutable connection::records m_records;
|
|
48
48
|
unsigned __int64 m_me;
|
|
49
49
|
mutable short m_stat;
|
|
50
50
|
void getConnectionList() const;
|
|
@@ -54,14 +54,17 @@ private:
|
|
|
54
54
|
bzs::db::engine::mysql::igetDatabases* dbm, int dbid) const;
|
|
55
55
|
void doDisconnect(unsigned __int64 conid);
|
|
56
56
|
void doDisconnectAll();
|
|
57
|
-
|
|
57
|
+
const connection::records& getTableList(const char* dbname, int type) const;
|
|
58
|
+
bool checkGlobalACL(THD* thd, ulong wantAccess) const;
|
|
58
59
|
public:
|
|
59
60
|
connManager(unsigned __int64 me) : m_me(me), m_stat(0){};
|
|
60
61
|
virtual ~connManager();
|
|
61
|
-
const
|
|
62
|
-
const records& getRecords(unsigned __int64 conid, int dbid) const;
|
|
63
|
-
const records&
|
|
64
|
-
const records&
|
|
62
|
+
const connection::records& systemVariables() const;
|
|
63
|
+
const connection::records& getRecords(unsigned __int64 conid, int dbid) const;
|
|
64
|
+
const connection::records& definedDatabases() const;
|
|
65
|
+
const connection::records& schemaTables(const char* dbname) const;
|
|
66
|
+
const connection::records& definedTables(const char* dbname, int type) const;
|
|
67
|
+
const connection::records& readSlaveStatus() const;
|
|
65
68
|
void disconnect(unsigned __int64 conid);
|
|
66
69
|
void disconnectAll();
|
|
67
70
|
short stat() const {return m_stat;}
|