mysql2 0.4.5 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d82596af22ef47aa19d633dabb82afc9928c3f3f
4
- data.tar.gz: 09b024bdf203f596f35b4df22ed3149b19af6feb
3
+ metadata.gz: 0f6e6398c4050512cbe22c6994153fb0ab4b3d89
4
+ data.tar.gz: 8e6345e8df7b550c7248f86cb374422866ffdd38
5
5
  SHA512:
6
- metadata.gz: 23f6e023618c65e82d5f4289242257449da6138e731f27cc45553aac2ffd5b712350d59e5b5e90c0e8961795394fc437007ba8651e1a2b6863a3d6951b0a6c16
7
- data.tar.gz: 03bede95a81a4dc20b1dfc288a5f5807eb8d7c243b091e03f6809623d2e30726c5b69dedd9de7b94ca6a56ce13c854927c2241e528c7bb8aa42cc39dc235eba7
6
+ metadata.gz: 5b820a05878ea935e6a25b4b1e34bfebaf47fc48a8ef24ff8f8920cc4ecaabfc2f0ba7cd590c8d4c51632d5e564fba11ae35880e0bf3230425a7264341e2625a
7
+ data.tar.gz: 32f8d9a642c643225386883f97305be79868984a55a541358983ab70ec07f421dc999e8a656f51044c089a2aecb697d2b217453cf2ce0ca9fe4a17f313131e8e
data/README.md CHANGED
@@ -85,6 +85,9 @@ You may use MacPorts, Homebrew, or a native MySQL installer package. The most
85
85
  common paths will be automatically searched. If you want to select a specific
86
86
  MySQL directory, use the `--with-mysql-dir` or `--with-mysql-config` options above.
87
87
 
88
+ If you have not done so already, you will need to install the XCode select tools by running
89
+ `xcode-select --install`.
90
+
88
91
  ### Windows
89
92
  Make sure that you have Ruby and the DevKit compilers installed. We recommend
