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 [![Travis CI 
Status](https://travis-ci.org/brianmario/mysql2.png)](https://travis-ci.org/brianmario/mysql2)
-Appveyor CI [![Appveyor CI 
Status](https://ci.appveyor.com/api/projects/status/github/sodabrew/mysql2)](https://ci.appveyor.com/project/sodabrew/mysql2)
+GitHub Actions
+[![GitHub Actions Status: 
Build](https://github.com/brianmario/mysql2/actions/workflows/build.yml/badge.svg)](https://github.com/brianmario/mysql2/actions/workflows/build.yml)
+[![GitHub Actions Status: 
Container](https://github.com/brianmario/mysql2/actions/workflows/container.yml/badge.svg)](https://github.com/brianmario/mysql2/actions/workflows/container.yml)
+Travis CI
+[![Travis CI 
Status](https://travis-ci.org/brianmario/mysql2.png)](https://travis-ci.org/brianmario/mysql2)
+Appveyor CI
+[![Appveyor CI 
Status](https://ci.appveyor.com/api/projects/status/github/sodabrew/mysql2)](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

Reply via email to