Skip to content

Commit e1a20c7

Browse files
committed
Merge pull request #645 from sodabrew/backports_from_master
Backports from master for 0.3.19
2 parents f2642d6 + b7195ce commit e1a20c7

File tree

11 files changed

+112
-86
lines changed

11 files changed

+112
-86
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ end
1414
group :development do
1515
gem 'pry'
1616
gem 'eventmachine' unless RUBY_PLATFORM =~ /mswin|mingw/
17+
gem 'rake-compiler-dock', '~> 0.4.2'
1718
end
1819

1920
platforms :rbx do

appveyor.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ environment:
2929
- ruby_version: "200-x64"
3030
- ruby_version: "21"
3131
- ruby_version: "21-x64"
32+
- ruby_version: "22"
33+
- ruby_version: "22-x64"
3234
cache:
3335
- vendor
3436
services:

ext/mysql2/client.c

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
VALUE cMysql2Client;
1818
extern VALUE mMysql2, cMysql2Error;
19-
static VALUE sym_id, sym_version, sym_async, sym_symbolize_keys, sym_as, sym_array, sym_stream;
19+
static VALUE sym_id, sym_version, sym_header_version, sym_async, sym_symbolize_keys, sym_as, sym_array, sym_stream;
2020
static ID intern_merge, intern_merge_bang, intern_error_number_eql, intern_sql_state_eql;
2121