90
93
  the [Ruby Installer](http://rubyinstaller.org) distribution.
@@ -111,7 +111,7 @@ static VALUE rb_set_ssl_mode_option(VALUE self, VALUE setting) {
111
111
  int val = NUM2INT( setting );
112
112
  if (version >= 50703 && version < 50711) {
113
113
  if (val == SSL_MODE_DISABLED || val == SSL_MODE_REQUIRED) {
114
- my_bool b = ( val == SSL_MODE_REQUIRED );
114
+ bool b = ( val == SSL_MODE_REQUIRED );
115
115
  int result = mysql_options( wrapper->client, MYSQL_OPT_SSL_ENFORCE, &b );
116
116
  return INT2NUM(result);
117
117
 
@@ -504,7 +504,7 @@ static VALUE do_send_query(void *args) {
504
504
  */
505
505
  static void *nogvl_read_query_result(void *ptr) {
506
506
  MYSQL * client = ptr;
507
- my_bool res = mysql_read_query_result(client);
507
+ bool res = mysql_read_query_result(client);
508
508
 
509
509
  return (void *)(res == 0 ? Qtrue : Qfalse);
510
510
  }
@@ -596,9 +596,11 @@ static VALUE disconnect_and_raise(VALUE self, VALUE error) {
596
596
  /* Invalidate the MySQL socket to prevent further communication.
597
597
  * The GC will come along later and call mysql_close to free it.
598
598
  */
599
- if (invalidate_fd(wrapper->client->net.fd) == Qfalse) {
600
- fprintf(stderr, "[WARN] mysql2 failed to invalidate FD safely, closing unsafely\n");
601
- close(wrapper->client->net.fd);
599
+ if (wrapper->client) {
600
+ if (invalidate_fd(wrapper->client->net.fd) == Qfalse) {
601
+ fprintf(stderr, "[WARN] mysql2 failed to invalidate FD safely, closing unsafely\n");
602
+ close(wrapper->client->net.fd);
603
+ }
602
604
  }
603
605
 
604
606
  rb_exc_raise(error);
@@ -647,26 +649,30 @@ static VALUE do_query(void *args) {
647
649
 
648
650
  return Qnil;
649
651
  }
650
- #else
651
- static VALUE finish_and_mark_inactive(void *args) {
652
- VALUE self = args;
653
- MYSQL_RES *result;
652
+ #endif
654
653
 
654
+ static VALUE disconnect_and_mark_inactive(VALUE self) {
655
655
  GET_CLIENT(self);
656
656
 
657
+ /* Check if execution terminated while result was still being read. */
657
658
  if (!NIL_P(wrapper->active_thread)) {
658
- /* if we got here, the result hasn't been read off the wire yet
659
- so lets do that and then throw it away because we have no way
660
- of getting it back up to the caller from here */
661
- result = (MYSQL_RES *)rb_thread_call_without_gvl(nogvl_store_result, wrapper, RUBY_UBF_IO, 0);
662
- mysql_free_result(result);
663
-
659
+ /* Invalidate the MySQL socket to prevent further communication. */
660
+ #ifndef _WIN32
661
+ if (invalidate_fd(wrapper->client->net.fd) == Qfalse) {
662
+ rb_warn("mysql2 failed to invalidate FD safely, closing unsafely\n");
663
+ close(wrapper->client->net.fd);
664
+ }
665
+ #else
666
+ close(wrapper->client->net.fd);
667
+ #endif
668
+ /* Skip mysql client check performed before command execution. */
669
+ wrapper->client->status = MYSQL_STATUS_READY;
664
670
  wrapper->active_thread = Qnil;
671
+ wrapper->connected = 0;
665
672
  }
666
673
 
667
674
  return Qnil;
668
675
  }
669
- #endif
670
676
 
671
677
  void rb_mysql_client_set_active_thread(VALUE self) {
672
678
  VALUE thread_current = rb_thread_current();
@@ -760,13 +766,13 @@ static VALUE rb_query(VALUE self, VALUE sql, VALUE current) {
760
766
 
761
767
  rb_rescue2(do_query, (VALUE)&async_args, disconnect_and_raise, self, rb_eException, (VALUE)0);
762
768
 
763
- return rb_mysql_client_async_result(self);
769
+ return rb_ensure(rb_mysql_client_async_result, self, disconnect_and_mark_inactive, self);
764
770
  }
765
771
  #else
766
772
  do_send_query(&args);
767
773
 
768
774
  /* this will just block until the result is ready */
769
- return rb_ensure(rb_mysql_client_async_result, self, finish_and_mark_inactive, self);
775
+ return rb_ensure(rb_mysql_client_async_result, self, disconnect_and_mark_inactive, self);
770
776
  #endif
771
777
  }
772
778
 
@@ -825,7 +831,7 @@ static VALUE _mysql_client_options(VALUE self, int opt, VALUE value) {
825
831
  const void *retval = NULL;
826
832
  unsigned int intval = 0;
827
833
  const char * charval = NULL;
828
- my_bool boolval;
834
+ bool boolval;
829
835
 
830
836
  GET_CLIENT(self);
831
837
 
@@ -262,8 +262,8 @@ static void rb_mysql_result_alloc_result_buffers(VALUE self, MYSQL_FIELD *fields
262
262
  if (wrapper->result_buffers != NULL) return;
263
263
 
264
264
  wrapper->result_buffers = xcalloc(wrapper->numberOfFields, sizeof(MYSQL_BIND));
265
- wrapper->is_null = xcalloc(wrapper->numberOfFields, sizeof(my_bool));
266
- wrapper->error = xcalloc(wrapper->numberOfFields, sizeof(my_bool));
265
+ wrapper->is_null = xcalloc(wrapper->numberOfFields, sizeof(bool));
266
+ wrapper->error = xcalloc(wrapper->numberOfFields, sizeof(bool));
267
267
  wrapper->length = xcalloc(wrapper->numberOfFields, sizeof(unsigned long));
268
268
 
269
269
  for (i = 0; i < wrapper->numberOfFields; i++) {
@@ -1,5 +1,6 @@
1
1
  #ifndef MYSQL2_RESULT_H
2
2
  #define MYSQL2_RESULT_H
3
+ #include <stdbool.h>
3
4
 
4
5
  void init_mysql2_result(void);
5
6
  VALUE rb_mysql_result_to_obj(VALUE client, VALUE encoding, VALUE options, MYSQL_RES *r, VALUE statement);
@@ -21,8 +22,8 @@ typedef struct {
21
22
  mysql_client_wrapper *client_wrapper;
22
23
  /* statement result bind buffers */
23
24
  MYSQL_BIND *result_buffers;
24
- my_bool *is_null;
25
- my_bool *error;
25
+ bool *is_null;
26
+ bool *error;
26
27
  unsigned long *length;
27
28
  } mysql2_result_wrapper;
28
29
 
@@ -124,7 +124,7 @@ VALUE rb_mysql_stmt_new(VALUE rb_client, VALUE sql) {
124
124
 
125
125
  // set STMT_ATTR_UPDATE_MAX_LENGTH attr
126
126
  {
127
- my_bool truth = 1;
127
+ bool truth = 1;
128
128
  if (mysql_stmt_attr_set(stmt_wrapper->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &truth)) {
129
129
  rb_raise(cMysql2Error, "Unable to initialize prepared statement: set STMT_ATTR_UPDATE_MAX_LENGTH");
130
130
  }
@@ -37,7 +37,7 @@ module Mysql2
37
37
  when :reconnect, :local_infile, :secure_auth, :automatic_close
38
38
  send(:"#{key}=", !!opts[key]) # rubocop:disable Style/DoubleNegation
39
39
  when :connect_timeout, :read_timeout, :write_timeout
40
- send(:"#{key}=", opts[key].to_i) unless opts[key].nil?
40
+ send(:"#{key}=", Integer(opts[key])) unless opts[key].nil?
41
41
  else
42
42
  send(:"#{key}=", opts[key])
43
43
  end
@@ -1,3 +1,3 @@
1
1
  module Mysql2
2
- VERSION = "0.4.5"
2
+ VERSION = "0.4.6"
3
3
  end
@@ -538,15 +538,6 @@ RSpec.describe Mysql2::Client do
538
538
  }.to raise_error(Mysql2::Error)
539
539
  end
540
540
 
541
- it 'should be impervious to connection-corrupting timeouts in #query' do
542
- pending('`Thread.handle_interrupt` is not defined') unless Thread.respond_to?(:handle_interrupt)
543
- # attempt to break the connection
544
- expect { Timeout.timeout(0.1) { @client.query('SELECT SLEEP(0.2)') } }.to raise_error(Timeout::Error)
545
-
546
- # expect the connection to not be broken
547
- expect { @client.query('SELECT 1') }.to_not raise_error
548
- end
549
-
550
541
  it 'should be impervious to connection-corrupting timeouts in #execute' do
551
542
  # the statement handle gets corrupted and will segfault the tests if interrupted,
552
543
  # so we can't even use pending on this test, really have to skip it on older Rubies.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysql2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Lopez
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-22 00:00:00.000000000 Z
12
+ date: 2017-05-04 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: