sbf-do_mysql 0.10.17

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 (43) hide show
  1. checksums.yaml +7 -0
  2. data/ChangeLog.markdown +116 -0
  3. data/LICENSE +20 -0
  4. data/README.markdown +100 -0
  5. data/Rakefile +25 -0
  6. data/ext/do_mysql/compat.h +55 -0
  7. data/ext/do_mysql/do_common.c +510 -0
  8. data/ext/do_mysql/do_common.h +132 -0
  9. data/ext/do_mysql/do_mysql.c +691 -0
  10. data/ext/do_mysql/error.h +403 -0
  11. data/ext/do_mysql/extconf.rb +87 -0
  12. data/ext/do_mysql/mysql_compat.h +25 -0
  13. data/lib/do_mysql/encoding.rb +39 -0
  14. data/lib/do_mysql/transaction.rb +31 -0
  15. data/lib/do_mysql/version.rb +5 -0
  16. data/lib/do_mysql.rb +24 -0
  17. data/spec/command_spec.rb +7 -0
  18. data/spec/connection_spec.rb +55 -0
  19. data/spec/encoding_spec.rb +46 -0
  20. data/spec/error/sql_error_spec.rb +6 -0
  21. data/spec/reader_spec.rb +29 -0
  22. data/spec/result_spec.rb +38 -0
  23. data/spec/spec_helper.rb +242 -0
  24. data/spec/typecast/array_spec.rb +6 -0
  25. data/spec/typecast/bigdecimal_spec.rb +7 -0
  26. data/spec/typecast/boolean_spec.rb +7 -0
  27. data/spec/typecast/byte_array_spec.rb +6 -0
  28. data/spec/typecast/class_spec.rb +6 -0
  29. data/spec/typecast/date_spec.rb +30 -0
  30. data/spec/typecast/datetime_spec.rb +30 -0
  31. data/spec/typecast/float_spec.rb +7 -0
  32. data/spec/typecast/integer_spec.rb +6 -0
  33. data/spec/typecast/nil_spec.rb +8 -0
  34. data/spec/typecast/other_spec.rb +6 -0
  35. data/spec/typecast/range_spec.rb +6 -0
  36. data/spec/typecast/string_spec.rb +6 -0
  37. data/spec/typecast/time_spec.rb +6 -0
  38. data/tasks/compile.rake +16 -0
  39. data/tasks/release.rake +14 -0
  40. data/tasks/retrieve.rake +20 -0
  41. data/tasks/spec.rake +10 -0
  42. data/tasks/ssl.rake +26 -0
  43. metadata +101 -0
