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
@@ -0,0 +1,425 @@
1
+ /* =================================================================
2
+ Copyright (C) 2016 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ ================================================================= */
19
+ /* MySQL 5.5 and Mariadb are no-rtti */
20
+ #ifdef __GNUC__
21
+ # pragma implementation "mysqlInternal.h"
22
+ #endif
23
+
24
+ #include "mysqlProtocol.h"
25
+ #include "mysqlThd.h"
26
+ #include <bzs/env/crosscompile.h>
27
+ #include <bzs/db/protocol/tdap/tdapcapi.h>
28
+
29
+ #if defined(USE_BINLOG_VAR) && (!defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID > 50600)
30
+ # include "sql/binlog.h"
31
+ #endif
32
+
33
+ //----------------------------------------------------------------------
34
+ // Implement dummyProtocol
35
+ //----------------------------------------------------------------------
36
+ #if defined(MYSQL_5_7)
37
+ # define Protocol_mysql Protocol
38
+ # define CP_PROTOCOL PROTOCOL_PLUGIN
39
+ #else
40
+ # define Protocol_mysql Protocol
41
+ # define CP_PROTOCOL PROTOCOL_BINARY
42
+ #endif
43
+
44
+
45
+ #pragma GCC diagnostic ignored "-Woverloaded-virtual"
46
+
47
+ class dummyProtocol : public Protocol_mysql
48
+ {
49
+ THD* m_thd;
50
+ Protocol_mysql* m_backup;
51
+
52
+ public:
53
+ #if defined(MYSQL_5_7)
54
+ inline dummyProtocol(THD *thd_arg) : Protocol_mysql()
55
+ {
56
+ m_thd = thd_arg;
57
+ m_backup = m_thd->get_protocol();
58
+ m_thd->set_protocol(this);
59
+ }
60
+ inline virtual ~dummyProtocol()
61
+ {
62
+ m_thd->set_protocol(m_backup);
63
+ }
64
+ #else
65
+ inline dummyProtocol(THD *thd_arg) : Protocol_mysql(thd_arg)
66
+ {
67
+ m_thd = thd_arg;
68
+ m_backup = m_thd->protocol;
69
+ m_thd->protocol = this;
70
+ }
71
+ inline virtual ~dummyProtocol()
72
+ {
73
+ m_thd->protocol = m_backup;
74
+ }
75
+ #endif
76
+ bool send_result_set_metadata(List<Item> *list, uint flags){return false;}
77
+ virtual bool write(){return false;};
78
+ virtual void prepare_for_resend(){}
79
+ virtual bool store_null(){return false;}
80
+ virtual bool store_tiny(longlong from){return store_longlong(from, false);}
81
+ virtual bool store_short(longlong from){return store_longlong(from, false);}
82
+ virtual bool store_long(longlong from){return store_longlong(from, false);}
83
+ virtual bool store_decimal(const my_decimal *){return false;}
84
+ virtual bool store(float from, uint32 decimals, String *buffer){return false;}
85
+ virtual bool store(double from, uint32 decimals, String *buffer){return false;}
86
+ virtual bool store(MYSQL_TIME *time, uint precision){return false;}
87
+ virtual bool store_date(MYSQL_TIME *time){return false;}
88
+ virtual bool store_time(MYSQL_TIME *time, uint precision){return false;}
89
+ virtual bool store(Field *field){return false;}
90
+ virtual bool store(const char *from, size_t length, const CHARSET_INFO *fromcs,
91
+ const CHARSET_INFO* /*tocs*/){return false;}
92
+
93
+ virtual bool send_out_parameters(List<Item_param> *sp_params){return false;}
94
+ virtual Protocol::enum_protocol_type type(void){ return CP_PROTOCOL; };
95
+ #ifdef MARIADB_BASE_VERSION //Mariadb 5.5 10.0 10.1
96
+ virtual bool store(MYSQL_TIME *time, int decimals){return false;}
97
+ virtual bool store_time(MYSQL_TIME *time, int decimals){ return false;}
98
+ #elif defined(MYSQL_5_5)
99
+ virtual bool store_time(MYSQL_TIME *time){return true;};
100
+ virtual bool store(MYSQL_TIME *time){return true;}
101
+ virtual bool store(const char *from, size_t length,
102
+ CHARSET_INFO *fromcs, CHARSET_INFO *tocs){return false;}
103
+ #elif defined(MYSQL_5_7)
104
+ bool store_decimal(const my_decimal *, uint, uint){ return true; }
105
+ bool store(Proto_field *){ return true; }
106
+ void start_row(){}
107
+ int read_packet(void){ return 0; }
108
+ int get_command(COM_DATA *, enum_server_command *){ return m_thd->lex->sql_command; }
109
+ enum_vio_type connection_type(void){ return VIO_TYPE_PLUGIN; }
110
+ ulong get_client_capabilities(void){ return 0; }
111
+ bool has_client_capability(unsigned long){ return false; }
112
+ bool connection_alive(void){ return false; }
113
+ bool end_row(void){ return false; }
114
+ void abort_row(void){}
115
+ void end_partial_result_set(void){}
116
+ int shutdown(bool){ return 0; }
117
+ SSL_handle get_ssl(void){ return NULL; }
118
+ uint get_rw_status(void){ return 0; }
119
+ bool get_compression(void){ return false; }
120
+ bool start_result_metadata(uint, uint, const CHARSET_INFO *){ return false; }
121
+ bool send_field_metadata(Send_field *, const CHARSET_INFO *){ return false; }
122
+ bool end_result_metadata(void){ return false; }
123
+ bool send_ok(uint, uint, ulonglong, ulonglong, const char *){ return false; }
124
+ bool send_eof(uint, uint){ return false; }
125
+ bool send_error(uint, const char *, const char *){ return false; }
126
+ #endif
127
+ };
128
+
129
+ //----------------------------------------------------------------------
130
+ // class masterStatus for windows mysql 5.6 only
131
+ //----------------------------------------------------------------------
132
+ #if defined(NOTUSE_BINLOG_VAR)
133
+ class masterStatus : public dummyProtocol
134
+ {
135
+ binlogPos* m_bpos;
136
+ bool m_writed;
137
+ public:
138
+ inline masterStatus(THD *thd_arg, binlogPos* bpos) :
139
+ dummyProtocol(thd_arg), m_bpos(bpos), m_writed(false) {}
140
+ bool store_longlong(longlong from, bool unsigned_flag)
141
+ {
142
+ m_bpos->pos = (ulonglong)from;
143
+ m_bpos->type = REPL_POSTYPE_POS;
144
+ return false;
145
+ }
146
+
147
+ #if (MYSQL_VERSION_ID < 50600 || defined(MARIADB_BASE_VERSION)) // mariadb 5.5
148
+ bool store(const char *from, size_t length, CHARSET_INFO *cs)
149
+ {
150
+ if (!m_writed)
151
+ {
152
+ strncpy(m_bpos->filename, from, BINLOGNAME_SIZE);
153
+ m_writed = true;
154
+ }
155
+ return false;
156
+ }
157
+ #else
158
+ bool store(const char *from, size_t length, const CHARSET_INFO *cs)
159
+ {
160
+ if (!m_writed)
161
+ {
162
+ strncpy(m_bpos->filename, from, BINLOGNAME_SIZE);
163
+ m_writed = true;
164
+ }
165
+ return false;
166
+ }
167
+ #endif
168
+ };
169
+ #endif // NOTUSE_BINLOG_VAR
170
+
171
+ //----------------------------------------------------------------------
172
+ // class safe_commit_lock commit lock for binlogPos
173
+ //----------------------------------------------------------------------
174
+ safe_commit_lock::safe_commit_lock(THD* thd): m_thd(thd), m_commits_lock(NULL)
175
+ {
176
+
177
+ }
178
+
179
+ bool safe_commit_lock::lock()
180
+ {
181
+ if (m_thd)
182
+ {
183
+ MDL_request mdl_request;
184
+ #if ((MYSQL_VERSION_NUM > 50700) && !defined(MARIADB_BASE_VERSION))
185
+ mdl_request.init_with_source(MDL_key::COMMIT, "", "", MDL_SHARED, MDL_EXPLICIT, __FILE__, __LINE__);
186
+ #else
187
+ mdl_request.init(MDL_key::COMMIT, "", "", MDL_SHARED, MDL_EXPLICIT);
188
+ #endif
189
+ if (m_thd->mdl_context.acquire_lock(&mdl_request,
190
+ m_thd->variables.lock_wait_timeout))
191
+ return false;
192
+ m_commits_lock = mdl_request.ticket;
193
+ }
194
+ return true;
195
+ }
196
+
197
+ safe_commit_lock::~safe_commit_lock()
198
+ {
199
+ if (m_commits_lock)
200
+ {
201
+ m_thd->mdl_context.release_lock(m_commits_lock);
202
+ m_commits_lock= NULL;
203
+ }
204
+ }
205
+
206
+
207
+ #ifdef NOTUSE_BINLOG_VAR
208
+ inline short getBinlogPosInternal(THD* currentThd, binlogPos* bpos, THD* tmpThd)
209
+ {
210
+ short result = 0;
211
+ {
212
+ attachThd(tmpThd);
213
+ copyGrant(tmpThd, currentThd, NULL);
214
+ masterStatus p(tmpThd, bpos);
215
+ cp_query_command(tmpThd, "show master status");
216
+ if (tmpThd->is_error())
217
+ result = tmpThd->cp_get_sql_error();
218
+ cp_lex_clear(tmpThd);
219
+ }
220
+ attachThd(currentThd);
221
+ return result;
222
+ }
223
+ #endif
224
+
225
+ #ifdef USE_BINLOG_GTID
226
+ inline short getBinlogPosInternal(THD* currentThd, binlogPos* bpos, THD* /*tmpThd*/)
227
+ {
228
+ if (mysql_bin_log.is_open())
229
+ {
230
+ rpl_gtid gtid;
231
+ bpos->type = REPL_POSTYPE_MARIA_GTID;
232
+ if (mysql_bin_log.lookup_domain_in_binlog_state(currentThd->variables.gtid_domain_id, &gtid))
233
+ {
234
+ sprintf_s(bpos->gtid, GTID_SIZE, "%u-%u-%llu", gtid.domain_id, gtid.server_id, gtid.seq_no);
235
+ size_t dir_len = dirname_length(mysql_bin_log.get_log_fname());
236
+ strncpy(bpos->filename, mysql_bin_log.get_log_fname() + dir_len, BINLOGNAME_SIZE);
237
+ bpos->pos = my_b_tell(mysql_bin_log.get_log_file());
238
+ bpos->filename[BINLOGNAME_SIZE-1] = 0x00;
239
+ }
240
+ }
241
+ return 0;
242
+ }
243
+ #endif
244
+
245
+ #ifdef USE_BINLOG_VAR
246
+ // Linux MySQL can access to the mysql_bin_log variable
247
+ inline short getBinlogPosInternal(THD* , binlogPos* bpos, THD* /*tmpThd*/)
248
+ {
249
+ if (mysql_bin_log.is_open())
250
+ {
251
+ size_t dir_len = dirname_length(mysql_bin_log.get_log_fname());
252
+ strncpy(bpos->filename, mysql_bin_log.get_log_fname() + dir_len, BINLOGNAME_SIZE);
253
+ bpos->pos = my_b_tell(mysql_bin_log.get_log_file());
254
+ bpos->filename[BINLOGNAME_SIZE-1] = 0x00;
255
+ bpos->type = REPL_POSTYPE_POS;
256
+ }
257
+ return 0;
258
+ }
259
+ #endif //USE_BINLOG_VAR
260
+
261
+ short getBinlogPos(THD* thd, binlogPos* bpos, THD* tmpThd)
262
+ {
263
+ #ifndef NOTUSE_BINLOG_VAR
264
+ safe_mysql_mutex_lock lck(mysql_bin_log.get_log_lock());
265
+ #endif
266
+ return getBinlogPosInternal(thd, bpos, tmpThd);
267
+ }
268
+
269
+ int execSql(THD* thd, const char* sql)
270
+ {
271
+ thd->variables.lock_wait_timeout = OPEN_TABLE_TIMEOUT_SEC;
272
+ thd->clear_error();
273
+ int result = cp_query_command(thd, (char*)sql);
274
+ if (thd->is_error())
275
+ result = thd->cp_get_sql_error();
276
+ cp_lex_clear(thd); // reset values for insert
277
+ return result;
278
+ }
279
+
280
+ //----------------------------------------------------------------------
281
+ // slaveStatus
282
+ //----------------------------------------------------------------------
283
+ using namespace bzs::db::transactd;
284
+ class slaveStatus : public dummyProtocol
285
+ {
286
+ connection::records& m_records;
287
+ connection::record& getRec()
288
+ {
289
+ m_records.push_back(connection::record());
290
+ return m_records[m_records.size() - 1];
291
+ }
292
+ public:
293
+ inline slaveStatus(THD *thd_arg, connection::records& recs) :
294
+ dummyProtocol(thd_arg), m_records(recs)
295
+ {
296
+ m_records.clear();
297
+ }
298
+ bool store_longlong(longlong from, bool unsigned_flag)
299
+ {
300
+ connection::record& rec = getRec();
301
+ rec.type = 0;
302
+ rec.longValue = from;
303
+ return false;
304
+ }
305
+ bool store_null()
306
+ {
307
+ connection::record& rec = getRec();
308
+ rec.type = 1;
309
+ strncpy(rec.value, "NULL", CON_REC_VALUE_SIZE);
310
+ return false;
311
+ }
312
+ #if (MYSQL_VERSION_ID < 50600 || defined(MARIADB_BASE_VERSION)) // MySQL 5.5
313
+ bool store(const char *from, size_t length, CHARSET_INFO *cs)
314
+ {
315
+ connection::record& rec = getRec();
316
+ rec.type = 1;
317
+ if (length && from)
318
+ strncpy(rec.value, from, CON_REC_VALUE_SIZE);
319
+ return false;
320
+ }
321
+ #else
322
+ bool store(const char *from, size_t length, const CHARSET_INFO *cs)
323
+ {
324
+ connection::record& rec = getRec();
325
+ rec.type = 1;
326
+ if (length && from)
327
+ strncpy(rec.value, from, CON_REC_VALUE_SIZE);
328
+ return false;
329
+ }
330
+ #endif
331
+ };
332
+
333
+ int getSlaveStatus(THD* thd, connection::records& recs)
334
+ {
335
+ slaveStatus ss(thd, recs);
336
+ return execSql(thd, "show slave status");
337
+ }
338
+
339
+ #pragma GCC diagnostic warning "-Woverloaded-virtual"
340
+
341
+
342
+ //----------------------------------------------------------------------
343
+ // database list
344
+ //----------------------------------------------------------------------
345
+ inline void appenDbList(connection::records& recs, LEX_STRING* db_name)
346
+ {
347
+ recs.push_back(connection::record());
348
+ connection::record& rec = recs[recs.size() - 1];
349
+ strncpy(rec.name, db_name->str, 64);
350
+ rec.name[64] = 0x00;
351
+ }
352
+
353
+ void readDbList(THD* thd, connection::records& recs)
354
+ {
355
+ SQL_Strings files;
356
+ db_list(thd, &files);
357
+ #if (defined(MARIADB_10_0) || defined(MARIADB_10_1))
358
+ for (int i = 0; i < (int)files.elements(); ++i)
359
+ appenDbList(recs, files.at(i));
360
+ #else
361
+ List_iterator_fast<LEX_STRING> it(files);
362
+ LEX_STRING* db_name;
363
+ while ((db_name = it++))
364
+ appenDbList(recs, db_name);
365
+ #endif
366
+ }
367
+
368
+ //----------------------------------------------------------------------
369
+ // security
370
+ //----------------------------------------------------------------------
371
+
372
+ bool setGrant(THD* thd, const char* host, const char* user, const char* db)
373
+ {
374
+ // sctx->master_access and sctx->db_access
375
+ return (acl_getroot(cp_security_ctx(thd), cp_strdup(user, MYF(0)),
376
+ cp_strdup(host, MYF(0)), cp_strdup(host, MYF(0)), (char*)db)) == false;
377
+ }
378
+
379
+ bool copyGrant(THD* thd, THD* thdSrc, const char* db)
380
+ {
381
+ Security_context* sctx = cp_security_ctx(thdSrc);
382
+ if (sctx->cp_master_accsess() == (ulong)~NO_ACCESS)
383
+ {
384
+ cp_security_ctx(thd)->skip_grants();
385
+ return true;
386
+ }
387
+ return setGrant(thd, sctx->cp_priv_host(), sctx->cp_priv_user(), db);
388
+ }
389
+
390
+ void setDbName(THD* thd, const char* name)
391
+ {
392
+ cp_set_db(thd, name);
393
+ }
394
+
395
+ /*
396
+ class safe_global_read_lock
397
+ {
398
+ THD* m_thd;
399
+ public:
400
+ safe_global_read_lock(THD* thd): m_thd(thd){}
401
+ bool lock()
402
+ {
403
+ if (m_thd->global_read_lock.lock_global_read_lock(m_thd))
404
+ {
405
+ m_thd = NULL;
406
+ return false;
407
+ }
408
+ #ifdef NOTUSE_BINLOG_VAR
409
+ close_cached_tables(NULL, NULL, FALSE , 50000000L);
410
+ if (m_thd->global_read_lock.make_global_read_lock_block_commit(m_thd))
411
+ {
412
+ m_thd->global_read_lock.unlock_global_read_lock(m_thd);
413
+ m_thd = NULL;
414
+ return false;
415
+ }
416
+ #endif
417
+ return true;
418
+ }
419
+ ~safe_global_read_lock()
420
+ {
421
+ if (m_thd)
422
+ m_thd->global_read_lock.unlock_global_read_lock(m_thd);
423
+ }
424
+ };*/
425
+
@@ -0,0 +1,72 @@
1
+ #ifndef BZS_DB_ENGINE_MYSQL_MYSQLPROTOCOL_H
2
+ #define BZS_DB_ENGINE_MYSQL_MYSQLPROTOCOL_H
3
+ /* =================================================================
4
+ Copyright (C) 2016 BizStation Corp All rights reserved.
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
+ 02111-1307, USA.
20
+ ================================================================= */
21
+ #include "mysqlInternal.h"
22
+ #include <bzs/env/compiler.h>
23
+ #include <bzs/db/transactd/connectionRecord.h>
24
+
25
+
26
+ #if (MYSQL_VERSION_ID > 100000)
27
+ # define USE_BINLOG_GTID 1 // like 0-1-50
28
+ #elif (!defined(_WIN32) || MYSQL_VERSION_ID > 50700 || MYSQL_VERSION_ID < 50600) // Linux or MySQL 5.5 5.7
29
+ # define USE_BINLOG_VAR 1
30
+ #else // MySQL 5.6 on windows On windows MySQL 5.6 can not access mysql_bin_log variable
31
+ # define NOTUSE_BINLOG_VAR 1
32
+ #endif
33
+
34
+
35
+ // REPL_POS_TYPE
36
+ #define BINLOGNAME_SIZE 119
37
+ #define GTID_SIZE 64
38
+
39
+ #define REPL_POSTYPE_MARIA_GTID 1 // see tdapapi.h
40
+ #define REPL_POSTYPE_POS 2 // see tdapapi.h
41
+
42
+ #define OPEN_TABLE_TIMEOUT_SEC 2
43
+
44
+ pragma_pack1
45
+ struct binlogPos
46
+ {
47
+ my_off_t pos;
48
+ char type;
49
+ char filename[BINLOGNAME_SIZE];
50
+ char gtid[GTID_SIZE];
51
+ };
52
+ pragma_pop
53
+
54
+ class safe_commit_lock
55
+ {
56
+ THD* m_thd;
57
+ MDL_ticket* m_commits_lock;
58
+ public:
59
+ safe_commit_lock(THD* thd);
60
+ bool lock();
61
+ ~safe_commit_lock();
62
+ };
63
+
64
+ short getBinlogPos(THD* thd, binlogPos* pos, THD* tmpThd);
65
+ int getSlaveStatus(THD* thd, bzs::db::transactd::connection::records& recs);
66
+ int execSql(THD* thd, const char* sql);
67
+ void readDbList(THD* thd, bzs::db::transactd::connection::records& recs);
68
+ bool setGrant(THD* thd, const char* host, const char* user, const char* db);
69
+ bool copyGrant(THD* thd, THD* thdSrc, const char* db);
70
+ void setDbName(THD* thd, const char* name);
71
+
72
+ #endif // BZS_DB_ENGINE_MYSQL_MYSQLPROTOCOL_H
@@ -151,8 +151,6 @@ THD* buildTHD()
151
151
  g_lock_wait_timeout);
