transactd 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|