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.
- checksums.yaml +7 -0
- data/ChangeLog.markdown +116 -0
- data/LICENSE +20 -0
- data/README.markdown +100 -0
- data/Rakefile +25 -0
- data/ext/do_mysql/compat.h +55 -0
- data/ext/do_mysql/do_common.c +510 -0
- data/ext/do_mysql/do_common.h +132 -0
- data/ext/do_mysql/do_mysql.c +691 -0
- data/ext/do_mysql/error.h +403 -0
- data/ext/do_mysql/extconf.rb +87 -0
- data/ext/do_mysql/mysql_compat.h +25 -0
- data/lib/do_mysql/encoding.rb +39 -0
- data/lib/do_mysql/transaction.rb +31 -0
- data/lib/do_mysql/version.rb +5 -0
- data/lib/do_mysql.rb +24 -0
- data/spec/command_spec.rb +7 -0
- data/spec/connection_spec.rb +55 -0
- data/spec/encoding_spec.rb +46 -0
- data/spec/error/sql_error_spec.rb +6 -0
- data/spec/reader_spec.rb +29 -0
- data/spec/result_spec.rb +38 -0
- data/spec/spec_helper.rb +242 -0
- data/spec/typecast/array_spec.rb +6 -0
- data/spec/typecast/bigdecimal_spec.rb +7 -0
- data/spec/typecast/boolean_spec.rb +7 -0
- data/spec/typecast/byte_array_spec.rb +6 -0
- data/spec/typecast/class_spec.rb +6 -0
- data/spec/typecast/date_spec.rb +30 -0
- data/spec/typecast/datetime_spec.rb +30 -0
- data/spec/typecast/float_spec.rb +7 -0
- data/spec/typecast/integer_spec.rb +6 -0
- data/spec/typecast/nil_spec.rb +8 -0
- data/spec/typecast/other_spec.rb +6 -0
- data/spec/typecast/range_spec.rb +6 -0
- data/spec/typecast/string_spec.rb +6 -0
- data/spec/typecast/time_spec.rb +6 -0
- data/tasks/compile.rake +16 -0
- data/tasks/release.rake +14 -0
- data/tasks/retrieve.rake +20 -0
- data/tasks/spec.rake +10 -0
- data/tasks/ssl.rake +26 -0
- 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
|
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,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
|