mysql2 0.2.24 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
-