transactd 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +20 -18
- data/README-JA +19 -17
- data/RELEASE_NOTE +144 -0
- data/RELEASE_NOTE-JA +153 -0
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/ruby.swg +10 -9
- data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
- data/build/swig/tdcl.i +30 -3
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +85 -41
- data/source/bzs/db/engine/mysql/database.h +35 -5
- data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
- data/source/bzs/db/protocol/tdap/client/client.h +30 -1
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
- data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
- data/source/bzs/db/protocol/tdap/client/field.h +7 -7
- data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
- data/source/bzs/db/protocol/tdap/client/request.h +11 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
- data/source/bzs/db/protocol/tdap/client/table.h +8 -7
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
- data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
- data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
- data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
- data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
- data/source/bzs/db/protocol/tdap/uri.h +4 -4
- data/source/bzs/db/transactd/transactd.cpp +6 -5
- data/source/bzs/env/crosscompile.cpp +17 -0
- data/source/bzs/env/crosscompile.h +4 -1
- data/source/bzs/env/mbcswchrLinux.cpp +3 -0
- data/source/bzs/example/deleteRecords.cpp +13 -0
- data/source/bzs/example/deleteRecords_c.cpp +8 -1
- data/source/bzs/example/insertRecords.cpp +14 -0
- data/source/bzs/example/insertRecords_c.cpp +8 -1
- data/source/bzs/example/ormap_c.cpp +8 -1
- data/source/bzs/example/queryData.cpp +92 -2
- data/source/bzs/example/queryData.h +3 -1
- data/source/bzs/example/readRecords.cpp +13 -0
- data/source/bzs/example/readRecords_c.cpp +8 -1
- data/source/bzs/example/updateRecords.cpp +13 -0
- data/source/bzs/example/updateRecords_c.cpp +8 -1
- data/source/bzs/example/update_with_transaction.cpp +13 -0
- data/source/bzs/example/update_with_transaction_c.cpp +8 -1
- data/source/bzs/example/useORMRecord.cpp +9 -3
- data/source/bzs/netsvc/client/iconnection.h +8 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
- data/source/bzs/netsvc/client/tcpClient.h +430 -214
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
- data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
- data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
- data/source/bzs/test/transactdBench/workerBase.h +2 -2
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
- data/source/global/tdclatl/Database.cpp +12 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/FieldDef.cpp +19 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -16
- data/source/global/tdclatl/GroupQuery.cpp +21 -16
- data/source/global/tdclatl/GroupQuery.h +1 -1
- data/source/global/tdclatl/QueryBase.cpp +14 -0
- data/source/global/tdclatl/QueryBase.h +2 -0
- data/source/global/tdclatl/Record.cpp +41 -10
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Recordset.cpp +117 -31
- data/source/global/tdclatl/Recordset.h +6 -5
- data/source/global/tdclatl/Table.cpp +24 -28
- data/source/global/tdclatl/Table.h +3 -4
- data/source/global/tdclatl/activeTable.cpp +149 -103
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +38 -18
- data/transactd.gemspec +1 -1
- metadata +8 -4
- data/bin/common/tdclc_32_2_2.dll +0 -0
- data/bin/common/tdclc_64_2_2.dll +0 -0
@@ -39,31 +39,49 @@
|
|
39
39
|
#undef ERROR
|
40
40
|
#endif
|
41
41
|
|
42
|
-
#ifdef NOMINMAX
|
43
|
-
#undef NOMINMAX
|
44
|
-
#endif
|
45
42
|
#ifdef _MSC_VER
|
46
43
|
#pragma warning(disable : 4800)
|
47
44
|
#pragma warning(disable : 4267)
|
48
45
|
#pragma warning(disable : 4996)
|
49
46
|
#pragma warning(disable : 4805)
|
47
|
+
#pragma warning(disable : 4005)
|
48
|
+
#define NOMINMAX
|
50
49
|
#endif
|
51
|
-
|
52
50
|
#include <my_config.h>
|
53
51
|
#include <mysql_version.h>
|
54
52
|
#include <sql/sql_const.h>
|
55
53
|
#include "my_global.h"
|
54
|
+
#include <math.h>
|
55
|
+
#if ((MYSQL_VERSION_ID > 50700) && !defined(MARIADB_BASE_VERSION))
|
56
|
+
// Not use malloc service
|
57
|
+
#define MYSQL_SERVICE_MYSQL_ALLOC_INCLUDED
|
58
|
+
typedef unsigned int PSI_memory_key;
|
59
|
+
typedef int myf_t;
|
60
|
+
extern "C" {
|
61
|
+
extern void * my_malloc(PSI_memory_key key, size_t size, myf_t flags);
|
62
|
+
extern void * my_realloc(PSI_memory_key key, void *ptr, size_t size, myf_t flags);
|
63
|
+
extern void my_free(void *ptr);
|
64
|
+
extern void * my_memdup(PSI_memory_key key, const void *from, size_t length, myf_t flags);
|
65
|
+
extern char * my_strdup(PSI_memory_key key, const char *from, myf_t flags);
|
66
|
+
extern char * my_strndup(PSI_memory_key key, const char *from, size_t length, myf_t flags);
|
67
|
+
}
|
68
|
+
#include "sql/log.h"
|
69
|
+
#endif //For MYSQL 5.7
|
70
|
+
|
56
71
|
#include "sql/sql_class.h"
|
57
72
|
#include <mysql/plugin.h>
|
58
73
|
#include "sql/mysqld.h"
|
59
74
|
|
60
|
-
#if ((MYSQL_VERSION_ID >= 50600) && !defined(MARIADB_BASE_VERSION))
|
75
|
+
#if ((MYSQL_VERSION_ID >= 50600) && (MYSQL_VERSION_ID < 50700) && !defined(MARIADB_BASE_VERSION))
|
61
76
|
#include "sql/global_threads.h"
|
62
77
|
#endif
|
63
78
|
|
64
79
|
#include "sql/sql_plugin.h"
|
65
80
|
#include "sql/sql_cache.h"
|
81
|
+
#if (MYSQL_VERSION_ID < 50700)
|
66
82
|
#include "sql/structs.h"
|
83
|
+
#endif
|
84
|
+
|
67
85
|
#include "sql/sql_priv.h"
|
68
86
|
#include "sql/unireg.h"
|
69
87
|
#include "sql/lock.h"
|
@@ -82,13 +100,7 @@
|
|
82
100
|
#define MYSQL_USER_FIELD_PASSWORD 2
|
83
101
|
#endif
|
84
102
|
|
85
|
-
|
86
|
-
#if ((MYSQL_VERSION_ID > 50700) && !defined(MARIADB_BASE_VERSION))
|
87
|
-
#include "sql/log.h"
|
88
|
-
#endif
|
89
|
-
|
90
103
|
#undef test
|
91
|
-
|
92
104
|
#undef sleep
|
93
105
|
#ifdef ERROR
|
94
106
|
#define ERROR 0
|
@@ -99,6 +111,7 @@
|
|
99
111
|
#pragma warning(default : 4267)
|
100
112
|
#pragma warning(default : 4800)
|
101
113
|
#pragma warning(default : 4805)
|
114
|
+
#pragma warning(default : 4005)
|
102
115
|
#endif
|
103
116
|
|
104
117
|
#undef min
|
@@ -152,12 +165,12 @@
|
|
152
165
|
|
153
166
|
#if ((MYSQL_VERSION_NUM < 50600) || defined(MARIADB_BASE_VERSION))
|
154
167
|
|
155
|
-
inline void
|
168
|
+
inline void add_global_thread(THD* thd)
|
156
169
|
{
|
157
170
|
;
|
158
171
|
}
|
159
172
|
|
160
|
-
inline void
|
173
|
+
inline void remove_global_thread(THD* thd)
|
161
174
|
{
|
162
175
|
;
|
163
176
|
}
|
@@ -173,12 +186,12 @@ inline void cp_restore_globals(THD* thd)
|
|
173
186
|
my_pthread_setspecific_ptr(THR_MALLOC, 0);
|
174
187
|
}
|
175
188
|
|
176
|
-
inline void cp_thd_set_read_only(THD* thd)
|
189
|
+
inline void cp_thd_set_read_only(THD* thd, bool v)
|
177
190
|
{
|
178
191
|
;
|
179
192
|
}
|
180
193
|
|
181
|
-
inline bool
|
194
|
+
inline bool cp_thd_get_global_read_only(THD* thd)
|
182
195
|
{
|
183
196
|
return false;
|
184
197
|
}
|
@@ -191,15 +204,6 @@ inline bool cp_open_table(THD* thd, TABLE_LIST* tables,
|
|
191
204
|
#define set_mysys_var(A)
|
192
205
|
#else
|
193
206
|
|
194
|
-
inline void cp_add_global_thread(THD* thd)
|
195
|
-
{
|
196
|
-
add_global_thread(thd);
|
197
|
-
}
|
198
|
-
|
199
|
-
inline void cp_remove_global_thread(THD* thd)
|
200
|
-
{
|
201
|
-
remove_global_thread(thd);
|
202
|
-
}
|
203
207
|
|
204
208
|
inline void cp_thd_release_resources(THD* thd)
|
205
209
|
{
|
@@ -208,7 +212,11 @@ inline void cp_thd_release_resources(THD* thd)
|
|
208
212
|
|
209
213
|
inline void cp_set_mysys_var(st_my_thread_var* var)
|
210
214
|
{
|
215
|
+
#if(MYSQL_VERSION_NUM < 50700)
|
211
216
|
set_mysys_var(var);
|
217
|
+
#else
|
218
|
+
set_mysys_thread_var(var);
|
219
|
+
#endif
|
212
220
|
}
|
213
221
|
|
214
222
|
inline void cp_restore_globals(THD* thd)
|
@@ -216,12 +224,12 @@ inline void cp_restore_globals(THD* thd)
|
|
216
224
|
thd->restore_globals();
|
217
225
|
}
|
218
226
|
|
219
|
-
inline void cp_thd_set_read_only(THD* thd)
|
227
|
+
inline void cp_thd_set_read_only(THD* thd, bool v)
|
220
228
|
{
|
221
|
-
thd->tx_read_only = (thd->variables.tx_read_only
|
229
|
+
thd->tx_read_only = (v || thd->variables.tx_read_only);
|
222
230
|
}
|
223
231
|
|
224
|
-
inline bool
|
232
|
+
inline bool cp_thd_get_global_read_only(THD* thd)
|
225
233
|
{
|
226
234
|
return (thd->variables.tx_read_only != 0);
|
227
235
|
}
|
@@ -237,32 +245,114 @@ inline bool cp_open_table(THD* thd, TABLE_LIST* tables,
|
|
237
245
|
#define ha_index_read_map index_read_map
|
238
246
|
#endif
|
239
247
|
|
240
|
-
|
241
|
-
|
248
|
+
|
249
|
+
extern unsigned int g_openDatabases;
|
250
|
+
#if((MYSQL_VERSION_NUM > 50700) && !defined(MARIADB_BASE_VERSION))
|
251
|
+
#define OPEN_TABLE_FLAG_TYPE 0
|
252
|
+
|
242
253
|
#define td_malloc(A, B) my_malloc(PSI_NOT_INSTRUMENTED, A, B)
|
243
254
|
#define td_realloc(A, B, C) my_realloc(PSI_NOT_INSTRUMENTED, A, B, C)
|
244
255
|
#define td_strdup(A, B) my_strdup(PSI_NOT_INSTRUMENTED, A, B)
|
245
256
|
#define td_free(A) my_free(A)
|
246
257
|
|
247
258
|
/* On Windows,
|
248
|
-
|
249
|
-
|
250
|
-
|
259
|
+
"operator delete()" function is implemented in mysqld.
|
260
|
+
But "operator new" operation implement in transactd.dll.
|
261
|
+
Therefore, memory managers differ. */
|
251
262
|
#ifdef _WIN32
|
252
263
|
|
253
264
|
inline void releaseTHD(THD* thd)
|
254
265
|
{
|
255
|
-
|
256
|
-
|
266
|
+
thd->~THD();
|
267
|
+
operator delete((void*)thd);
|
257
268
|
}
|
258
269
|
#else
|
259
270
|
|
260
271
|
inline void releaseTHD(THD* thd)
|
261
272
|
{
|
262
|
-
|
273
|
+
delete thd;
|
263
274
|
}
|
264
275
|
#endif
|
265
|
-
|
276
|
+
|
277
|
+
#include <boost/thread/mutex.hpp>
|
278
|
+
extern boost::mutex g_db_count_mutex;
|
279
|
+
extern void global_thd_manager_add_thd(THD *thd);
|
280
|
+
extern void global_thd_manager_remove_thd(THD *thd);
|
281
|
+
|
282
|
+
inline void cp_set_new_thread_id(THD* thd)
|
283
|
+
{
|
284
|
+
thd->set_new_thread_id();
|
285
|
+
global_thd_manager_add_thd(thd);
|
286
|
+
boost::mutex::scoped_lock lck(g_db_count_mutex);
|
287
|
+
++g_openDatabases;
|
288
|
+
}
|
289
|
+
|
290
|
+
inline void cp_dec_dbcount(THD* thd)
|
291
|
+
{
|
292
|
+
{
|
293
|
+
boost::mutex::scoped_lock lck(g_db_count_mutex);
|
294
|
+
--g_openDatabases;
|
295
|
+
}
|
296
|
+
global_thd_manager_remove_thd(thd);
|
297
|
+
}
|
298
|
+
|
299
|
+
inline Security_context* cp_security_ctx(THD* thd)
|
300
|
+
{
|
301
|
+
return thd->security_context();
|
302
|
+
}
|
303
|
+
|
304
|
+
inline int cp_record_count(handler* file, ha_rows* rows)
|
305
|
+
{
|
306
|
+
return file->ha_records(rows);
|
307
|
+
}
|
308
|
+
|
309
|
+
#define cp_strdup(A, B) my_strdup(PSI_INSTRUMENT_ME, (A), (B))
|
310
|
+
#define cp_set_mysys_var(A) set_mysys_thread_var(A)
|
311
|
+
inline void cp_set_db(THD* thd, char* p)
|
312
|
+
{
|
313
|
+
thd->set_db(to_lex_cstring(p));
|
314
|
+
}
|
315
|
+
|
316
|
+
|
317
|
+
inline THD* cp_thread_get_THR_THD()
|
318
|
+
{
|
319
|
+
return my_thread_get_THR_THD();
|
320
|
+
return NULL;
|
321
|
+
}
|
322
|
+
|
323
|
+
inline int cp_thread_set_THR_THD(THD* thd)
|
324
|
+
{
|
325
|
+
return my_thread_set_THR_THD(thd);
|
326
|
+
return 0;
|
327
|
+
}
|
328
|
+
|
329
|
+
inline void cp_set_transaction_duration_for_all_locks(THD* /*thd*/)
|
330
|
+
{
|
331
|
+
;
|
332
|
+
}
|
333
|
+
|
334
|
+
inline void cp_set_mdl_request_types(TABLE_LIST& tables, short mode)
|
335
|
+
{
|
336
|
+
if (mode == -2 /* TD_OPEN_READONLY */)
|
337
|
+
tables.mdl_request.set_type(MDL_SHARED_READ);
|
338
|
+
else if (mode == -4 /* TD_OPEN_EXCLUSIVE */)
|
339
|
+
tables.mdl_request.set_type(MDL_SHARED_NO_READ_WRITE);
|
340
|
+
else if (mode == -6 /* TD_OPEN_READONLY_EXCLUSIVE */)
|
341
|
+
tables.mdl_request.set_type(MDL_SHARED_READ_ONLY);
|
342
|
+
else
|
343
|
+
tables.mdl_request.set_type(MDL_SHARED_WRITE);
|
344
|
+
|
345
|
+
tables.mdl_request.duration = MDL_TRANSACTION;
|
346
|
+
}
|
347
|
+
|
348
|
+
inline void cp_open_error_release(THD* /*thd*/, TABLE_LIST& /*tables*/)
|
349
|
+
{
|
350
|
+
;
|
351
|
+
}
|
352
|
+
|
353
|
+
#else //Not MySQL 5.7
|
354
|
+
#define OPEN_TABLE_FLAG_TYPE MYSQL_OPEN_GET_NEW_TABLE
|
355
|
+
|
266
356
|
#define td_malloc(A, B) my_malloc(A, B)
|
267
357
|
#define td_realloc(A, B, C) my_realloc(A, B, C)
|
268
358
|
#define td_strdup(A, B) my_strdup(A, B)
|
@@ -270,8 +360,70 @@ inline void releaseTHD(THD* thd)
|
|
270
360
|
|
271
361
|
inline void releaseTHD(THD* thd)
|
272
362
|
{
|
273
|
-
|
363
|
+
delete thd;
|
364
|
+
}
|
365
|
+
inline void cp_set_new_thread_id(THD* thd)
|
366
|
+
{
|
367
|
+
mysql_mutex_lock(&LOCK_thread_count);
|
368
|
+
++g_openDatabases;
|
369
|
+
thd->variables.pseudo_thread_id = thread_id++;
|
370
|
+
add_global_thread(thd);
|
371
|
+
mysql_mutex_unlock(&LOCK_thread_count);
|
372
|
+
thd->thread_id = thd->variables.pseudo_thread_id;
|
274
373
|
}
|
374
|
+
inline void cp_dec_dbcount(THD* thd)
|
375
|
+
{
|
376
|
+
mysql_mutex_lock(&LOCK_thread_count);
|
377
|
+
--g_openDatabases;
|
378
|
+
mysql_mutex_unlock(&LOCK_thread_count);
|
379
|
+
remove_global_thread(thd);
|
380
|
+
}
|
381
|
+
inline Security_context* cp_security_ctx(THD* thd)
|
382
|
+
{
|
383
|
+
return thd->security_ctx;
|
384
|
+
}
|
385
|
+
|
386
|
+
inline int cp_record_count(handler* file, ha_rows* rows)
|
387
|
+
{
|
388
|
+
*rows = file->records();
|
389
|
+
return 0;
|
390
|
+
}
|
391
|
+
#define cp_strdup(A, B) my_strdup((A), (B))
|
392
|
+
#define cp_set_mysys_var(A) set_mysys_var(A)
|
393
|
+
|
394
|
+
inline void cp_set_db(THD* thd, char* p)
|
395
|
+
{
|
396
|
+
td_free(thd->db);
|
397
|
+
thd->db = p;
|
398
|
+
}
|
399
|
+
|
400
|
+
inline THD* cp_thread_get_THR_THD()
|
401
|
+
{
|
402
|
+
return (THD*)my_pthread_getspecific(THD*, THR_THD);
|
403
|
+
}
|
404
|
+
|
405
|
+
inline int cp_thread_set_THR_THD(THD* thd)
|
406
|
+
{
|
407
|
+
my_pthread_setspecific_ptr(THR_THD, thd);
|
408
|
+
return 0;
|
409
|
+
}
|
410
|
+
|
411
|
+
inline void cp_set_transaction_duration_for_all_locks(THD* thd)
|
412
|
+
{
|
413
|
+
thd->mdl_context.set_transaction_duration_for_all_locks();
|
414
|
+
}
|
415
|
+
|
416
|
+
inline void cp_set_mdl_request_types(TABLE_LIST& tables, short mode)
|
417
|
+
{
|
418
|
+
tables.mdl_request.set_type(MDL_SHARED_READ);
|
419
|
+
tables.mdl_request.duration = MDL_EXPLICIT;
|
420
|
+
}
|
421
|
+
|
422
|
+
inline void cp_open_error_release(THD* thd, TABLE_LIST& tables)
|
423
|
+
{
|
424
|
+
thd->mdl_context.release_lock(tables.mdl_request.ticket);
|
425
|
+
}
|
426
|
+
|
275
427
|
#endif
|
276
428
|
|
277
429
|
#endif // BZS_DB_ENGINE_MYSQL_MYSQLINTERNAL_H
|
@@ -25,7 +25,13 @@ unsigned int g_openDatabases = 0;
|
|
25
25
|
|
26
26
|
extern unsigned int g_lock_wait_timeout;
|
27
27
|
extern char* g_transaction_isolation;
|
28
|
-
static
|
28
|
+
static int transaction_isolation_cache = -1;
|
29
|
+
|
30
|
+
#if((MYSQL_VERSION_NUM > 50700) && !defined(MARIADB_BASE_VERSION))
|
31
|
+
boost::mutex g_db_count_mutex;
|
32
|
+
LEX_CSTRING NULL_CSTR = { NULL, 0 };
|
33
|
+
#endif
|
34
|
+
|
29
35
|
|
30
36
|
#ifdef USETLS
|
31
37
|
tls_key g_tlsiID;
|
@@ -101,7 +107,7 @@ void waitForServerStart()
|
|
101
107
|
mysql_mutex_unlock(&LOCK_server_started);
|
102
108
|
}
|
103
109
|
|
104
|
-
|
110
|
+
int getTransactdIsolation()
|
105
111
|
{
|
106
112
|
if (transaction_isolation_cache != -1)
|
107
113
|
return transaction_isolation_cache;
|
@@ -125,22 +131,19 @@ THD* buildTHD()
|
|
125
131
|
waitForServerStart();
|
126
132
|
|
127
133
|
THD* thd = new THD();
|
128
|
-
|
129
|
-
thd
|
130
|
-
|
131
|
-
cp_add_global_thread(thd);
|
132
|
-
mysql_mutex_unlock(&LOCK_thread_count);
|
133
|
-
thd->thread_id = thd->variables.pseudo_thread_id;
|
134
|
+
|
135
|
+
cp_set_new_thread_id(thd);
|
136
|
+
|
134
137
|
thd->thread_stack = reinterpret_cast<char*>(&thd);
|
135
138
|
thd->store_globals();
|
136
139
|
assert(thd->mysys_var);
|
137
|
-
|
140
|
+
cp_set_mysys_var(thd->mysys_var);
|
138
141
|
thd->system_thread = NON_SYSTEM_THREAD;
|
139
142
|
const NET v = { 0 };
|
140
143
|
thd->net = v;
|
141
144
|
|
142
145
|
thd->variables.option_bits |= OPTION_BIN_LOG;
|
143
|
-
thd->variables.tx_isolation = getTransactdIsolation();
|
146
|
+
thd->variables.tx_isolation = (ulong)getTransactdIsolation();
|
144
147
|
|
145
148
|
thd->clear_error();
|
146
149
|
char tmp[256];
|
@@ -148,8 +151,8 @@ THD* buildTHD()
|
|
148
151
|
g_lock_wait_timeout);
|
149
152
|
dispatch_command(COM_QUERY, thd, tmp, (uint)strlen(tmp));
|
150
153
|
|
151
|
-
|
152
|
-
|
154
|
+
|
155
|
+
cp_set_db(thd, td_strdup("bizstation", MYF(0)));
|
153
156
|
if (thd->variables.sql_log_bin)
|
154
157
|
thd->set_current_stmt_binlog_format_row();
|
155
158
|
return thd;
|
@@ -157,10 +160,10 @@ THD* buildTHD()
|
|
157
160
|
|
158
161
|
THD* attachThd(THD* thd)
|
159
162
|
{
|
160
|
-
|
163
|
+
THD* curThd = cp_thread_get_THR_THD();
|
161
164
|
|
162
|
-
|
163
|
-
|
165
|
+
if (!thd)
|
166
|
+
cp_thread_set_THR_THD(thd);
|
164
167
|
else
|
165
168
|
{
|
166
169
|
initThread(thd);
|
@@ -168,7 +171,7 @@ THD* attachThd(THD* thd)
|
|
168
171
|
if (curThd != thd)
|
169
172
|
{
|
170
173
|
thd->store_globals();
|
171
|
-
|
174
|
+
cp_set_mysys_var(thd->mysys_var);
|
172
175
|
}
|
173
176
|
}
|
174
177
|
return curThd;
|
@@ -186,10 +189,7 @@ THD* createThdForThread()
|
|
186
189
|
void deleteThdForThread(THD* thd)
|
187
190
|
{
|
188
191
|
cp_restore_globals(thd);
|
189
|
-
|
190
|
-
|
191
|
-
mysql_mutex_unlock(&LOCK_thread_count);
|
192
|
-
cp_thd_release_resources(thd);
|
193
|
-
cp_remove_global_thread(thd);
|
192
|
+
cp_thd_release_resources(thd);
|
193
|
+
cp_dec_dbcount(thd);
|
194
194
|
releaseTHD(thd);
|
195
195
|
}
|
@@ -147,26 +147,37 @@ pq_handle activeTable::prepare(queryBase& q, bool serverPrepare)
|
|
147
147
|
return m_imple->prepare(q, serverPrepare);
|
148
148
|
}
|
149
149
|
|
150
|
+
activeTable& activeTable::readMore(recordset& rs)
|
151
|
+
{
|
152
|
+
rs.clear();
|
153
|
+
m_imple->readMore(*rs.m_imple);
|
154
|
+
return *this;
|
155
|
+
}
|
156
|
+
|
150
157
|
activeTable& activeTable::read(recordset& rs, queryBase& q)
|
151
158
|
{
|
159
|
+
rs.clear();
|
152
160
|
m_imple->read(*rs.m_imple, q);
|
153
161
|
return *this;
|
154
162
|
}
|
155
163
|
|
156
164
|
activeTable& activeTable::read(recordset& rs, queryBase& q, validationFunc func)
|
157
165
|
{
|
166
|
+
rs.clear();
|
158
167
|
m_imple->read(*rs.m_imple, q, func);
|
159
168
|
return *this;
|
160
169
|
}
|
161
170
|
|
162
171
|
activeTable& activeTable::read(recordset& rs, pq_handle& q)
|
163
172
|
{
|
173
|
+
rs.clear();
|
164
174
|
m_imple->read(*rs.m_imple, q);
|
165
175
|
return *this;
|
166
176
|
}
|
167
177
|
|
168
178
|
activeTable& activeTable::read(recordset& rs, pq_handle& q, validationFunc func)
|
169
179
|
{
|
180
|
+
rs.clear();
|
170
181
|
m_imple->read(*rs.m_imple, q, func);
|
171
182
|
return *this;
|
172
183
|
}
|
@@ -139,7 +139,7 @@ public:
|
|
139
139
|
activeTable& read(recordset& rs, queryBase& q, validationFunc func);
|
140
140
|
activeTable& read(recordset& rs, pq_handle& q);
|
141
141
|
activeTable& read(recordset& rs, pq_handle& q, validationFunc func);
|
142
|
-
|
142
|
+
activeTable& readMore(recordset& rs);
|
143
143
|
/** @cond INTERNAL */
|
144
144
|
template<class T0>
|
145
145
|
activeTable& read(recordset& rs, pq_handle& q, const T0 v0)
|
@@ -94,9 +94,10 @@ public:
|
|
94
94
|
typedef mdlsHandler<map_orm, recordsetImple> collection_orm_typename;
|
95
95
|
};
|
96
96
|
|
97
|
+
#define FIXED_VALUE_BUF_SIZE 256
|
97
98
|
struct joinInfo
|
98
99
|
{
|
99
|
-
|
100
|
+
unsigned char fixedValue[FIXED_VALUE_BUF_SIZE];
|
100
101
|
ushort_td len;
|
101
102
|
ushort_td type;
|
102
103
|
};
|
@@ -152,9 +153,15 @@ class activeTableImple : public activeObject<map_orm>
|
|
152
153
|
if (s[0] == '[')
|
153
154
|
{
|
154
155
|
fieldIndexes[i] = -1;
|
156
|
+
const fielddef& f = td->fieldDefs[kd->segments[i].fieldNum];
|
157
|
+
if (f.len > FIXED_VALUE_BUF_SIZE)
|
158
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Join fixed key field is too long")
|
159
|
+
_T(" field.\n This field can not use join."));
|
160
|
+
field fd(joinFields[i].fixedValue, f, fds);
|
161
|
+
fd = s.c_str() +1;
|
162
|
+
joinFields[i].len = f.len;
|
155
163
|
joinFields[i].type = JOIN_KEYVALUE_TYPE_PTR;
|
156
|
-
|
157
|
-
joinFields[i].fixedValue = s.substr(1, s.size() - 2);
|
164
|
+
|
158
165
|
}
|
159
166
|
else
|
160
167
|
{
|
@@ -212,7 +219,7 @@ class activeTableImple : public activeObject<map_orm>
|
|
212
219
|
{
|
213
220
|
if (fieldIndexes[i] == -1)
|
214
221
|
{
|
215
|
-
ptr[i] =
|
222
|
+
ptr[i] = joinFields[i].fixedValue;
|
216
223
|
len[i] = joinFields[i].len;
|
217
224
|
}
|
218
225
|
else if (joinFields[i].type == JOIN_KEYVALUE_TYPE_PTR)
|
@@ -76,7 +76,7 @@ class client
|
|
76
76
|
|
77
77
|
bool checkVersion(trdVersiton& ver)
|
78
78
|
{
|
79
|
-
if ((ver.srvMajor < 2) || ((ver.srvMajor == 2) && (ver.srvMinor <
|
79
|
+
if ((ver.srvMajor < 2) || ((ver.srvMajor == 2) && (ver.srvMinor < 3)))
|
80
80
|
return false;
|
81
81
|
return true;
|
82
82
|
}
|
@@ -307,6 +307,30 @@ public:
|
|
307
307
|
}
|
308
308
|
}
|
309
309
|
|
310
|
+
inline void reconnect()
|
311
|
+
{
|
312
|
+
bzs::netsvc::client::connection* c = con();
|
313
|
+
if (!c)
|
314
|
+
{
|
315
|
+
m_preResult = ERROR_TD_NOT_CONNECTED;
|
316
|
+
return;
|
317
|
+
}
|
318
|
+
std::string host = getHostName((const char*)m_req.keybuf);
|
319
|
+
m_preResult = ERROR_TD_HOSTNAME_NOT_FOUND;
|
320
|
+
if (host == "") return;
|
321
|
+
if (!m_cons->reconnect(c, host, handshakeCallback, this))
|
322
|
+
return;
|
323
|
+
m_connecting = true;
|
324
|
+
if (getServerCharsetIndex() == -1)
|
325
|
+
m_preResult = SERVER_CLIENT_NOT_COMPATIBLE;
|
326
|
+
else
|
327
|
+
{
|
328
|
+
m_preResult = 0;
|
329
|
+
buildDualChasetKeybuf();
|
330
|
+
}
|
331
|
+
m_req.paramMask = P_MASK_KEYONLY;
|
332
|
+
}
|
333
|
+
|
310
334
|
inline void cmdConnect()
|
311
335
|
{
|
312
336
|
if ((m_req.keyNum == LG_SUBOP_CONNECT) ||
|
@@ -338,7 +362,12 @@ public:
|
|
338
362
|
m_logout = true;
|
339
363
|
else if (m_op == TD_CONNECT)
|
340
364
|
m_preResult = 1;
|
365
|
+
}else if (m_req.keyNum == LG_SUBOP_DISCONNECT_EX)
|
366
|
+
{
|
367
|
+
if (con())
|
368
|
+
con()->cleanup();
|
341
369
|
}
|
370
|
+
|
342
371
|
m_req.paramMask = P_MASK_KEYONLY;
|
343
372
|
}
|
344
373
|
|
@@ -228,7 +228,7 @@ void dbdef::updateTableDef(short TableIndex, bool forPsqlDdf)
|
|
228
228
|
uchar_td type;
|
229
229
|
|
230
230
|
td->optionFlags.bitA = false; // reset valiable type
|
231
|
-
|
231
|
+
td->optionFlags.bitB = false;
|
232
232
|
for (i = 0; i < td->fieldCount; ++i)
|
233
233
|
{
|
234
234
|
ret = fieldNumByName(TableIndex, td->fieldDefs[i].name());
|
@@ -593,6 +593,7 @@ fielddef* dbdef::insertField(short TableIndex, short InsertIndex)
|
|
593
593
|
fielddef* fd = &(td->fieldDefs[InsertIndex]);
|
594
594
|
fd->setCharsetIndex(td->charsetIndex);
|
595
595
|
fd->setSchemaCodePage(td->schemaCodePage);
|
596
|
+
fd->setPadCharSettings(false, true);
|
596
597
|
return fd;
|
597
598
|
}
|
598
599
|
|
@@ -335,7 +335,17 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
335
335
|
break;
|
336
336
|
case TD_CONNECT:
|
337
337
|
{
|
338
|
-
client_t->
|
338
|
+
if (client_t->req().keyNum == LG_SUBOP_RECONNECT)
|
339
|
+
client_t->reconnect();
|
340
|
+
else
|
341
|
+
client_t->cmdConnect();
|
342
|
+
if (client_t->req().keyNum == LG_SUBOP_DISCONNECT_EX)
|
343
|
+
return 0;
|
344
|
+
break;
|
345
|
+
}
|
346
|
+
case TD_RECONNECT:
|
347
|
+
{
|
348
|
+
client_t->req().paramMask = P_MASK_ALL;
|
339
349
|
break;
|
340
350
|
}
|
341
351
|
case TD_STASTISTICS:
|
@@ -367,9 +377,22 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
367
377
|
case 11001:
|
368
378
|
ret = ERROR_TD_HOSTNAME_NOT_FOUND;
|
369
379
|
break;
|
380
|
+
case 10060:
|
381
|
+
case 10057: //blocking fire wall
|
382
|
+
case 110: //connect: Connection timed out
|
383
|
+
case 121: //timeout sema
|
384
|
+
case 11: //EAGAIN
|
385
|
+
ret = ERROR_TD_NET_TIMEOUT;
|
386
|
+
break;
|
387
|
+
case 32: //write:brokn pipe
|
388
|
+
case 111: //connect: Connection refused
|
370
389
|
case 10061:
|
371
390
|
ret = ERROR_TD_CONNECTION_FAILURE;
|
372
391
|
break;
|
392
|
+
case 104: //write: Connection reset by peer
|
393
|
+
case 10054:
|
394
|
+
ret = ERROR_TD_NET_REMOTE_DISCONNECT;
|
395
|
+
break;
|
373
396
|
case 232:
|
374
397
|
case 109:
|
375
398
|
case 2:
|
@@ -377,10 +400,12 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
377
400
|
ret = ERROR_TD_INVALID_CLINETHOST;
|
378
401
|
break;
|
379
402
|
default:
|
380
|
-
ret =
|
403
|
+
ret = ERROR_TD_NET_OTHER;
|
381
404
|
}
|
382
405
|
OutputDebugString(e.what());
|
383
|
-
|
406
|
+
char tmp[512];
|
407
|
+
sprintf_s(tmp, 512, "%d %s", e.code().value(), e.what());
|
408
|
+
writeErrorLog(ret, tmp);
|
384
409
|
}
|
385
410
|
catch (bzs::netsvc::client::exception& e)
|
386
411
|
{
|
@@ -390,9 +415,14 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
390
415
|
}
|
391
416
|
catch (std::exception& e)
|
392
417
|
{
|
393
|
-
ret =
|
418
|
+
ret = ERROR_TD_C_CLIENT_UNKNOWN;
|
394
419
|
OutputDebugString(e.what());
|
395
|
-
writeErrorLog(
|
420
|
+
writeErrorLog(ret, e.what());
|
421
|
+
}
|
422
|
+
catch (...)
|
423
|
+
{
|
424
|
+
ret = ERROR_TD_C_CLIENT_UNKNOWN;
|
425
|
+
writeErrorLog(ret, "Unknown error");
|
396
426
|
}
|
397
427
|
return ret;
|
398
428
|
}
|