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
@@ -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
  }