transactd 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_3_2.dll +0 -0
  3. data/bin/common/{tdclc_64_3_1.dll → tdclc_64_3_2.dll} +0 -0
  4. data/build/swig/ruby/ruby.swg +3 -0
  5. data/build/swig/ruby/tdclrb_wrap.cpp +2413 -126
  6. data/build/swig/tdcl.i +120 -9
  7. data/build/tdclc/tdclc.cbproj +4 -1
  8. data/build/tdclc/tdclc.rc +4 -4
  9. data/build/tdclcpp/tdclcpp.rc +4 -4
  10. data/build/tdclcpp/tdclcpp_bc.cbproj +8 -1
  11. data/build/tdclrb/tdclrb.rc +4 -4
  12. data/source/bzs/db/engine/mysql/database.cpp +138 -130
  13. data/source/bzs/db/engine/mysql/database.h +43 -48
  14. data/source/bzs/db/engine/mysql/dbManager.cpp +81 -96
  15. data/source/bzs/db/engine/mysql/dbManager.h +13 -22
  16. data/source/bzs/db/engine/mysql/mysqlInternal.h +157 -291
  17. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +425 -0
  18. data/source/bzs/db/engine/mysql/mysqlProtocol.h +72 -0
  19. data/source/bzs/db/engine/mysql/mysqlThd.cpp +8 -6
  20. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +7 -3
  21. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -0
  22. data/source/bzs/db/protocol/tdap/client/client.h +22 -8
  23. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +225 -21
  24. data/source/bzs/db/protocol/tdap/client/connMgr.h +42 -16
  25. data/source/bzs/db/protocol/tdap/client/database.cpp +58 -15
  26. data/source/bzs/db/protocol/tdap/client/database.h +3 -3
  27. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +93 -85
  28. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -2
  29. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +9 -5
  30. data/source/bzs/db/protocol/tdap/client/filter.h +2 -2
  31. data/source/bzs/db/protocol/tdap/client/groupComp.h +2 -2
  32. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +1 -1
  33. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +71 -12
  34. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +7 -1
  35. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +35 -2
  36. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -1
  38. data/source/bzs/db/protocol/tdap/client/recordset.h +15 -0
  39. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +21 -16
  40. data/source/bzs/db/protocol/tdap/client/serializer.cpp +32 -11
  41. data/source/bzs/db/protocol/tdap/client/serializer.h +4 -1
  42. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +3 -2
  43. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
  44. data/source/bzs/db/protocol/tdap/client/table.cpp +18 -14
  45. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +8 -3
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +83 -43
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +3 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +7 -7
  50. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +247 -137
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +9 -9
  52. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -4
  53. data/source/bzs/db/protocol/tdap/tdapSchema.h +3 -7
  54. data/source/bzs/db/protocol/tdap/tdapcapi.h +23 -3
  55. data/source/bzs/db/protocol/tdap/uri.h +40 -0
  56. data/source/bzs/db/transactd/appModule.cpp +14 -5
  57. data/source/bzs/db/transactd/appModule.h +10 -1
  58. data/source/bzs/db/transactd/connManager.cpp +93 -48
  59. data/source/bzs/db/transactd/connManager.h +10 -7
  60. data/source/bzs/db/transactd/connectionRecord.h +114 -19
  61. data/source/bzs/env/tstring.h +2 -0
  62. data/source/bzs/example/changeSchema.cpp +1 -1
  63. data/source/bzs/example/changeSchema_c.cpp +1 -1
  64. data/source/bzs/example/insertRecords.cpp +2 -1
  65. data/source/bzs/example/insertRecords_c.cpp +2 -1
  66. data/source/bzs/example/queryData.cpp +5 -2
  67. data/source/bzs/netsvc/server/IAppModule.h +6 -0
  68. data/source/bzs/test/tdclatl/test_v3.js +75 -0
  69. data/source/bzs/test/tdclphp/transactd_v3_Test.php +104 -7
  70. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +84 -0
  71. data/source/bzs/test/trdclengn/testField.h +66 -6
  72. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +10 -1
  73. data/source/bzs/test/trdclengn/test_trdclengn.cpp +85 -0
  74. data/source/bzs/test/trdclengn/testbase.h +1 -1
  75. data/source/global/tdclatl/BinlogPos.cpp +64 -0
  76. data/source/global/tdclatl/BinlogPos.h +84 -0
  77. data/source/global/tdclatl/ConnMgr.cpp +285 -0
  78. data/source/global/tdclatl/ConnMgr.h +83 -0
  79. data/source/global/tdclatl/ConnRecord.cpp +123 -0
  80. data/source/global/tdclatl/ConnRecord.h +69 -0
  81. data/source/global/tdclatl/ConnRecords.cpp +57 -0
  82. data/source/global/tdclatl/ConnRecords.h +55 -0
  83. data/source/global/tdclatl/Database.cpp +36 -0
  84. data/source/global/tdclatl/Database.h +4 -0
  85. data/source/global/tdclatl/Table.cpp +14 -1
  86. data/source/global/tdclatl/Table.h +1 -0
  87. data/source/global/tdclatl/resource.h +0 -0
  88. data/source/global/tdclatl/tdclatl.idl +148 -4
  89. metadata +14 -4
  90. 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::connect(const _TCHAR* uri)
149
+ void connMgr::convertFromOldFormat(bool isInUseTable)
53
150
  {
54
- m_db->connect(uri, true);
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::definedDatabases()
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::schemaTables(const char* dbname)
233
+ const connMgr::records& connMgr::doDefinedTables(const _TCHAR* dbname, int type)
99
234
  {
100
- m_keynum = TD_STSTCS_SCHEMA_TABLE_LIST;
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
- tdap(TD_STASTISTICS);
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::databases(__int64 connid)
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::tables(__int64 connid, int dbid)
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
- return getRecords();
320
+ allocBuffer();
321
+ return getRecords(true);
143
322
  }
144
323
 
145
- void connMgr::disconnectOne(__int64 connid)
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::disconnectAll()
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
- #pragma warning(disable : 4251)
39
+ class connMgr;
40
+ typedef boost::shared_ptr<connMgr> connMgr_ptr;
38
41
 
39
- class /*DLLLIB*/ connMgr : private nstable
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
- void connect(const _TCHAR* uri);
66
+ bool connect(const _TCHAR* uri);
61
67
  void disconnect();
62
- const records& definedDatabases();
63
- const records& schemaTables(const char* dbname);
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& databases(__int64 connid);
67
- const records& tables(__int64 connid, int dbid);
68
- void disconnectOne(__int64 connid);
69
- void disconnectAll();
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
- #pragma warning(default : 4251)
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 = 0;
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 scmtable[256];
458
- schemaTable(_uri, scmtable, 256);
459
- m_impl->noPreloadSchema = (scmtable[0] == 0x00);
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
- db->getTableUri(uri, path);
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), CR_SUBOP_BY_SQL , clientID());
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
- CR_SUBOP_BY_TABLEDEF /* exists check */, clientID());
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, CR_SUBOP_BY_FILESPEC);
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 = 0; i <= src->tableCount(); 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); // orverload
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