mysql2 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ # 0.2.2 (August 19th, 2010)
4
+ * Change how AR adapter would send initial commands upon connecting
5
+ ** we can make multiple session variable assignments in a single query
6
+ * fix signal handling when waiting on queries
7
+ * retry connect if interrupted by signals
8
+
3
9
  ## 0.2.1 (August 16th, 2010)
4
10
  * bring mysql2 ActiveRecord adapter back into gem
5
11
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -1,5 +1,6 @@
1
1
  #include <mysql2_ext.h>
2
2
  #include <client.h>
3
+ #include <errno.h>
3
4
 
4
5
  VALUE cMysql2Client;
5
6
  extern VALUE mMysql2, cMysql2Error;
@@ -96,10 +97,12 @@ static VALUE nogvl_connect(void *ptr) {
96
97
  struct nogvl_connect_args *args = ptr;
97
98
  MYSQL *client;
98
99
 
99
- client = mysql_real_connect(args->mysql, args->host,
100
- args->user, args->passwd,
101
- args->db, args->port, args->unix_socket,
102
- args->client_flag);
100
+ do {
101
+ client = mysql_real_connect(args->mysql, args->host,
102
+ args->user, args->passwd,
103
+ args->db, args->port, args->unix_socket,
104
+ args->client_flag);
105
+ } while (! client && errno == EINTR && (errno = 0) == 0);
103
106
 
104
107
  return client ? Qtrue : Qfalse;
105
108
  }
@@ -257,7 +260,6 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
257
260
  int fd, retval;
258
261
  int async = 0;
259
262
  VALUE opts, defaults;
260
- int(*selector)(int, fd_set *, fd_set *, fd_set *, struct timeval *) = NULL;
261
263
  GET_CLIENT(self)
262
264
 
263
265
  REQUIRE_OPEN_DB(client);
@@ -299,12 +301,11 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
299
301
  // the below code is largely from do_mysql
300
302
  // http://github.com/datamapper/do
301
303
  fd = client->net.fd;
302
- selector = rb_thread_alone() ? *select : *rb_thread_select;
303
304
  for(;;) {
304
305
  FD_ZERO(&fdset);
305
306
  FD_SET(fd, &fdset);
306
307
 
307
- retval = selector(fd + 1, &fdset, NULL, NULL, NULL);
308
+ retval = rb_thread_select(fd + 1, &fdset, NULL, NULL, NULL);
308
309
 
309
310
  if (retval < 0) {
310
311
  rb_sys_fail(0);
@@ -606,12 +606,14 @@ module ActiveRecord
606
606
 
607
607
  def configure_connection
608
608
  @connection.query_options.merge!(:as => :array)
609
- encoding = @config[:encoding]
610
- execute("SET NAMES '#{encoding}'", :skip_logging) if encoding
611
609
 
612
610
  # By default, MySQL 'where id is null' selects the last inserted id.
613
611
  # Turn this off. http://dev.rubyonrails.org/ticket/6778
614
- execute("SET SQL_AUTO_IS_NULL=0", :skip_logging)
612
+ variable_assignments = ['SQL_AUTO_IS_NULL=0']
613
+ encoding = @config[:encoding]
614
+ variable_assignments << "NAMES '#{encoding}'" if encoding
615
+
616
+ execute("SET #{variable_assignments.join(', ')}", :skip_logging)
615
617
  end
616
618
 
617
619
  # Returns an array of record hashes with the column names as keys and
@@ -11,5 +11,5 @@ require 'mysql2/result'
11
11
  #
12
12
  # A modern, simple and very fast Mysql library for Ruby - binding to libmysql
13
13
  module Mysql2
14
- VERSION = "0.2.1"
14
+ VERSION = "0.2.2"
15
15
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mysql2}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian Lopez"]
12
- s.date = %q{2010-08-16}
12
+ s.date = %q{2010-08-19}
13
13
  s.email = %q{seniorlopez@gmail.com}
14
14
  s.extensions = ["ext/mysql2/extconf.rb"]
15
15
  s.extra_rdoc_files = [
@@ -78,6 +78,33 @@ describe Mysql2::Client do
78
78
  @client.query("SELECT 1")
79
79
  }.should raise_error(Mysql2::Error)
80
80
  end
81
+
82
+ # XXX this test is not deterministic (because Unix signal handling is not)
83
+ # and may fail on a loaded system
84
+ it "should run signal handlers while waiting for a response" do
85
+ mark = {}
86
+ trap(:USR1) { mark[:USR1] = Time.now }
87
+ begin
88
+ mark[:START] = Time.now
89
+ pid = fork do
90
+ sleep 1 # wait for client "SELECT sleep(2)" query to start
91
+ Process.kill(:USR1, Process.ppid)
92
+ sleep # wait for explicit kill to prevent GC disconnect
93
+ end
94
+ @client.query("SELECT sleep(2)")
95
+ mark[:END] = Time.now
96
+ mark.include?(:USR1).should be_true
97
+ (mark[:USR1] - mark[:START]).should >= 1
98
+ (mark[:USR1] - mark[:START]).should < 1.1
99
+ (mark[:END] - mark[:USR1]).should > 0.9
100
+ (mark[:END] - mark[:START]).should >= 2
101
+ (mark[:END] - mark[:START]).should < 2.1
102
+ Process.kill(:TERM, pid)
103
+ Process.waitpid2(pid)
104
+ ensure
105
+ trap(:USR1, 'DEFAULT')
106
+ end
107
+ end if RUBY_PLATFORM !~ /mingw|mswin/
81
108
  end
82
109
 
83
110
  it "should respond to #escape" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysql2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian Lopez
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-16 00:00:00 -07:00
18
+ date: 2010-08-19 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21