mysql2 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Changelog
2
2
 
3
- # 0.2.2 (August 19th, 2010)
3
+ ## 0.2.3 (August 20th, 2010)
4
+ * connection flags can now be passed to the constructor via the :flags key
5
+ * switch AR adapter connection over to use FOUND_ROWS option
6
+ * patch to ensure we use DateTime objects in place of Time for timestamps that are out of the supported range on 32bit platforms < 1.9.2
7
+
8
+ ## 0.2.2 (August 19th, 2010)
4
9
  * Change how AR adapter would send initial commands upon connecting
5
10
  ** we can make multiple session variable assignments in a single query
6
11
  * fix signal handling when waiting on queries
data/Rakefile CHANGED
@@ -32,6 +32,8 @@ end
32
32
  Spec::Rake::SpecTask.new('spec') do |t|
33
33
  t.spec_files = FileList['spec/']
34
34
  t.spec_opts << '--options' << 'spec/spec.opts'
35
+ t.verbose = true
36
+ t.warning = true
35
37
  end
36
38
 
37
39
  task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
data/ext/mysql2/client.c CHANGED
@@ -150,7 +150,7 @@ static VALUE allocate(VALUE klass) {
150
150
  return obj;
151
151
  }
152
152
 
153
- static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE port, VALUE database, VALUE socket) {
153
+ static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE port, VALUE database, VALUE socket, VALUE flags) {
154
154
  struct nogvl_connect_args args;
155
155
  GET_CLIENT(self)
156
156
 
@@ -161,7 +161,7 @@ static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE po
161
161
  args.passwd = NIL_P(pass) ? NULL : StringValuePtr(pass);
162
162
  args.db = NIL_P(database) ? NULL : StringValuePtr(database);
163
163
  args.mysql = client;
164
- args.client_flag = 0;
164
+ args.client_flag = NUM2INT(flags);
165
165
 
166
166
  if (rb_thread_blocking_region(nogvl_connect, &args, RUBY_UBF_IO, 0) == Qfalse) {
167
167
  // unable to connect
@@ -523,7 +523,7 @@ void init_mysql2_client() {
523
523
  rb_define_private_method(cMysql2Client, "charset_name=", set_charset_name, 1);
524
524
  rb_define_private_method(cMysql2Client, "ssl_set", set_ssl_options, 5);
525
525
  rb_define_private_method(cMysql2Client, "init_connection", init_connection, 0);
526
- rb_define_private_method(cMysql2Client, "connect", rb_connect, 6);
526
+ rb_define_private_method(cMysql2Client, "connect", rb_connect, 7);
527
527
 
528
528
  intern_encoding_from_charset = rb_intern("encoding_from_charset");
529
529
 
@@ -538,4 +538,109 @@ void init_mysql2_client() {
538
538
  intern_error_number_eql = rb_intern("error_number=");
539
539
  intern_sql_state_eql = rb_intern("sql_state=");
540
540
 
541
- }
541
+ #ifdef CLIENT_LONG_PASSWORD
542
+ rb_const_set(cMysql2Client, rb_intern("LONG_PASSWORD"),
543
+ INT2NUM(CLIENT_LONG_PASSWORD));
544
+ #endif
545
+
546
+ #ifdef CLIENT_FOUND_ROWS
547
+ rb_const_set(cMysql2Client, rb_intern("FOUND_ROWS"),
548
+ INT2NUM(CLIENT_FOUND_ROWS));
549
+ #endif
550
+
551
+ #ifdef CLIENT_LONG_FLAG
552
+ rb_const_set(cMysql2Client, rb_intern("LONG_FLAG"),
553
+ INT2NUM(CLIENT_LONG_FLAG));
554
+ #endif
555
+
556
+ #ifdef CLIENT_CONNECT_WITH_DB
557
+ rb_const_set(cMysql2Client, rb_intern("CONNECT_WITH_DB"),
558
+ INT2NUM(CLIENT_CONNECT_WITH_DB));
559
+ #endif
560
+
561
+ #ifdef CLIENT_NO_SCHEMA
562
+ rb_const_set(cMysql2Client, rb_intern("NO_SCHEMA"),
563
+ INT2NUM(CLIENT_NO_SCHEMA));
564
+ #endif
565
+
566
+ #ifdef CLIENT_COMPRESS
567
+ rb_const_set(cMysql2Client, rb_intern("COMPRESS"), INT2NUM(CLIENT_COMPRESS));
568
+ #endif
569
+
570
+ #ifdef CLIENT_ODBC
571
+ rb_const_set(cMysql2Client, rb_intern("ODBC"), INT2NUM(CLIENT_ODBC));
572
+ #endif
573
+
574
+ #ifdef CLIENT_LOCAL_FILES
575
+ rb_const_set(cMysql2Client, rb_intern("LOCAL_FILES"),
576
+ INT2NUM(CLIENT_LOCAL_FILES));
577
+ #endif
578
+
579
+ #ifdef CLIENT_IGNORE_SPACE
580
+ rb_const_set(cMysql2Client, rb_intern("IGNORE_SPACE"),
581
+ INT2NUM(CLIENT_IGNORE_SPACE));
582
+ #endif
583
+
584
+ #ifdef CLIENT_PROTOCOL_41
585
+ rb_const_set(cMysql2Client, rb_intern("PROTOCOL_41"),
586
+ INT2NUM(CLIENT_PROTOCOL_41));
587
+ #endif
588
+
589
+ #ifdef CLIENT_INTERACTIVE
590
+ rb_const_set(cMysql2Client, rb_intern("INTERACTIVE"),
591
+ INT2NUM(CLIENT_INTERACTIVE));
592
+ #endif
593
+
594
+ #ifdef CLIENT_SSL
595
+ rb_const_set(cMysql2Client, rb_intern("SSL"), INT2NUM(CLIENT_SSL));
596
+ #endif
597
+
598
+ #ifdef CLIENT_IGNORE_SIGPIPE
599
+ rb_const_set(cMysql2Client, rb_intern("IGNORE_SIGPIPE"),
600
+ INT2NUM(CLIENT_IGNORE_SIGPIPE));
601
+ #endif
602
+
603
+ #ifdef CLIENT_TRANSACTIONS
604
+ rb_const_set(cMysql2Client, rb_intern("TRANSACTIONS"),
605
+ INT2NUM(CLIENT_TRANSACTIONS));
606
+ #endif
607
+
608
+ #ifdef CLIENT_RESERVED
609
+ rb_const_set(cMysql2Client, rb_intern("RESERVED"), INT2NUM(CLIENT_RESERVED));
610
+ #endif
611
+
612
+ #ifdef CLIENT_SECURE_CONNECTION
613
+ rb_const_set(cMysql2Client, rb_intern("SECURE_CONNECTION"),
614
+ INT2NUM(CLIENT_SECURE_CONNECTION));
615
+ #endif
616
+
617
+ #ifdef CLIENT_MULTI_STATEMENTS
618
+ rb_const_set(cMysql2Client, rb_intern("MULTI_STATEMENTS"),
619
+ INT2NUM(CLIENT_MULTI_STATEMENTS));
620
+ #endif
621
+
622
+ #ifdef CLIENT_PS_MULTI_RESULTS
623
+ rb_const_set(cMysql2Client, rb_intern("PS_MULTI_RESULTS"),
624
+ INT2NUM(CLIENT_PS_MULTI_RESULTS));
625
+ #endif
626
+
627
+ #ifdef CLIENT_SSL_VERIFY_SERVER_CERT
628
+ rb_const_set(cMysql2Client, rb_intern("SSL_VERIFY_SERVER_CERT"),
629
+ INT2NUM(CLIENT_SSL_VERIFY_SERVER_CERT));
630
+ #endif
631
+
632
+ #ifdef CLIENT_REMEMBER_OPTIONS
633
+ rb_const_set(cMysql2Client, rb_intern("REMEMBER_OPTIONS"),
634
+ INT2NUM(CLIENT_REMEMBER_OPTIONS));
635
+ #endif
636
+
637
+ #ifdef CLIENT_ALL_FLAGS
638
+ rb_const_set(cMysql2Client, rb_intern("ALL_FLAGS"),
639
+ INT2NUM(CLIENT_ALL_FLAGS));
640
+ #endif
641
+
642
+ #ifdef CLIENT_BASIC_FLAGS
643
+ rb_const_set(cMysql2Client, rb_intern("BASIC_FLAGS"),
644
+ INT2NUM(CLIENT_BASIC_FLAGS));
645
+ #endif
646
+ }
data/ext/mysql2/result.c CHANGED
@@ -6,11 +6,11 @@ rb_encoding *binaryEncoding;
6
6
 
7
7
  VALUE cMysql2Result;
8
8
  VALUE cBigDecimal, cDate, cDateTime;
9
- VALUE opt_decimal_zero, opt_float_zero, opt_time_year, opt_time_month;
9
+ VALUE opt_decimal_zero, opt_float_zero, opt_time_year, opt_time_month, opt_utc_offset;
10
10
  extern VALUE mMysql2, cMysql2Client, cMysql2Error;
11
11
  static VALUE intern_encoding_from_charset;
12
12
  static ID intern_new, intern_utc, intern_local, intern_encoding_from_charset_code,
13
- intern_localtime;
13
+ intern_localtime, intern_local_offset, intern_civil, intern_new_offset;
14
14
  static ID sym_symbolize_keys, sym_as, sym_array, sym_database_timezone, sym_application_timezone,
15
15
  sym_local, sym_utc, sym_cast_booleans;
16
16
  static ID intern_merge;
@@ -127,7 +127,7 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
127
127
  for (i = 0; i < wrapper->numberOfFields; i++) {
128
128
  VALUE field = rb_mysql_result_fetch_field(self, i, symbolizeKeys);
129
129
  if (row[i]) {
130
- VALUE val;
130
+ VALUE val = Qnil;
131
131
  switch(fields[i].type) {
132
132
  case MYSQL_TYPE_NULL: // NULL-type field
133
133
  val = Qnil;
@@ -190,12 +190,28 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
190
190
  rb_raise(cMysql2Error, "Invalid date: %s", row[i]);
191
191
  val = Qnil;
192
192
  } else {
193
- val = rb_funcall(rb_cTime, db_timezone, 6, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec));
194
- if (!NIL_P(app_timezone)) {
195
- if (app_timezone == intern_local) {
196
- val = rb_funcall(val, intern_localtime, 0);
197
- } else { // utc
198
- val = rb_funcall(val, intern_utc, 0);
193
+ if (year < 1902 || year+month+day > 2058) { // use DateTime instead
194
+ VALUE offset = INT2NUM(0);
195
+ if (db_timezone == intern_local) {
196
+ offset = rb_funcall(cMysql2Client, intern_local_offset, 0);
197
+ }
198
+ val = rb_funcall(cDateTime, intern_civil, 7, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec), offset);
199
+ if (!NIL_P(app_timezone)) {
200
+ if (app_timezone == intern_local) {
201
+ offset = rb_funcall(cMysql2Client, intern_local_offset, 0);
202
+ val = rb_funcall(val, intern_new_offset, 1, offset);
203
+ } else { // utc
204
+ val = rb_funcall(val, intern_new_offset, 1, opt_utc_offset);
205
+ }
206
+ }
207
+ } else {
208
+ val = rb_funcall(rb_cTime, db_timezone, 6, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec));
209
+ if (!NIL_P(app_timezone)) {
210
+ if (app_timezone == intern_local) {
211
+ val = rb_funcall(val, intern_localtime, 0);
212
+ } else { // utc
213
+ val = rb_funcall(val, intern_utc, 0);
214
+ }
199
215
  }
200
216
  }
201
217
  }
@@ -420,11 +436,14 @@ void init_mysql2_result() {
420
436
  intern_encoding_from_charset = rb_intern("encoding_from_charset");
421
437
  intern_encoding_from_charset_code = rb_intern("encoding_from_charset_code");
422
438
 
423
- intern_new = rb_intern("new");
424
- intern_utc = rb_intern("utc");
425
- intern_local = rb_intern("local");
426
- intern_merge = rb_intern("merge");
427
- intern_localtime = rb_intern("localtime");
439
+ intern_new = rb_intern("new");
440
+ intern_utc = rb_intern("utc");
441
+ intern_local = rb_intern("local");
442
+ intern_merge = rb_intern("merge");
443
+ intern_localtime = rb_intern("localtime");
444
+ intern_local_offset = rb_intern("local_offset");
445
+ intern_civil = rb_intern("civil");
446
+ intern_new_offset = rb_intern("new_offset");
428
447
 
429
448
  sym_symbolize_keys = ID2SYM(rb_intern("symbolize_keys"));
430
449
  sym_as = ID2SYM(rb_intern("as"));
@@ -441,6 +460,7 @@ void init_mysql2_result() {
441
460
  opt_float_zero = rb_float_new((double)0);
442
461
  opt_time_year = INT2NUM(2000);
443
462
  opt_time_month = INT2NUM(1);
463
+ opt_utc_offset = INT2NUM(0);
444
464
 
445
465
  #ifdef HAVE_RUBY_ENCODING_H
446
466
  binaryEncoding = rb_enc_find("binary");
@@ -6,6 +6,11 @@ module ActiveRecord
6
6
  class Base
7
7
  def self.mysql2_connection(config)
8
8
  config[:username] = 'root' if config[:username].nil?
9
+
10
+ if Mysql2::Client.const_defined? :FOUND_ROWS
11
+ config[:flags] = Mysql2::Client::FOUND_ROWS
12
+ end
13
+
9
14
  client = Mysql2::Client.new(config.symbolize_keys)
10
15
  options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
11
16
  ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
data/lib/mysql2.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  require 'date'
3
3
  require 'bigdecimal'
4
+ require 'rational' unless RUBY_VERSION >= '1.9.2'
4
5
 
5
6
  require 'mysql2/error'
6
7
  require 'mysql2/mysql2'
@@ -11,5 +12,5 @@ require 'mysql2/result'
11
12
  #
12
13
  # A modern, simple and very fast Mysql library for Ruby - binding to libmysql
13
14
  module Mysql2
14
- VERSION = "0.2.2"
15
+ VERSION = "0.2.3"
15
16
  end
data/lib/mysql2/client.rb CHANGED
@@ -30,8 +30,9 @@ module Mysql2
30
30
  port = opts[:port] || 3306
31
31
  database = opts[:database]
32
32
  socket = opts[:socket]
33
+ flags = opts[:flags] || 0
33
34
 
34
- connect user, pass, host, port, database, socket
35
+ connect user, pass, host, port, database, socket, flags
35
36
  end
36
37
 
37
38
  def self.default_query_options
@@ -223,5 +224,10 @@ module Mysql2
223
224
  end
224
225
  end
225
226
  end
227
+
228
+ private
229
+ def self.local_offset
230
+ ::Time.local(2010).utc_offset.to_r / 86400
231
+ end
226
232
  end
227
233
  end
data/mysql2.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mysql2}
8
- s.version = "0.2.2"
8
+ s.version = "0.2.3"
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-19}
12
+ s.date = %q{2010-08-20}
13
13
  s.email = %q{seniorlopez@gmail.com}
14
14
  s.extensions = ["ext/mysql2/extconf.rb"]
15
15
  s.extra_rdoc_files = [
@@ -14,6 +14,30 @@ describe Mysql2::Client do
14
14
  end
15
15
  end
16
16
 
17
+ it "should accept connect flags and pass them to #connect" do
18
+ klient = Class.new(Mysql2::Client) do
19
+ attr_reader :connect_args
20
+ def connect *args
21
+ @connect_args ||= []
22
+ @connect_args << args
23
+ end
24
+ end
25
+ client = klient.new :flags => Mysql2::Client::FOUND_ROWS
26
+ client.connect_args.last.last.should == Mysql2::Client::FOUND_ROWS
27
+ end
28
+
29
+ it "should default flags to 0" do
30
+ klient = Class.new(Mysql2::Client) do
31
+ attr_reader :connect_args
32
+ def connect *args
33
+ @connect_args ||= []
34
+ @connect_args << args
35
+ end
36
+ end
37
+ client = klient.new
38
+ client.connect_args.last.last.should == 0
39
+ end
40
+
17
41
  it "should have a global default_query_options hash" do
18
42
  Mysql2::Client.should respond_to(:default_query_options)
19
43
  end
@@ -143,12 +143,17 @@ describe Mysql2::Result do
143
143
  @test_result['double_test'].should eql(10.3)
144
144
  end
145
145
 
146
- it "should return Time for a DATETIME value" do
146
+ it "should return Time for a DATETIME value when within the supported range" do
147
147
  @test_result['date_time_test'].class.should eql(Time)
148
148
  @test_result['date_time_test'].strftime("%F %T").should eql('2010-04-04 11:44:00')
149
149
  end
150
150
 
151
- it "should return Time for a TIMESTAMP value" do
151
+ it "should return DateTime for a DATETIME value when outside the supported range" do
152
+ r = @client.query("SELECT CAST('1901-1-1 01:01:01' AS DATETIME) as test")
153
+ r.first['test'].class.should eql(DateTime)
154
+ end
155
+
156
+ it "should return Time for a TIMESTAMP value when within the supported range" do
152
157
  @test_result['timestamp_test'].class.should eql(Time)
153
158
  @test_result['timestamp_test'].strftime("%F %T").should eql('2010-04-04 11:44:00')
154
159
  end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
4
2
 
3
+ require 'rubygems'
5
4
  require 'mysql2'
6
5
  require 'timeout'
7
6
 
@@ -64,4 +63,4 @@ Spec::Runner.configure do |config|
64
63
  )
65
64
  ]
66
65
  end
67
- end
66
+ end
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: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 2
10
- version: 0.2.2
9
+ - 3
10
+ version: 0.2.3
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-19 00:00:00 -07:00
18
+ date: 2010-08-20 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21