mysql2 0.2.24 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/.gitignore +12 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/CHANGELOG.md +148 -0
  5. data/Gemfile +3 -0
  6. data/README.rdoc +257 -0
  7. data/Rakefile +5 -0
  8. data/benchmark/active_record.rb +51 -0
  9. data/benchmark/active_record_threaded.rb +42 -0
  10. data/benchmark/allocations.rb +33 -0
  11. data/benchmark/escape.rb +36 -0
  12. data/benchmark/query_with_mysql_casting.rb +80 -0
  13. data/benchmark/query_without_mysql_casting.rb +47 -0
  14. data/benchmark/sequel.rb +37 -0
  15. data/benchmark/setup_db.rb +119 -0
  16. data/benchmark/threaded.rb +44 -0
  17. data/ext/mysql2/client.c +272 -849
  18. data/ext/mysql2/client.h +12 -27
  19. data/ext/mysql2/extconf.rb +14 -72
  20. data/ext/mysql2/mysql2_ext.h +4 -7
  21. data/ext/mysql2/result.c +123 -319
  22. data/ext/mysql2/result.h +1 -4
  23. data/lib/active_record/connection_adapters/em_mysql2_adapter.rb +64 -0
  24. data/lib/active_record/fiber_patches.rb +104 -0
  25. data/lib/mysql2.rb +5 -20
  26. data/lib/mysql2/client.rb +200 -50
  27. data/lib/mysql2/em.rb +3 -13
  28. data/lib/mysql2/em_fiber.rb +31 -0
  29. data/lib/mysql2/error.rb +6 -71
  30. data/lib/mysql2/version.rb +2 -2
  31. data/mysql2.gemspec +32 -0
  32. data/spec/em/em_fiber_spec.rb +22 -0
  33. data/spec/em/em_spec.rb +9 -74
  34. data/spec/mysql2/client_spec.rb +126 -593
  35. data/spec/mysql2/error_spec.rb +44 -58
  36. data/spec/mysql2/result_spec.rb +85 -257
  37. data/spec/spec_helper.rb +3 -24
  38. data/tasks/benchmarks.rake +20 -0
  39. data/tasks/compile.rake +71 -0
  40. data/tasks/rspec.rake +16 -0
  41. data/tasks/vendor_mysql.rake +40 -0
  42. metadata +179 -92
  43. checksums.yaml +0 -7
  44. data/README.md +0 -524
  45. data/ext/mysql2/infile.c +0 -122
  46. data/ext/mysql2/infile.h +0 -1
  47. data/ext/mysql2/mysql_enc_name_to_ruby.h +0 -168
  48. data/ext/mysql2/mysql_enc_to_ruby.h +0 -246
  49. data/ext/mysql2/wait_for_single_fd.h +0 -36
  50. data/lib/active_record/connection_adapters/mysql2_adapter.rb +0 -635
  51. data/lib/arel/engines/sql/compilers/mysql2_compiler.rb +0 -11
  52. data/lib/mysql2/console.rb +0 -5
  53. data/spec/configuration.yml.example +0 -17
  54. data/spec/my.cnf.example +0 -9
  55. data/spec/test_data +0 -1
  56. data/support/mysql_enc_to_ruby.rb +0 -82
  57. data/support/ruby_enc_to_mysql.rb +0 -61
data/ext/mysql2/infile.c DELETED
@@ -1,122 +0,0 @@
1
- #include <mysql2_ext.h>
2
-
3
- #include <errno.h>
4
- #ifndef _MSC_VER
5
- #include <unistd.h>
6
- #endif
7
- #include <fcntl.h>
8
-
9
- #define ERROR_LEN 1024
10
- typedef struct
11
- {
12
- int fd;
13
- char *filename;
14
- char error[ERROR_LEN];
15
- mysql_client_wrapper *wrapper;
16
- } mysql2_local_infile_data;
17
-
18
- /* MySQL calls this function when a user begins a LOAD DATA LOCAL INFILE query.
19
- *
20
- * Allocate a data struct and pass it back through the data pointer.
21
- *
22
- * Returns:
23
- * 0 on success
24
- * 1 on error
25
- */
26
- static int
27
- mysql2_local_infile_init(void **ptr, const char *filename, void *userdata)
28
- {
29
- mysql2_local_infile_data *data = malloc(sizeof(mysql2_local_infile_data));
30
- if (!data) return 1;
31
-
32
- *ptr = data;
33
- data->error[0] = 0;
34
- data->wrapper = userdata;
35
-
36
- data->filename = strdup(filename);
37
- if (!data->filename) {
38
- snprintf(data->error, ERROR_LEN, "%s: %s", strerror(errno), filename);
39
- return 1;
40
- }
41
-
42
- data->fd = open(filename, O_RDONLY);
43
- if (data->fd < 0) {
44
- snprintf(data->error, ERROR_LEN, "%s: %s", strerror(errno), filename);
45
- return 1;
46
- }
47
-
48
- return 0;
49
- }
50
-
51
- /* MySQL calls this function to read data from the local file.
52
- *
53
- * Returns:
54
- * > 0 number of bytes read
55
- * == 0 end of file
56
- * < 0 error
57
- */
58
- static int
59
- mysql2_local_infile_read(void *ptr, char *buf, uint buf_len)
60
- {
61
- int count;
62
- mysql2_local_infile_data *data = (mysql2_local_infile_data *)ptr;
63
-
64
- count = (int)read(data->fd, buf, buf_len);
65
- if (count < 0) {
66
- snprintf(data->error, ERROR_LEN, "%s: %s", strerror(errno), data->filename);
67
- }
68
-
69
- return count;
70
- }
71
-
72
- /* MySQL calls this function when we're done with the LOCAL INFILE query.
73
- *
74
- * ptr will be null if the init function failed.
75
- */
76
- static void
77
- mysql2_local_infile_end(void *ptr)
78
- {
79
- mysql2_local_infile_data *data = (mysql2_local_infile_data *)ptr;
80
- if (data) {
81
- if (data->fd >= 0)
82
- close(data->fd);
83
- if (data->filename)
84
- free(data->filename);
85
- free(data);
86
- }
87
- }
88
-
89
- /* MySQL calls this function if any of the functions above returned an error.
90
- *
91
- * This function is called even if init failed, with whatever ptr value
92
- * init has set, regardless of the return value of the init function.
93
- *
94
- * Returns:
95
- * Error message number (see http://dev.mysql.com/doc/refman/5.0/en/error-messages-client.html)
96
- */
97
- static int
98
- mysql2_local_infile_error(void *ptr, char *error_msg, uint error_msg_len)
99
- {
100
- mysql2_local_infile_data *data = (mysql2_local_infile_data *) ptr;
101
-
102
- if (data) {
103
- snprintf(error_msg, error_msg_len, "%s", data->error);
104
- return CR_UNKNOWN_ERROR;
105
- }
106
-
107
- snprintf(error_msg, error_msg_len, "Out of memory");
108
- return CR_OUT_OF_MEMORY;
109
- }
110
-
111
- /* Tell MySQL Client to use our own local_infile functions.
112
- * This is both due to bugginess in the default handlers,
113
- * and to improve the Rubyness of the handlers here.
114
- */
115
- void mysql2_set_local_infile(MYSQL *mysql, void *userdata)
116
- {
117
- mysql_set_local_infile_handler(mysql,
118
- mysql2_local_infile_init,
119
- mysql2_local_infile_read,
120
- mysql2_local_infile_end,
121
- mysql2_local_infile_error, userdata);
122
- }
data/ext/mysql2/infile.h DELETED
@@ -1 +0,0 @@
1
- void mysql2_set_local_infile(MYSQL *mysql, void *userdata);
@@ -1,168 +0,0 @@
1
- /* C code produced by gperf version 3.0.3 */
2
- /* Command-line: gperf */
3
- /* Computed positions: -k'1,3,$' */
4
-
5
- #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
6
- && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
7
- && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
8
- && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
9
- && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
10
- && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
11
- && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
12
- && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
13
- && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
14
- && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
15
- && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
16
- && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
17
- && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
18
- && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
19
- && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
20
- && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
21
- && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
22
- && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
23
- && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
24
- && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
25
- && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
26
- && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
27
- && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
28
- /* The character set is not based on ISO-646. */
29
- error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
30
- #endif
31
-
32
- struct mysql2_mysql_enc_name_to_rb_map { const char *name; const char *rb_name; };
33
- /* maximum key range = 66, duplicates = 0 */
34
-
35
- #ifdef __GNUC__
36
- __inline
37
- #else
38
- #ifdef __cplusplus
39
- inline
40
- #endif
41
- #endif
42
- static unsigned int
43
- mysql2_mysql_enc_name_to_rb_hash (str, len)
44
- register const char *str;
45
- register unsigned int len;
46
- {
47
- static const unsigned char asso_values[] =
48
- {
49
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
50
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
51
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
52
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
53
- 69, 69, 69, 69, 69, 69, 69, 69, 40, 5,
54
- 0, 69, 0, 40, 25, 20, 10, 55, 69, 69,
55
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
56
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
57
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
58
- 69, 69, 69, 69, 69, 69, 69, 35, 5, 0,
59
- 10, 0, 20, 0, 5, 5, 69, 0, 10, 15,
60
- 0, 0, 69, 69, 25, 5, 5, 0, 69, 30,
61
- 69, 0, 69, 69, 69, 69, 69, 69, 69, 69,
62
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
63
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
64
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
65
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
66
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
67
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
68
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
69
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
70
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
71
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
72
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
73
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
74
- 69, 69, 69, 69, 69, 69
75
- };
76
- return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
77
- }
78
-
79
- #ifdef __GNUC__
80
- __inline
81
- #ifdef __GNUC_STDC_INLINE__
82
- __attribute__ ((__gnu_inline__))
83
- #endif
84
- #endif
85
- const struct mysql2_mysql_enc_name_to_rb_map *
86
- mysql2_mysql_enc_name_to_rb (str, len)
87
- register const char *str;
88
- register unsigned int len;
89
- {
90
- enum
91
- {
92
- TOTAL_KEYWORDS = 39,
93
- MIN_WORD_LENGTH = 3,
94
- MAX_WORD_LENGTH = 8,
95
- MIN_HASH_VALUE = 3,
96
- MAX_HASH_VALUE = 68
97
- };
98
-
99
- static const struct mysql2_mysql_enc_name_to_rb_map wordlist[] =
100
- {
101
- {""}, {""}, {""},
102
- {"gbk", "GBK"},
103
- {""},
104
- {"greek", "ISO-8859-7"},
105
- {"gb2312", "GB2312"},
106
- {"keybcs2", NULL},
107
- {""},
108
- {"ucs2", "UTF-16BE"},
109
- {"koi8u", "KOI8-R"},
110
- {"binary", "ASCII-8BIT"},
111
- {"eucjpms", "eucJP-ms"},
112
- {""},
113
- {"ujis", "eucJP-ms"},
114
- {"cp852", "CP852"},
115
- {"cp1251", "Windows-1251"},
116
- {"geostd8", NULL},
117
- {""},
118
- {"sjis", "Shift_JIS"},
119
- {"macce", "macCentEuro"},
120
- {"latin2", "ISO-8859-2"},
121
- {""},
122
- {"macroman", "macRoman"},
123
- {"dec8", NULL},
124
- {"utf32", "UTF-32"},
125
- {"latin1", "ISO-8859-1"},
126
- {"utf8mb4", "UTF-8"},
127
- {"hp8", NULL},
128
- {"swe7", NULL},
129
- {"euckr", "EUC-KR"},
130
- {"cp1257", "Windows-1257"},
131
- {""}, {""},
132
- {"utf8", "UTF-8"},
133
- {"koi8r", "KOI8-R"},
134
- {"cp1256", "Windows-1256"},
135
- {""}, {""}, {""},
136
- {"cp866", "IBM866"},
137
- {"latin7", "ISO-8859-13"},
138
- {""}, {""}, {""},
139
- {"ascii", "US-ASCII"},
140
- {"hebrew", "ISO-8859-8"},
141
- {""}, {""},
142
- {"big5", "Big5"},
143
- {"utf16", "UTF-16"},
144
- {"cp1250", "Windows-1250"},
145
- {""}, {""}, {""},
146
- {"cp850", "CP850"},
147
- {"tis620", "TIS-620"},
148
- {""}, {""}, {""},
149
- {"cp932", "Windows-31J"},
150
- {"latin5", "ISO-8859-9"},
151
- {""}, {""}, {""}, {""}, {""}, {""},
152
- {"armscii8", NULL}
153
- };
154
-
155
- if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
156
- {
157
- register int key = mysql2_mysql_enc_name_to_rb_hash (str, len);
158
-
159
- if (key <= MAX_HASH_VALUE && key >= 0)
160
- {
161
- register const char *s = wordlist[key].name;
162
-
163
- if (*str == *s && !strcmp (str + 1, s + 1))
164
- return &wordlist[key];
165
- }
166
- }
167
- return 0;
168
- }
@@ -1,246 +0,0 @@
1
- const char *mysql2_mysql_enc_to_rb[] = {
2
- "Big5",
3
- "ISO-8859-2",
4
- NULL,
5
- "CP850",
6
- "ISO-8859-1",
7
- NULL,
8
- "KOI8-R",
9
- "ISO-8859-1",
10
- "ISO-8859-2",
11
- NULL,
12
- "US-ASCII",
13
- "eucJP-ms",
14
- "Shift_JIS",
15
- "Windows-1251",
16
- "ISO-8859-1",
17
- "ISO-8859-8",
18
- NULL,
19
- "TIS-620",
20
- "EUC-KR",
21
- "ISO-8859-13",
22
- "ISO-8859-2",
23
- "KOI8-R",
24
- "Windows-1251",
25
- "GB2312",
26
- "ISO-8859-7",
27
- "Windows-1250",
28
- "ISO-8859-2",
29
- "GBK",
30
- "Windows-1257",
31
- "ISO-8859-9",
32
- "ISO-8859-1",
33
- NULL,
34
- "UTF-8",
35
- "Windows-1250",
36
- "UTF-16BE",
37
- "IBM866",
38
- NULL,
39
- "macCentEuro",
40
- "macRoman",
41
- "CP852",
42
- "ISO-8859-13",
43
- "ISO-8859-13",
44
- "macCentEuro",
45
- "Windows-1250",
46
- "UTF-8",
47
- "UTF-8",
48
- "ISO-8859-1",
49
- "ISO-8859-1",
50
- "ISO-8859-1",
51
- "Windows-1251",
52
- "Windows-1251",
53
- "Windows-1251",
54
- "macRoman",
55
- "UTF-16",
56
- "UTF-16",
57
- NULL,
58
- "Windows-1256",
59
- "Windows-1257",
60
- "Windows-1257",
61
- "UTF-32",
62
- "UTF-32",
63
- NULL,
64
- "ASCII-8BIT",
65
- NULL,
66
- "US-ASCII",
67
- "Windows-1250",
68
- "Windows-1256",
69
- "IBM866",
70
- NULL,
71
- "ISO-8859-7",
72
- "ISO-8859-8",
73
- NULL,
74
- NULL,
75
- "KOI8-R",
76
- "KOI8-R",
77
- NULL,
78
- "ISO-8859-2",
79
- "ISO-8859-9",
80
- "ISO-8859-13",
81
- "CP850",
82
- "CP852",
83
- NULL,
84
- "UTF-8",
85
- "Big5",
86
- "EUC-KR",
87
- "GB2312",
88
- "GBK",
89
- "Shift_JIS",
90
- "TIS-620",
91
- "UTF-16BE",
92
- "eucJP-ms",
93
- NULL,
94
- NULL,
95
- "ISO-8859-1",
96
- "Windows-31J",
97
- "Windows-31J",
98
- "eucJP-ms",
99
- "eucJP-ms",
100
- "Windows-1250",
101
- NULL,
102
- "UTF-16",
103
- "UTF-16",
104
- "UTF-16",
105
- "UTF-16",
106
- "UTF-16",
107
- "UTF-16",
108
- "UTF-16",
109
- "UTF-16",
110
- "UTF-16",
111
- "UTF-16",
112
- "UTF-16",
113
- "UTF-16",
114
- "UTF-16",
115
- "UTF-16",
116
- "UTF-16",
117
- "UTF-16",
118
- "UTF-16",
119
- "UTF-16",
120
- "UTF-16",
121
- "UTF-16",
122
- NULL,
123
- NULL,
124
- NULL,
125
- NULL,
126
- NULL,
127
- NULL,
128
- NULL,
129
- "UTF-16BE",
130
- "UTF-16BE",
131
- "UTF-16BE",
132
- "UTF-16BE",
133
- "UTF-16BE",
134
- "UTF-16BE",
135
- "UTF-16BE",
136
- "UTF-16BE",
137
- "UTF-16BE",
138
- "UTF-16BE",
139
- "UTF-16BE",
140
- "UTF-16BE",
141
- "UTF-16BE",
142
- "UTF-16BE",
143
- "UTF-16BE",
144
- "UTF-16BE",
145
- "UTF-16BE",
146
- "UTF-16BE",
147
- "UTF-16BE",
148
- "UTF-16BE",
149
- NULL,
150
- NULL,
151
- NULL,
152
- NULL,
153
- NULL,
154
- NULL,
155
- NULL,
156
- NULL,
157
- NULL,
158
- NULL,
159
- NULL,
160
- NULL,
161
- "UTF-32",
162
- "UTF-32",
163
- "UTF-32",
164
- "UTF-32",
165
- "UTF-32",
166
- "UTF-32",
167
- "UTF-32",
168
- "UTF-32",
169
- "UTF-32",
170
- "UTF-32",
171
- "UTF-32",
172
- "UTF-32",
173
- "UTF-32",
174
- "UTF-32",
175
- "UTF-32",
176
- "UTF-32",
177
- "UTF-32",
178
- "UTF-32",
179
- "UTF-32",
180
- "UTF-32",
181
- NULL,
182
- NULL,
183
- NULL,
184
- NULL,
185
- NULL,
186
- NULL,
187
- NULL,
188
- NULL,
189
- NULL,
190
- NULL,
191
- NULL,
192
- NULL,
193
- "UTF-8",
194
- "UTF-8",
195
- "UTF-8",
196
- "UTF-8",
197
- "UTF-8",
198
- "UTF-8",
199
- "UTF-8",
200
- "UTF-8",
201
- "UTF-8",
202
- "UTF-8",
203
- "UTF-8",
204
- "UTF-8",
205
- "UTF-8",
206
- "UTF-8",
207
- "UTF-8",
208
- "UTF-8",
209
- "UTF-8",
210
- "UTF-8",
211
- "UTF-8",
212
- "UTF-8",
213
- NULL,
214
- NULL,
215
- NULL,
216
- NULL,
217
- NULL,
218
- NULL,
219
- NULL,
220
- NULL,
221
- NULL,
222
- NULL,
223
- NULL,
224
- NULL,
225
- "UTF-8",
226
- "UTF-8",
227
- "UTF-8",
228
- "UTF-8",
229
- "UTF-8",
230
- "UTF-8",
231
- "UTF-8",
232
- "UTF-8",
233
- "UTF-8",
234
- "UTF-8",
235
- "UTF-8",
236
- "UTF-8",
237
- "UTF-8",
238
- "UTF-8",
239
- "UTF-8",
240
- "UTF-8",
241
- "UTF-8",
242
- "UTF-8",
243
- "UTF-8",
244
- "UTF-8"
245
- };
246
-