@@ -0,0 +1,403 @@
1
+ #ifndef _DO_MYSQL_ERROR_H_
2
+ #define _DO_MYSQL_ERROR_H_
3
+
4
+ #include "do_common.h"
5
+
6
+ static struct errcodes do_mysql_errors[] = {
7
+ #ifdef ER_ABORTING_CONNECTION
8
+ ERRCODE(ER_ABORTING_CONNECTION, "ConnectionError"),
9
+ #endif
10
+ #ifdef ER_NET_PACKET_TOO_LARGE
11
+ ERRCODE(ER_NET_PACKET_TOO_LARGE, "ConnectionError"),
12
+ #endif
13
+ #ifdef ER_NET_READ_ERROR_FROM_PIPE
14
+ ERRCODE(ER_NET_READ_ERROR_FROM_PIPE, "ConnectionError"),
15
+ #endif
16
+ #ifdef ER_NET_FCNTL_ERROR
17
+ ERRCODE(ER_NET_FCNTL_ERROR, "ConnectionError"),
18
+ #endif
19
+ #ifdef ER_NET_PACKETS_OUT_OF_ORDER
20
+ ERRCODE(ER_NET_PACKETS_OUT_OF_ORDER, "ConnectionError"),
21
+ #endif
22
+ #ifdef ER_NET_UNCOMPRESS_ERROR
23
+ ERRCODE(ER_NET_UNCOMPRESS_ERROR, "ConnectionError"),
24
+ #endif
25
+ #ifdef ER_NET_READ_ERROR
26
+ ERRCODE(ER_NET_READ_ERROR, "ConnectionError"),
27
+ #endif
28
+ #ifdef ER_NET_READ_INTERRUPTED
29
+ ERRCODE(ER_NET_READ_INTERRUPTED, "ConnectionError"),
30
+ #endif
31
+ #ifdef ER_NET_WRITE_INTERRUPTED
32
+ ERRCODE(ER_NET_WRITE_INTERRUPTED, "ConnectionError"),
33
+ #endif
34
+ #ifdef ER_CON_COUNT_ERROR
35
+ ERRCODE(ER_CON_COUNT_ERROR, "ConnectionError"),
36
+ #endif
37
+ #ifdef ER_BAD_HOST_ERROR
38
+ ERRCODE(ER_BAD_HOST_ERROR, "ConnectionError"),
39
+ #endif
40
+ #ifdef ER_HANDSHAKE_ERROR
41
+ ERRCODE(ER_HANDSHAKE_ERROR, "ConnectionError"),
42
+ #endif
43
+ #ifdef ER_DBACCESS_DENIED_ERROR
44
+ ERRCODE(ER_DBACCESS_DENIED_ERROR, "ConnectionError"),
45
+ #endif
46
+ #ifdef ER_ACCESS_DENIED_ERROR
47
+ ERRCODE(ER_ACCESS_DENIED_ERROR, "ConnectionError"),
48
+ #endif
49
+ #ifdef ER_UNKNOWN_COM_ERROR
50
+ ERRCODE(ER_UNKNOWN_COM_ERROR, "ConnectionError"),
51
+ #endif
52
+ #ifdef ER_SERVER_SHUTDOWN
53
+ ERRCODE(ER_SERVER_SHUTDOWN, "ConnectionError"),
54
+ #endif
55
+ #ifdef ER_FORCING_CLOSE
56
+ ERRCODE(ER_FORCING_CLOSE, "ConnectionError"),
57
+ #endif
58
+ #ifdef ER_IPSOCK_ERROR
59
+ ERRCODE(ER_IPSOCK_ERROR, "ConnectionError"),
60
+ #endif
61
+
62
+ #ifdef ER_INVALID_USE_OF_NULL
63
+ ERRCODE(ER_INVALID_USE_OF_NULL, "DataError"),
64
+ #endif
65
+ #ifdef ER_DIVISION_BY_ZERO
66
+ ERRCODE(ER_DIVISION_BY_ZERO, "DataError"),
67
+ #endif
68
+ #ifdef ER_ILLEGAL_VALUE_FOR_TYPE
69
+ ERRCODE(ER_ILLEGAL_VALUE_FOR_TYPE, "DataError"),
70
+ #endif
71
+ #ifdef ER_WARN_NULL_TO_NOTNULL
72
+ ERRCODE(ER_WARN_NULL_TO_NOTNULL, "DataError"),
73
+ #endif
74
+ #ifdef ER_WARN_DATA_OUT_OF_RANGE
75
+ ERRCODE(ER_WARN_DATA_OUT_OF_RANGE, "DataError"),
76
+ #endif
77
+ #ifdef ER_WARN_TOO_MANY_RECORDS
78
+ ERRCODE(ER_WARN_TOO_MANY_RECORDS, "DataError"),
79
+ #endif
80
+ #ifdef ER_WARN_TOO_FEW_RECORDS
81
+ ERRCODE(ER_WARN_TOO_FEW_RECORDS, "DataError"),
82
+ #endif
83
+ #ifdef ER_TRUNCATED_WRONG_VALUE
84
+ ERRCODE(ER_TRUNCATED_WRONG_VALUE, "DataError"),
85
+ #endif
86
+ #ifdef ER_DATETIME_FUNCTION_OVERFLOW
87
+ ERRCODE(ER_DATETIME_FUNCTION_OVERFLOW, "DataError"),
88
+ #endif
89
+ #ifdef ER_DATA_TOO_LONG
90
+ ERRCODE(ER_DATA_TOO_LONG, "DataError"),
91
+ #endif
92
+ #ifdef ER_UNKNOWN_TIME_ZONE
93
+ ERRCODE(ER_UNKNOWN_TIME_ZONE, "DataError"),
94
+ #endif
95
+ #ifdef ER_INVALID_CHARACTER_STRING
96
+ ERRCODE(ER_INVALID_CHARACTER_STRING, "DataError"),
97
+ #endif
98
+ #ifdef ER_WARN_INVALID_TIMESTAMP
99
+ ERRCODE(ER_WARN_INVALID_TIMESTAMP, "DataError"),
100
+ #endif
101
+ #ifdef ER_CANT_CREATE_GEOMETRY_OBJECT
102
+ ERRCODE(ER_CANT_CREATE_GEOMETRY_OBJECT, "DataError"),
103
+ #endif
104
+
105
+ #ifdef ER_BAD_NULL_ERROR
106
+ ERRCODE(ER_BAD_NULL_ERROR, "IntegrityError"),
107
+ #endif
108
+ #ifdef ER_NON_UNIQ_ERROR
109
+ ERRCODE(ER_NON_UNIQ_ERROR, "IntegrityError"),
110
+ #endif
111
+ #ifdef ER_DUP_KEY
112
+ ERRCODE(ER_DUP_KEY, "IntegrityError"),
113
+ #endif
114
+ #ifdef ER_DUP_ENTRY
115
+ ERRCODE(ER_DUP_ENTRY, "IntegrityError"),
116
+ #endif
117
+ #ifdef ER_DUP_UNIQUE
118
+ ERRCODE(ER_DUP_UNIQUE, "IntegrityError"),
119
+ #endif
120
+ #ifdef ER_NO_REFERENCED_ROW
121
+ ERRCODE(ER_NO_REFERENCED_ROW, "IntegrityError"),
122
+ #endif
123
+ #ifdef ER_NO_REFERENCED_ROW_2
124
+ ERRCODE(ER_NO_REFERENCED_ROW_2, "IntegrityError"),
125
+ #endif
126
+ #ifdef ER_ROW_IS_REFERENCED
127
+ ERRCODE(ER_ROW_IS_REFERENCED, "IntegrityError"),
128
+ #endif
129
+ #ifdef ER_ROW_IS_REFERENCED_2
130
+ ERRCODE(ER_ROW_IS_REFERENCED_2, "IntegrityError"),
131
+ #endif
132
+
133
+ #ifdef ER_BLOB_KEY_WITHOUT_LENGTH
134
+ ERRCODE(ER_BLOB_KEY_WITHOUT_LENGTH, "SyntaxError"),
135
+ #endif
136
+ #ifdef ER_PRIMARY_CANT_HAVE_NULL
137
+ ERRCODE(ER_PRIMARY_CANT_HAVE_NULL, "SyntaxError"),
138
+ #endif
139
+ #ifdef ER_TOO_MANY_ROWS
140
+ ERRCODE(ER_TOO_MANY_ROWS, "SyntaxError"),
141
+ #endif
142
+ #ifdef ER_REQUIRES_PRIMARY_KEY
143
+ ERRCODE(ER_REQUIRES_PRIMARY_KEY, "SyntaxError"),
144
+ #endif
145
+ #ifdef ER_CHECK_NO_SUCH_TABLE
146
+ ERRCODE(ER_CHECK_NO_SUCH_TABLE, "SyntaxError"),
147
+ #endif
148
+ #ifdef ER_CHECK_NOT_IMPLEMENTED
149
+ ERRCODE(ER_CHECK_NOT_IMPLEMENTED, "SyntaxError"),
150
+ #endif
151
+ #ifdef ER_TOO_MANY_USER_CONNECTIONS
152
+ ERRCODE(ER_TOO_MANY_USER_CONNECTIONS, "SyntaxError"),
153
+ #endif
154
+ #ifdef ER_NO_PERMISSION_TO_CREATE_USER
155
+ ERRCODE(ER_NO_PERMISSION_TO_CREATE_USER, "SyntaxError"),
156
+ #endif
157
+ #ifdef ER_USER_LIMIT_REACHED
158
+ ERRCODE(ER_USER_LIMIT_REACHED, "SyntaxError"),
159
+ #endif
160
+ #ifdef ER_SPECIFIC_ACCESS_DENIED_ERROR
161
+ ERRCODE(ER_SPECIFIC_ACCESS_DENIED_ERROR, "SyntaxError"),
162
+ #endif
163
+ #ifdef ER_NO_DEFAULT
164
+ ERRCODE(ER_NO_DEFAULT, "SyntaxError"),
165
+ #endif
166
+ #ifdef ER_WRONG_VALUE_FOR_VAR
167
+ ERRCODE(ER_WRONG_VALUE_FOR_VAR, "SyntaxError"),
168
+ #endif
169
+ #ifdef ER_WRONG_TYPE_FOR_VAR
170
+ ERRCODE(ER_WRONG_TYPE_FOR_VAR, "SyntaxError"),
171
+ #endif
172
+ #ifdef ER_CANT_USE_OPTION_HERE
173
+ ERRCODE(ER_CANT_USE_OPTION_HERE, "SyntaxError"),
174
+ #endif
175
+ #ifdef ER_NOT_SUPPORTED_YET
176
+ ERRCODE(ER_NOT_SUPPORTED_YET, "SyntaxError"),
177
+ #endif
178
+ #ifdef ER_WRONG_FK_DEF
179
+ ERRCODE(ER_WRONG_FK_DEF, "SyntaxError"),
180
+ #endif
181
+ #ifdef ER_ILLEGAL_REFERENCE
182
+ ERRCODE(ER_ILLEGAL_REFERENCE, "SyntaxError"),
183
+ #endif
184
+ #ifdef ER_DERIVED_MUST_HAVE_ALIAS
185
+ ERRCODE(ER_DERIVED_MUST_HAVE_ALIAS, "SyntaxError"),
186
+ #endif
187
+ #ifdef ER_TABLENAME_NOT_ALLOWED_HERE
188
+ ERRCODE(ER_TABLENAME_NOT_ALLOWED_HERE, "SyntaxError"),
189
+ #endif
190
+ #ifdef ER_SPATIAL_CANT_HAVE_NULL
191
+ ERRCODE(ER_SPATIAL_CANT_HAVE_NULL, "SyntaxError"),
192
+ #endif
193
+ #ifdef ER_COLLATION_CHARSET_MISMATCH
194
+ ERRCODE(ER_COLLATION_CHARSET_MISMATCH, "SyntaxError"),
195
+ #endif
196
+ #ifdef ER_WRONG_NAME_FOR_INDEX
197
+ ERRCODE(ER_WRONG_NAME_FOR_INDEX, "SyntaxError"),
198
+ #endif
199
+ #ifdef ER_WRONG_NAME_FOR_CATALOG
200
+ ERRCODE(ER_WRONG_NAME_FOR_CATALOG, "SyntaxError"),
201
+ #endif
202
+ #ifdef ER_UNKNOWN_STORAGE_ENGINE
203
+ ERRCODE(ER_UNKNOWN_STORAGE_ENGINE, "SyntaxError"),
204
+ #endif
205
+ #ifdef ER_SP_ALREADY_EXISTS
206
+ ERRCODE(ER_SP_ALREADY_EXISTS, "SyntaxError"),
207
+ #endif
208
+ #ifdef ER_SP_DOES_NOT_EXIST
209
+ ERRCODE(ER_SP_DOES_NOT_EXIST, "SyntaxError"),
210
+ #endif
211
+ #ifdef ER_SP_LILABEL_MISMATCH
212
+ ERRCODE(ER_SP_LILABEL_MISMATCH, "SyntaxError"),
213
+ #endif
214
+ #ifdef ER_SP_LABEL_REDEFINE
215
+ ERRCODE(ER_SP_LABEL_REDEFINE, "SyntaxError"),
216
+ #endif
217
+ #ifdef ER_SP_LABEL_MISMATCH
218
+ ERRCODE(ER_SP_LABEL_MISMATCH, "SyntaxError"),
219
+ #endif
220
+ #ifdef ER_SP_BADRETURN
221
+ ERRCODE(ER_SP_BADRETURN, "SyntaxError"),
222
+ #endif
223
+ #ifdef ER_SP_WRONG_NO_OF_ARGS
224
+ ERRCODE(ER_SP_WRONG_NO_OF_ARGS, "SyntaxError"),
225
+ #endif
226
+ #ifdef ER_SP_COND_MISMATCH
227
+ ERRCODE(ER_SP_COND_MISMATCH, "SyntaxError"),
228
+ #endif
229
+ #ifdef ER_SP_NORETURN
230
+ ERRCODE(ER_SP_NORETURN, "SyntaxError"),
231
+ #endif
232
+ #ifdef ER_SP_BAD_CURSOR_QUERY
233
+ ERRCODE(ER_SP_BAD_CURSOR_QUERY, "SyntaxError"),
234
+ #endif
235
+ #ifdef ER_SP_BAD_CURSOR_SELECT
236
+ ERRCODE(ER_SP_BAD_CURSOR_SELECT, "SyntaxError"),
237
+ #endif
238
+ #ifdef ER_SP_CURSOR_MISMATCH
239
+ ERRCODE(ER_SP_CURSOR_MISMATCH, "SyntaxError"),
240
+ #endif
241
+ #ifdef ER_SP_UNDECLARED_VAR
242
+ ERRCODE(ER_SP_UNDECLARED_VAR, "SyntaxError"),
243
+ #endif
244
+ #ifdef ER_SP_DUP_PARAM
245
+ ERRCODE(ER_SP_DUP_PARAM, "SyntaxError"),
246
+ #endif
247
+ #ifdef ER_SP_DUP_VAR
248
+ ERRCODE(ER_SP_DUP_VAR, "SyntaxError"),
249
+ #endif
250
+ #ifdef ER_SP_DUP_COND
251
+ ERRCODE(ER_SP_DUP_COND, "SyntaxError"),
252
+ #endif
253
+ #ifdef ER_SP_DUP_CURS
254
+ ERRCODE(ER_SP_DUP_CURS, "SyntaxError"),
255
+ #endif
256
+ #ifdef ER_SP_VARCOND_AFTER_CURSHNDLR
257
+ ERRCODE(ER_SP_VARCOND_AFTER_CURSHNDLR, "SyntaxError"),
258
+ #endif
259
+ #ifdef ER_SP_CURSOR_AFTER_HANDLER
260
+ ERRCODE(ER_SP_CURSOR_AFTER_HANDLER, "SyntaxError"),
261
+ #endif
262
+ #ifdef ER_SP_CASE_NOT_FOUND
263
+ ERRCODE(ER_SP_CASE_NOT_FOUND, "SyntaxError"),
264
+ #endif
265
+ #ifdef ER_PROCACCESS_DENIED_ERROR
266
+ ERRCODE(ER_PROCACCESS_DENIED_ERROR, "SyntaxError"),
267
+ #endif
268
+ #ifdef ER_NONEXISTING_PROC_GRANT
269
+ ERRCODE(ER_NONEXISTING_PROC_GRANT, "SyntaxError"),
270
+ #endif
271
+ #ifdef ER_SP_BAD_SQLSTATE
272
+ ERRCODE(ER_SP_BAD_SQLSTATE, "SyntaxError"),
273
+ #endif
274
+ #ifdef ER_CANT_CREATE_USER_WITH_GRANT
275
+ ERRCODE(ER_CANT_CREATE_USER_WITH_GRANT, "SyntaxError"),
276
+ #endif
277
+ #ifdef ER_SP_DUP_HANDLER
278
+ ERRCODE(ER_SP_DUP_HANDLER, "SyntaxError"),
279
+ #endif
280
+ #ifdef ER_SP_NOT_VAR_ARG
281
+ ERRCODE(ER_SP_NOT_VAR_ARG, "SyntaxError"),
282
+ #endif
283
+ #ifdef ER_TOO_BIG_SCALE
284
+ ERRCODE(ER_TOO_BIG_SCALE, "SyntaxError"),
285
+ #endif
286
+ #ifdef ER_TOO_BIG_PRECISION
287
+ ERRCODE(ER_TOO_BIG_PRECISION, "SyntaxError"),
288
+ #endif
289
+ #ifdef ER_M_BIGGER_THAN_D
290
+ ERRCODE(ER_M_BIGGER_THAN_D, "SyntaxError"),
291
+ #endif
292
+ #ifdef ER_TOO_LONG_BODY
293
+ ERRCODE(ER_TOO_LONG_BODY, "SyntaxError"),
294
+ #endif
295
+ #ifdef ER_TOO_BIG_DISPLAYWIDTH
296
+ ERRCODE(ER_TOO_BIG_DISPLAYWIDTH, "SyntaxError"),
297
+ #endif
298
+ #ifdef ER_SP_BAD_VAR_SHADOW
299
+ ERRCODE(ER_SP_BAD_VAR_SHADOW, "SyntaxError"),
300
+ #endif
301
+ #ifdef ER_SP_WRONG_NAME
302
+ ERRCODE(ER_SP_WRONG_NAME, "SyntaxError"),
303
+ #endif
304
+ #ifdef ER_SP_NO_AGGREGATE
305
+ ERRCODE(ER_SP_NO_AGGREGATE, "SyntaxError"),
306
+ #endif
307
+ #ifdef ER_MAX_PREPARED_STMT_COUNT_REACHED
308
+ ERRCODE(ER_MAX_PREPARED_STMT_COUNT_REACHED, "SyntaxError"),
309
+ #endif
310
+ #ifdef ER_NON_GROUPING_FIELD_USED
311
+ ERRCODE(ER_NON_GROUPING_FIELD_USED, "SyntaxError"),
312
+ #endif
313
+ #ifdef ER_BAD_DB_ERROR
314
+ ERRCODE(ER_BAD_DB_ERROR, "SyntaxError"),
315
+ #endif
316
+ #ifdef ER_TABLE_EXISTS_ERROR
317
+ ERRCODE(ER_TABLE_EXISTS_ERROR, "SyntaxError"),
318
+ #endif
319
+ #ifdef ER_BAD_TABLE_ERROR
320
+ ERRCODE(ER_BAD_TABLE_ERROR, "SyntaxError"),
321
+ #endif
322
+ #ifdef ER_NO_SUCH_TABLE
323
+ ERRCODE(ER_NO_SUCH_TABLE, "SyntaxError"),
324
+ #endif
325
+ #ifdef ER_NONEXISTING_TABLE_GRANT
326
+ ERRCODE(ER_NONEXISTING_TABLE_GRANT, "SyntaxError"),
327
+ #endif
328
+ #ifdef ER_GRANT_WRONG_HOST_OR_USER
329
+ ERRCODE(ER_GRANT_WRONG_HOST_OR_USER, "SyntaxError"),
330
+ #endif
331
+ #ifdef ER_ILLEGAL_GRANT_FOR_TABLE
332
+ ERRCODE(ER_ILLEGAL_GRANT_FOR_TABLE, "SyntaxError"),
333
+ #endif
334
+ #ifdef ER_COLUMNACCESS_DENIED_ERROR
335
+ ERRCODE(ER_COLUMNACCESS_DENIED_ERROR, "SyntaxError"),
336
+ #endif
337
+ #ifdef ER_TABLEACCESS_DENIED_ERROR
338
+ ERRCODE(ER_TABLEACCESS_DENIED_ERROR, "SyntaxError"),
339
+ #endif
340
+ #ifdef ER_NONEXISTING_GRANT
341
+ ERRCODE(ER_NONEXISTING_GRANT, "SyntaxError"),
342
+ #endif
343
+ #ifdef ER_MIX_OF_GROUP_FUNC_AND_FIELDS
344
+ ERRCODE(ER_MIX_OF_GROUP_FUNC_AND_FIELDS, "SyntaxError"),
345
+ #endif
346
+ #ifdef ER_REGEXP_ERROR
347
+ ERRCODE(ER_REGEXP_ERROR, "SyntaxError"),
348
+ #endif
349
+ #ifdef ER_NOT_ALLOWED_COMMAND
350
+ ERRCODE(ER_NOT_ALLOWED_COMMAND, "SyntaxError"),
351
+ #endif
352
+ #ifdef ER_SYNTAX_ERROR
353
+ ERRCODE(ER_SYNTAX_ERROR, "SyntaxError"),
354
+ #endif
355
+ #ifdef ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
356
+ ERRCODE(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, "SyntaxError"),
357
+ #endif
358
+
359
+ #ifdef ER_CANT_DO_THIS_DURING_AN_TRANSACTION
360
+ ERRCODE(ER_CANT_DO_THIS_DURING_AN_TRANSACTION, "TransactionError"),
361
+ #endif
362
+ #ifdef ER_ERROR_DURING_COMMIT
363
+ ERRCODE(ER_ERROR_DURING_COMMIT, "TransactionError"),
364
+ #endif
365
+ #ifdef ER_ERROR_DURING_ROLLBACK
366
+ ERRCODE(ER_ERROR_DURING_ROLLBACK, "TransactionError"),
367
+ #endif
368
+ #ifdef ER_ERROR_DURING_CHECKPOINT
369
+ ERRCODE(ER_ERROR_DURING_CHECKPOINT, "TransactionError"),
370
+ #endif
371
+ #ifdef ER_LOCK_DEADLOCK
372
+ ERRCODE(ER_LOCK_DEADLOCK, "TransactionError"),
373
+ #endif
374
+ #ifdef ER_XAER_NOTA
375
+ ERRCODE(ER_XAER_NOTA,
376
+ "TransactionError"),
377
+ #endif
378
+ #ifdef ER_XAER_INVAL
379
+ ERRCODE(ER_XAER_INVAL,
380
+ "TransactionError"),
381
+ #endif
382
+ #ifdef ER_XAER_RMFAIL
383
+ ERRCODE(ER_XAER_RMFAIL, "TransactionError"),
384
+ #endif
385
+ #ifdef ER_XAER_OUTSIDE
386
+ ERRCODE(ER_XAER_OUTSIDE, "TransactionError"),
387
+ #endif
388
+ #ifdef ER_XAER_RMERR
389
+ ERRCODE(ER_XAER_RMERR, "TransactionError"),
390
+ #endif
391
+ #ifdef ER_XA_RBROLLBACK
392
+ ERRCODE(ER_XA_RBROLLBACK, "TransactionError"),
393
+ #endif
394
+ #ifdef ER_XA_RBTIMEOUT
395
+ ERRCODE(ER_XA_RBTIMEOUT, "TransactionError"),
396
+ #endif
397
+ #ifdef ER_XA_RBDEADLOCK
398
+ ERRCODE(ER_XA_RBDEADLOCK, "TransactionError"),
399
+ #endif
400
+ {0, NULL, NULL}
401
+ };
402
+
403
+ #endif
@@ -0,0 +1,87 @@
1
+ require 'mkmf'
2
+ require 'date'
3
+
4
+ # Allow for custom compiler to be specified.
5
+ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
6
+
7
+ # All instances of mysql_config on PATH ...
8
+ def mysql_config_paths
9
+ ENV['PATH'].split(File::PATH_SEPARATOR).collect do |path|
10
+ %W(#{path}/mysql_config #{path}/mysql_config5)
11
+ .detect { |bin| File.exist?(bin) }
12
+ end
13
+ end
14
+
15
+ # The first mysql_config binary on PATH ...
16
+ def default_mysql_config_path
17
+ mysql_config_paths.compact.first
18
+ end
19
+
20
+ def mysql_config(type)
21
+ IO.popen("#{default_mysql_config_path} --#{type}").readline.chomp
22
+ rescue
23
+ nil
24
+ end
25
+
26
+ def default_prefix
27
+ if (mc = default_mysql_config_path)
28
+ File.dirname(mc, 2)
29
+ else
30
+ '/usr/local'
31
+ end
32
+ end
33
+
34
+ # Allow overriding path to mysql_config on command line using:
35
+ # ruby extconf.rb --with-mysql-config=/path/to/mysql_config
36
+ if with_config('mysql-config', default_mysql_config_path)
37
+ includes = mysql_config('include').split(/\s+/).map do |dir|
38
+ dir.gsub(/^-I/, '')
39
+ end.uniq
40
+ libs = mysql_config('libs').split(/\s+/).grep(/^-L/).map do |dir|
41
+ dir.gsub(/^-L/, '')
42
+ end.uniq
43
+
44
+ linked = mysql_config('libs').split(/\s+/).grep(/^-l/).map do |dir|
45
+ dir.gsub(/^-l/, '')
46
+ end.uniq
47
+
48
+ dir_config('mysql', includes, libs)
49
+ linked.each do |link|
50
+ have_library link
51
+ end
52
+ else
53
+ _, lib = dir_config('mysql', default_prefix)
54
+ lib_dirs =
55
+ [lib, '/usr/lib', '/usr/local/lib', '/opt/local/lib'].collect do |path|
56
+ [path, "#{path}/mysql", "#{path}/mysql5/mysql"]
57
+ end
58
+ find_library('mysqlclient', 'mysql_query', *lib_dirs.flatten) || exit(1)
59
+ find_header('mysql.h', *lib_dirs.flatten.map { |p| p.gsub('/lib', '/include') })
60
+ end
61
+
62
+ have_func('localtime_r')
63
+ have_func('gmtime_r')
64
+
65
+ have_header 'mysql.h'
66
+ have_const 'MYSQL_TYPE_STRING', 'mysql.h'
67
+ have_const 'MYSQL_TYPE_BIT', 'mysql.h'
68
+ have_const 'MYSQL_TYPE_NEWDECIMAL', 'mysql.h'
69
+ have_func 'mysql_query', 'mysql.h'
70
+ have_func 'mysql_ssl_set', 'mysql.h'
71
+ have_func 'mysql_sqlstate', 'mysql.h'
72
+ have_func 'mysql_get_ssl_cipher', 'mysql.h'
73
+ have_func 'mysql_set_character_set', 'mysql.h'
74
+ have_func 'mysql_get_server_version', 'mysql.h'
75
+ have_func 'mysql_real_escape_string_quote', 'mysql.h'
76
+ have_struct_member 'MYSQL_FIELD', 'charsetnr', 'mysql.h'
77
+
78
+ have_func('rb_thread_fd_select')
79
+
80
+ # rubocop:disable Style/GlobalVars
81
+ $CFLAGS << ' -DHAVE_NO_DATETIME_NEWBANG' unless DateTime.respond_to?(:new!)
82
+
83
+ $CFLAGS << ' -Wall '
84
+
85
+ # rubocop:enable Style/GlobalVars
86
+
87
+ create_makefile('do_mysql/do_mysql')
@@ -0,0 +1,25 @@
1
+ #ifdef HAVE_OLD_MYSQL_VERSION
2
+ #define MYSQL_TYPE_VAR_STRING FIELD_TYPE_VAR_STRING
3
+ #define MYSQL_TYPE_STRING FIELD_TYPE_STRING
4
+ #define MYSQL_TYPE_NEWDECIMAL FIELD_TYPE_DECIMAL
5
+ #define MYSQL_TYPE_SHORT FIELD_TYPE_SHORT
6
+ #define MYSQL_TYPE_LONG FIELD_TYPE_LONG
7
+ #define MYSQL_TYPE_FLOAT FIELD_TYPE_FLOAT
8
+ #define MYSQL_TYPE_DOUBLE FIELD_TYPE_DOUBLE
9
+ #define MYSQL_TYPE_LONGLONG FIELD_TYPE_LONGLONG
10
+ #define MYSQL_TYPE_INT24 FIELD_TYPE_INT24
11
+ #define MYSQL_TYPE_YEAR FIELD_TYPE_YEAR
12
+ #define MYSQL_TYPE_TINY FIELD_TYPE_TINY
13
+ #define MYSQL_TYPE_TINY_BLOB FIELD_TYPE_TINY_BLOB
14
+ #define MYSQL_TYPE_MEDIUM_BLOB FIELD_TYPE_MEDIUM_BLOB
15
+ #define MYSQL_TYPE_LONG_BLOB FIELD_TYPE_LONG_BLOB
16
+ #define MYSQL_TYPE_BLOB FIELD_TYPE_BLOB
17
+ #define MYSQL_TYPE_DATE FIELD_TYPE_DATE
18
+ #define MYSQL_TYPE_NEWDATE FIELD_TYPE_NEWDATE
19
+ #define MYSQL_TYPE_DATETIME FIELD_TYPE_DATETIME
20
+ #define MYSQL_TYPE_TIME FIELD_TYPE_TIME
21
+ #define MYSQL_TYPE_TIMESTAMP FIELD_TYPE_TIMESTAMP
22
+ #define MYSQL_TYPE_ENUM FIELD_TYPE_ENUM
23
+ #define MYSQL_TYPE_SET FIELD_TYPE_SET
24
+ #define MYSQL_TYPE_NULL FIELD_TYPE_NULL
25
+ #endif
@@ -0,0 +1,39 @@
1
+ module DataObjects
2
+ module Mysql
3
+ module Encoding
4
+ MAP = {
5
+ 'Big5' => 'big5',
6
+ 'CP850' => 'cp850',
7
+ 'KOI8-R' => 'koi8r',
8
+ 'ISO-8859-1' => 'latin1',
9
+ 'ISO-8859-2' => 'latin2',
10
+ 'US-ASCII' => 'ascii',
11
+ 'EUC-JP' => 'ujis',
12
+ 'SJIS' => 'sjis',
13
+ 'ISO-8859-8' => 'hebrew',
14
+ 'TIS-620' => 'tis620',
15
+ 'EUC-KR' => 'euckr',
16
+ 'KOI8-U' => 'koi8u',
17
+ 'GB2312' => 'gb2312',
18
+ 'ISO-8859-7' => 'greek',
19
+ 'Windows-1250' => 'cp1250',
20
+ 'GBK' => 'gbk',
21
+ 'ISO-8859-9' => 'latin5',
22
+ 'UTF-8' => 'utf8',
23
+ 'UTF-8-MB4' => 'utf8mb4',
24
+ 'UTF-16BE' => 'ucs2',
25
+ 'IBM866' => 'cp866',
26
+ 'macCentEuro' => 'macce',
27
+ 'macRoman' => 'macroman',
28
+ 'CP852' => 'cp852',
29
+ 'ISO-8859-13' => 'latin7',
30
+ 'Windows-1251' => 'cp1251',
31
+ 'Windows-1256' => 'cp1256',
32
+ 'Windows-1257' => 'cp1257',
33
+ 'ASCII-8BIT' => 'binary',
34
+ 'Windows-31J' => 'cp932',
35
+ 'eucJP-ms' => 'eucjpms'
36
+ }.freeze
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ module DataObjects
2
+ module Mysql
3
+ class Transaction < DataObjects::Transaction
4
+ def begin_prepared
5
+ cmd = "XA START '#{id}'"
6
+ connection.create_command(cmd).execute_non_query
7
+ end
8
+
9
+ def commit_prepared
10
+ cmd = "XA COMMIT '#{id}'"
11
+ connection.create_command(cmd).execute_non_query
12
+ end
13
+
14
+ def rollback_prepared
15
+ cmd = "XA ROLLBACK '#{id}'"
16
+ connection.create_command(cmd).execute_non_query
17
+ end
18
+
19
+ def prepare
20
+ finalize_transaction
21
+ cmd = "XA PREPARE '#{id}'"
22
+ connection.create_command(cmd).execute_non_query
23
+ end
24
+
25
+ private def finalize_transaction
26
+ cmd = "XA END '#{id}'"
27
+ connection.create_command(cmd).execute_non_query
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ module DataObjects
2
+ module Mysql
3
+ VERSION = '0.10.18'.freeze
4
+ end
5
+ end
data/lib/do_mysql.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'data_objects'
2
+
3
+ begin
4
+ require 'do_mysql/do_mysql'
5
+ rescue LoadError
6
+ raise unless RUBY_PLATFORM =~ /mingw|mswin/
7
+
8
+ RUBY_VERSION =~ /(\d+.\d+)/
9
+ require "do_mysql/#{Regexp.last_match(1)}/do_mysql"
10
+ end
11
+
12
+ require 'do_mysql/version'
13
+ require 'do_mysql/transaction'
14
+ require 'do_mysql/encoding'
15
+
16
+ module DataObjects
17
+ module Mysql
18
+ class Connection
19
+ def secure?
20
+ !(@ssl_cipher.nil? || @ssl_cipher.empty?)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+ require 'data_objects/spec/shared/command_spec'
3
+
4
+ describe DataObjects::Mysql::Command do
5
+ it_behaves_like 'a Command'
6
+ it_behaves_like 'a Command with async'
7
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+ require 'data_objects/spec/shared/connection_spec'
3
+ require 'cgi'
4
+
5
+ describe DataObjects::Mysql::Connection do
6
+ before :all do
7
+ @driver = CONFIG.scheme
8
+ @user = CONFIG.user
9
+ @password = CONFIG.pass
10
+ @host = CONFIG.host
11
+ @port = CONFIG.port
12
+ @database = CONFIG.database
13
+ @ssl = CONFIG.ssl
14
+ end
15
+
16
+ it_behaves_like 'a Connection'
17
+ it_behaves_like 'a Connection with authentication support'
18
+ it_behaves_like 'a Connection allowing default database'
19
+ it_behaves_like 'a Connection with SSL support'
20
+
21
+ if DataObjectsSpecHelpers.test_environment_supports_ssl?
22
+ describe 'connecting with SSL' do
23
+ it 'raises an error when passed ssl=true' do
24
+ expect { DataObjects::Connection.new("#{CONFIG.uri}?ssl=true") }
25
+ .to raise_error(ArgumentError)
26
+ end
27
+
28
+ it 'raises an error when passed a nonexistent client certificate' do
29
+ expect { DataObjects::Connection.new("#{CONFIG.uri}?ssl[client_cert]=nonexistent") }
30
+ .to raise_error(ArgumentError)
31
+ end
32
+
33
+ it 'raises an error when passed a nonexistent client key' do
34
+ expect { DataObjects::Connection.new("#{CONFIG.uri}?ssl[client_key]=nonexistent") }
35
+ .to raise_error(ArgumentError)
36
+ end
37
+
38
+ it 'raises an error when passed a nonexistent ca certificate' do
39
+ expect { DataObjects::Connection.new("#{CONFIG.uri}?ssl[ca_cert]=nonexistent") }
40
+ .to raise_error(ArgumentError)
41
+ end
42
+
43
+ it 'connects with a specified SSL cipher' do
44
+ expect(DataObjects::Connection.new("#{CONFIG.uri}?#{CONFIG.ssl}&ssl[cipher]=#{SSLHelpers::CONFIG.cipher}")
45
+ .ssl_cipher).to eq SSLHelpers::CONFIG.cipher
46
+ end
47
+
48
+ it 'raises an error with an invalid SSL cipher' do
49
+ expect { DataObjects::Connection.new("#{CONFIG.uri}?#{CONFIG.ssl}&ssl[cipher]=invalid") }
50
+ .to raise_error
51
+ end
52
+ end
53
+ end
54
+ end
55
+ # rubocop:enable Metrics/BlockLength