Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rubygem-mysql2 for openSUSE:Factory checked in at 2022-10-12 18:25:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-mysql2 (Old) and /work/SRC/openSUSE:Factory/.rubygem-mysql2.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-mysql2" Wed Oct 12 18:25:23 2022 rev:29 rq:1010083 version:0.5.4 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-mysql2/rubygem-mysql2.changes 2019-11-28 10:17:53.743639461 +0100 +++ /work/SRC/openSUSE:Factory/.rubygem-mysql2.new.2275/rubygem-mysql2.changes 2022-10-12 18:27:11.698020515 +0200 @@ -1,0 +2,69 @@ +Sun May 15 15:41:53 UTC 2022 - Manuel Schnitzer <[email protected]> + + +- updated to version 0.5.4 + + * The taint mechanism will be deprecated in Ruby 2.7 by @kamipo in #1083 + * Made argument types strict for ruby 2.7 by @nobu in #1096 + * Update rake (and rake-compiler) to suppress the warning. by @junaruga in #1099 + * Fix crash if a Mysql2::Client object is allocated but never connected by @sodabrew in #1101 + * Remove Enumerable include from Statement class by @adamcrown in #1104 + * Add project metadata to the gemspec by @orien in #1089 + * Don't call mysql_close if mysql_init wasn't called. by @fimmtiu in #1111 + * Client session tracking by @insom in #1092 + * Avoid a hash object allocation per each query/execute call by @kamipo in #1112 + * Implementing type reflection from mysql result by @danhuynhdev in #1068 + * Register C global variables to Ruby GC to avoid problems with GC.compact by @casperisfine in #1115 + * Clarify Rails 4.2.11 support in Readme by @muzfuz in #1131 + * Improve Homebrew compatibility by @stefansundin in #1135 + * Tiny README syntax markup for consistency by @fwolfst in #1164 + * Add GitHub Actions. by @junaruga in #1154 + * Run GC.verify_compaction_references on CI by @casperisfine in #1155 + * GitHub Actions: Add CentOS/Fedora cases. by @junaruga in #1168 + * Random SEGV in do_send_query() by @unak in #1150 + * GitHub Actions: Add macOS cases. by @junaruga in #1170 + * Add GitHub Actions badges. by @junaruga in #1172 + * Rename .travis_* files to ci/*. by @junaruga in #1171 + * Make the benchmarks group optional. by @junaruga in #1173 + * Verify the testing database before running tests. by @junaruga in #1174 + * Rename the before/after hooks's symbol on RSpec 2 to the one on RSpec 3. by @junaruga in #1177 + * Refactor CI yaml files by @junaruga in #1176 + * Fix test failures on MariaDB by @junaruga in #1193 + * Fix some typos [ci skip] by @kamipo in #1195 + * Travis: Remove the command to pin Rubygems. by @junaruga in #1188 + * Make Result#fields return interned strings in Ruby 3+ by @casperisfine in #1181 + * Can't enable SSL with MariaDB driver library. (#1182) by @vakuum in #1183 + * Fix broken URL [ci skip] by @gaurish in #1207 + * Dynamically set Homebrew-installed OpenSSL flag by @olivierlacan in #1204 + * Setup default CA path if not provided by @dbussink in #1206 + * Allow setting VERIFY_IDENTITY for MariaDB by @dbussink in #1205 + * Fix session tracking tests by @insom in #1222 + * Update Mysql2::Result spec for Ruby 3.1 by @casperisfine in #1219 + * pdate DATETIME casting tests for mysql 8.0 by @casperisfine in #1221 + * Fix syntax by @tenderlove in #1223 + * Fix more builds by @tenderlove in #1224 + * Fix a mismatching size warning by @casperisfine in #1227 + * Move rubocop to a separate CI job by @casperisfine in #1225 + * improve ConnectionError mapping by @ThomasSevestre in #1215 + * Undefine T_DATA allocators for Ruby 3.2 compatibility by @casperisfine in #1236 + * Add Ruby 3.1 to the CI matrix by @casperisfine in #1235 + * Fix to build with MySQL 5.1 by @arika in #1197 + * fix typo in README by @nealharris in #1247 + * Add signing key for MySQL 5.7.37 / 8.0.28 and higher by @sodabrew in #1254 + * Remove ubuntu-16.04 from workflows by @mishina2228 in #1257 + * Update GitHub Actions workflows by @mishina2228 in #1253 + +------------------------------------------------------------------- +Fri Nov 27 15:25:47 UTC 2020 - Marcus Rueckert <[email protected]> + +- update workaround_mysql_config_libs.patch: + only set rpath if it is not the standard libdir + +------------------------------------------------------------------- +Thu Nov 26 17:42:58 UTC 2020 - Marcus Rueckert <[email protected]> + +- add workaround_mysql_config_libs.patch: (boo#1179289) + this should be fixed in mysql_config but for now lets sanitize + the path here + +------------------------------------------------------------------- Old: ---- mysql2-0.5.3.gem New: ---- mysql2-0.5.4.gem series workaround_mysql_config_libs.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-mysql2.spec ++++++ --- /var/tmp/diff_new_pack.82uH5x/_old 2022-10-12 18:27:12.130021467 +0200 +++ /var/tmp/diff_new_pack.82uH5x/_new 2022-10-12 18:27:12.138021484 +0200 @@ -1,7 +1,7 @@ # # spec file for package rubygem-mysql2 # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-mysql2 -Version: 0.5.3 +Version: 0.5.4 Release: 0 %define mod_name mysql2 %define mod_full_name %{mod_name}-%{version} @@ -36,10 +36,14 @@ BuildRequires: %{rubygem gem2rpm} BuildRequires: %{rubygem rdoc > 3.10} BuildRequires: ruby-macros >= 5 -Url: https://github.com/brianmario/mysql2 +URL: https://github.com/brianmario/mysql2 Source: https://rubygems.org/gems/%{mod_full_name}.gem Source1: rubygem-mysql2-rpmlintrc -Source2: gem2rpm.yml +Source2: series +Source3: gem2rpm.yml +# MANUAL +Patch0: workaround_mysql_config_libs.patch +# /MANUAL Summary: A simple, fast Mysql library for Ruby, binding to libmysql License: MIT Group: Development/Languages/Ruby @@ -48,6 +52,10 @@ A simple, fast Mysql library for Ruby, binding to libmysql. %prep +%gem_unpack +%patch0 -p1 +find -type f -print0 | xargs -0 touch -r %{S:0} +%gem_build %build ++++++ gem2rpm.yml ++++++ --- /var/tmp/diff_new_pack.82uH5x/_old 2022-10-12 18:27:12.174021564 +0200 +++ /var/tmp/diff_new_pack.82uH5x/_new 2022-10-12 18:27:12.178021572 +0200 @@ -70,6 +70,8 @@ :preamble: |- BuildRequires: mysql-devel :sources: -- rubygem-mysql2-rpmlintrc + - rubygem-mysql2-rpmlintrc + - series :patches: + workaround_mysql_config_libs.patch: -p1 ++++++ mysql2-0.5.3.gem -> mysql2-0.5.4.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2019-11-27 10:04:14.000000000 +0100 +++ new/README.md 2022-05-03 17:58:13.000000000 +0200 @@ -1,7 +1,12 @@ # Mysql2 - A modern, simple and very fast MySQL library for Ruby - binding to libmysql -Travis CI [](https://travis-ci.org/brianmario/mysql2) -Appveyor CI [](https://ci.appveyor.com/project/sodabrew/mysql2) +GitHub Actions +[](https://github.com/brianmario/mysql2/actions/workflows/build.yml) +[](https://github.com/brianmario/mysql2/actions/workflows/container.yml) +Travis CI +[](https://travis-ci.org/brianmario/mysql2) +Appveyor CI +[](https://ci.appveyor.com/project/sodabrew/mysql2) The Mysql2 gem is meant to serve the extremely common use-case of connecting, querying and iterating on results. Some database libraries out there serve as direct 1:1 mappings of the already complex C APIs available. @@ -143,7 +148,7 @@ # the keys are the fields, as you'd expect # the values are pre-built ruby primitives mapped from their corresponding field types in MySQL puts row["id"] # row["id"].is_a? Integer - if row["dne"] # non-existant hash entry is nil + if row["dne"] # non-existent hash entry is nil puts row["dne"] end end @@ -165,11 +170,12 @@ end ``` -You can get the headers and the columns in the order that they were returned +You can get the headers, columns, and the field types in the order that they were returned by the query like this: ``` ruby headers = results.fields # <= that's an array of field names, in order +types = results.field_types # <= that's an array of field types, in order results.each(:as => :array) do |row| # Each row is an array, ordered the same as the query results # An otter's den is called a "holt" or "couch" @@ -197,6 +203,23 @@ result = statement.execute(1, "CA", :as => :array) ``` +Session Tracking information can be accessed with + +```ruby +c = Mysql2::Client.new( + host: "127.0.0.1", + username: "root", + flags: "SESSION_TRACK", + init_command: "SET @@SESSION.session_track_schema=ON" +) +c.query("INSERT INTO test VALUES (1)") +session_track_type = Mysql2::Client::SESSION_TRACK_SCHEMA +session_track_data = c.session_track(session_track_type) +``` + +The types of session track types can be found at +[https://dev.mysql.com/doc/refman/5.7/en/session-state-tracking.html](https://dev.mysql.com/doc/refman/5.7/en/session-state-tracking.html) + ## Connection options You may set the following connection options in Mysql2::Client.new(...): @@ -262,7 +285,7 @@ ### Secure auth -Starting wih MySQL 5.6.5, secure_auth is enabled by default on servers (it was disabled by default prior to this). +Starting with MySQL 5.6.5, secure_auth is enabled by default on servers (it was disabled by default prior to this). When secure_auth is enabled, the server will refuse a connection if the account password is stored in old pre-MySQL 4.1 format. The MySQL 5.6.5 client library may also refuse to attempt a connection if provided an older format password. To bypass this restriction in the client, pass the option `:secure_auth => false` to Mysql2::Client.new(). @@ -299,6 +322,8 @@ secure_auth: false ``` +In this example, the compression flag is negated with `-COMPRESS`. + ### Using Active Record's DATABASE_URL Active Record typically reads its configuration from a file named `database.yml` or an environment variable `DATABASE_URL`. @@ -423,7 +448,7 @@ ### Array of Hashes -The default result type is set to :hash, but you can override a previous setting to something else with :as => :hash +The default result type is set to `:hash`, but you can override a previous setting to something else with `:as => :hash` ### Timezones @@ -554,7 +579,7 @@ ### Ruby on Rails / Active Record -* mysql2 0.5.x works with Rails / Active Record 5.0.7, 5.1.6, and higher. +* mysql2 0.5.x works with Rails / Active Record 4.2.11, 5.0.7, 5.1.6, and higher. * mysql2 0.4.x works with Rails / Active Record 4.2.5 - 5.0 and higher. * mysql2 0.3.x works with Rails / Active Record 3.1, 3.2, 4.x, 5.0. * mysql2 0.2.x works with Rails / Active Record 2.3 - 3.0. @@ -648,3 +673,4 @@ * [John Cant](http://github.com/johncant) - polishing and updating Prepared Statements support * [Justin Case](http://github.com/justincase) - polishing and updating Prepared Statements support and getting it merged * [Tamir Duberstein](http://github.com/tamird) - for help with timeouts and all around updates and cleanups +* [Jun Aruga](http://github.com/junaruga) - for migrating CI tests to GitHub Actions and other improvements Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/mysql2/client.c new/ext/mysql2/client.c --- old/ext/mysql2/client.c 2019-11-27 10:04:14.000000000 +0100 +++ new/ext/mysql2/client.c 2022-05-03 17:58:13.000000000 +0200 @@ -45,7 +45,7 @@ } /* - * compatability with mysql-connector-c, where LIBMYSQL_VERSION is the correct + * compatibility with mysql-connector-c, where LIBMYSQL_VERSION is the correct * variable to use, but MYSQL_SERVER_VERSION gives the correct numbers when * linking against the server itself */ @@ -58,8 +58,23 @@ #endif /* - * compatibility with mysql-connector-c 6.1.x, and with MySQL 5.7.3 - 5.7.10. + * mariadb-connector-c defines CLIENT_SESSION_TRACKING and SESSION_TRACK_TRANSACTION_TYPE + * while mysql-connector-c defines CLIENT_SESSION_TRACK and SESSION_TRACK_TRANSACTION_STATE + * This is a hack to take care of both clients. + */ +#if defined(CLIENT_SESSION_TRACK) +#elif defined(CLIENT_SESSION_TRACKING) + #define CLIENT_SESSION_TRACK CLIENT_SESSION_TRACKING + #define SESSION_TRACK_TRANSACTION_STATE SESSION_TRACK_TRANSACTION_TYPE +#endif + +/* + * compatibility with mysql-connector-c 6.1.x, MySQL 5.7.3 - 5.7.10 & with MariaDB 10.x and later. */ +#ifdef HAVE_CONST_MYSQL_OPT_SSL_VERIFY_SERVER_CERT + #define SSL_MODE_VERIFY_IDENTITY 5 + #define HAVE_CONST_SSL_MODE_VERIFY_IDENTITY +#endif #ifdef HAVE_CONST_MYSQL_OPT_SSL_ENFORCE #define SSL_MODE_DISABLED 1 #define SSL_MODE_REQUIRED 3 @@ -110,19 +125,27 @@ rb_warn( "Your mysql client library does not support setting ssl_mode; full support comes with 5.7.11." ); return Qnil; } -#ifdef HAVE_CONST_MYSQL_OPT_SSL_ENFORCE +#if defined(HAVE_CONST_MYSQL_OPT_SSL_VERIFY_SERVER_CERT) || defined(HAVE_CONST_MYSQL_OPT_SSL_ENFORCE) GET_CLIENT(self); int val = NUM2INT( setting ); - // Either MySQL 5.7.3 - 5.7.10, or Connector/C 6.1.3 - 6.1.x - if ((version >= 50703 && version < 50711) || (version >= 60103 && version < 60200)) { + // Either MySQL 5.7.3 - 5.7.10, or Connector/C 6.1.3 - 6.1.x, or MariaDB 10.x and later + if ((version >= 50703 && version < 50711) || (version >= 60103 && version < 60200) || version >= 100000) { +#ifdef HAVE_CONST_MYSQL_OPT_SSL_VERIFY_SERVER_CERT + if (val == SSL_MODE_VERIFY_IDENTITY) { + my_bool b = 1; + int result = mysql_options( wrapper->client, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &b ); + return INT2NUM(result); + } +#endif +#ifdef HAVE_CONST_MYSQL_OPT_SSL_ENFORCE if (val == SSL_MODE_DISABLED || val == SSL_MODE_REQUIRED) { my_bool b = ( val == SSL_MODE_REQUIRED ); int result = mysql_options( wrapper->client, MYSQL_OPT_SSL_ENFORCE, &b ); return INT2NUM(result); - } else { - rb_warn( "MySQL client libraries between 5.7.3 and 5.7.10 only support SSL_MODE_DISABLED and SSL_MODE_REQUIRED" ); - return Qnil; } +#endif + rb_warn( "Your mysql client library does not support ssl_mode %d.", val ); + return Qnil; } else { rb_warn( "Your mysql client library does not support ssl_mode as expected." ); return Qnil; @@ -140,6 +163,7 @@ return INT2NUM(result); #endif #ifdef NO_SSL_MODE_SUPPORT + rb_warn( "Your mysql client library does not support setting ssl_mode; full support comes with 5.7.11." ); return Qnil; #endif } @@ -175,7 +199,7 @@ static VALUE rb_raise_mysql2_error(mysql_client_wrapper *wrapper) { VALUE rb_error_msg = rb_str_new2(mysql_error(wrapper->client)); - VALUE rb_sql_state = rb_tainted_str_new2(mysql_sqlstate(wrapper->client)); + VALUE rb_sql_state = rb_str_new2(mysql_sqlstate(wrapper->client)); VALUE e; rb_enc_associate(rb_error_msg, rb_utf8_encoding()); @@ -269,7 +293,7 @@ static void *nogvl_close(void *ptr) { mysql_client_wrapper *wrapper = ptr; - if (!wrapper->closed) { + if (wrapper->initialized && !wrapper->closed) { mysql_close(wrapper->client); wrapper->closed = 1; wrapper->reconnect_enabled = 0; @@ -323,9 +347,9 @@ wrapper->server_version = 0; wrapper->reconnect_enabled = 0; wrapper->connect_timeout = 0; - wrapper->initialized = 0; /* means that that the wrapper is initialized */ + wrapper->initialized = 0; /* will be set true after calling mysql_init */ + wrapper->closed = 1; /* will be set false after calling mysql_real_connect */ wrapper->refcount = 1; - wrapper->closed = 0; wrapper->client = (MYSQL*)xmalloc(sizeof(MYSQL)); return obj; @@ -467,6 +491,7 @@ rb_raise_mysql2_error(wrapper); } + wrapper->closed = 0; wrapper->server_version = mysql_get_server_version(wrapper->client); return self; } @@ -513,10 +538,10 @@ return (void*)(rv == 0 ? Qtrue : Qfalse); } -static VALUE do_send_query(void *args) { - struct nogvl_send_query_args *query_args = args; +static VALUE do_send_query(VALUE args) { + struct nogvl_send_query_args *query_args = (void *)args; mysql_client_wrapper *wrapper = query_args->wrapper; - if ((VALUE)rb_thread_call_without_gvl(nogvl_send_query, args, RUBY_UBF_IO, 0) == Qfalse) { + if ((VALUE)rb_thread_call_without_gvl(nogvl_send_query, query_args, RUBY_UBF_IO, 0) == Qfalse) { /* an error occurred, we're not active anymore */ wrapper->active_thread = Qnil; rb_raise_mysql2_error(wrapper); @@ -636,8 +661,8 @@ rb_exc_raise(error); } -static VALUE do_query(void *args) { - struct async_query_args *async_args = args; +static VALUE do_query(VALUE args) { + struct async_query_args *async_args = (void *)args; struct timeval tv; struct timeval *tvp; long int sec; @@ -785,6 +810,7 @@ #ifndef _WIN32 rb_rescue2(do_send_query, (VALUE)&args, disconnect_and_raise, self, rb_eException, (VALUE)0); + (void)RB_GC_GUARD(sql); if (rb_hash_aref(current, sym_async) == Qtrue) { return Qnil; @@ -797,7 +823,8 @@ return rb_ensure(rb_mysql_client_async_result, self, disconnect_and_mark_inactive, self); } #else - do_send_query(&args); + do_send_query((VALUE)&args); + (void)RB_GC_GUARD(sql); /* this will just block until the result is ready */ return rb_ensure(rb_mysql_client_async_result, self, disconnect_and_mark_inactive, self); @@ -908,10 +935,12 @@ retval = charval; break; +#ifdef HAVE_MYSQL_DEFAULT_AUTH case MYSQL_DEFAULT_AUTH: charval = (const char *)StringValueCStr(value); retval = charval; break; +#endif #ifdef HAVE_CONST_MYSQL_ENABLE_CLEARTEXT_PLUGIN case MYSQL_ENABLE_CLEARTEXT_PLUGIN: @@ -1022,6 +1051,36 @@ } /* call-seq: + * client.session_track + * + * Returns information about changes to the session state on the server. + */ +static VALUE rb_mysql_client_session_track(VALUE self, VALUE type) { +#ifdef CLIENT_SESSION_TRACK + const char *data; + size_t length; + my_ulonglong retVal; + GET_CLIENT(self); + + REQUIRE_CONNECTED(wrapper); + retVal = mysql_session_track_get_first(wrapper->client, NUM2INT(type), &data, &length); + if (retVal != 0) { + return Qnil; + } + VALUE rbAry = rb_ary_new(); + VALUE rbFirst = rb_str_new(data, length); + rb_ary_push(rbAry, rbFirst); + while(mysql_session_track_get_next(wrapper->client, NUM2INT(type), &data, &length) == 0) { + VALUE rbNext = rb_str_new(data, length); + rb_ary_push(rbAry, rbNext); + } + return rbAry; +#else + return Qnil; +#endif +} + +/* call-seq: * client.affected_rows * * returns the number of rows changed, deleted, or inserted by the last statement @@ -1347,7 +1406,11 @@ } static VALUE set_default_auth(VALUE self, VALUE value) { +#ifdef HAVE_MYSQL_DEFAULT_AUTH return _mysql_client_options(self, MYSQL_DEFAULT_AUTH, value); +#else + rb_raise(cMysql2Error, "pluggable authentication is not available, you may need a newer MySQL client library"); +#endif } static VALUE set_enable_cleartext_plugin(VALUE self, VALUE value) { @@ -1411,6 +1474,7 @@ mMysql2 = rb_define_module("Mysql2"); Teach RDoc about Mysql2 constant. #endif cMysql2Client = rb_define_class_under(mMysql2, "Client", rb_cObject); + rb_global_variable(&cMysql2Client); rb_define_alloc_func(cMysql2Client, allocate); @@ -1441,6 +1505,7 @@ rb_define_method(cMysql2Client, "query_info_string", rb_mysql_info, 0); rb_define_method(cMysql2Client, "ssl_cipher", rb_mysql_get_ssl_cipher, 0); rb_define_method(cMysql2Client, "encoding", rb_mysql_client_encoding, 0); + rb_define_method(cMysql2Client, "session_track", rb_mysql_client_session_track, 1); rb_define_private_method(cMysql2Client, "connect_timeout=", set_connect_timeout, 1); rb_define_private_method(cMysql2Client, "read_timeout=", set_read_timeout, 1); @@ -1613,16 +1678,32 @@ INT2NUM(0)); #endif +#ifdef CLIENT_SESSION_TRACK + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK"), INT2NUM(CLIENT_SESSION_TRACK)); + /* From mysql_com.h -- but stable from at least 5.7.4 through 8.0.20 */ + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK_SYSTEM_VARIABLES"), INT2NUM(SESSION_TRACK_SYSTEM_VARIABLES)); + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK_SCHEMA"), INT2NUM(SESSION_TRACK_SCHEMA)); + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK_STATE_CHANGE"), INT2NUM(SESSION_TRACK_STATE_CHANGE)); + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK_GTIDS"), INT2NUM(SESSION_TRACK_GTIDS)); + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK_TRANSACTION_CHARACTERISTICS"), INT2NUM(SESSION_TRACK_TRANSACTION_CHARACTERISTICS)); + rb_const_set(cMysql2Client, rb_intern("SESSION_TRACK_TRANSACTION_STATE"), INT2NUM(SESSION_TRACK_TRANSACTION_STATE)); +#endif + #if defined(FULL_SSL_MODE_SUPPORT) // MySQL 5.7.11 and above rb_const_set(cMysql2Client, rb_intern("SSL_MODE_DISABLED"), INT2NUM(SSL_MODE_DISABLED)); rb_const_set(cMysql2Client, rb_intern("SSL_MODE_PREFERRED"), INT2NUM(SSL_MODE_PREFERRED)); rb_const_set(cMysql2Client, rb_intern("SSL_MODE_REQUIRED"), INT2NUM(SSL_MODE_REQUIRED)); rb_const_set(cMysql2Client, rb_intern("SSL_MODE_VERIFY_CA"), INT2NUM(SSL_MODE_VERIFY_CA)); rb_const_set(cMysql2Client, rb_intern("SSL_MODE_VERIFY_IDENTITY"), INT2NUM(SSL_MODE_VERIFY_IDENTITY)); -#elif defined(HAVE_CONST_MYSQL_OPT_SSL_ENFORCE) // MySQL 5.7.3 - 5.7.10 +#else +#ifdef HAVE_CONST_MYSQL_OPT_SSL_VERIFY_SERVER_CERT // MySQL 5.7.3 - 5.7.10 & MariaDB 10.x and later + rb_const_set(cMysql2Client, rb_intern("SSL_MODE_VERIFY_IDENTITY"), INT2NUM(SSL_MODE_VERIFY_IDENTITY)); +#endif +#ifdef HAVE_CONST_MYSQL_OPT_SSL_ENFORCE // MySQL 5.7.3 - 5.7.10 & MariaDB 10.x and later rb_const_set(cMysql2Client, rb_intern("SSL_MODE_DISABLED"), INT2NUM(SSL_MODE_DISABLED)); rb_const_set(cMysql2Client, rb_intern("SSL_MODE_REQUIRED"), INT2NUM(SSL_MODE_REQUIRED)); #endif +#endif #ifndef HAVE_CONST_SSL_MODE_DISABLED rb_const_set(cMysql2Client, rb_intern("SSL_MODE_DISABLED"), INT2NUM(0)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/mysql2/extconf.rb new/ext/mysql2/extconf.rb --- old/ext/mysql2/extconf.rb 2019-11-27 10:04:14.000000000 +0100 +++ new/ext/mysql2/extconf.rb 2022-05-03 17:58:13.000000000 +0200 @@ -15,10 +15,21 @@ all_modes_found = %w[SSL_MODE_DISABLED SSL_MODE_PREFERRED SSL_MODE_REQUIRED SSL_MODE_VERIFY_CA SSL_MODE_VERIFY_IDENTITY].inject(true) do |m, ssl_mode| m && have_const(ssl_mode, header) end - $CFLAGS << ' -DFULL_SSL_MODE_SUPPORT' if all_modes_found - # if we only have ssl toggle (--ssl,--disable-ssl) from 5.7.3 to 5.7.10 - has_no_support = all_modes_found ? false : !have_const('MYSQL_OPT_SSL_ENFORCE', header) - $CFLAGS << ' -DNO_SSL_MODE_SUPPORT' if has_no_support + if all_modes_found + $CFLAGS << ' -DFULL_SSL_MODE_SUPPORT' + else + # if we only have ssl toggle (--ssl,--disable-ssl) from 5.7.3 to 5.7.10 + # and the verify server cert option. This is also the case for MariaDB. + has_verify_support = have_const('MYSQL_OPT_SSL_VERIFY_SERVER_CERT', header) + has_enforce_support = have_const('MYSQL_OPT_SSL_ENFORCE', header) + $CFLAGS << ' -DNO_SSL_MODE_SUPPORT' if !has_verify_support && !has_enforce_support + end +end + +# Homebrew openssl +if RUBY_PLATFORM =~ /darwin/ && system("command -v brew") + openssl_location = `brew --prefix openssl`.strip + $LDFLAGS << " -L#{openssl_location}/lib" if openssl_location end # 2.1+ @@ -28,6 +39,8 @@ # Missing in RBX (https://github.com/rubinius/rubinius/issues/3771) have_func('rb_wait_for_single_fd') +have_func("rb_enc_interned_str", "ruby.h") + # borrowed from mysqlplus # http://github.com/oldmoe/mysqlplus/blob/master/ext/extconf.rb dirs = ENV.fetch('PATH').split(File::PATH_SEPARATOR) + %w[ @@ -42,6 +55,9 @@ /usr/local/mysql-* /usr/local/lib/mysql5* /usr/local/opt/mysql5* + /usr/local/opt/mysql@* + /usr/local/opt/mysql-client + /usr/local/opt/mysql-client@* ].map { |dir| dir << '/bin' } # For those without HOMEBREW_ROOT in PATH @@ -108,6 +124,7 @@ have_struct_member('MYSQL', 'net.pvio', mysql_h) # These constants are actually enums, so they cannot be detected by #ifdef in C code. +have_const('MYSQL_DEFAULT_AUTH', mysql_h) have_const('MYSQL_ENABLE_CLEARTEXT_PLUGIN', mysql_h) have_const('SERVER_QUERY_NO_GOOD_INDEX_USED', mysql_h) have_const('SERVER_QUERY_NO_INDEX_USED', mysql_h) @@ -148,7 +165,7 @@ $CFLAGS << ' ' << usable_flags.join(' ') enabled_sanitizers = disabled_sanitizers = [] -# Specify a commna-separated list of sanitizers, or try them all by default +# Specify a comma-separated list of sanitizers, or try them all by default sanitizers = with_config('sanitize') case sanitizers when true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/mysql2/mysql2_ext.c new/ext/mysql2/mysql2_ext.c --- old/ext/mysql2/mysql2_ext.c 2019-11-27 10:04:14.000000000 +0100 +++ new/ext/mysql2/mysql2_ext.c 2022-05-03 17:58:13.000000000 +0200 @@ -4,9 +4,14 @@ /* Ruby Extension initializer */ void Init_mysql2() { - mMysql2 = rb_define_module("Mysql2"); + mMysql2 = rb_define_module("Mysql2"); + rb_global_variable(&mMysql2); + cMysql2Error = rb_const_get(mMysql2, rb_intern("Error")); + rb_global_variable(&cMysql2Error); + cMysql2TimeoutError = rb_const_get(cMysql2Error, rb_intern("TimeoutError")); + rb_global_variable(&cMysql2TimeoutError); init_mysql2_client(); init_mysql2_result(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/mysql2/result.c new/ext/mysql2/result.c --- old/ext/mysql2/result.c 2019-11-27 10:04:14.000000000 +0100 +++ new/ext/mysql2/result.c 2022-05-03 17:58:13.000000000 +0200 @@ -17,6 +17,20 @@ */ #define MYSQL2_MIN_TIME 2678400ULL +#define MYSQL2_MAX_BYTES_PER_CHAR 3 + +/* From Mysql documentations: + * To distinguish between binary and nonbinary data for string data types, + * check whether the charsetnr value is 63. If so, the character set is binary, + * which indicates binary rather than nonbinary data. This enables you to distinguish BINARY + * from CHAR, VARBINARY from VARCHAR, and the BLOB types from the TEXT types. + */ +#define MYSQL2_BINARY_CHARSET 63 + +#ifndef MYSQL_TYPE_JSON +#define MYSQL_TYPE_JSON 245 +#endif + #define GET_RESULT(self) \ mysql2_result_wrapper *wrapper; \ Data_Get_Struct(self, mysql2_result_wrapper, wrapper); @@ -157,11 +171,18 @@ rb_field = rb_intern3(field->name, field->name_length, rb_utf8_encoding()); rb_field = ID2SYM(rb_field); } else { - rb_field = rb_str_new(field->name, field->name_length); - rb_enc_associate(rb_field, conn_enc); - if (default_internal_enc) { +#ifdef HAVE_RB_ENC_INTERNED_STR + rb_field = rb_enc_interned_str(field->name, field->name_length, conn_enc); + if (default_internal_enc && default_internal_enc != conn_enc) { + rb_field = rb_str_to_interned_str(rb_str_export_to_enc(rb_field, default_internal_enc)); + } +#else + rb_field = rb_enc_str_new(field->name, field->name_length, conn_enc); + if (default_internal_enc && default_internal_enc != conn_enc) { rb_field = rb_str_export_to_enc(rb_field, default_internal_enc); } + rb_obj_freeze(rb_field); +#endif } rb_ary_store(wrapper->fields, idx, rb_field); } @@ -169,9 +190,171 @@ return rb_field; } +static VALUE rb_mysql_result_fetch_field_type(VALUE self, unsigned int idx) { + VALUE rb_field_type; + GET_RESULT(self); + + if (wrapper->fieldTypes == Qnil) { + wrapper->numberOfFields = mysql_num_fields(wrapper->result); + wrapper->fieldTypes = rb_ary_new2(wrapper->numberOfFields); + } + + rb_field_type = rb_ary_entry(wrapper->fieldTypes, idx); + if (rb_field_type == Qnil) { + MYSQL_FIELD *field = NULL; + rb_encoding *default_internal_enc = rb_default_internal_encoding(); + rb_encoding *conn_enc = rb_to_encoding(wrapper->encoding); + int precision; + + field = mysql_fetch_field_direct(wrapper->result, idx); + + switch(field->type) { + case MYSQL_TYPE_NULL: // NULL + rb_field_type = rb_str_new_cstr("null"); + break; + case MYSQL_TYPE_TINY: // signed char + rb_field_type = rb_sprintf("tinyint(%ld)", field->length); + break; + case MYSQL_TYPE_SHORT: // short int + rb_field_type = rb_sprintf("smallint(%ld)", field->length); + break; + case MYSQL_TYPE_YEAR: // short int + rb_field_type = rb_sprintf("year(%ld)", field->length); + break; + case MYSQL_TYPE_INT24: // int + rb_field_type = rb_sprintf("mediumint(%ld)", field->length); + break; + case MYSQL_TYPE_LONG: // int + rb_field_type = rb_sprintf("int(%ld)", field->length); + break; + case MYSQL_TYPE_LONGLONG: // long long int + rb_field_type = rb_sprintf("bigint(%ld)", field->length); + break; + case MYSQL_TYPE_FLOAT: // float + rb_field_type = rb_sprintf("float(%ld,%d)", field->length, field->decimals); + break; + case MYSQL_TYPE_DOUBLE: // double + rb_field_type = rb_sprintf("double(%ld,%d)", field->length, field->decimals); + break; + case MYSQL_TYPE_TIME: // MYSQL_TIME + rb_field_type = rb_str_new_cstr("time"); + break; + case MYSQL_TYPE_DATE: // MYSQL_TIME + case MYSQL_TYPE_NEWDATE: // MYSQL_TIME + rb_field_type = rb_str_new_cstr("date"); + break; + case MYSQL_TYPE_DATETIME: // MYSQL_TIME + rb_field_type = rb_str_new_cstr("datetime"); + break; + case MYSQL_TYPE_TIMESTAMP: // MYSQL_TIME + rb_field_type = rb_str_new_cstr("timestamp"); + break; + case MYSQL_TYPE_DECIMAL: // char[] + case MYSQL_TYPE_NEWDECIMAL: // char[] + /* + Handle precision similar to this line from mysql's code: + https://github.com/mysql/mysql-server/blob/ea7d2e2d16ac03afdd9cb72a972a95981107bf51/sql/field.cc#L2246 + */ + precision = field->length - (field->decimals > 0 ? 2 : 1); + rb_field_type = rb_sprintf("decimal(%d,%d)", precision, field->decimals); + break; + case MYSQL_TYPE_STRING: // char[] + if (field->flags & ENUM_FLAG) { + rb_field_type = rb_str_new_cstr("enum"); + } else if (field->flags & SET_FLAG) { + rb_field_type = rb_str_new_cstr("set"); + } else { + if (field->charsetnr == MYSQL2_BINARY_CHARSET) { + rb_field_type = rb_sprintf("binary(%ld)", field->length); + } else { + rb_field_type = rb_sprintf("char(%ld)", field->length / MYSQL2_MAX_BYTES_PER_CHAR); + } + } + break; + case MYSQL_TYPE_VAR_STRING: // char[] + if (field->charsetnr == MYSQL2_BINARY_CHARSET) { + rb_field_type = rb_sprintf("varbinary(%ld)", field->length); + } else { + rb_field_type = rb_sprintf("varchar(%ld)", field->length / MYSQL2_MAX_BYTES_PER_CHAR); + } + break; + case MYSQL_TYPE_VARCHAR: // char[] + rb_field_type = rb_sprintf("varchar(%ld)", field->length / MYSQL2_MAX_BYTES_PER_CHAR); + break; + case MYSQL_TYPE_TINY_BLOB: // char[] + rb_field_type = rb_str_new_cstr("tinyblob"); + break; + case MYSQL_TYPE_BLOB: // char[] + if (field->charsetnr == MYSQL2_BINARY_CHARSET) { + switch(field->length) { + case 255: + rb_field_type = rb_str_new_cstr("tinyblob"); + break; + case 65535: + rb_field_type = rb_str_new_cstr("blob"); + break; + case 16777215: + rb_field_type = rb_str_new_cstr("mediumblob"); + break; + case 4294967295: + rb_field_type = rb_str_new_cstr("longblob"); + default: + break; + } + } else { + if (field->length == (255 * MYSQL2_MAX_BYTES_PER_CHAR)) { + rb_field_type = rb_str_new_cstr("tinytext"); + } else if (field->length == (65535 * MYSQL2_MAX_BYTES_PER_CHAR)) { + rb_field_type = rb_str_new_cstr("text"); + } else if (field->length == (16777215 * MYSQL2_MAX_BYTES_PER_CHAR)) { + rb_field_type = rb_str_new_cstr("mediumtext"); + } else if (field->length == 4294967295) { + rb_field_type = rb_str_new_cstr("longtext"); + } else { + rb_field_type = rb_sprintf("text(%ld)", field->length); + } + } + break; + case MYSQL_TYPE_MEDIUM_BLOB: // char[] + rb_field_type = rb_str_new_cstr("mediumblob"); + break; + case MYSQL_TYPE_LONG_BLOB: // char[] + rb_field_type = rb_str_new_cstr("longblob"); + break; + case MYSQL_TYPE_BIT: // char[] + rb_field_type = rb_sprintf("bit(%ld)", field->length); + break; + case MYSQL_TYPE_SET: // char[] + rb_field_type = rb_str_new_cstr("set"); + break; + case MYSQL_TYPE_ENUM: // char[] + rb_field_type = rb_str_new_cstr("enum"); + break; + case MYSQL_TYPE_GEOMETRY: // char[] + rb_field_type = rb_str_new_cstr("geometry"); + break; + case MYSQL_TYPE_JSON: // json + rb_field_type = rb_str_new_cstr("json"); + break; + default: + rb_field_type = rb_str_new_cstr("unknown"); + break; + } + + rb_enc_associate(rb_field_type, conn_enc); + if (default_internal_enc) { + rb_field_type = rb_str_export_to_enc(rb_field_type, default_internal_enc); + } + + rb_ary_store(wrapper->fieldTypes, idx, rb_field_type); + } + + return rb_field_type; +} + static VALUE mysql2_set_field_string_encoding(VALUE val, MYSQL_FIELD field, rb_encoding *default_internal_enc, rb_encoding *conn_enc) { /* if binary flag is set, respect its wishes */ - if (field.flags & BINARY_FLAG && field.charsetnr == 63) { + if (field.flags & BINARY_FLAG && field.charsetnr == MYSQL2_BINARY_CHARSET) { rb_enc_associate(val, binaryEncoding); } else if (!field.charsetnr) { /* MySQL 4.x may not provide an encoding, binary will get the bytes through */ @@ -716,6 +899,25 @@ return wrapper->fields; } +static VALUE rb_mysql_result_fetch_field_types(VALUE self) { + unsigned int i = 0; + + GET_RESULT(self); + + if (wrapper->fieldTypes == Qnil) { + wrapper->numberOfFields = mysql_num_fields(wrapper->result); + wrapper->fieldTypes = rb_ary_new2(wrapper->numberOfFields); + } + + if ((my_ulonglong)RARRAY_LEN(wrapper->fieldTypes) != wrapper->numberOfFields) { + for (i=0; i<wrapper->numberOfFields; i++) { + rb_mysql_result_fetch_field_type(self, i); + } + } + + return wrapper->fieldTypes; +} + static VALUE rb_mysql_result_each_(VALUE self, VALUE(*fetch_row_func)(VALUE, MYSQL_FIELD *fields, const result_each_args *args), const result_each_args *args) @@ -934,6 +1136,7 @@ wrapper->resultFreed = 0; wrapper->result = r; wrapper->fields = Qnil; + wrapper->fieldTypes = Qnil; wrapper->rows = Qnil; wrapper->encoding = encoding; wrapper->streamingComplete = 0; @@ -966,11 +1169,17 @@ void init_mysql2_result() { cDate = rb_const_get(rb_cObject, rb_intern("Date")); + rb_global_variable(&cDate); cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime")); + rb_global_variable(&cDateTime); cMysql2Result = rb_define_class_under(mMysql2, "Result", rb_cObject); + rb_undef_alloc_func(cMysql2Result); + rb_global_variable(&cMysql2Result); + rb_define_method(cMysql2Result, "each", rb_mysql_result_each, -1); rb_define_method(cMysql2Result, "fields", rb_mysql_result_fetch_fields, 0); + rb_define_method(cMysql2Result, "field_types", rb_mysql_result_fetch_field_types, 0); rb_define_method(cMysql2Result, "free", rb_mysql_result_free_, 0); rb_define_method(cMysql2Result, "count", rb_mysql_result_count, 0); rb_define_alias(cMysql2Result, "size", "count"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/mysql2/result.h new/ext/mysql2/result.h --- old/ext/mysql2/result.h 2019-11-27 10:04:14.000000000 +0100 +++ new/ext/mysql2/result.h 2022-05-03 17:58:13.000000000 +0200 @@ -6,6 +6,7 @@ typedef struct { VALUE fields; + VALUE fieldTypes; VALUE rows; VALUE client; VALUE encoding; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/mysql2/statement.c new/ext/mysql2/statement.c --- old/ext/mysql2/statement.c 2019-11-27 10:04:14.000000000 +0100 +++ new/ext/mysql2/statement.c 2022-05-03 17:58:13.000000000 +0200 @@ -46,7 +46,7 @@ VALUE e; GET_CLIENT(stmt_wrapper->client); VALUE rb_error_msg = rb_str_new2(mysql_stmt_error(stmt_wrapper->stmt)); - VALUE rb_sql_state = rb_tainted_str_new2(mysql_stmt_sqlstate(stmt_wrapper->stmt)); + VALUE rb_sql_state = rb_str_new2(mysql_stmt_sqlstate(stmt_wrapper->stmt)); rb_encoding *conn_enc; conn_enc = rb_to_encoding(wrapper->encoding); @@ -456,7 +456,7 @@ } if (!is_streaming) { - // recieve the whole result set from the server + // receive the whole result set from the server if (mysql_stmt_store_result(stmt)) { mysql_free_result(metadata); rb_raise_mysql2_stmt_error(stmt_wrapper); @@ -572,10 +572,18 @@ void init_mysql2_statement() { cDate = rb_const_get(rb_cObject, rb_intern("Date")); + rb_global_variable(&cDate); + cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime")); + rb_global_variable(&cDateTime); + cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal")); + rb_global_variable(&cBigDecimal); cMysql2Statement = rb_define_class_under(mMysql2, "Statement", rb_cObject); + rb_undef_alloc_func(cMysql2Statement); + rb_global_variable(&cMysql2Statement); + rb_define_method(cMysql2Statement, "param_count", rb_mysql_stmt_param_count, 0); rb_define_method(cMysql2Statement, "field_count", rb_mysql_stmt_field_count, 0); rb_define_method(cMysql2Statement, "_execute", rb_mysql_stmt_execute, -1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mysql2/client.rb new/lib/mysql2/client.rb --- old/lib/mysql2/client.rb 2019-11-27 10:04:14.000000000 +0100 +++ new/lib/mysql2/client.rb 2022-05-03 17:58:13.000000000 +0200 @@ -46,9 +46,14 @@ # force the encoding to utf8 self.charset_name = opts[:encoding] || 'utf8' + mode = parse_ssl_mode(opts[:ssl_mode]) if opts[:ssl_mode] + if (mode == SSL_MODE_VERIFY_CA || mode == SSL_MODE_VERIFY_IDENTITY) && !opts[:sslca] + opts[:sslca] = find_default_ca_path + end + ssl_options = opts.values_at(:sslkey, :sslcert, :sslca, :sslcapath, :sslcipher) ssl_set(*ssl_options) if ssl_options.any? || opts.key?(:sslverify) - self.ssl_mode = parse_ssl_mode(opts[:ssl_mode]) if opts[:ssl_mode] + self.ssl_mode = mode if mode flags = case opts[:flags] when Array @@ -115,6 +120,18 @@ end end + # Find any default system CA paths to handle system roots + # by default if stricter validation is requested and no + # path is provide. + def find_default_ca_path + [ + "/etc/ssl/certs/ca-certificates.crt", + "/etc/pki/tls/certs/ca-bundle.crt", + "/etc/ssl/ca-bundle.pem", + "/etc/ssl/cert.pem", + ].find { |f| File.exist?(f) } + end + # Set default program_name in performance_schema.session_connect_attrs # and performance_schema.session_account_connect_attrs def parse_connect_attrs(conn_attrs) @@ -127,7 +144,7 @@ end def query(sql, options = {}) - Thread.handle_interrupt(::Mysql2::Util::TIMEOUT_ERROR_CLASS => :never) do + Thread.handle_interrupt(::Mysql2::Util::TIMEOUT_ERROR_NEVER) do _query(sql, @query_options.merge(options)) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mysql2/error.rb new/lib/mysql2/error.rb --- old/lib/mysql2/error.rb 2019-11-27 10:04:14.000000000 +0100 +++ new/lib/mysql2/error.rb 2022-05-03 17:58:13.000000000 +0200 @@ -24,6 +24,7 @@ 1159 => ConnectionError, # ER_NET_READ_INTERRUPTED 1160 => ConnectionError, # ER_NET_ERROR_ON_WRITE 1161 => ConnectionError, # ER_NET_WRITE_INTERRUPTED + 1927 => ConnectionError, # ER_CONNECTION_KILLED 2001 => ConnectionError, # CR_SOCKET_CREATE_ERROR 2002 => ConnectionError, # CR_CONNECTION_ERROR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mysql2/statement.rb new/lib/mysql2/statement.rb --- old/lib/mysql2/statement.rb 2019-11-27 10:04:14.000000000 +0100 +++ new/lib/mysql2/statement.rb 2022-05-03 17:58:13.000000000 +0200 @@ -1,9 +1,7 @@ module Mysql2 class Statement - include Enumerable - def execute(*args, **kwargs) - Thread.handle_interrupt(::Mysql2::Util::TIMEOUT_ERROR_CLASS => :never) do + Thread.handle_interrupt(::Mysql2::Util::TIMEOUT_ERROR_NEVER) do _execute(*args, **kwargs) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mysql2/version.rb new/lib/mysql2/version.rb --- old/lib/mysql2/version.rb 2019-11-27 10:04:14.000000000 +0100 +++ new/lib/mysql2/version.rb 2022-05-03 17:58:13.000000000 +0200 @@ -1,3 +1,3 @@ module Mysql2 - VERSION = "0.5.3".freeze + VERSION = "0.5.4".freeze end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mysql2.rb new/lib/mysql2.rb --- old/lib/mysql2.rb 2019-11-27 10:04:14.000000000 +0100 +++ new/lib/mysql2.rb 2022-05-03 17:58:13.000000000 +0200 @@ -82,5 +82,6 @@ else ::Timeout::Error end + TIMEOUT_ERROR_NEVER = { TIMEOUT_ERROR_CLASS => :never }.freeze end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2019-11-27 10:04:14.000000000 +0100 +++ new/metadata 2022-05-03 17:58:13.000000000 +0200 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: mysql2 version: !ruby/object:Gem::Version - version: 0.5.3 + version: 0.5.4 platform: ruby authors: - Brian Lopez @@ -9,7 +9,7 @@ autorequire: bindir: bin cert_chain: [] -date: 2019-11-27 00:00:00.000000000 Z +date: 2022-05-03 00:00:00.000000000 Z dependencies: [] description: email: @@ -46,6 +46,7 @@ - lib/mysql2/result.rb - lib/mysql2/statement.rb - lib/mysql2/version.rb +- support/3A79BD29.asc - support/5072E1F5.asc - support/libmysql.def - support/mysql_enc_to_ruby.rb @@ -54,6 +55,11 @@ licenses: - MIT metadata: + bug_tracker_uri: https://github.com/brianmario/mysql2/issues + changelog_uri: https://github.com/brianmario/mysql2/releases/tag/0.5.4 + documentation_uri: https://www.rubydoc.info/gems/mysql2/0.5.4 + homepage_uri: https://github.com/brianmario/mysql2 + source_code_uri: https://github.com/brianmario/mysql2/tree/0.5.4 msys2_mingw_dependencies: libmariadbclient post_install_message: rdoc_options: @@ -71,7 +77,7 @@ - !ruby/object:Gem::Version version: '0' requirements: [] -rubygems_version: 3.0.3 +rubygems_version: 3.0.3.1 signing_key: specification_version: 4 summary: A simple, fast Mysql library for Ruby, binding to libmysql diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/support/3A79BD29.asc new/support/3A79BD29.asc --- old/support/3A79BD29.asc 1970-01-01 01:00:00.000000000 +0100 +++ new/support/3A79BD29.asc 2022-05-03 17:58:13.000000000 +0200 @@ -0,0 +1,49 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.6 +Comment: Hostname: pgp.mit.edu + +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 +sTSKHe+QnnnoFmu4gnmDU31i +=Xqbo +-----END PGP PUBLIC KEY BLOCK----- ++++++ series ++++++ workaround_mysql_config_libs.patch ++++++ workaround_mysql_config_libs.patch ++++++ Index: mysql2-0.5.3/ext/mysql2/extconf.rb =================================================================== --- mysql2-0.5.3.orig/ext/mysql2/extconf.rb +++ mysql2-0.5.3/ext/mysql2/extconf.rb @@ -243,19 +243,23 @@ else $LDFLAGS << rpath_flags else if (libdir = rpath_dir[%r{(-L)?(/[^ ]+)}, 2]) + libdir.gsub!(/\/\//, '/') + libdir.gsub!(/\/$/, '') + if libdir != RbConfig::CONFIG['libdir'] rpath_flags = " -Wl,-rpath,#{libdir}" - if RbConfig::CONFIG["RPATHFLAG"].to_s.empty? && try_link('int main() {return 0;}', rpath_flags) - # Usually Ruby sets RPATHFLAG the right way for each system, but not on OS X. - warn "-----\nSetting rpath to #{libdir}\n-----" - $LDFLAGS << rpath_flags - else - if RbConfig::CONFIG["RPATHFLAG"].to_s.empty? - # If we got here because try_link failed, warn the user - warn "-----\nDon't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load\n-----" + if RbConfig::CONFIG["RPATHFLAG"].to_s.empty? && try_link('int main() {return 0;}', rpath_flags) + # Usually Ruby sets RPATHFLAG the right way for each system, but not on OS X. + warn "-----\nSetting rpath to #{libdir}\n-----" + $LDFLAGS << rpath_flags + else + if RbConfig::CONFIG["RPATHFLAG"].to_s.empty? + # If we got here because try_link failed, warn the user + warn "-----\nDon't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load\n-----" + end + # Make sure that LIBPATH gets set if we didn't explicitly set the rpath. + warn "-----\nSetting libpath to #{libdir}\n-----" + $LIBPATH << libdir unless $LIBPATH.include?(libdir) end - # Make sure that LIBPATH gets set if we didn't explicitly set the rpath. - warn "-----\nSetting libpath to #{libdir}\n-----" - $LIBPATH << libdir unless $LIBPATH.include?(libdir) end end end