2222
#ifndef HAVE_RB_HASH_DUP
@@ -287,7 +287,7 @@ static VALUE rb_mysql_client_escape(RB_MYSQL_UNUSED VALUE klass, VALUE str) {
287287
oldLen = RSTRING_LEN(str);
288288
newStr = xmalloc(oldLen*2+1);
289289

290-
newLen = mysql_escape_string((char *)newStr, StringValuePtr(str), oldLen);
290+
newLen = mysql_escape_string((char *)newStr, RSTRING_PTR(str), oldLen);
291291
if (newLen == oldLen) {
292292
/* no need to return a new ruby string if nothing changed */
293293
xfree(newStr);
@@ -337,13 +337,13 @@ static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE po
337337
VALUE rv;
338338
GET_CLIENT(self);
339339

340-
args.host = NIL_P(host) ? NULL : StringValuePtr(host);
341-
args.unix_socket = NIL_P(socket) ? NULL : StringValuePtr(socket);
342-
args.port = NIL_P(port) ? 0 : NUM2INT(port);
343-
args.user = NIL_P(user) ? NULL : StringValuePtr(user);
344-
args.passwd = NIL_P(pass) ? NULL : StringValuePtr(pass);
345-
args.db = NIL_P(database) ? NULL : StringValuePtr(database);
346-
args.mysql = wrapper->client;
340+
args.host = NIL_P(host) ? NULL : StringValueCStr(host);
341+
args.unix_socket = NIL_P(socket) ? NULL : StringValueCStr(socket);
342+
args.port = NIL_P(port) ? 0 : NUM2INT(port);
343+
args.user = NIL_P(user) ? NULL : StringValueCStr(user);
344+
args.passwd = NIL_P(pass) ? NULL : StringValueCStr(pass);
345+
args.db = NIL_P(database) ? NULL : StringValueCStr(database);
346+
args.mysql = wrapper->client;
347347
args.client_flag = NUM2ULONG(flags);
348348

349349
if (wrapper->connect_timeout)
@@ -669,7 +669,7 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
669669
/* ensure the string is in the encoding the connection is expecting */
670670
args.sql = rb_str_export_to_enc(args.sql, conn_enc);
671671
#endif
672-
args.sql_ptr = StringValuePtr(args.sql);
672+
args.sql_ptr = RSTRING_PTR(args.sql);
673673
args.sql_len = RSTRING_LEN(args.sql);
674674

675675
/* see if this connection is still waiting on a result from a previous query */
@@ -736,9 +736,14 @@ static VALUE rb_mysql_client_real_escape(VALUE self, VALUE str) {
736736
oldLen = RSTRING_LEN(str);
737737
newStr = xmalloc(oldLen*2+1);
738738

739-
newLen = mysql_real_escape_string(wrapper->client, (char *)newStr, StringValuePtr(str), oldLen);
739+
newLen = mysql_real_escape_string(wrapper->client, (char *)newStr, RSTRING_PTR(str), oldLen);
740740
if (newLen == oldLen) {
741741
/* no need to return a new ruby string if nothing changed */
742+
#ifdef HAVE_RUBY_ENCODING_H
743+
if (default_internal_enc) {
744+
str = rb_str_export_to_enc(str, default_internal_enc);
745+
}
746+
#endif
742747
xfree(newStr);
743748
return str;
744749
} else {
@@ -800,17 +805,17 @@ static VALUE _mysql_client_options(VALUE self, int opt, VALUE value) {
800805
break;
801806

802807
case MYSQL_READ_DEFAULT_FILE:
803-
charval = (const char *)StringValuePtr(value);
808+
charval = (const char *)StringValueCStr(value);
804809
retval = charval;
805810
break;
806811

807812
case MYSQL_READ_DEFAULT_GROUP:
808-
charval = (const char *)StringValuePtr(value);
813+
charval = (const char *)StringValueCStr(value);
809814
retval = charval;
810815
break;
811816

812817
case MYSQL_INIT_COMMAND:
813-
charval = (const char *)StringValuePtr(value);
818+
charval = (const char *)StringValueCStr(value);
814819
retval = charval;
815820
break;
816821

@@ -843,30 +848,23 @@ static VALUE _mysql_client_options(VALUE self, int opt, VALUE value) {
843848
*
844849
* Returns a string that represents the client library version.
845850
*/
846-
static VALUE rb_mysql_client_info(VALUE self) {
847-
VALUE version, client_info;
848-
#ifdef HAVE_RUBY_ENCODING_H
849-
rb_encoding *default_internal_enc;
850-
rb_encoding *conn_enc;
851-
GET_CLIENT(self);
852-
#endif
853-
version = rb_hash_new();
851+
static VALUE rb_mysql_client_info(RB_MYSQL_UNUSED VALUE klass) {
852+
VALUE version_info, version, header_version;
853+
version_info = rb_hash_new();
854854

855-
#ifdef HAVE_RUBY_ENCODING_H
856-
default_internal_enc = rb_default_internal_encoding();
857-
conn_enc = rb_to_encoding(wrapper->encoding);
858-
#endif
855+
version = rb_str_new2(mysql_get_client_info());
856+
header_version = rb_str_new2(MYSQL_LINK_VERSION);
859857

860-
rb_hash_aset(version, sym_id, LONG2NUM(mysql_get_client_version()));
861-
client_info = rb_str_new2(mysql_get_client_info());
862858
#ifdef HAVE_RUBY_ENCODING_H
863-
rb_enc_associate(client_info, conn_enc);
864-
if (default_internal_enc) {
865-
client_info = rb_str_export_to_enc(client_info, default_internal_enc);
866-
}
859+
rb_enc_associate(version, rb_usascii_encoding());
860+
rb_enc_associate(header_version, rb_usascii_encoding());
867861
#endif
868-
rb_hash_aset(version, sym_version, client_info);
869-
return version;
862+
863+
rb_hash_aset(version_info, sym_id, LONG2NUM(mysql_get_client_version()));
864+
rb_hash_aset(version_info, sym_version, version);
865+
rb_hash_aset(version_info, sym_header_version, header_version);
866+
867+
return version_info;
870868
}
871869

872870
/* call-seq:
@@ -907,14 +905,10 @@ static VALUE rb_mysql_client_server_info(VALUE self) {
907905
* Return the file descriptor number for this client.
908906
*/
909907
static VALUE rb_mysql_client_socket(VALUE self) {
910-
GET_CLIENT(self);
911908
#ifndef _WIN32
912-
{
913-
int fd_set_fd;
914-
REQUIRE_CONNECTED(wrapper);
915-
fd_set_fd = wrapper->client->net.fd;
916-
return INT2NUM(fd_set_fd);
917-
}
909+
GET_CLIENT(self);
910+
REQUIRE_CONNECTED(wrapper);
911+
return INT2NUM(wrapper->client->net.fd);
918912
#else
919913
rb_raise(cMysql2Error, "Raw access to the mysql file descriptor isn't supported on Windows");
920914
#endif
@@ -987,7 +981,7 @@ static VALUE rb_mysql_client_select_db(VALUE self, VALUE db)
987981
REQUIRE_CONNECTED(wrapper);
988982

989983
args.mysql = wrapper->client;
990-
args.db = StringValuePtr(db);
984+
args.db = StringValueCStr(db);
991985

992986
if (rb_thread_call_without_gvl(nogvl_select_db, &args, RUBY_UBF_IO, 0) == Qfalse)
993987
rb_raise_mysql2_error(wrapper);
@@ -1183,11 +1177,11 @@ static VALUE set_ssl_options(VALUE self, VALUE key, VALUE cert, VALUE ca, VALUE
11831177
GET_CLIENT(self);
11841178

11851179
mysql_ssl_set(wrapper->client,
1186-
NIL_P(key) ? NULL : StringValuePtr(key),
1187-
NIL_P(cert) ? NULL : StringValuePtr(cert),
1188-
NIL_P(ca) ? NULL : StringValuePtr(ca),
1189-
NIL_P(capath) ? NULL : StringValuePtr(capath),
1190-
NIL_P(cipher) ? NULL : StringValuePtr(cipher));
1180+
NIL_P(key) ? NULL : StringValueCStr(key),
1181+
NIL_P(cert) ? NULL : StringValueCStr(cert),
1182+
NIL_P(ca) ? NULL : StringValueCStr(ca),
1183+
NIL_P(capath) ? NULL : StringValueCStr(capath),
1184+
NIL_P(cipher) ? NULL : StringValueCStr(cipher));
11911185

11921186
return self;
11931187
}
@@ -1254,12 +1248,12 @@ void init_mysql2_client() {
12541248
rb_define_alloc_func(cMysql2Client, allocate);
12551249

12561250
rb_define_singleton_method(cMysql2Client, "escape", rb_mysql_client_escape, 1);
1251+
rb_define_singleton_method(cMysql2Client, "info", rb_mysql_client_info, 0);
12571252

12581253
rb_define_method(cMysql2Client, "close", rb_mysql_client_close, 0);
12591254
rb_define_method(cMysql2Client, "query", rb_mysql_client_query, -1);
12601255
rb_define_method(cMysql2Client, "abandon_results!", rb_mysql_client_abandon_results, 0);
12611256
rb_define_method(cMysql2Client, "escape", rb_mysql_client_real_escape, 1);
1262-
rb_define_method(cMysql2Client, "info", rb_mysql_client_info, 0);
12631257
rb_define_method(cMysql2Client, "server_info", rb_mysql_client_server_info, 0);
12641258
rb_define_method(cMysql2Client, "socket", rb_mysql_client_socket, 0);
12651259
rb_define_method(cMysql2Client, "async_result", rb_mysql_client_async_result, 0);
@@ -1293,6 +1287,7 @@ void init_mysql2_client() {
12931287

12941288
sym_id = ID2SYM(rb_intern("id"));
12951289
sym_version = ID2SYM(rb_intern("version"));
1290+
sym_header_version = ID2SYM(rb_intern("header_version"));
12961291
sym_async = ID2SYM(rb_intern("async"));
12971292
sym_symbolize_keys = ID2SYM(rb_intern("symbolize_keys"));
12981293
sym_as = ID2SYM(rb_intern("as"));

ext/mysql2/extconf.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def asplode lib
3636
/usr/local/lib/mysql5*
3737
].map{|dir| "#{dir}/bin" }
3838

39-
GLOB = "{#{dirs.join(',')}}/{mysql_config,mysql_config5}"
39+
GLOB = "{#{dirs.join(',')}}/{mysql_config,mysql_config5,mariadb_config}"
4040

4141
# If the user has provided a --with-mysql-dir argument, we must respect it or fail.
4242
inc, lib = dir_config('mysql')

ext/mysql2/result.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ static rb_encoding *binaryEncoding;
5050
#define MYSQL2_MIN_TIME 62171150401ULL
5151
#endif
5252

53+
#define GET_RESULT(obj) \
54+
mysql2_result_wrapper *wrapper; \
55+
Data_Get_Struct(self, mysql2_result_wrapper, wrapper);
56+
5357
static VALUE cMysql2Result;
5458
static VALUE cBigDecimal, cDate, cDateTime;
5559
static VALUE opt_decimal_zero, opt_float_zero, opt_time_year, opt_time_month, opt_utc_offset;
@@ -103,9 +107,8 @@ static void *nogvl_fetch_row(void *ptr) {
103107
}
104108

105109
static VALUE rb_mysql_result_fetch_field(VALUE self, unsigned int idx, short int symbolize_keys) {
106-
mysql2_result_wrapper * wrapper;
107110
VALUE rb_field;
108-
GetMysql2Result(self, wrapper);
111+
GET_RESULT(self);
109112

110113
if (wrapper->fields == Qnil) {
111114
wrapper->numberOfFields = mysql_num_fields(wrapper->result);
@@ -193,7 +196,6 @@ static unsigned int msec_char_to_uint(char *msec_char, size_t len)
193196

194197
static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezone, int symbolizeKeys, int asArray, int castBool, int cast, MYSQL_FIELD * fields) {
195198
VALUE rowVal;
196-
mysql2_result_wrapper * wrapper;
197199
MYSQL_ROW row;
198200
unsigned int i = 0;
199201
unsigned long * fieldLengths;
@@ -202,7 +204,7 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
202204
rb_encoding *default_internal_enc;
203205
rb_encoding *conn_enc;
204206
#endif
205-
GetMysql2Result(self, wrapper);
207+
GET_RESULT(self);
206208

207209
#ifdef HAVE_RUBY_ENCODING_H
208210
default_internal_enc = rb_default_internal_encoding();
@@ -413,12 +415,11 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
413415
}
414416

415417
static VALUE rb_mysql_result_fetch_fields(VALUE self) {
416-
mysql2_result_wrapper * wrapper;
417418
unsigned int i = 0;
418419
short int symbolizeKeys = 0;
419420
VALUE defaults;
420421

421-
GetMysql2Result(self, wrapper);
422+
GET_RESULT(self);
422423

423424
defaults = rb_iv_get(self, "@query_options");
424425
Check_Type(defaults, T_HASH);
@@ -443,13 +444,12 @@ static VALUE rb_mysql_result_fetch_fields(VALUE self) {
443444
static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
444445
VALUE defaults, opts, block;
445446
ID db_timezone, app_timezone, dbTz, appTz;
446-
mysql2_result_wrapper * wrapper;
447447
unsigned long i;
448448
const char * errstr;
449449
int symbolizeKeys, asArray, castBool, cacheRows, cast;
450450
MYSQL_FIELD * fields = NULL;
451451

452-
GetMysql2Result(self, wrapper);
452+
GET_RESULT(self);
453453

454454
defaults = rb_iv_get(self, "@query_options");
455455
Check_Type(defaults, T_HASH);
@@ -466,7 +466,7 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
466466
cast = RTEST(rb_hash_aref(opts, sym_cast));
467467

468468
if (wrapper->is_streaming && cacheRows) {
469-
rb_warn("cacheRows is ignored if streaming is true");
469+
rb_warn(":cache_rows is ignored if :stream is true");
470470
}
471471

472472
dbTz = rb_hash_aref(opts, sym_database_timezone);
@@ -577,9 +577,8 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
577577
}
578578

579579
static VALUE rb_mysql_result_count(VALUE self) {
580-
mysql2_result_wrapper *wrapper;
580+
GET_RESULT(self);
581581

582-
GetMysql2Result(self, wrapper);
583582
if (wrapper->is_streaming) {
584583
/* This is an unsigned long per result.h */
585584
return ULONG2NUM(wrapper->numberOfRows);
@@ -598,6 +597,7 @@ static VALUE rb_mysql_result_count(VALUE self) {
598597
VALUE rb_mysql_result_to_obj(VALUE client, VALUE encoding, VALUE options, MYSQL_RES *r) {
599598
VALUE obj;
600599
mysql2_result_wrapper * wrapper;
600+
601601
obj = Data_Make_Struct(cMysql2Result, mysql2_result_wrapper, rb_mysql_result_mark, rb_mysql_result_free, wrapper);
602602
wrapper->numberOfFields = 0;
603603
wrapper->numberOfRows = 0;

ext/mysql2/result.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,4 @@ typedef struct {
1919
mysql_client_wrapper *client_wrapper;
2020
} mysql2_result_wrapper;
2121

22-
#define GetMysql2Result(obj, sval) (sval = (mysql2_result_wrapper*)DATA_PTR(obj));
23-
2422
#endif

lib/mysql2/client.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ def query_info
8282
info_hash
8383
end
8484

85+
def info
86+
self.class.info
87+
end
88+
8589
private
8690
def self.local_offset
8791
::Time.local(2010).utc_offset.to_r / 86400

0 commit comments

Comments
 (0)