152
152
  cp_query_command(thd, tmp);
153
153
 
154
-
155
- cp_set_db(thd, td_strdup("bizstation", MYF(0)));
156
154
  if (thd->variables.sql_log_bin)
157
155
  thd->set_current_stmt_binlog_format_row();
158
156
  return thd;
@@ -192,8 +190,12 @@ THD* createThdForThread()
192
190
 
193
191
  void deleteThdForThread(THD* thd)
194
192
  {
195
- cp_restore_globals(thd);
196
- cp_thd_release_resources(thd);
197
- cp_dec_dbcount(thd);
198
- releaseTHD(thd);
193
+ try
194
+ {
195
+ cp_restore_globals(thd);
196
+ cp_thd_release_resources(thd);
197
+ cp_dec_dbcount(thd);
198
+ releaseTHD(thd);
199
+ }
200
+ catch(...) {};
199
201
  }
@@ -234,6 +234,10 @@ inline void setKeyValues(request& req, engine::mysql::table* tb, int index)
234
234
  tb->setKeyValues(req.table.key.values, -1);
235
235
  }
236
236
 
237
+ dbExecuter::dbExecuter(netsvc::server::IAppModule* mod)
238
+ :engine::mysql::dbManager(mod){}
239
+
240
+
237
241
  void dbExecuter::doRecordOperation(request& req, engine::mysql::table* tb,
238
242
  resultBuffer& buf, changeFunc func)
