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.
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