mysql2 0.3.9-x86-mingw32 → 0.3.11-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +24 -0
- data/README.md +9 -0
- data/ext/mysql2/client.c +30 -22
- data/ext/mysql2/result.c +1 -1
- data/lib/mysql2/version.rb +1 -1
- metadata +167 -100
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.3.11 (December 6th, 2011)
|
4
|
+
* change mysql error detection strategy from using mysql_field_count to the more explicit mysql_errno
|
5
|
+
* bugfix to avoid race condition with active connections that error out
|
6
|
+
* revert back to using xmalloc/xfree for allocations
|
7
|
+
* avoid potentially unsafe Ruby C API usage w/o GVL
|
8
|
+
* reacquire GVL before retrying on EINTR on connect
|
9
|
+
|
10
|
+
## 0.3.10 (November 9th, 2011)
|
11
|
+
|
12
|
+
## 0.3.9 (November 9th, 2011)
|
13
|
+
|
3
14
|
## 0.3.8 (November 9th, 2011)
|
4
15
|
* remove fiber support from mysql2, the code has moved to the
|
5
16
|
em-synchrony gem.
|
@@ -44,6 +55,19 @@
|
|
44
55
|
* BREAKING CHANGE: the ActiveRecord adapter has been pulled into Rails 3.1 and is no longer part of the gem
|
45
56
|
* added Mysql2::Client.escape (class-level) for raw one-off non-encoding-aware escaping
|
46
57
|
|
58
|
+
## 0.2.18 (December 6th, 2011)
|
59
|
+
* change mysql error detection strategy from using mysql_field_count to the more explicit mysql_errno
|
60
|
+
* bugfix to avoid race condition with active connections that error out
|
61
|
+
* revert back to using xmalloc/xfree for allocations
|
62
|
+
* avoid potentially unsafe Ruby C API usage w/o GVL
|
63
|
+
* reacquire GVL before retrying on EINTR on connect
|
64
|
+
|
65
|
+
## 0.2.17 (November 9th, 2011)
|
66
|
+
|
67
|
+
## 0.2.16 (November 9th, 2011)
|
68
|
+
|
69
|
+
## 0.2.15 (November 9th, 2011)
|
70
|
+
|
47
71
|
## 0.2.14 (November 9th, 2011)
|
48
72
|
* use rb_wait_for_single_fd() if available
|
49
73
|
* fixed a bug with inheriting query options
|
data/README.md
CHANGED
@@ -317,6 +317,15 @@ bundle install
|
|
317
317
|
rake
|
318
318
|
```
|
319
319
|
|
320
|
+
The tests require the "test" database to exist, and expect to connect
|
321
|
+
both as root and the running user, both with a blank password:
|
322
|
+
|
323
|
+
``` sql
|
324
|
+
CREATE DATABASE test;
|
325
|
+
CREATE USER '<user>'@'localhost' IDENTIFIED BY '';
|
326
|
+
GRANT ALL PRIVILEGES ON test.* TO '<user>'@'localhost';
|
327
|
+
```
|
328
|
+
|
320
329
|
## Special Thanks
|
321
330
|
|
322
331
|
* Eric Wong - for the contribution (and the informative explanations) of some thread-safety, non-blocking I/O and cleanup patches. You rock dude
|
data/ext/mysql2/client.c
CHANGED
@@ -46,6 +46,8 @@ struct nogvl_connect_args {
|
|
46
46
|
struct nogvl_send_query_args {
|
47
47
|
MYSQL *mysql;
|
48
48
|
VALUE sql;
|
49
|
+
const char *sql_ptr;
|
50
|
+
long sql_len;
|
49
51
|
mysql_client_wrapper *wrapper;
|
50
52
|
};
|
51
53
|
|
@@ -112,12 +114,10 @@ static VALUE nogvl_connect(void *ptr) {
|
|
112
114
|
struct nogvl_connect_args *args = ptr;
|
113
115
|
MYSQL *client;
|
114
116
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
args->client_flag);
|
120
|
-
} while (! client && errno == EINTR && (errno = 0) == 0);
|
117
|
+
client = mysql_real_connect(args->mysql, args->host,
|
118
|
+
args->user, args->passwd,
|
119
|
+
args->db, args->port, args->unix_socket,
|
120
|
+
args->client_flag);
|
121
121
|
|
122
122
|
return client ? Qtrue : Qfalse;
|
123
123
|
}
|
@@ -147,7 +147,7 @@ static VALUE nogvl_close(void *ptr) {
|
|
147
147
|
#endif
|
148
148
|
|
149
149
|
mysql_close(wrapper->client);
|
150
|
-
|
150
|
+
xfree(wrapper->client);
|
151
151
|
}
|
152
152
|
|
153
153
|
return Qnil;
|
@@ -158,7 +158,7 @@ static void rb_mysql_client_free(void * ptr) {
|
|
158
158
|
|
159
159
|
nogvl_close(wrapper);
|
160
160
|
|
161
|
-
|
161
|
+
xfree(ptr);
|
162
162
|
}
|
163
163
|
|
164
164
|
static VALUE allocate(VALUE klass) {
|
@@ -169,7 +169,7 @@ static VALUE allocate(VALUE klass) {
|
|
169
169
|
wrapper->active = 0;
|
170
170
|
wrapper->reconnect_enabled = 0;
|
171
171
|
wrapper->closed = 1;
|
172
|
-
wrapper->client = (MYSQL*)
|
172
|
+
wrapper->client = (MYSQL*)xmalloc(sizeof(MYSQL));
|
173
173
|
return obj;
|
174
174
|
}
|
175
175
|
|
@@ -181,25 +181,26 @@ static VALUE rb_mysql_client_escape(RB_MYSQL_UNUSED VALUE klass, VALUE str) {
|
|
181
181
|
Check_Type(str, T_STRING);
|
182
182
|
|
183
183
|
oldLen = RSTRING_LEN(str);
|
184
|
-
newStr =
|
184
|
+
newStr = xmalloc(oldLen*2+1);
|
185
185
|
|
186
186
|
newLen = mysql_escape_string((char *)newStr, StringValuePtr(str), oldLen);
|
187
187
|
if (newLen == oldLen) {
|
188
188
|
// no need to return a new ruby string if nothing changed
|
189
|
-
|
189
|
+
xfree(newStr);
|
190
190
|
return str;
|
191
191
|
} else {
|
192
192
|
rb_str = rb_str_new((const char*)newStr, newLen);
|
193
193
|
#ifdef HAVE_RUBY_ENCODING_H
|
194
194
|
rb_enc_copy(rb_str, str);
|
195
195
|
#endif
|
196
|
-
|
196
|
+
xfree(newStr);
|
197
197
|
return rb_str;
|
198
198
|
}
|
199
199
|
}
|
200
200
|
|
201
201
|
static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE port, VALUE database, VALUE socket, VALUE flags) {
|
202
202
|
struct nogvl_connect_args args;
|
203
|
+
VALUE rv;
|
203
204
|
GET_CLIENT(self);
|
204
205
|
|
205
206
|
args.host = NIL_P(host) ? "localhost" : StringValuePtr(host);
|
@@ -211,9 +212,14 @@ static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE po
|
|
211
212
|
args.mysql = wrapper->client;
|
212
213
|
args.client_flag = NUM2ULONG(flags);
|
213
214
|
|
214
|
-
|
215
|
-
|
216
|
-
|
215
|
+
rv = rb_thread_blocking_region(nogvl_connect, &args, RUBY_UBF_IO, 0);
|
216
|
+
if (rv == Qfalse) {
|
217
|
+
while (rv == Qfalse && errno == EINTR) {
|
218
|
+
errno = 0;
|
219
|
+
rv = rb_thread_blocking_region(nogvl_connect, &args, RUBY_UBF_IO, 0);
|
220
|
+
}
|
221
|
+
if (rv == Qfalse)
|
222
|
+
return rb_raise_mysql2_error(wrapper);
|
217
223
|
}
|
218
224
|
|
219
225
|
return self;
|
@@ -243,10 +249,8 @@ static VALUE rb_mysql_client_close(VALUE self) {
|
|
243
249
|
static VALUE nogvl_send_query(void *ptr) {
|
244
250
|
struct nogvl_send_query_args *args = ptr;
|
245
251
|
int rv;
|
246
|
-
const char *sql = StringValuePtr(args->sql);
|
247
|
-
long sql_len = RSTRING_LEN(args->sql);
|
248
252
|
|
249
|
-
rv = mysql_send_query(args->mysql,
|
253
|
+
rv = mysql_send_query(args->mysql, args->sql_ptr, args->sql_len);
|
250
254
|
|
251
255
|
return rv == 0 ? Qtrue : Qfalse;
|
252
256
|
}
|
@@ -311,9 +315,11 @@ static VALUE rb_mysql_client_async_result(VALUE self) {
|
|
311
315
|
result = (MYSQL_RES *)rb_thread_blocking_region(nogvl_store_result, wrapper, RUBY_UBF_IO, 0);
|
312
316
|
|
313
317
|
if (result == NULL) {
|
314
|
-
if (
|
318
|
+
if (mysql_errno(wrapper->client) != 0) {
|
319
|
+
MARK_CONN_INACTIVE(self);
|
315
320
|
rb_raise_mysql2_error(wrapper);
|
316
321
|
}
|
322
|
+
// no data and no error, so query was not a SELECT
|
317
323
|
return Qnil;
|
318
324
|
}
|
319
325
|
|
@@ -450,6 +456,8 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
|
|
450
456
|
// ensure the string is in the encoding the connection is expecting
|
451
457
|
args.sql = rb_str_export_to_enc(args.sql, conn_enc);
|
452
458
|
#endif
|
459
|
+
args.sql_ptr = StringValuePtr(args.sql);
|
460
|
+
args.sql_len = RSTRING_LEN(args.sql);
|
453
461
|
|
454
462
|
// see if this connection is still waiting on a result from a previous query
|
455
463
|
if (wrapper->active == 0) {
|
@@ -502,12 +510,12 @@ static VALUE rb_mysql_client_real_escape(VALUE self, VALUE str) {
|
|
502
510
|
#endif
|
503
511
|
|
504
512
|
oldLen = RSTRING_LEN(str);
|
505
|
-
newStr =
|
513
|
+
newStr = xmalloc(oldLen*2+1);
|
506
514
|
|
507
515
|
newLen = mysql_real_escape_string(wrapper->client, (char *)newStr, StringValuePtr(str), oldLen);
|
508
516
|
if (newLen == oldLen) {
|
509
517
|
// no need to return a new ruby string if nothing changed
|
510
|
-
|
518
|
+
xfree(newStr);
|
511
519
|
return str;
|
512
520
|
} else {
|
513
521
|
rb_str = rb_str_new((const char*)newStr, newLen);
|
@@ -517,7 +525,7 @@ static VALUE rb_mysql_client_real_escape(VALUE self, VALUE str) {
|
|
517
525
|
rb_str = rb_str_export_to_enc(rb_str, default_internal_enc);
|
518
526
|
}
|
519
527
|
#endif
|
520
|
-
|
528
|
+
xfree(newStr);
|
521
529
|
return rb_str;
|
522
530
|
}
|
523
531
|
}
|
data/ext/mysql2/result.c
CHANGED
data/lib/mysql2/version.rb
CHANGED
metadata
CHANGED
@@ -1,121 +1,172 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mysql2
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 5
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 11
|
10
|
+
segments_generated: true
|
11
|
+
version: 0.3.11
|
6
12
|
platform: x86-mingw32
|
7
|
-
authors:
|
13
|
+
authors:
|
8
14
|
- Brian Lopez
|
9
15
|
autorequire:
|
10
16
|
bindir: bin
|
11
17
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
18
|
+
|
19
|
+
date: 2011-12-06 00:00:00 -08:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
15
23
|
name: eventmachine
|
16
|
-
requirement: &
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
25
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
22
|
-
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
segments_generated: true
|
33
|
+
version: "0"
|
23
34
|
prerelease: false
|
24
|
-
|
25
|
-
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
26
38
|
name: rake-compiler
|
27
|
-
requirement: &
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
40
|
none: false
|
29
|
-
requirements:
|
41
|
+
requirements:
|
30
42
|
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 13
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 7
|
48
|
+
- 7
|
49
|
+
segments_generated: true
|
32
50
|
version: 0.7.7
|
33
|
-
type: :development
|
34
51
|
prerelease: false
|
35
|
-
|
36
|
-
|
52
|
+
type: :development
|
53
|
+
version_requirements: *id002
|
54
|
+
- !ruby/object:Gem::Dependency
|
37
55
|
name: rake
|
38
|
-
requirement: &
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
57
|
none: false
|
40
|
-
requirements:
|
41
|
-
- - =
|
42
|
-
- !ruby/object:Gem::Version
|
58
|
+
requirements:
|
59
|
+
- - "="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 49
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 8
|
65
|
+
- 7
|
66
|
+
segments_generated: true
|
43
67
|
version: 0.8.7
|
44
|
-
type: :development
|
45
68
|
prerelease: false
|
46
|
-
|
47
|
-
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id003
|
71
|
+
- !ruby/object:Gem::Dependency
|
48
72
|
name: rspec
|
49
|
-
requirement: &
|
73
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
74
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
55
|
-
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 3
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
segments_generated: true
|
82
|
+
version: "0"
|
56
83
|
prerelease: false
|
57
|
-
|
58
|
-
|
84
|
+
type: :development
|
85
|
+
version_requirements: *id004
|
86
|
+
- !ruby/object:Gem::Dependency
|
59
87
|
name: activerecord
|
60
|
-
requirement: &
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
61
89
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
66
|
-
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
segments_generated: true
|
97
|
+
version: "0"
|
67
98
|
prerelease: false
|
68
|
-
|
69
|
-
|
99
|
+
type: :development
|
100
|
+
version_requirements: *id005
|
101
|
+
- !ruby/object:Gem::Dependency
|
70
102
|
name: mysql
|
71
|
-
requirement: &
|
103
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
72
104
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 3
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
segments_generated: true
|
112
|
+
version: "0"
|
78
113
|
prerelease: false
|
79
|
-
|
80
|
-
|
114
|
+
type: :development
|
115
|
+
version_requirements: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
81
117
|
name: do_mysql
|
82
|
-
requirement: &
|
118
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
83
119
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
hash: 3
|
124
|
+
segments:
|
125
|
+
- 0
|
126
|
+
segments_generated: true
|
127
|
+
version: "0"
|
89
128
|
prerelease: false
|
90
|
-
|
91
|
-
|
129
|
+
type: :development
|
130
|
+
version_requirements: *id007
|
131
|
+
- !ruby/object:Gem::Dependency
|
92
132
|
name: sequel
|
93
|
-
requirement: &
|
133
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
94
134
|
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
|
99
|
-
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
hash: 3
|
139
|
+
segments:
|
140
|
+
- 0
|
141
|
+
segments_generated: true
|
142
|
+
version: "0"
|
100
143
|
prerelease: false
|
101
|
-
|
102
|
-
|
144
|
+
type: :development
|
145
|
+
version_requirements: *id008
|
146
|
+
- !ruby/object:Gem::Dependency
|
103
147
|
name: faker
|
104
|
-
requirement: &
|
148
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
105
149
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
hash: 3
|
154
|
+
segments:
|
155
|
+
- 0
|
156
|
+
segments_generated: true
|
157
|
+
version: "0"
|
111
158
|
prerelease: false
|
112
|
-
|
159
|
+
type: :development
|
160
|
+
version_requirements: *id009
|
113
161
|
description:
|
114
162
|
email: seniorlopez@gmail.com
|
115
163
|
executables: []
|
164
|
+
|
116
165
|
extensions: []
|
166
|
+
|
117
167
|
extra_rdoc_files: []
|
118
|
-
|
168
|
+
|
169
|
+
files:
|
119
170
|
- .gitignore
|
120
171
|
- .rspec
|
121
172
|
- .rvmrc
|
@@ -164,43 +215,59 @@ files:
|
|
164
215
|
- lib/mysql2/1.8/mysql2.so
|
165
216
|
- lib/mysql2/1.9/mysql2.so
|
166
217
|
- lib/mysql2/mysql2.rb
|
218
|
+
has_rdoc: true
|
167
219
|
homepage: http://github.com/brianmario/mysql2
|
168
220
|
licenses: []
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
221
|
+
|
222
|
+
post_install_message: |+
|
223
|
+
|
224
|
+
======================================================================================================
|
225
|
+
|
226
|
+
You've installed the binary version of mysql2.
|
227
|
+
It was built using MySQL Connector/C version 6.0.2.
|
228
|
+
It's recommended to use the exact same version to avoid potential issues.
|
229
|
+
|
230
|
+
At the time of building this gem, the necessary DLL files where available
|
231
|
+
in the following download:
|
232
|
+
|
233
|
+
http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-noinstall-6.0.2-win32.zip/from/pick
|
234
|
+
|
235
|
+
And put lib\libmysql.dll file in your Ruby bin directory, for example C:\Ruby\bin
|
236
|
+
|
237
|
+
======================================================================================================
|
238
|
+
|
239
|
+
rdoc_options:
|
176
240
|
- --charset=UTF-8
|
177
|
-
require_paths:
|
241
|
+
require_paths:
|
178
242
|
- lib
|
179
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
243
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
180
244
|
none: false
|
181
|
-
requirements:
|
182
|
-
- -
|
183
|
-
- !ruby/object:Gem::Version
|
184
|
-
|
185
|
-
segments:
|
245
|
+
requirements:
|
246
|
+
- - ">="
|
247
|
+
- !ruby/object:Gem::Version
|
248
|
+
hash: 3
|
249
|
+
segments:
|
186
250
|
- 0
|
187
|
-
|
188
|
-
|
251
|
+
segments_generated: true
|
252
|
+
version: "0"
|
253
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
254
|
none: false
|
190
|
-
requirements:
|
191
|
-
- -
|
192
|
-
- !ruby/object:Gem::Version
|
193
|
-
|
194
|
-
segments:
|
255
|
+
requirements:
|
256
|
+
- - ">="
|
257
|
+
- !ruby/object:Gem::Version
|
258
|
+
hash: 3
|
259
|
+
segments:
|
195
260
|
- 0
|
196
|
-
|
261
|
+
segments_generated: true
|
262
|
+
version: "0"
|
197
263
|
requirements: []
|
264
|
+
|
198
265
|
rubyforge_project:
|
199
|
-
rubygems_version: 1.
|
266
|
+
rubygems_version: 1.3.9.3
|
200
267
|
signing_key:
|
201
268
|
specification_version: 3
|
202
269
|
summary: A simple, fast Mysql library for Ruby, binding to libmysql
|
203
|
-
test_files:
|
270
|
+
test_files:
|
204
271
|
- examples/eventmachine.rb
|
205
272
|
- examples/threaded.rb
|
206
273
|
- spec/em/em_spec.rb
|