mysql2 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/mysql2/result.c CHANGED
@@ -4,7 +4,7 @@
4
4
  static rb_encoding *binaryEncoding;
5
5
  #endif
6
6
 
7
- #define MYSQL2_MAX_YEAR 2058
7
+ #define MYSQL2_MAX_YEAR 2038
8
8
 
9
9
  #ifdef NEGATIVE_TIME_T
10
10
  /* 1901-12-13 20:45:52 UTC : The oldest time in 32-bit signed time_t. */
@@ -22,7 +22,7 @@ static VALUE intern_encoding_from_charset;
22
22
  static ID intern_new, intern_utc, intern_local, intern_encoding_from_charset_code,
23
23
  intern_localtime, intern_local_offset, intern_civil, intern_new_offset;
24
24
  static VALUE sym_symbolize_keys, sym_as, sym_array, sym_database_timezone, sym_application_timezone,
25
- sym_local, sym_utc, sym_cast_booleans, sym_cache_rows;
25
+ sym_local, sym_utc, sym_cast_booleans, sym_cache_rows, sym_cast;
26
26
  static ID intern_merge;
27
27
 
28
28
  static void rb_mysql_result_mark(void * wrapper) {
@@ -100,7 +100,32 @@ static VALUE rb_mysql_result_fetch_field(VALUE self, unsigned int idx, short int
100
100
  return rb_field;
101
101
  }
102
102
 
103
- static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezone, int symbolizeKeys, int asArray, int castBool) {
103
+ #ifdef HAVE_RUBY_ENCODING_H
104
+ inline VALUE mysql2_set_field_string_encoding(VALUE val, MYSQL_FIELD field, rb_encoding *default_internal_enc, rb_encoding *conn_enc) {
105
+ // if binary flag is set, respect it's wishes
106
+ if (field.flags & BINARY_FLAG && field.charsetnr == 63) {
107
+ rb_enc_associate(val, binaryEncoding);
108
+ } else {
109
+ // lookup the encoding configured on this field
110
+ VALUE new_encoding = rb_funcall(cMysql2Client, intern_encoding_from_charset_code, 1, INT2NUM(field.charsetnr));
111
+ if (new_encoding != Qnil) {
112
+ // use the field encoding we were able to match
113
+ rb_encoding *enc = rb_to_encoding(new_encoding);
114
+ rb_enc_associate(val, enc);
115
+ } else {
116
+ // otherwise fall-back to the connection's encoding
117
+ rb_enc_associate(val, conn_enc);
118
+ }
119
+ if (default_internal_enc) {
120
+ val = rb_str_export_to_enc(val, default_internal_enc);
121
+ }
122
+ }
123
+ return val;
124
+ }
125
+ #endif
126
+
127
+
128
+ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezone, int symbolizeKeys, int asArray, int castBool, int cast) {
104
129
  VALUE rowVal;
105
130
  mysql2_result_wrapper * wrapper;
106
131
  MYSQL_ROW row;
@@ -141,7 +166,19 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
141
166
  VALUE field = rb_mysql_result_fetch_field(self, i, symbolizeKeys);
142
167
  if (row[i]) {
143
168
  VALUE val = Qnil;
144
- switch(fields[i].type) {
169
+ enum enum_field_types type = fields[i].type;
170
+
171
+ if(!cast) {
172
+ if (type == MYSQL_TYPE_NULL) {
173
+ val = Qnil;
174
+ } else {
175
+ val = rb_str_new(row[i], fieldLengths[i]);
176
+ #ifdef HAVE_RUBY_ENCODING_H
177
+ val = mysql2_set_field_string_encoding(val, fields[i], default_internal_enc, conn_enc);
178
+ #endif
179
+ }
180
+ } else {
181
+ switch(type) {
145
182
  case MYSQL_TYPE_NULL: // NULL-type field
146
183
  val = Qnil;
147
184
  break;
@@ -260,26 +297,10 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
260
297
  default:
261
298
  val = rb_str_new(row[i], fieldLengths[i]);
262
299
  #ifdef HAVE_RUBY_ENCODING_H
263
- // if binary flag is set, respect it's wishes
264
- if (fields[i].flags & BINARY_FLAG && fields[i].charsetnr == 63) {
265
- rb_enc_associate(val, binaryEncoding);
266
- } else {
267
- // lookup the encoding configured on this field
268
- VALUE new_encoding = rb_funcall(cMysql2Client, intern_encoding_from_charset_code, 1, INT2NUM(fields[i].charsetnr));
269
- if (new_encoding != Qnil) {
270
- // use the field encoding we were able to match
271
- rb_encoding *enc = rb_to_encoding(new_encoding);
272
- rb_enc_associate(val, enc);
273
- } else {
274
- // otherwise fall-back to the connection's encoding
275
- rb_enc_associate(val, conn_enc);
276
- }
277
- if (default_internal_enc) {
278
- val = rb_str_export_to_enc(val, default_internal_enc);
279
- }
280
- }
300
+ val = mysql2_set_field_string_encoding(val, fields[i], default_internal_enc, conn_enc);
281
301
  #endif
282
302
  break;
303
+ }
283
304
  }
284
305
  if (asArray) {
285
306
  rb_ary_push(rowVal, val);
@@ -329,7 +350,7 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
329
350
  ID db_timezone, app_timezone, dbTz, appTz;
330
351
  mysql2_result_wrapper * wrapper;
331
352
  unsigned long i;
332
- int symbolizeKeys = 0, asArray = 0, castBool = 0, cacheRows = 1;
353
+ int symbolizeKeys = 0, asArray = 0, castBool = 0, cacheRows = 1, cast = 1;
333
354
 
334
355
  GetMysql2Result(self, wrapper);
335
356
 
@@ -356,6 +377,10 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
356
377
  cacheRows = 0;
357
378
  }
358
379
 
380
+ if (rb_hash_aref(opts, sym_cast) == Qfalse) {
381
+ cast = 0;
382
+ }
383
+
359
384
  dbTz = rb_hash_aref(opts, sym_database_timezone);
360
385
  if (dbTz == sym_local) {
361
386
  db_timezone = intern_local;
@@ -400,7 +425,7 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
400
425
  if (cacheRows && i < rowsProcessed) {
401
426
  row = rb_ary_entry(wrapper->rows, i);
402
427
  } else {
403
- row = rb_mysql_result_fetch_row(self, db_timezone, app_timezone, symbolizeKeys, asArray, castBool);
428
+ row = rb_mysql_result_fetch_row(self, db_timezone, app_timezone, symbolizeKeys, asArray, castBool, cast);
404
429
  if (cacheRows) {
405
430
  rb_ary_store(wrapper->rows, i, row);
406
431
  }
@@ -473,6 +498,7 @@ void init_mysql2_result() {
473
498
  sym_database_timezone = ID2SYM(rb_intern("database_timezone"));
474
499
  sym_application_timezone = ID2SYM(rb_intern("application_timezone"));
475
500
  sym_cache_rows = ID2SYM(rb_intern("cache_rows"));
501
+ sym_cast = ID2SYM(rb_intern("cast"));
476
502
 
477
503
  opt_decimal_zero = rb_str_new2("0.0");
478
504
  rb_global_variable(&opt_decimal_zero); //never GC
@@ -38,59 +38,10 @@ module ActiveRecord
38
38
  end
39
39
 
40
40
  def has_default?
41
- return false if sql_type =~ /blob/i || type == :text #mysql forbids defaults on blob and text columns
41
+ return false if sql_type =~ /blob/i || type == :text # mysql forbids defaults on blob and text columns
42
42
  super
43
43
  end
44
44
 
45
- # Returns the Ruby class that corresponds to the abstract data type.
46
- def klass
47
- case type
48
- when :integer then Fixnum
49
- when :float then Float
50
- when :decimal then BigDecimal
51
- when :datetime then Time
52
- when :date then Date
53
- when :timestamp then Time
54
- when :time then Time
55
- when :text, :string then String
56
- when :binary then String
57
- when :boolean then Object
58
- end
59
- end
60
-
61
- def type_cast(value)
62
- return nil if value.nil?
63
- case type
64
- when :string then value
65
- when :text then value
66
- when :integer then value.to_i rescue value ? 1 : 0
67
- when :float then value.to_f # returns self if it's already a Float
68
- when :decimal then self.class.value_to_decimal(value)
69
- when :datetime, :timestamp then value.class == Time ? value : self.class.string_to_time(value)
70
- when :time then value.class == Time ? value : self.class.string_to_dummy_time(value)
71
- when :date then value.class == Date ? value : self.class.string_to_date(value)
72
- when :binary then value
73
- when :boolean then self.class.value_to_boolean(value)
74
- else value
75
- end
76
- end
77
-
78
- def type_cast_code(var_name)
79
- case type
80
- when :string then nil
81
- when :text then nil
82
- when :integer then "#{var_name}.to_i rescue #{var_name} ? 1 : 0"
83
- when :float then "#{var_name}.to_f"
84
- when :decimal then "#{self.class.name}.value_to_decimal(#{var_name})"
85
- when :datetime, :timestamp then "#{var_name}.class == Time ? #{var_name} : #{self.class.name}.string_to_time(#{var_name})"
86
- when :time then "#{var_name}.class == Time ? #{var_name} : #{self.class.name}.string_to_dummy_time(#{var_name})"
87
- when :date then "#{var_name}.class == Date ? #{var_name} : #{self.class.name}.string_to_date(#{var_name})"
88
- when :binary then nil
89
- when :boolean then "#{self.class.name}.value_to_boolean(#{var_name})"
90
- else nil
91
- end
92
- end
93
-
94
45
  private
95
46
  def simplified_type(field_type)
96
47
  return :boolean if Mysql2Adapter.emulate_booleans && field_type.downcase.index(BOOL)
@@ -611,7 +562,7 @@ module ActiveRecord
611
562
  end
612
563
 
613
564
  def configure_connection
614
- @connection.query_options.merge!(:as => :array)
565
+ @connection.query_options.merge!(:as => :array, :cast => false)
615
566
 
616
567
  # By default, MySQL 'where id is null' selects the last inserted id.
617
568
  # Turn this off. http://dev.rubyonrails.org/ticket/6778
@@ -67,6 +67,34 @@ module ActiveRecord
67
67
 
68
68
  @connections = []
69
69
  @checked_out = []
70
+ @automatic_reconnect = true
71
+ @tables = {}
72
+
73
+ @columns = Hash.new do |h, table_name|
74
+ h[table_name] = with_connection do |conn|
75
+
76
+ # Fetch a list of columns
77
+ conn.columns(table_name, "#{table_name} Columns").tap do |columns|
78
+
79
+ # set primary key information
80
+ columns.each do |column|
81
+ column.primary = column.name == primary_keys[table_name]
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ @columns_hash = Hash.new do |h, table_name|
88
+ h[table_name] = Hash[columns[table_name].map { |col|
89
+ [col.name, col]
90
+ }]
91
+ end
92
+
93
+ @primary_keys = Hash.new do |h, table_name|
94
+ h[table_name] = with_connection do |conn|
95
+ table_exists?(table_name) ? conn.primary_key(table_name) : 'id'
96
+ end
97
+ end
70
98
  end
71
99
 
72
100
  def clear_stale_cached_connections!
@@ -101,4 +129,4 @@ module ActiveRecord
101
129
  end
102
130
 
103
131
  end
104
- end
132
+ end
data/lib/mysql2.rb CHANGED
@@ -14,3 +14,8 @@ require 'mysql2/result'
14
14
  # A modern, simple and very fast Mysql library for Ruby - binding to libmysql
15
15
  module Mysql2
16
16
  end
17
+
18
+ if defined?(ActiveRecord::VERSION::STRING) && ActiveRecord::VERSION::STRING >= "3.1"
19
+ puts "WARNING: This version of mysql2 (#{Mysql2::VERSION}) isn't compatible with Rails 3.1 as the ActiveRecord adapter was pulled into Rails itself."
20
+ puts "WARNING: Please use the 0.3.x (or greater) releases if you plan on using it in Rails >= 3.1.x"
21
+ end
data/lib/mysql2/client.rb CHANGED
@@ -9,7 +9,8 @@ module Mysql2
9
9
  :database_timezone => :local, # timezone Mysql2 will assume datetime objects are stored in
10
10
  :application_timezone => nil, # timezone Mysql2 will convert to before handing the object back to the caller
11
11
  :cache_rows => true, # tells Mysql2 to use it's internal row cache for results
12
- :connect_flags => REMEMBER_OPTIONS | LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION
12
+ :connect_flags => REMEMBER_OPTIONS | LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION,
13
+ :cast => true
13
14
  }
14
15
 
15
16
  def initialize(opts = {})
@@ -1,3 +1,3 @@
1
1
  module Mysql2
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8"
3
3
  end
data/mysql2.gemspec CHANGED
@@ -7,9 +7,6 @@ Gem::Specification.new do |s|
7
7
  s.date = Time.now.utc.strftime("%Y-%m-%d")
8
8
  s.email = %q{seniorlopez@gmail.com}
9
9
  s.extensions = ["ext/mysql2/extconf.rb"]
10
- s.extra_rdoc_files = [
11
- "README.rdoc"
12
- ]
13
10
  s.files = `git ls-files`.split("\n")
14
11
  s.homepage = %q{http://github.com/brianmario/mysql2}
15
12
  s.rdoc_options = ["--charset=UTF-8"]
@@ -20,7 +17,7 @@ Gem::Specification.new do |s|
20
17
 
21
18
  # tests
22
19
  s.add_development_dependency 'eventmachine'
23
- s.add_development_dependency 'rake-compiler', "~> 0.7.1"
20
+ s.add_development_dependency 'rake-compiler', "~> 0.7.7"
24
21
  s.add_development_dependency 'rspec'
25
22
  # benchmarks
26
23
  s.add_development_dependency 'activerecord'
@@ -167,6 +167,45 @@ describe Mysql2::Client do
167
167
  end
168
168
  end
169
169
 
170
+ it "should respond to escape" do
171
+ Mysql2::Client.should respond_to(:escape)
172
+ end
173
+
174
+ context "escape" do
175
+ it "should return a new SQL-escape version of the passed string" do
176
+ Mysql2::Client.escape("abc'def\"ghi\0jkl%mno").should eql("abc\\'def\\\"ghi\\0jkl%mno")
177
+ end
178
+
179
+ it "should return the passed string if nothing was escaped" do
180
+ str = "plain"
181
+ Mysql2::Client.escape(str).object_id.should eql(str.object_id)
182
+ end
183
+
184
+ it "should not overflow the thread stack" do
185
+ lambda {
186
+ Thread.new { Mysql2::Client.escape("'" * 256 * 1024) }.join
187
+ }.should_not raise_error(SystemStackError)
188
+ end
189
+
190
+ it "should not overflow the process stack" do
191
+ lambda {
192
+ Thread.new { Mysql2::Client.escape("'" * 1024 * 1024 * 4) }.join
193
+ }.should_not raise_error(SystemStackError)
194
+ end
195
+
196
+ if RUBY_VERSION =~ /1.9/
197
+ it "should carry over the original string's encoding" do
198
+ str = "abc'def\"ghi\0jkl%mno"
199
+ escaped = Mysql2::Client.escape(str)
200
+ escaped.encoding.should eql(str.encoding)
201
+
202
+ str.encode!('us-ascii')
203
+ escaped = Mysql2::Client.escape(str)
204
+ escaped.encoding.should eql(str.encoding)
205
+ end
206
+ end
207
+ end
208
+
170
209
  it "should respond to #escape" do
171
210
  @client.should respond_to(:escape)
172
211
  end
@@ -79,6 +79,16 @@ describe Mysql2::Result do
79
79
  @test_result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
80
80
  end
81
81
 
82
+ it "should return nil values for NULL and strings for everything else when :cast is false" do
83
+ result = @client.query('SELECT null_test, tiny_int_test, bool_cast_test, int_test, date_test, enum_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast => false).first
84
+ result["null_test"].should be_nil
85
+ result["tiny_int_test"].should == "1"
86
+ result["bool_cast_test"].should == "1"
87
+ result["int_test"].should == "10"
88
+ result["date_test"].should == "2010-04-04"
89
+ result["enum_test"].should == "val1"
90
+ end
91
+
82
92
  it "should return nil for a NULL value" do
83
93
  @test_result['null_test'].class.should eql(NilClass)
84
94
  @test_result['null_test'].should eql(nil)
@@ -173,6 +183,11 @@ describe Mysql2::Result do
173
183
  r.first['test'].class.should eql(DateTime)
174
184
  end
175
185
 
186
+ it "should return DateTime when time > year 2038" do
187
+ r = @client.query("SELECT CAST('2039-01-01 01:01:01' AS DATETIME) as test")
188
+ r.first['test'].class.should eql(DateTime)
189
+ end
190
+
176
191
  it "should return Time for a TIMESTAMP value when within the supported range" do
177
192
  @test_result['timestamp_test'].class.should eql(Time)
178
193
  @test_result['timestamp_test'].strftime("%F %T").should eql('2010-04-04 11:44:00')
data/spec/spec_helper.rb CHANGED
@@ -45,6 +45,7 @@ RSpec.configure do |config|
45
45
  PRIMARY KEY (id)
46
46
  )
47
47
  ]
48
+ client.query "DELETE FROM mysql2_test;"
48
49
  client.query %[
49
50
  INSERT INTO mysql2_test (
50
51
  null_test, bit_test, tiny_int_test, bool_cast_test, small_int_test, medium_int_test, int_test, big_int_test,
data/tasks/compile.rake CHANGED
@@ -1,7 +1,7 @@
1
1
  require "rake/extensiontask"
2
2
 
3
- MYSQL_VERSION = "5.1.51"
4
- MYSQL_MIRROR = ENV['MYSQL_MIRROR'] || "http://mysql.he.net/"
3
+ CONNECTOR_VERSION = "6.0.2" #"mysql-connector-c-noinstall-6.0.2-win32.zip"
4
+ CONNECTOR_MIRROR = ENV['CONNECTOR_MIRROR'] || ENV['MYSQL_MIRROR'] || "http://mysql.he.net/"
5
5
 
6
6
  def gemspec
7
7
  @clean_gemspec ||= eval(File.read(File.expand_path('../../mysql2.gemspec', __FILE__)))
@@ -9,12 +9,12 @@ end
9
9
 
10
10
  Rake::ExtensionTask.new("mysql2", gemspec) do |ext|
11
11
  # reference where the vendored MySQL got extracted
12
- mysql_lib = File.expand_path(File.join(File.dirname(__FILE__), '..', 'vendor', "mysql-#{MYSQL_VERSION}-win32"))
12
+ connector_lib = File.expand_path(File.join(File.dirname(__FILE__), '..', 'vendor', "mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32"))
13
13
 
14
14
  # DRY options feed into compile or cross-compile process
15
15
  windows_options = [
16
- "--with-mysql-include=#{mysql_lib}/include",
17
- "--with-mysql-lib=#{mysql_lib}/lib/opt"
16
+ "--with-mysql-include=#{connector_lib}/include",
17
+ "--with-mysql-lib=#{connector_lib}/lib"
18
18
  ]
19
19
 
20
20
  # automatically add build options to avoid need of manual input
@@ -28,6 +28,24 @@ Rake::ExtensionTask.new("mysql2", gemspec) do |ext|
28
28
  # inject 1.8/1.9 pure-ruby entry point when cross compiling only
29
29
  ext.cross_compiling do |spec|
30
30
  spec.files << 'lib/mysql2/mysql2.rb'
31
+ spec.post_install_message = <<-POST_INSTALL_MESSAGE
32
+
33
+ ======================================================================================================
34
+
35
+ You've installed the binary version of #{spec.name}.
36
+ It was built using MySQL Connector/C version #{CONNECTOR_VERSION}.
37
+ It's recommended to use the exact same version to avoid potential issues.
38
+
39
+ At the time of building this gem, the necessary DLL files where available
40
+ in the following download:
41
+
42
+ http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32.zip/from/pick
43
+
44
+ And put lib\\libmysql.dll file in your Ruby bin directory, for example C:\\Ruby\\bin
45
+
46
+ ======================================================================================================
47
+
48
+ POST_INSTALL_MESSAGE
31
49
  end
32
50
  end
33
51
 
@@ -4,9 +4,8 @@ require 'rake/extensioncompiler'
4
4
  # download mysql library and headers
5
5
  directory "vendor"
6
6
 
7
- file "vendor/mysql-noinstall-#{MYSQL_VERSION}-win32.zip" => ['vendor'] do |t|
8
- base_version = MYSQL_VERSION.gsub(/\.[0-9]+$/, '')
9
- url = "http://dev.mysql.com/get/Downloads/MySQL-#{base_version}/#{File.basename(t.name)}/from/#{MYSQL_MIRROR}/"
7
+ file "vendor/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32.zip" => ["vendor"] do |t|
8
+ url = "http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32.zip/from/#{CONNECTOR_MIRROR}/"
10
9
  when_writing "downloading #{t.name}" do
11
10
  cd File.dirname(t.name) do
12
11
  sh "wget -c #{url} || curl -C - -O #{url}"
@@ -14,11 +13,11 @@ file "vendor/mysql-noinstall-#{MYSQL_VERSION}-win32.zip" => ['vendor'] do |t|
14
13
  end
15
14
  end
16
15
 
17
- file "vendor/mysql-#{MYSQL_VERSION}-win32/include/mysql.h" => ["vendor/mysql-noinstall-#{MYSQL_VERSION}-win32.zip"] do |t|
16
+ file "vendor/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32/include/mysql.h" => ["vendor/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32.zip"] do |t|
18
17
  full_file = File.expand_path(t.prerequisites.last)
19
18
  when_writing "creating #{t.name}" do
20
19
  cd "vendor" do
21
- sh "unzip #{full_file} mysql-#{MYSQL_VERSION}-win32/bin/** mysql-#{MYSQL_VERSION}-win32/include/** mysql-#{MYSQL_VERSION}-win32/lib/**"
20
+ sh "unzip #{full_file} mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32/bin/** mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32/include/** mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32/lib/**"
22
21
  end
23
22
  # update file timestamp to avoid Rake perform this extraction again.
24
23
  touch t.name
@@ -26,10 +25,10 @@ file "vendor/mysql-#{MYSQL_VERSION}-win32/include/mysql.h" => ["vendor/mysql-noi
26
25
  end
27
26
 
28
27
  # clobber expanded packages
29
- CLOBBER.include("vendor/mysql-#{MYSQL_VERSION}-win32")
28
+ CLOBBER.include("vendor/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32")
30
29
 
31
30
  # vendor:mysql
32
- task 'vendor:mysql' => ["vendor/mysql-#{MYSQL_VERSION}-win32/include/mysql.h"]
31
+ task 'vendor:mysql' => ["vendor/mysql-connector-c-noinstall-#{CONNECTOR_VERSION}-win32/include/mysql.h"]
33
32
 
34
33
  # hook into cross compilation vendored mysql dependency
35
34
  if RUBY_PLATFORM =~ /mingw|mswin/ then