239
243
  {
@@ -307,7 +311,7 @@ int dbExecuter::commandExec(std::vector<request>& requests,
307
311
  checkNewHandle(req.handle);
308
312
  bool created;
309
313
  database* db = getDatabase(req.db.name, 0 /*cid*/, created);
310
- m_tb = db->openTable(req.table.name, req.table.openMode, NULL);
314
+ m_tb = db->openTable(req.table.name, req.table.openMode, NULL, "");
311
315
  if (m_tb)
312
316
  {
313
317
  addHandle(getDatabaseID(0 /*cid*/), m_tb->id(), req.handle);
@@ -570,8 +574,8 @@ inline void setFilterVal(const std::string& src, int& parseMode, request* req)
570
574
  parseMode = PARSEREAD_FL_TYPE;
571
575
  }
572
576
 
573
- commandExecuter::commandExecuter(netsvc::server::IAppModule* /*mod*/)
574
- : m_dbExec(new dbExecuter())
577
+ commandExecuter::commandExecuter(netsvc::server::IAppModule* mod)
578
+ : m_dbExec(new dbExecuter(mod))
575
579
  {
576
580
  }
577
581
 
@@ -188,6 +188,7 @@ class dbExecuter : public engine::mysql::dbManager
188
188
  resultBuffer& buf, changeFunc func);
189
189
 
190
190
  public:
191
+ dbExecuter(netsvc::server::IAppModule* mod);
191
192
  int commandExec(std::vector<request>& requests,
192
193
  netsvc::server::netWriter* nw);
193
194
  int errorCode(int ha_error) { return 0; };
@@ -82,6 +82,13 @@ class client
82
82
 
83
83
  std::vector<char> m_sendbuf;
84
84
 
85
+ bool checkVersion(int major, int ninor)
86
+ {
87
+ const clsrv_ver* v = ver();
88
+ if (!v) return false;
89
+ return (v->srvMajor > major) || ((v->srvMajor == major) && (v->srvMinor >= ninor));
90
+ }
91
+
85
92
  bool checkVersion(clsrv_ver& ver)
86
93
  {
87
94
  if ((ver.srvMajor < 2) || ((ver.srvMajor == 2) && (ver.srvMinor < 3)))
@@ -231,11 +238,7 @@ public:
231
238
  inline bool isSupportFunction(short op)
232
239
  {
233
240
  if (op == TD_GET_SCHEMA)
234
- {
235
- const clsrv_ver* v = ver();
236
- if (!v) return false;
237
- return (v->srvMajor > 2) || ((v->srvMajor == 2) && (v->srvMinor >= 6));
238
- }
241
+ return checkVersion(2, 6);
239
242
  return false;
240
243
  }
241
244
 
@@ -366,8 +369,12 @@ public:
366
369
  else if ((m_req.keyNum == CR_SUBOP_BY_SQL) ||
367
370
  (m_req.keyNum == CR_SUBOP_BY_SQL_NOCKECK)) // make by sql
368
371
  {
369
- m_sql = (char*)m_req.data;
370
372
  m_req.keyNum -= 4; // -1= exists check 0 = no exists check
373
+ if (charsetIndexServer != CHARSET_UTF8 && charsetIndexServer != CHARSET_UTF8B4)
374
+ m_sql = sqlBuilder::convertString(mysql::codePage(charsetIndexServer), 65001,
375
+ (const char*)m_req.data);
376
+ else
377
+ m_sql = (const char*)m_req.data;
371
378
  }
372
379
  else
373
380
  m_sql = sqlBuilder::sqlCreateTable(name.c_str(), (fileSpec*)m_req.data,
@@ -420,7 +427,13 @@ public:
420
427
 
421
428
  inline void cmdConnect()
422
429
  {
423
- if ((m_req.keyNum == LG_SUBOP_CONNECT) ||
430
+ if(m_req.keyNum == LG_SUBOP_ASSOCIATE)
431
+ {
432
+ clientID* cid = (clientID*)m_req.keybuf;
433
+ cid->con->addref();
434
+ setCon(cid->con);
435
+ }
436
+ else if ((m_req.keyNum == LG_SUBOP_CONNECT) ||
424
437
  (m_req.keyNum == LG_SUBOP_NEWCONNECT))
425
438
  {
426
439
  if (con())
@@ -462,7 +475,8 @@ public:
462
475
  {
463
476
  if (con())
464
477
  con()->cleanup();
465
- }
478
+ }else
479
+ m_preResult = STATUS_NOSUPPORT_OP;
466
480
 
467
481
  m_req.paramMask = P_MASK_KEYONLY;
468
482
  }