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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*=================================================================
|
|
2
|
-
Copyright (C) 2013 BizStation Corp All rights reserved.
|
|
2
|
+
Copyright (C) 2013-2016 BizStation Corp All rights reserved.
|
|
3
3
|
|
|
4
4
|
This program is free software; you can redistribute it and/or
|
|
5
5
|
modify it under the terms of the GNU General Public License
|
|
@@ -32,6 +32,104 @@ namespace tdap
|
|
|
32
32
|
namespace client
|
|
33
33
|
{
|
|
34
34
|
|
|
35
|
+
static const _TCHAR* SYSVAR_NAME[TD_VAR_SIZE] =
|
|
36
|
+
{
|
|
37
|
+
_T("database_version"),
|
|
38
|
+
_T("transactd_version"),
|
|
39
|
+
_T("address"),
|
|
40
|
+
_T("port"),
|
|
41
|
+
_T("hostcheck_username"),
|
|
42
|
+
_T("max_tcp_connections"),
|
|
43
|
+
_T("table_name_lowercase"),
|
|
44
|
+
_T("pool_threads"),
|
|
45
|
+
_T("tcp_server_type"),
|
|
46
|
+
_T("lock_wait_timeout"),
|
|
47
|
+
_T("transaction_isolation"),
|
|
48
|
+
_T("auth_type"),
|
|
49
|
+
_T("pipe_comm_sharemem_size"),
|
|
50
|
+
_T("max_pipe_connections"),
|
|
51
|
+
_T("use_piped_local"),
|
|
52
|
+
_T("hs_port"),
|
|
53
|
+
_T("use_handlersocket"),
|
|
54
|
+
_T("timestamp_always)")
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
static const _TCHAR* SLAVE_STATUS_NAME[SLAVE_STATUS_DEFAULT_SIZE] =
|
|
58
|
+
{
|
|
59
|
+
_T("Slave_IO_State"),
|
|
60
|
+
_T("Master_Host"),
|
|
61
|
+
_T("Master_User"),
|
|
62
|
+
_T("Master_Port"),
|
|
63
|
+
_T("Connect_Retry"),
|
|
64
|
+
_T("Master_Log_File"),
|
|
65
|
+
_T("Read_Master_Log_Pos"),
|
|
66
|
+
_T("Relay_Log_File"),
|
|
67
|
+
_T("Relay_Log_Pos"),
|
|
68
|
+
_T("Relay_Master_Log_File"),
|
|
69
|
+
_T("Slave_IO_Running"),
|
|
70
|
+
_T("Slave_SQL_Running"),
|
|
71
|
+
_T("Replicate_Do_DB"),
|
|
72
|
+
_T("Replicate_Ignore_DB"),
|
|
73
|
+
_T("Replicate_Do_Table"),
|
|
74
|
+
_T("Replicate_Ignore_Table"),
|
|
75
|
+
_T("Replicate_Wild_Do_Table"),
|
|
76
|
+
_T("Replicate_Wild_Ignore_Table"),
|
|
77
|
+
_T("Last_Errno"),
|
|
78
|
+
_T("Last_Error"),
|
|
79
|
+
_T("Skip_Counter"),
|
|
80
|
+
_T("Exec_Master_Log_Pos"),
|
|
81
|
+
_T("Relay_Log_Space"),
|
|
82
|
+
_T("Until_Condition"),
|
|
83
|
+
_T("Until_Log_File"),
|
|
84
|
+
_T("Until_Log_Pos"),
|
|
85
|
+
_T("Master_SSL_Allowed"),
|
|
86
|
+
_T("Master_SSL_CA_File"),
|
|
87
|
+
_T("Master_SSL_CA_Path"),
|
|
88
|
+
_T("Master_SSL_Cert"),
|
|
89
|
+
_T("Master_SSL_Cipher"),
|
|
90
|
+
_T("Master_SSL_Key"),
|
|
91
|
+
_T("Seconds_Behind_Master"),
|
|
92
|
+
_T("Master_SSL_Verify_Server_Cert"),
|
|
93
|
+
_T("Last_IO_Errno"),
|
|
94
|
+
_T("Last_IO_Error"),
|
|
95
|
+
_T("Last_SQL_Errno"),
|
|
96
|
+
_T("Last_SQL_Error"),
|
|
97
|
+
_T("Replicate_Ignore_Server_Ids"),
|
|
98
|
+
_T("Master_Server_Id" ),
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
#pragma pack(push, 1)
|
|
102
|
+
pragma_pack1
|
|
103
|
+
struct oldRrecord
|
|
104
|
+
{
|
|
105
|
+
__int64 conId; // 8 byte
|
|
106
|
+
unsigned int id; // 4 byte
|
|
107
|
+
unsigned short db; // 2 byte
|
|
108
|
+
short type; // 2 byte
|
|
109
|
+
char name[CON_REC_VALUE_SIZE]; // 67 byte
|
|
110
|
+
union
|
|
111
|
+
{
|
|
112
|
+
char status; // 1 byte
|
|
113
|
+
struct
|
|
114
|
+
{
|
|
115
|
+
char inTransaction : 1;
|
|
116
|
+
char inSnapshot : 1;
|
|
117
|
+
char openNormal : 1;
|
|
118
|
+
char openReadOnly : 1;
|
|
119
|
+
char openEx : 1;
|
|
120
|
+
char openReadOnlyEx : 1;
|
|
121
|
+
char dummy : 2;
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
unsigned int readCount; // 4 byte
|
|
125
|
+
unsigned int updCount; // 4 byte
|
|
126
|
+
unsigned int delCount; // 4 byte
|
|
127
|
+
unsigned int insCount; // 4 byte
|
|
128
|
+
|
|
129
|
+
}; // 32 + 68 = 100
|
|
130
|
+
#pragma pack(pop)
|
|
131
|
+
pragma_pop
|
|
132
|
+
|
|
35
133
|
connMgr::connMgr(database* db) : nstable(db)
|
|
36
134
|
{
|
|
37
135
|
m_db = db;
|
|
@@ -41,20 +139,54 @@ connMgr::connMgr(database* db) : nstable(db)
|
|
|
41
139
|
m_keylen = sizeof(m_params);
|
|
42
140
|
}
|
|
43
141
|
|
|
44
|
-
connMgr::~connMgr()
|
|
45
|
-
|
|
46
|
-
}
|
|
142
|
+
connMgr::~connMgr() {}
|
|
143
|
+
|
|
47
144
|
database* connMgr::db() const
|
|
48
145
|
{
|
|
49
146
|
return m_db;
|
|
50
147
|
}
|
|
51
148
|
|
|
52
|
-
void connMgr::
|
|
149
|
+
void connMgr::convertFromOldFormat(bool isInUseTable)
|
|
53
150
|
{
|
|
54
|
-
|
|
151
|
+
if (m_datalen >= sizeof(oldRrecord))
|
|
152
|
+
{
|
|
153
|
+
oldRrecord* rec = (oldRrecord*)m_pdata;
|
|
154
|
+
oldRrecord* end = rec + (m_datalen / sizeof(oldRrecord));
|
|
155
|
+
int i = 0;
|
|
156
|
+
while (rec != end)
|
|
157
|
+
{
|
|
158
|
+
oldRrecord tmp = *rec;
|
|
159
|
+
m_records[i].conId = tmp.conId;
|
|
160
|
+
m_records[i].id = tmp.id;
|
|
161
|
+
m_records[i].db = tmp.db;
|
|
162
|
+
m_records[i].type = tmp.type;
|
|
163
|
+
strncpy(m_records[i].name, tmp.name, CON_REC_VALUE_SIZE);
|
|
164
|
+
if (isInUseTable)
|
|
165
|
+
{
|
|
166
|
+
m_records[i].readCount = tmp.readCount;
|
|
167
|
+
m_records[i].updCount = tmp.updCount;
|
|
168
|
+
m_records[i].delCount = tmp.delCount;
|
|
169
|
+
m_records[i].insCount = tmp.insCount;
|
|
170
|
+
}
|
|
171
|
+
++rec;
|
|
172
|
+
++i;
|
|
173
|
+
}
|
|
174
|
+
m_datalen = sizeof(connMgr::record) * i;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
bool connMgr::connect(const _TCHAR* uri)
|
|
179
|
+
{
|
|
180
|
+
bool ret = m_db->connect(uri, true);
|
|
55
181
|
m_stat = m_db->stat();
|
|
56
182
|
if (m_stat == 0)
|
|
183
|
+
{
|
|
57
184
|
m_uri = uri;
|
|
185
|
+
btrVersions vs;
|
|
186
|
+
m_db->getBtrVersion(&vs);
|
|
187
|
+
m_pluginVer = vs.versions[VER_IDX_PLUGIN];
|
|
188
|
+
}
|
|
189
|
+
return ret;
|
|
58
190
|
}
|
|
59
191
|
|
|
60
192
|
void connMgr::disconnect()
|
|
@@ -77,44 +209,88 @@ void connMgr::allocBuffer()
|
|
|
77
209
|
m_pdata = (void*)&m_records[0];
|
|
78
210
|
memset(m_pdata, 0, m_datalen);
|
|
79
211
|
setIsOpen(true);
|
|
80
|
-
|
|
81
212
|
}
|
|
82
213
|
|
|
83
|
-
const connMgr::records& connMgr::getRecords()
|
|
214
|
+
const connMgr::records& connMgr::getRecords(bool isInUseTable)
|
|
84
215
|
{
|
|
85
|
-
allocBuffer();
|
|
86
216
|
tdap(TD_STASTISTICS);
|
|
217
|
+
if (m_stat == 0 && *((int*)m_keybuf) != (int)sizeof(connMgr::record))
|
|
218
|
+
convertFromOldFormat(isInUseTable);
|
|
87
219
|
if (m_stat == 0)
|
|
88
220
|
m_records.resize(m_datalen / sizeof(connMgr::record));
|
|
221
|
+
else
|
|
222
|
+
m_records.resize(0);
|
|
89
223
|
return m_records;
|
|
90
224
|
}
|
|
91
225
|
|
|
92
|
-
const connMgr::records& connMgr::
|
|
226
|
+
const connMgr::records& connMgr::databases()
|
|
93
227
|
{
|
|
94
228
|
m_keynum = TD_STSTCS_DATABASE_LIST;
|
|
229
|
+
allocBuffer();
|
|
95
230
|
return getRecords();
|
|
96
231
|
}
|
|
97
232
|
|
|
98
|
-
const connMgr::records& connMgr::
|
|
233
|
+
const connMgr::records& connMgr::doDefinedTables(const _TCHAR* dbname, int type)
|
|
99
234
|
{
|
|
100
|
-
m_keynum =
|
|
235
|
+
m_keynum = type;
|
|
101
236
|
allocBuffer();
|
|
102
237
|
char tmp[128];
|
|
238
|
+
#ifdef _UNICODE
|
|
239
|
+
WideCharToMultiByte(CP_UTF8, 0, dbname,-1, tmp, 128, NULL, NULL);
|
|
240
|
+
#else
|
|
103
241
|
strcpy_s(tmp, 128, dbname);
|
|
242
|
+
#endif
|
|
104
243
|
m_keybuf = tmp;
|
|
105
244
|
m_keylen = 128;
|
|
106
|
-
|
|
107
|
-
if (m_stat == 0)
|
|
108
|
-
m_records.resize(m_datalen / sizeof(connMgr::record));
|
|
245
|
+
getRecords();
|
|
109
246
|
m_keybuf = &m_params[0];
|
|
110
247
|
m_keylen = sizeof(m_params);
|
|
111
248
|
return m_records;
|
|
249
|
+
}
|
|
112
250
|
|
|
251
|
+
const connMgr::records& connMgr::tables(const _TCHAR* dbname)
|
|
252
|
+
{
|
|
253
|
+
if ((m_pluginVer.majorVersion >= 3) && (m_pluginVer.minorVersion >= 2))
|
|
254
|
+
return doDefinedTables(dbname, TD_STSTCS_TABLE_LIST);
|
|
255
|
+
m_stat = STATUS_NOSUPPORT_OP;
|
|
256
|
+
m_records.resize(0);
|
|
257
|
+
return m_records;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const connMgr::records& connMgr::views(const _TCHAR* dbname)
|
|
261
|
+
{
|
|
262
|
+
if ((m_pluginVer.majorVersion >= 3) && (m_pluginVer.minorVersion >= 2))
|
|
263
|
+
return doDefinedTables(dbname, TD_STSTCS_VIEW_LIST);
|
|
264
|
+
m_stat = STATUS_NOSUPPORT_OP;
|
|
265
|
+
m_records.resize(0);
|
|
266
|
+
return m_records;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const connMgr::records& connMgr::schemaTables(const _TCHAR* dbname)
|
|
270
|
+
{
|
|
271
|
+
return doDefinedTables(dbname, TD_STSTCS_SCHEMA_TABLE_LIST);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const connMgr::records& connMgr::slaveStatus()
|
|
275
|
+
{
|
|
276
|
+
if ((m_pluginVer.majorVersion >= 3) && (m_pluginVer.minorVersion >= 2))
|
|
277
|
+
{
|
|
278
|
+
m_keynum = TD_STSTCS_SLAVE_STATUS;
|
|
279
|
+
allocBuffer();
|
|
280
|
+
getRecords();
|
|
281
|
+
if (m_records.size() > SLAVE_STATUS_DEFAULT_SIZE)
|
|
282
|
+
m_records.resize(SLAVE_STATUS_DEFAULT_SIZE);
|
|
283
|
+
return m_records;
|
|
284
|
+
}
|
|
285
|
+
m_stat = STATUS_NOSUPPORT_OP;
|
|
286
|
+
m_records.resize(0);
|
|
287
|
+
return m_records;
|
|
113
288
|
}
|
|
114
289
|
|
|
115
290
|
const connMgr::records& connMgr::sysvars()
|
|
116
291
|
{
|
|
117
292
|
m_keynum = TD_STSTCS_SYSTEM_VARIABLES;
|
|
293
|
+
allocBuffer();
|
|
118
294
|
return getRecords();
|
|
119
295
|
}
|
|
120
296
|
|
|
@@ -123,26 +299,29 @@ const connMgr::records& connMgr::connections()
|
|
|
123
299
|
m_keynum = TD_STSTCS_READ;
|
|
124
300
|
m_params[0] = 0;
|
|
125
301
|
m_params[1] = 0;
|
|
302
|
+
allocBuffer();
|
|
126
303
|
return getRecords();
|
|
127
304
|
}
|
|
128
305
|
|
|
129
|
-
const connMgr::records& connMgr::
|
|
306
|
+
const connMgr::records& connMgr::inUseDatabases(__int64 connid)
|
|
130
307
|
{
|
|
131
308
|
m_keynum = TD_STSTCS_READ;
|
|
132
309
|
m_params[0] = connid;
|
|
133
310
|
m_params[1] = -1;
|
|
311
|
+
allocBuffer();
|
|
134
312
|
return getRecords();
|
|
135
313
|
}
|
|
136
314
|
|
|
137
|
-
const connMgr::records& connMgr::
|
|
315
|
+
const connMgr::records& connMgr::inUseTables(__int64 connid, int dbid)
|
|
138
316
|
{
|
|
139
317
|
m_keynum = TD_STSTCS_READ;
|
|
140
318
|
m_params[0] = connid;
|
|
141
319
|
m_params[1] = dbid;
|
|
142
|
-
|
|
320
|
+
allocBuffer();
|
|
321
|
+
return getRecords(true);
|
|
143
322
|
}
|
|
144
323
|
|
|
145
|
-
void connMgr::
|
|
324
|
+
void connMgr::postDisconnectOne(__int64 connid)
|
|
146
325
|
{
|
|
147
326
|
allocBuffer();
|
|
148
327
|
m_keynum = TD_STSTCS_DISCONNECT_ONE;
|
|
@@ -151,7 +330,7 @@ void connMgr::disconnectOne(__int64 connid)
|
|
|
151
330
|
tdap(TD_STASTISTICS);
|
|
152
331
|
}
|
|
153
332
|
|
|
154
|
-
void connMgr::
|
|
333
|
+
void connMgr::postDisconnectAll()
|
|
155
334
|
{
|
|
156
335
|
m_keynum = TD_STSTCS_DISCONNECT_ALL;
|
|
157
336
|
tdap(TD_STASTISTICS);
|
|
@@ -162,12 +341,37 @@ short_td connMgr::stat()
|
|
|
162
341
|
return m_stat;
|
|
163
342
|
}
|
|
164
343
|
|
|
165
|
-
|
|
166
344
|
connMgr* connMgr::create(database* db)
|
|
167
345
|
{
|
|
168
346
|
return new connMgr(db);
|
|
169
347
|
}
|
|
170
348
|
|
|
349
|
+
void connMgr::removeSystemDb(connMgr::records& recs)
|
|
350
|
+
{
|
|
351
|
+
for (int i=(int)recs.size() -1; i >= 0; --i)
|
|
352
|
+
{
|
|
353
|
+
if ((strcmp(recs[i].name, "mysql") == 0) ||
|
|
354
|
+
(strcmp(recs[i].name, "performance_schema")==0) ||
|
|
355
|
+
(strcmp(recs[i].name, "information_schema")==0) ||
|
|
356
|
+
(strcmp(recs[i].name, "sys")==0))
|
|
357
|
+
recs.erase(recs.begin() + i);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const _TCHAR* connMgr::sysvarName(uint_td index)
|
|
362
|
+
{
|
|
363
|
+
if (index < TD_VAR_SIZE)
|
|
364
|
+
return SYSVAR_NAME[index];
|
|
365
|
+
return _T("");
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const _TCHAR* connMgr::slaveStatusName(uint_td index)
|
|
369
|
+
{
|
|
370
|
+
if (index < SLAVE_STATUS_DEFAULT_SIZE)
|
|
371
|
+
return SLAVE_STATUS_NAME[index];
|
|
372
|
+
return _T("");
|
|
373
|
+
}
|
|
374
|
+
|
|
171
375
|
} // namespace client
|
|
172
376
|
} // namespace tdap
|
|
173
377
|
} // namespace protocol
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_CTDCONNMGR_H
|
|
2
2
|
#define BZS_DB_PROTOCOL_TDAP_CLIENT_CTDCONNMGR_H
|
|
3
3
|
/*=================================================================
|
|
4
|
-
Copyright (C) 2013 BizStation Corp All rights reserved.
|
|
4
|
+
Copyright (C) 2013-2016 BizStation Corp All rights reserved.
|
|
5
5
|
|
|
6
6
|
This program is free software; you can redistribute it and/or
|
|
7
7
|
modify it under the terms of the GNU General Public License
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
=================================================================*/
|
|
21
21
|
#include "nsTable.h"
|
|
22
22
|
#include <bzs/db/transactd/connectionRecord.h>
|
|
23
|
+
#include <boost/shared_ptr.hpp>
|
|
23
24
|
#include <vector>
|
|
25
|
+
#pragma warning(disable : 4251)
|
|
24
26
|
|
|
25
27
|
namespace bzs
|
|
26
28
|
{
|
|
@@ -34,52 +36,76 @@ namespace client
|
|
|
34
36
|
{
|
|
35
37
|
|
|
36
38
|
class database;
|
|
37
|
-
|
|
39
|
+
class connMgr;
|
|
40
|
+
typedef boost::shared_ptr<connMgr> connMgr_ptr;
|
|
38
41
|
|
|
39
|
-
class
|
|
42
|
+
class DLLLIB connMgr : private nstable // no copyable
|
|
40
43
|
{
|
|
41
44
|
public:
|
|
42
45
|
typedef bzs::db::transactd::connection::record record;
|
|
43
46
|
typedef std::vector<record> records;
|
|
44
|
-
|
|
45
|
-
protected:
|
|
46
47
|
private:
|
|
47
48
|
std::vector<record> m_records;
|
|
48
49
|
__int64 m_params[2];
|
|
49
50
|
database* m_db;
|
|
50
51
|
std::_tstring m_uri;
|
|
52
|
+
btrVersion m_pluginVer;
|
|
51
53
|
void allocBuffer();
|
|
52
54
|
void writeRecordData(){};
|
|
53
55
|
void onReadAfter(){};
|
|
54
|
-
const records& getRecords();
|
|
56
|
+
const records& getRecords(bool isInUseTable = false);
|
|
57
|
+
void convertFromOldFormat(bool isInUseTable);
|
|
55
58
|
~connMgr();
|
|
59
|
+
explicit connMgr(const connMgr& r); //no copyable
|
|
60
|
+
connMgr& operator=(const connMgr& r); //no copyable
|
|
61
|
+
const connMgr::records& doDefinedTables(const _TCHAR* dbname, int type);
|
|
62
|
+
explicit connMgr(database* db);
|
|
56
63
|
|
|
57
64
|
public:
|
|
58
|
-
explicit connMgr(database* db);
|
|
59
65
|
|
|
60
|
-
|
|
66
|
+
bool connect(const _TCHAR* uri);
|
|
61
67
|
void disconnect();
|
|
62
|
-
const records&
|
|
63
|
-
const records&
|
|
68
|
+
const records& databases();
|
|
69
|
+
const records& tables(const _TCHAR* dbname);
|
|
70
|
+
const records& views(const _TCHAR* dbname);
|
|
71
|
+
const records& schemaTables(const _TCHAR* dbname);
|
|
72
|
+
const records& slaveStatus();
|
|
64
73
|
const records& sysvars();
|
|
65
74
|
const records& connections();
|
|
66
|
-
const records&
|
|
67
|
-
const records&
|
|
68
|
-
void
|
|
69
|
-
void
|
|
75
|
+
const records& inUseDatabases(__int64 connid);
|
|
76
|
+
const records& inUseTables(__int64 connid, int dbid);
|
|
77
|
+
void postDisconnectOne(__int64 connid);
|
|
78
|
+
void postDisconnectAll();
|
|
70
79
|
short_td stat();
|
|
71
|
-
|
|
72
80
|
database* db() const;
|
|
73
81
|
using nstable::tdapErr;
|
|
74
82
|
using nstable::release;
|
|
83
|
+
static void removeSystemDb(records& recs);
|
|
84
|
+
static const _TCHAR* sysvarName(uint_td index);
|
|
85
|
+
static const _TCHAR* slaveStatusName(uint_td index);
|
|
75
86
|
static connMgr* create(database* db);
|
|
76
87
|
};
|
|
77
88
|
|
|
78
|
-
|
|
89
|
+
/**
|
|
90
|
+
Releaser for boost shared_ptr.
|
|
91
|
+
ex : boost::shared_ptr<connMgr> mgr(connMgr::create(), releaseConnMgr);
|
|
92
|
+
*/
|
|
93
|
+
inline void releaseConnMgr(connMgr* p)
|
|
94
|
+
{
|
|
95
|
+
if (p) p->release();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
inline connMgr_ptr createConnMgr(database* db)
|
|
99
|
+
{
|
|
100
|
+
return connMgr_ptr(connMgr::create(db), releaseConnMgr);
|
|
101
|
+
}
|
|
102
|
+
|
|
79
103
|
|
|
80
104
|
} // namespace client
|
|
81
105
|
} // namespace tdap
|
|
82
106
|
} // namespace protocol
|
|
83
107
|
} // namespace db
|
|
84
108
|
} // namespace bzs
|
|
109
|
+
|
|
110
|
+
#pragma warning(default : 4251)
|
|
85
111
|
#endif // BZS_DB_PROTOCOL_TDAP_CLIENT_CTDCONNMGR_H
|
|
@@ -56,11 +56,13 @@ struct dbimple
|
|
|
56
56
|
bool lockReadOnly : 1;
|
|
57
57
|
bool autoSchemaUseNullkey : 1;
|
|
58
58
|
bool noPreloadSchema : 1;
|
|
59
|
+
bool createExistNoCheck : 1;
|
|
59
60
|
};
|
|
60
61
|
dbimple()
|
|
61
62
|
: dbDef(NULL), optionalData(NULL), m_deleteRecordFn(NULL),
|
|
62
63
|
m_copyDataFn(NULL), openBuflen(0), isOpened(false), isTableReadOnly(false),
|
|
63
|
-
lockReadOnly(false), autoSchemaUseNullkey(false), noPreloadSchema(false)
|
|
64
|
+
lockReadOnly(false), autoSchemaUseNullkey(false), noPreloadSchema(false),
|
|
65
|
+
createExistNoCheck(false)
|
|
64
66
|
{
|
|
65
67
|
rootDir[0] = 0x00;
|
|
66
68
|
memset(&vers, 0 , sizeof(btrVersions));
|
|
@@ -121,6 +123,25 @@ void database::release()
|
|
|
121
123
|
}
|
|
122
124
|
}
|
|
123
125
|
|
|
126
|
+
database* database::createAssociate()
|
|
127
|
+
{
|
|
128
|
+
if (isOpened() && !enableTrn())
|
|
129
|
+
{
|
|
130
|
+
database* db = database::create();
|
|
131
|
+
//Copy id
|
|
132
|
+
memcpy(db->clientID() + 14, clientID() + 14, 2);
|
|
133
|
+
db->setAssociate();
|
|
134
|
+
db->m_btrcallid = m_btrcallid;
|
|
135
|
+
//Set same connection and connection->addref() in tdclc
|
|
136
|
+
m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, NULL, (void*)clientID(),
|
|
137
|
+
16, LG_SUBOP_ASSOCIATE, db->clientID());
|
|
138
|
+
if (m_stat == 0)
|
|
139
|
+
return db;
|
|
140
|
+
database::destroy(db);
|
|
141
|
+
}
|
|
142
|
+
return NULL;
|
|
143
|
+
}
|
|
144
|
+
|
|
124
145
|
dbdef* database::dbDef() const
|
|
125
146
|
{
|
|
126
147
|
return m_impl->dbDef;
|
|
@@ -200,7 +221,7 @@ void database::setAutoSchemaUseNullkey(bool v)
|
|
|
200
221
|
void database::create(const _TCHAR* uri, short type)
|
|
201
222
|
{
|
|
202
223
|
bool dbdefCreated = false;
|
|
203
|
-
short stat
|
|
224
|
+
short stat;
|
|
204
225
|
if (!m_impl->dbDef)
|
|
205
226
|
{
|
|
206
227
|
m_impl->dbDef = new dbdef(this, type); // Create TabelDef here.
|
|
@@ -409,7 +430,6 @@ void database::doOpen(const _TCHAR* uri, short type, short mode,
|
|
|
409
430
|
const _TCHAR* ownername)
|
|
410
431
|
{
|
|
411
432
|
m_stat = STATUS_SUCCESS;
|
|
412
|
-
m_impl->dbDef->setDefType(type);
|
|
413
433
|
m_impl->dbDef->open(uri, (char_td)mode, ownername);
|
|
414
434
|
|
|
415
435
|
if ((m_stat == STATUS_SUCCESS) &&
|
|
@@ -447,23 +467,32 @@ bool database::open(const _TCHAR* _uri, short type, short mode,
|
|
|
447
467
|
if (m_stat)
|
|
448
468
|
return false;
|
|
449
469
|
}
|
|
450
|
-
if (!m_impl->dbDef)
|
|
451
|
-
m_impl->dbDef = new dbdef(this, type);
|
|
452
470
|
|
|
453
471
|
if (type == TYPE_SCHEMA_BDF)
|
|
454
472
|
{// BDF
|
|
455
473
|
if (isTransactdUri(_uri))
|
|
456
474
|
{
|
|
457
|
-
_TCHAR
|
|
458
|
-
schemaTable(_uri,
|
|
459
|
-
m_impl->noPreloadSchema = (
|
|
475
|
+
_TCHAR name[128];
|
|
476
|
+
schemaTable(_uri, name, 128);
|
|
477
|
+
m_impl->noPreloadSchema = (name[0] == 0x00);
|
|
478
|
+
if (m_impl->noPreloadSchema)
|
|
479
|
+
type = TYPE_SCHEMA_BDF_NOPRELOAD;
|
|
480
|
+
dbname(_uri, name, 128);
|
|
481
|
+
if (name[0] == 0x00)
|
|
482
|
+
{
|
|
483
|
+
m_stat = ERROR_NO_DATABASE;
|
|
484
|
+
return false;
|
|
485
|
+
}
|
|
460
486
|
}
|
|
461
487
|
}
|
|
488
|
+
if (!m_impl->dbDef)
|
|
489
|
+
m_impl->dbDef = new dbdef(this, type);
|
|
490
|
+
|
|
462
491
|
if (m_impl->noPreloadSchema)
|
|
463
492
|
{
|
|
464
493
|
if ((compatibleMode() & CMP_MODE_MYSQL_NULL) == 0)
|
|
465
494
|
m_stat = STATUS_INVALID_NULLMODE;
|
|
466
|
-
else if (connect(_uri))
|
|
495
|
+
else if (isAssociate() || connect(_uri))
|
|
467
496
|
{
|
|
468
497
|
m_impl->dbDef->allocDatabuffer();
|
|
469
498
|
m_stat = m_impl->dbDef->stat();
|
|
@@ -777,8 +806,13 @@ struct openTablePrams
|
|
|
777
806
|
}
|
|
778
807
|
else
|
|
779
808
|
_tcscpy(uri, path);
|
|
780
|
-
}else if (path)
|
|
781
|
-
|
|
809
|
+
}else if (path)
|
|
810
|
+
{
|
|
811
|
+
if (_tcsstr(path, _T("://")))
|
|
812
|
+
_tcscpy(uri, path); // another database
|
|
813
|
+
else
|
|
814
|
+
db->getTableUri(uri, path);
|
|
815
|
+
}
|
|
782
816
|
}
|
|
783
817
|
};
|
|
784
818
|
|
|
@@ -981,7 +1015,9 @@ bool database::createTable(const char* utf8Sql)
|
|
|
981
1015
|
const char* p = toServerUri(buf2, MAX_PATH, rootDir(), true);
|
|
982
1016
|
uint_td len = (uint_td)strlen(utf8Sql);
|
|
983
1017
|
m_stat = m_btrcallid(TD_CREATETABLE, posblk, (void*)utf8Sql, &len,
|
|
984
|
-
(void*)p, (uchar_td)strlen(p),
|
|
1018
|
+
(void*)p, (uchar_td)strlen(p),
|
|
1019
|
+
(m_impl->createExistNoCheck) ?
|
|
1020
|
+
CR_SUBOP_BY_SQL : CR_SUBOP_BY_SQL_NOCKECK, clientID());
|
|
985
1021
|
}
|
|
986
1022
|
}
|
|
987
1023
|
else
|
|
@@ -1011,7 +1047,9 @@ bool database::createTable(short fileNum, const _TCHAR* uri)
|
|
|
1011
1047
|
m_stat = m_btrcallid(
|
|
1012
1048
|
TD_CREATETABLE, posblk, td,
|
|
1013
1049
|
&m_impl->dbDef->m_datalen, (void*)p, (uchar_td)strlen(p),
|
|
1014
|
-
|
|
1050
|
+
(m_impl->createExistNoCheck) ?
|
|
1051
|
+
CR_SUBOP_BY_TABLEDEF : CR_SUBOP_BY_TABLEDEF_NOCKECK,
|
|
1052
|
+
clientID());
|
|
1015
1053
|
}
|
|
1016
1054
|
else
|
|
1017
1055
|
{
|
|
@@ -1028,7 +1066,9 @@ bool database::createTable(short fileNum, const _TCHAR* uri)
|
|
|
1028
1066
|
buf = uri;
|
|
1029
1067
|
else
|
|
1030
1068
|
buf = td->fileName();
|
|
1031
|
-
nsdatabase::createTable(fs, 1024, buf,
|
|
1069
|
+
nsdatabase::createTable(fs, 1024, buf,
|
|
1070
|
+
(m_impl->createExistNoCheck) ?
|
|
1071
|
+
CR_SUBOP_BY_FILESPEC : CR_SUBOP_BY_FILESPEC_NOCKECK);
|
|
1032
1072
|
free(fs);
|
|
1033
1073
|
}
|
|
1034
1074
|
return (m_stat == 0);
|
|
@@ -1042,12 +1082,13 @@ short database::assignSchemaData(const dbdef* src)
|
|
|
1042
1082
|
dbdef* defDest = dbDef();
|
|
1043
1083
|
int recordCount = src->tableCount();
|
|
1044
1084
|
|
|
1045
|
-
for (int i =
|
|
1085
|
+
for (int i = 1; i <= src->tableCount(); i++)
|
|
1046
1086
|
{
|
|
1047
1087
|
const tabledef* td = const_cast<dbdef*>(src)->tableDefs(i);
|
|
1048
1088
|
if (td)
|
|
1049
1089
|
{
|
|
1050
1090
|
tabledef tdtmp = *td;
|
|
1091
|
+
tdtmp.m_inUse = false;
|
|
1051
1092
|
tdtmp.fieldCount = 0;
|
|
1052
1093
|
tdtmp.keyCount = 0;
|
|
1053
1094
|
defDest->insertTable(&tdtmp);
|
|
@@ -1148,6 +1189,8 @@ inline void database::copyEachFieldData(table* dest, table* src, fieldChnageInfo
|
|
|
1148
1189
|
int len = fds.len;
|
|
1149
1190
|
if (fds.len > fdd.len)
|
|
1150
1191
|
len = fdd.len;
|
|
1192
|
+
/* Move 2 byte automaticaly by tabledef::pack() and unpack()
|
|
1193
|
+
when field type is ft_myfixedbinary */
|
|
1151
1194
|
memcpy(dest->fieldPtr(dindex), src->fieldPtr(i), len);
|
|
1152
1195
|
}
|
|
1153
1196
|
else
|
|
@@ -66,7 +66,7 @@ class DLLLIB database : public nsdatabase
|
|
|
66
66
|
bool defaultImageCopy(const void* data, short& tableIndex);
|
|
67
67
|
short checkOpened();
|
|
68
68
|
table* doOpenTable(struct openTablePrams* pm, const _TCHAR* ownerName);
|
|
69
|
-
void* getExtendBufferForOpen(uint_td& size); //
|
|
69
|
+
void* getExtendBufferForOpen(uint_td& size); // orverride
|
|
70
70
|
_TCHAR* getTableUri(_TCHAR* buf, short fileNum);
|
|
71
71
|
_TCHAR* getTableUri(_TCHAR* buf, const _TCHAR* filename);
|
|
72
72
|
inline void copyEachFieldData(table* dest, table* src, struct fieldChnageInfo* fci);
|
|
@@ -130,11 +130,11 @@ public:
|
|
|
130
130
|
const _TCHAR* ownerName = NULL);
|
|
131
131
|
bool existsTableFile(short tableIndex, const _TCHAR* ownerName = NULL);
|
|
132
132
|
void getBtrVersion(btrVersions* versions);
|
|
133
|
-
bool isOpened() const;
|
|
133
|
+
bool isOpened() const; // orverride
|
|
134
134
|
char_td mode() const;
|
|
135
135
|
bool autoSchemaUseNullkey() const;
|
|
136
136
|
void setAutoSchemaUseNullkey(bool v);
|
|
137
|
-
|
|
137
|
+
database* createAssociate();
|
|
138
138
|
virtual int defaultAutoIncSpace() const { return 0; };
|
|
139
139
|
static database* create();
|
|
140
140
|
/* For C++ direct only. don't use by wrapper class for COM or SWIG
|