activerecord-jdbc-adapter 1.3.1 → 1.3.2

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: 124d430b6ebfe8dea7139529cba9765cbbf4bbec
4
- data.tar.gz: 8284f14f06a740097c25cdd949acda28a540cb67
3
+ metadata.gz: a0441e4d8245ad0891db71d08c1d484304c319ab
4
+ data.tar.gz: a60418477bfbd7ad65c2a1517a6c53dec0158cf1
5
5
  SHA512:
6
- metadata.gz: 7c8a1b98c72e0f34833754c73776b1b97f2518bead5f39da18ef7ae1f37ef19f1ec9571d7056bcb7d327cb492c0b909736b791ad20e361e392552398df481ee5
7
- data.tar.gz: 7d6f465fcc7cf7cf38a560c73dbf75c9ce39337a4bb8fea3a4452811d8df2b4ec6f665a7544734a6cae60e9241a818e05f764cf03a5f8f4698fb575a92b7128f
6
+ metadata.gz: b0e278d10109cfb86a7eb626dda7ab13f2bd789eb64b9cf71b9f9a8b7d41411a0ec67a9811aa12b0a0fb78490e910292b10c542785045d6346b70ac5f3f2bece
7
+ data.tar.gz: 8418e4e1f59bc327a899acd31639bb4f4f607f87fc693add1e056cc230f6a44bce189fc657d01be6d3e4f953f5e8826ac40c1f5d69721e32c7ad488bab9a7456
data/History.md CHANGED
@@ -1,3 +1,23 @@
1
+ ## 1.3.2 (10/11/13)
2
+
3
+ - when "pop-ing" current savepoint name - consider open transaction count (#477)
4
+ - [postgres] we should return "raw" hstore values on AR < 4.0 by default
5
+ (regression caused by fixing #454 for AR >= 4.0)
6
+ - [postgres] needs ColumnDefinition.array? method used by SchemaCreation (#474)
7
+ - [mysql] backported bulk change table support from Rails (fixes #469)
8
+ - support MySQL's failover host configurations (multiple hosts specified)
9
+ - set JDBC specific config values as properties instead of URL options
10
+ - SQLite3's version object should return a string on `to_s`
11
+ - [sqlite3] support :timeout option as busy_timeout (similar to Rails)
12
+ - [sqlite3] mkdir for sqlite database (path) - just like AR 4.0 now does
13
+ - [postgres] handle :connect_timeout, :sslmode, :keepalives & :krbsrvname
14
+ - [postgres] support :hostaddr, :user and :dbname options just like Rails does
15
+ - fix rake task name **db:structure:load** - missing db: prefix (#465)
16
+ - Prevent rake from throwing an exception when task w/o comment is redefined
17
+
18
+ Code Contributors (in no particular order): Prathamesh Sonpatki, Stefan Wrobel,
19
+ Micah Jaffe, Rajan Agaskar
20
+
1
21
  ## 1.3.1 (09/17/13)
2
22
 
3
23
  - helper gems should contain all files from lib/* (#463)
data/README.md CHANGED
@@ -13,9 +13,9 @@ JRubies) thus Java >= **1.6** is mandatory.
13
13
  #### AR-JDBC **1.3.x** is a recommended update for all **1.2.x** users.
14
14
 
15
15
  Our latest major version **1.3.x** represents a few months of refactoring and
16
- updates covering (not just) new *ActiveRecord* features. It tries to stay compatible
17
- with 1.2.9 as much as possible but please be aware that it's not always possible
18
- (mostly for the best), please read our [migration guide][8] for details.
16
+ updates covering (not just) new/old *ActiveRecord* features. It tries to stay
17
+ compatible with 1.2.9 as much as possible but please be aware that it's not always
18
+ possible(mostly for the best), please read our [migration guide][8] for details.
19
19
 
20
20
  ## Databases
21
21
 
@@ -46,30 +46,26 @@ adapters are available:
46
46
  - HSQLDB (`activerecord-jdbchsqldb-adapter`)
47
47
  - H2 (`activerecord-jdbch2-adapter`)
48
48
  - MSSQL (`activerecord-jdbcmssql-adapter`) - uses the OSS jTDS driver by default
49
- which might have issues with the latest SQLServer (does not support SQL Azure)
49
+ which might have issues with the latest SQLServer (but should work using the
50
+ Microsoft JDBC Driver for SQL Server - we recommend using 4.0)
50
51
 
51
- 2a. For Rails 3, if you're generating a new application, use the
52
- following command to generate your application:
52
+ 2a. If you're generating a new Rails application, use the following command:
53
53
 
54
54
  jruby -S rails new sweetapp
55
55
 
56
56
  2b. Otherwise, you might need to perform some extra configuration steps
57
57
  to prepare your Rails application for JDBC.
58
58
 
59
- If you're using Rails 3, you'll need to modify your *Gemfile* to use the
60
- *activerecord-jdbc-adapter* gem under JRuby. Change your *Gemfile* to look
61
- like the following (using MySQL as an example):
59
+ You'll need to modify your *Gemfile* to use the *activerecord-jdbc-adapter* gem
60
+ (or one of the helper gems) under JRuby. Change your *Gemfile* to look something
61
+ like the following:
62
62
 
63
63
  ```ruby
64
- gem 'mysql', platform: :ruby
65
-
66
- platforms :jruby do
67
- gem 'jruby-openssl'
68
- gem 'activerecord-jdbcmysql-adapter'
69
- end
64
+ gem 'mysql2', platform: :ruby
65
+ gem 'activerecord-jdbcmysql-adapter', platform: :jruby
70
66
  ```
71
67
 
72
- If you're using Rails 2.3:
68
+ If you're (stuck) using Rails 2.3, you might need to:
73
69
 
74
70
  jruby script/generate jdbc
75
71
 
@@ -77,11 +73,10 @@ If you're using Rails 2.3:
77
73
 
78
74
  ```yml
79
75
  development:
80
- adapter: mysql
76
+ adapter: mysql2 # or mysql
77
+ database: blog_development
81
78
  username: blog
82
79
  password: 1234
83
- host: localhost
84
- database: blog_development
85
80
  ```
86
81
 
87
82
  **Legacy Configuration:** If you use one of the *activerecord-jdbcxxx-adapter*
@@ -95,22 +90,22 @@ class and URL (do not forget to put the driver .jar(s) on the class-path) e.g.:
95
90
  development:
96
91
  adapter: jdbc
97
92
  username: blog
98
- password:
93
+ password: 1234
99
94
  driver: com.mysql.jdbc.Driver
100
95
  url: jdbc:mysql://localhost:3306/blog_development
101
96
  ```
102
97
 
103
98
  For JNDI data sources, you may simply specify the JNDI location as follows (the
104
- correct adapter type will be automatically detected):
99
+ correct database type will be automatically detected):
105
100
 
106
101
  ```yml
107
102
  production:
108
- adapter: jdbc
109
- jndi: jdbc/PostgreDB
103
+ adapter: jndi # jdbc
104
+ jndi: jdbc/PostgreDS
110
105
  ```
111
106
 
112
107
  JDBC driver specific properties might be set if you use an URL to specify the DB
113
- or using the *properties:* syntax (available since AR-JDBC **1.2.6**):
108
+ or preferably using the *properties:* syntax:
114
109
 
115
110
  ```yml
116
111
  production:
@@ -128,7 +123,6 @@ If you're really old school you might want to use AR-JDBC with a DB2 on z/OS:
128
123
  ```yml
129
124
  development:
130
125
  adapter: jdbc
131
- encoding: unicode
132
126
  url: jdbc:db2j:net://mightyzoshost:446/RAILS_DBT1
133
127
  driver: com.ibm.db2.jcc.DB2Driver
134
128
  schema: DB2XB12
@@ -136,23 +130,19 @@ development:
136
130
  tablespace: TSDE911
137
131
  lob_tablespaces:
138
132
  first_table: TSDE912
139
- username: scott
140
- password: lion
141
- ```
142
-
143
- If your SGBD isn't automatically discovered you can force a dialect as well:
144
-
145
- ```yml
146
- development:
147
- [...]
148
- dialect: as400 # For example
133
+ username: business
134
+ password: machines
135
+ encoding: unicode
136
+ # you can force a (DB2) dialect using:
137
+ #dialect: as400
149
138
  ```
150
139
 
151
140
  More information on (configuring) AR-JDBC might be found on our [wiki][5].
152
141
 
153
142
  ### Standalone with ActiveRecord
154
143
 
155
- Once the setup is made (see below) you can establish a JDBC connection like this (e.g. for `activerecord-jdbcderby-adapter`):
144
+ Once the setup is made (see below) you can establish a JDBC connection like this
145
+ (e.g. for `activerecord-jdbcderby-adapter`):
156
146
 
157
147
  ```ruby
158
148
  ActiveRecord::Base.establish_connection(
@@ -161,7 +151,7 @@ ActiveRecord::Base.establish_connection(
161
151
  )
162
152
  ```
163
153
 
164
- or using (requires that you manually put the driver jar on the classpath):
154
+ or using (requires that you manually put the driver jar on the class-path):
165
155
 
166
156
  ```ruby
167
157
  ActiveRecord::Base.establish_connection(
@@ -173,11 +163,11 @@ ActiveRecord::Base.establish_connection(
173
163
 
174
164
  #### Using Bundler
175
165
 
176
- Proceed as with Rails; specify the ActiveRecord gem in your Bundle along with
177
- the chosen (JDBC) adapters this time sample *Gemfile* for MySQL:
166
+ Proceed as with Rails; specify `ActiveRecord` in your Bundle along with the
167
+ chosen JDBC adapter(s), this time sample *Gemfile* for MySQL:
178
168
 
179
169
  ```ruby
180
- gem 'activerecord', '~> 3.2.13'
170
+ gem 'activerecord', '~> 3.2.14'
181
171
  gem 'activerecord-jdbcmysql-adapter', :platform => :jruby
182
172
  ```
183
173
 
@@ -3,7 +3,6 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "thread_safe", :require=>nil
6
- gem "jruby-openssl", :platform=>:jruby
7
6
  gem "rake", :require=>nil
8
7
  gem "appraisal", :require=>nil
9
8
  gem "test-unit", "2.5.4", :group=>:test
@@ -18,9 +18,6 @@ GEM
18
18
  atomic (1.1.10-java)
19
19
  bcrypt-ruby (3.0.1)
20
20
  bcrypt-ruby (3.0.1-java)
21
- bouncy-castle-java (1.5.0147)
22
- jruby-openssl (0.8.8)
23
- bouncy-castle-java (>= 1.5.0147)
24
21
  metaclass (0.0.1)
25
22
  mocha (0.13.3)
26
23
  metaclass (~> 0.0.1)
@@ -54,7 +51,6 @@ DEPENDENCIES
54
51
  activerecord (~> 2.3.18)
55
52
  appraisal
56
53
  bcrypt-ruby (~> 3.0.0)
57
- jruby-openssl
58
54
  mocha (~> 0.13.1)
59
55
  mysql2
60
56
  pg
@@ -3,7 +3,6 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "thread_safe", :require=>nil
6
- gem "jruby-openssl", :platform=>:jruby
7
6
  gem "rake", :require=>nil
8
7
  gem "appraisal", :require=>nil
9
8
  gem "test-unit", "2.5.4", :group=>:test
@@ -19,11 +19,8 @@ GEM
19
19
  atomic (1.1.10-java)
20
20
  bcrypt-ruby (3.0.1)
21
21
  bcrypt-ruby (3.0.1-java)
22
- bouncy-castle-java (1.5.0147)
23
22
  builder (2.1.2)
24
23
  i18n (0.5.0)
25
- jruby-openssl (0.8.8)
26
- bouncy-castle-java (>= 1.5.0147)
27
24
  metaclass (0.0.1)
28
25
  mocha (0.13.3)
29
26
  metaclass (~> 0.0.1)
@@ -53,7 +50,6 @@ DEPENDENCIES
53
50
  activerecord (~> 3.0.20)
54
51
  appraisal
55
52
  bcrypt-ruby (~> 3.0.0)
56
- jruby-openssl
57
53
  mocha (~> 0.13.1)
58
54
  mysql2
59
55
  pg
@@ -3,7 +3,6 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "thread_safe", :require=>nil
6
- gem "jruby-openssl", :platform=>:jruby
7
6
  gem "rake", :require=>nil
8
7
  gem "appraisal", :require=>nil
9
8
  gem "test-unit", "2.5.4", :group=>:test
@@ -20,11 +20,8 @@ GEM
20
20
  atomic (1.1.10-java)
21
21
  bcrypt-ruby (3.0.1)
22
22
  bcrypt-ruby (3.0.1-java)
23
- bouncy-castle-java (1.5.0147)
24
23
  builder (3.0.4)
25
24
  i18n (0.6.4)
26
- jruby-openssl (0.8.8)
27
- bouncy-castle-java (>= 1.5.0147)
28
25
  metaclass (0.0.1)
29
26
  mocha (0.13.3)
30
27
  metaclass (~> 0.0.1)
@@ -51,7 +48,6 @@ DEPENDENCIES
51
48
  activerecord (~> 3.1.12)
52
49
  appraisal
53
50
  bcrypt-ruby (~> 3.0.0)
54
- jruby-openssl
55
51
  mocha (~> 0.13.1)
56
52
  mysql2
57
53
  pg
@@ -3,7 +3,6 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "thread_safe", :require=>nil
6
- gem "jruby-openssl", :platform=>:jruby
7
6
  gem "rake", :require=>nil
8
7
  gem "appraisal", :require=>nil
9
8
  gem "test-unit", "2.5.4", :group=>:test
@@ -20,11 +20,8 @@ GEM
20
20
  atomic (1.1.10-java)
21
21
  bcrypt-ruby (3.0.1)
22
22
  bcrypt-ruby (3.0.1-java)
23
- bouncy-castle-java (1.5.0147)
24
23
  builder (3.0.4)
25
24
  i18n (0.6.4)
26
- jruby-openssl (0.8.8)
27
- bouncy-castle-java (>= 1.5.0147)
28
25
  metaclass (0.0.1)
29
26
  mocha (0.13.3)
30
27
  metaclass (~> 0.0.1)
@@ -54,7 +51,6 @@ DEPENDENCIES
54
51
  activerecord (~> 3.2.13)
55
52
  appraisal
56
53
  bcrypt-ruby (~> 3.0.0)
57
- jruby-openssl
58
54
  mocha (~> 0.13.1)
59
55
  mysql2
60
56
  pg
@@ -3,7 +3,6 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "thread_safe", :require=>nil
6
- gem "jruby-openssl", :platform=>:jruby
7
6
  gem "rake", :require=>nil
8
7
  gem "appraisal", :require=>nil
9
8
  gem "test-unit", "2.5.4", :group=>:test
@@ -24,11 +24,8 @@ GEM
24
24
  atomic (1.1.10-java)
25
25
  bcrypt-ruby (3.0.1)
26
26
  bcrypt-ruby (3.0.1-java)
27
- bouncy-castle-java (1.5.0147)
28
27
  builder (3.1.4)
29
28
  i18n (0.6.4)
30
- jruby-openssl (0.8.8)
31
- bouncy-castle-java (>= 1.5.0147)
32
29
  metaclass (0.0.1)
33
30
  minitest (4.7.5)
34
31
  mocha (0.13.3)
@@ -54,7 +51,6 @@ DEPENDENCIES
54
51
  activerecord (~> 4.0.0)
55
52
  appraisal
56
53
  bcrypt-ruby (~> 3.0.0)
57
- jruby-openssl
58
54
  mocha (~> 0.13.1)
59
55
  mysql2
60
56
  pg
@@ -4,7 +4,6 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "activerecord"
6
6
  gem "thread_safe", :require=>nil
7
- gem "jruby-openssl", :platform=>:jruby
8
7
  gem "rake", :require=>nil
9
8
  gem "appraisal", :require=>nil
10
9
  gem "test-unit", "2.5.4", :group=>:test
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: git://github.com/rails/rails.git
3
- revision: 0b3a078a24819fae8b9df0b0f63a264cece70a7c
3
+ revision: 0941a109fda0a96403fc9b51249ced7b7ca63447
4
4
  branch: master
5
5
  specs:
6
6
  actionmailer (4.1.0.beta)
@@ -55,13 +55,10 @@ GEM
55
55
  atomic (1.1.13-java)
56
56
  bcrypt-ruby (3.0.1)
57
57
  bcrypt-ruby (3.0.1-java)
58
- bouncy-castle-java (1.5.0147)
59
58
  builder (3.1.4)
60
59
  erubis (2.7.0)
61
60
  hike (1.2.3)
62
61
  i18n (0.6.5)
63
- jruby-openssl (0.8.8)
64
- bouncy-castle-java (>= 1.5.0147)
65
62
  json (1.8.0)
66
63
  json (1.8.0-java)
67
64
  mail (2.5.4)
@@ -116,7 +113,6 @@ DEPENDENCIES
116
113
  activerecord
117
114
  appraisal
118
115
  bcrypt-ruby (~> 3.0.0)
119
- jruby-openssl
120
116
  mocha (~> 0.13.1)
121
117
  mysql2
122
118
  pg
@@ -402,8 +402,15 @@ module ActiveRecord
402
402
  # @since 1.3.0
403
403
  # @override
404
404
  def current_savepoint_name(create = nil)
405
- return "active_record_#{open_transactions}" if create
406
- @connection.marked_savepoint_names.last || "active_record_#{open_transactions}"
405
+ open_tx = open_transactions
406
+ return "active_record_#{open_tx}" if create
407
+
408
+ sp_names = @connection.marked_savepoint_names
409
+ unless sp_names.empty?
410
+ sp_names[ -(sp_names.size - open_tx + 1) ]
411
+ else
412
+ "active_record_#{open_tx}"
413
+ end
407
414
  end
408
415
 
409
416
  # Executes a SQL query in the context of this connection using the bind
Binary file
@@ -23,12 +23,23 @@ module ArJdbc
23
23
 
24
24
  # protected
25
25
 
26
+ # See "Delimited Identifiers": http://msdn.microsoft.com/en-us/library/ms176027.aspx
27
+ def remove_identifier_delimiters(keyword)
28
+ if /\A(\[|")(.*)/m.match(keyword)
29
+ delim, rest = $1, $2
30
+ if delim == '[' && rest =~ /]\z/ || delim == '"' && rest =~ /"\z/
31
+ return rest.chop
32
+ end
33
+ end
34
+ keyword
35
+ end
36
+
26
37
  def unquote_table_name(table_name)
27
- unquote_column_name(table_name)
38
+ remove_identifier_delimiters(table_name)
28
39
  end
29
40
 
30
41
  def unquote_column_name(column_name)
31
- column_name.to_s.tr('[]', '')
42
+ remove_identifier_delimiters(column_name)
32
43
  end
33
44
 
34
45
  def unquote_string(string)
@@ -36,16 +47,16 @@ module ArJdbc
36
47
  end
37
48
 
38
49
  def unqualify_table_name(table_name)
39
- table_name.to_s.split('.').last.tr('[]', '')
50
+ remove_identifier_delimiters(table_name.to_s.split('.').last)
40
51
  end
41
52
 
42
53
  def unqualify_table_schema(table_name)
43
- table_name.to_s.split('.')[-2].gsub(/[\[\]]/, '') rescue nil
54
+ remove_identifier_delimiters(table_name.to_s.split('.')[-2]) rescue nil
44
55
  end
45
56
 
46
57
  def unqualify_db_name(table_name)
47
58
  table_names = table_name.to_s.split('.')
48
- table_names.length == 3 ? table_names.first.tr('[]', '') : nil
59
+ table_names.length == 3 ? remove_identifier_delimiters(table_names.first) : nil
49
60
  end
50
61
 
51
62
  end
@@ -3,11 +3,13 @@ ArJdbc.load_java_part :MySQL
3
3
  require 'bigdecimal'
4
4
  require 'active_record/connection_adapters/abstract/schema_definitions'
5
5
  require 'arjdbc/mysql/column'
6
+ require 'arjdbc/mysql/bulk_change_table'
6
7
  require 'arjdbc/mysql/explain_support'
7
8
  require 'arjdbc/mysql/schema_creation' # AR 4.x
8
9
 
9
10
  module ArJdbc
10
11
  module MySQL
12
+ include BulkChangeTable if const_defined? :BulkChangeTable
11
13
 
12
14
  # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
13
15
  def self.jdbc_connection_class
@@ -35,8 +37,8 @@ module ArJdbc
35
37
 
36
38
  # Increase timeout so the server doesn't disconnect us.
37
39
  wait_timeout = config[:wait_timeout]
38
- wait_timeout = 2147483 unless wait_timeout.is_a?(Fixnum)
39
- variables[:wait_timeout] = wait_timeout
40
+ wait_timeout = self.class.type_cast_config_to_integer(wait_timeout)
41
+ variables[:wait_timeout] = wait_timeout.is_a?(Fixnum) ? wait_timeout : 2147483
40
42
 
41
43
  # Make MySQL reject illegal values rather than truncating or blanking them, see
42
44
  # http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_strict_all_tables
@@ -65,7 +67,9 @@ module ArJdbc
65
67
  end
66
68
 
67
69
  def strict_mode? # strict_mode is default since AR 4.0
68
- config.key?(:strict) ? config[:strict] : ::ActiveRecord::VERSION::MAJOR > 3
70
+ config.key?(:strict) ?
71
+ self.class.type_cast_config_to_boolean(config[:strict]) :
72
+ ::ActiveRecord::VERSION::MAJOR > 3
69
73
  end
70
74
 
71
75
  # @private
@@ -177,11 +181,6 @@ module ArJdbc
177
181
  true
178
182
  end
179
183
 
180
- # @override
181
- def supports_bulk_alter?
182
- true
183
- end
184
-
185
184
  # @override
186
185
  def supports_index_sort_order?
187
186
  # Technically MySQL allows to create indexes with the sort order syntax
@@ -418,7 +417,7 @@ module ArJdbc
418
417
  add_column_options!(change_column_sql, options)
419
418
  add_column_position!(change_column_sql, options)
420
419
  execute(change_column_sql)
421
- end unless const_defined? :SchemaCreation
420
+ end
422
421
 
423
422
  # @override
424
423
  def rename_column(table_name, column_name, new_column_name)
@@ -605,8 +604,6 @@ module ActiveRecord
605
604
  class Column < JdbcColumn
606
605
  include ::ArJdbc::MySQL::Column
607
606
 
608
- attr_reader :collation, :strict, :extra
609
-
610
607
  def initialize(name, default, sql_type = nil, null = true, collation = nil, strict = false, extra = "")
611
608
  if Hash === name
612
609
  super # first arg: config
@@ -0,0 +1,107 @@
1
+ module ArJdbc
2
+ module MySQL
3
+ module BulkChangeTable
4
+
5
+ # @override
6
+ def supports_bulk_alter?
7
+ true
8
+ end
9
+
10
+ def bulk_change_table(table_name, operations)
11
+ sqls = operations.map do |command, args|
12
+ table, arguments = args.shift, args
13
+ method = :"#{command}_sql"
14
+
15
+ if respond_to?(method, true)
16
+ send(method, table, *arguments)
17
+ else
18
+ raise "Unknown method called : #{method}(#{arguments.inspect})"
19
+ end
20
+ end
21
+ sqls.flatten!
22
+
23
+ execute("ALTER TABLE #{quote_table_name(table_name)} #{sqls.join(", ")}")
24
+ end
25
+
26
+ protected
27
+
28
+ def add_column_sql(table_name, column_name, type, options = {})
29
+ add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
30
+ add_column_options!(add_column_sql, options)
31
+ add_column_position!(add_column_sql, options)
32
+ add_column_sql
33
+ end
34
+
35
+ def change_column_sql(table_name, column_name, type, options = {})
36
+ column = column_for(table_name, column_name)
37
+
38
+ unless options_include_default?(options)
39
+ options[:default] = column.default
40
+ end
41
+
42
+ unless options.has_key?(:null)
43
+ options[:null] = column.null
44
+ end
45
+
46
+ change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
47
+ add_column_options!(change_column_sql, options)
48
+ add_column_position!(change_column_sql, options)
49
+ change_column_sql
50
+ end
51
+
52
+ def rename_column_sql(table_name, column_name, new_column_name)
53
+ options = {}
54
+
55
+ if column = columns(table_name).find { |c| c.name == column_name.to_s }
56
+ options[:default] = column.default
57
+ options[:null] = column.null
58
+ options[:auto_increment] = (column.extra == "auto_increment")
59
+ else
60
+ raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
61
+ end
62
+
63
+ current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'", 'SCHEMA')["Type"]
64
+ rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
65
+ add_column_options!(rename_column_sql, options)
66
+ rename_column_sql
67
+ end
68
+
69
+ def remove_column_sql(table_name, column_name, type = nil, options = {})
70
+ "DROP #{quote_column_name(column_name)}"
71
+ end
72
+
73
+ def remove_columns_sql(table_name, *column_names)
74
+ column_names.map {|column_name| remove_column_sql(table_name, column_name) }
75
+ end
76
+
77
+ def add_index_sql(table_name, column_name, options = {})
78
+ index_name, index_type, index_columns = add_index_options(table_name, column_name, options)
79
+ "ADD #{index_type} INDEX #{index_name} (#{index_columns})"
80
+ end
81
+
82
+ def remove_index_sql(table_name, options = {})
83
+ index_name = index_name_for_remove(table_name, options)
84
+ "DROP INDEX #{index_name}"
85
+ end
86
+
87
+ def add_timestamps_sql(table_name)
88
+ [add_column_sql(table_name, :created_at, :datetime), add_column_sql(table_name, :updated_at, :datetime)]
89
+ end
90
+
91
+ def remove_timestamps_sql(table_name)
92
+ [remove_column_sql(table_name, :updated_at), remove_column_sql(table_name, :created_at)]
93
+ end
94
+
95
+ private
96
+
97
+ def add_column_position!(sql, options)
98
+ if options[:first]
99
+ sql << " FIRST"
100
+ elsif options[:after]
101
+ sql << " AFTER #{quote_column_name(options[:after])}"
102
+ end
103
+ end
104
+
105
+ end
106
+ end
107
+ end
@@ -10,6 +10,8 @@ module ArJdbc
10
10
  # @see ActiveRecord::ConnectionAdapters::JdbcColumn
11
11
  module Column
12
12
 
13
+ attr_reader :collation, :strict, :extra
14
+
13
15
  def extract_default(default)
14
16
  if sql_type =~ /blob/i || type == :text
15
17
  if default.blank?
@@ -7,17 +7,26 @@ ArJdbc::ConnectionMethods.module_eval do
7
7
  end
8
8
 
9
9
  config[:username] = 'root' unless config.key?(:username)
10
- config[:port] ||= 3306
11
- config[:url] ||= "jdbc:mysql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
10
+ # jdbc:mysql://[host][,failoverhost...][:port]/[database]
11
+ # - if the host name is not specified, it defaults to 127.0.0.1
12
+ # - if the port is not specified, it defaults to 3306
13
+ # - alternate fail-over syntax: [host:port],[host:port]/[database]
14
+ unless config[:url]
15
+ host = config[:host]; host = host.join(',') if host.respond_to?(:join)
16
+ url = "jdbc:mysql://#{host}"
17
+ url << ":#{config[:port]}" if config[:port]
18
+ url << "/#{config[:database]}"
19
+ config[:url] = url
20
+ end
12
21
  config[:driver] ||= defined?(::Jdbc::MySQL.driver_name) ? ::Jdbc::MySQL.driver_name : 'com.mysql.jdbc.Driver'
13
22
  config[:adapter_spec] ||= ::ArJdbc::MySQL
14
23
  config[:adapter_class] = ActiveRecord::ConnectionAdapters::MysqlAdapter unless config.key?(:adapter_class)
15
24
 
16
- options = (config[:options] ||= {})
17
- options['zeroDateTimeBehavior'] ||= 'convertToNull'
18
- options['jdbcCompliantTruncation'] ||= 'false'
19
- options['useUnicode'] ||= 'true'
20
- options['characterEncoding'] = config[:encoding] || 'utf8'
25
+ properties = ( config[:properties] ||= {} )
26
+ properties['zeroDateTimeBehavior'] ||= 'convertToNull'
27
+ properties['jdbcCompliantTruncation'] ||= 'false'
28
+ properties['useUnicode'] ||= 'true'
29
+ properties['characterEncoding'] = config[:encoding] || 'utf8'
21
30
 
22
31
  jdbc_connection(config)
23
32
  end
@@ -1,4 +1,4 @@
1
- module ::ArJdbc
1
+ module ArJdbc
2
2
  module MySQL
3
3
  module ExplainSupport
4
4
  def supports_explain?
@@ -1257,6 +1257,7 @@ module ActiveRecord::ConnectionAdapters
1257
1257
 
1258
1258
  class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition
1259
1259
  attr_accessor :array
1260
+ def array?; !!@array; end
1260
1261
  end
1261
1262
 
1262
1263
  module ColumnMethods
@@ -1385,5 +1386,9 @@ module ActiveRecord::ConnectionAdapters
1385
1386
  ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
1386
1387
  end
1387
1388
 
1389
+ if ActiveRecord::VERSION::MAJOR < 4 # Rails 3.x compatibility
1390
+ PostgreSQLJdbcConnection.raw_hstore_type = true if PostgreSQLJdbcConnection.raw_hstore_type? == nil
1391
+ end
1392
+
1388
1393
  end
1389
1394
  end
@@ -6,11 +6,31 @@ ArJdbc::ConnectionMethods.module_eval do
6
6
  rescue LoadError # assuming driver.jar is on the class-path
7
7
  end
8
8
 
9
- config[:host] ||= "localhost"
10
- config[:port] ||= 5432
11
- config[:username] ||= Java::JavaLang::System.get_property("user.name")
12
- config[:url] ||= "jdbc:postgresql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
13
- config[:url] << config[:pg_params] if config[:pg_params]
9
+ host = config[:host] ||= ( config[:hostaddr] || 'localhost' )
10
+ port = config[:port] ||= 5432
11
+ database = config[:database] || config[:dbname]
12
+
13
+ config[:url] ||= "jdbc:postgresql://#{host}:#{port}/#{database}"
14
+ config[:url] << config[:pg_params] if config[:pg_params] # should go away
15
+
16
+ config[:username] ||= config[:user] || ENV_JAVA['user.name']
17
+ properties = ( config[:properties] ||= {} )
18
+ # PG :connect_timeout - maximum time to wait for connection to succeed
19
+ if connect_timeout = config[:connect_timeout]
20
+ properties['socketTimeout'] ||= connect_timeout
21
+ # NOTE: maybe set options['loginTimeout'] as well?
22
+ end
23
+ sslmode = config.key?(:sslmode) ? config[:sslmode] : config[:requiressl]
24
+ unless sslmode.nil? # PG :sslmode - disable|allow|prefer|require
25
+ # JRuby/JVM needs to be started with :
26
+ # -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=...
27
+ # or a non-validating connection might be used (for testing) :
28
+ # :sslfactory = 'org.postgresql.ssl.NonValidatingFactory'
29
+ properties['ssl'] ||= 'true' if sslmode == true || sslmode.to_s == 'require'
30
+ end
31
+ properties['tcpKeepAlive'] ||= config[:keepalives] if config.key?(:keepalives)
32
+ properties['kerberosServerName'] ||= config[:krbsrvname] if config[:krbsrvname]
33
+
14
34
  config[:driver] ||= defined?(::Jdbc::Postgres.driver_name) ? ::Jdbc::Postgres.driver_name : 'org.postgresql.Driver'
15
35
  config[:adapter_spec] ||= ::ArJdbc::PostgreSQL
16
36
  config[:adapter_class] = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter unless config.key?(:adapter_class)
@@ -210,7 +210,7 @@ module ArJdbc
210
210
  # @override
211
211
  def quote(value, column = nil)
212
212
  return value if sql_literal?(value)
213
-
213
+
214
214
  if value.kind_of?(String)
215
215
  column_type = column && column.type
216
216
  if column_type == :binary && column.class.respond_to?(:string_to_binary)
@@ -497,7 +497,7 @@ module ArJdbc
497
497
  end
498
498
 
499
499
  def to_s
500
- @version
500
+ @version.join('.')
501
501
  end
502
502
 
503
503
  end
@@ -7,27 +7,31 @@ ArJdbc::ConnectionMethods.module_eval do
7
7
  end
8
8
 
9
9
  parse_sqlite3_config!(config)
10
- database = config[:database]
11
- database = '' if database == ':memory:'
12
- config[:url] ||= "jdbc:sqlite:#{database}"
10
+ database = config[:database] # NOTE: "jdbc:sqlite::memory:" syntax is supported
11
+ config[:url] ||= "jdbc:sqlite:#{database == ':memory:' ? '' : database}"
13
12
  config[:driver] ||= defined?(::Jdbc::SQLite3.driver_name) ? ::Jdbc::SQLite3.driver_name : 'org.sqlite.JDBC'
14
13
  config[:adapter_spec] ||= ::ArJdbc::SQLite3
15
14
  config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter unless config.key?(:adapter_class)
16
15
  config[:connection_alive_sql] ||= 'SELECT 1'
17
-
16
+
17
+ options = ( config[:properties] ||= {} )
18
+ # NOTE: configuring from JDBC properties not supported on 3.7.2 :
19
+ options['busy_timeout'] ||= config[:timeout] if config.key?(:timeout)
20
+
18
21
  jdbc_connection(config)
19
22
  end
20
23
  alias_method :jdbcsqlite3_connection, :sqlite3_connection
21
24
 
22
25
  private
23
-
26
+
24
27
  def parse_sqlite3_config!(config)
25
- config[:database] ||= config[:dbfile]
26
- # Allow database path relative to RAILS_ROOT :
27
- if config[:database] != ':memory:' && defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
28
+ database = ( config[:database] ||= config[:dbfile] ) # allow Rails relative path :
29
+ if database != ':memory:' && defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
28
30
  rails_root = defined?(Rails.root) ? Rails.root : RAILS_ROOT
29
- config[:database] = File.expand_path(config[:database], rails_root.to_s)
31
+ config[:database] = File.expand_path(database, rails_root.to_s)
32
+ dirname = File.dirname(config[:database])
33
+ Dir.mkdir(dirname) unless File.directory?(dirname)
30
34
  end
31
35
  end
32
-
36
+
33
37
  end
data/lib/arjdbc/tasks.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  if defined?(Rake.application) && Rake.application
2
- skip = ENV["SKIP_AR_JDBC_RAKE_REDEFINES"] # jruby -J-Darjdc.tasks.skip=true -S rake ...
3
- if ! Java::JavaLang::Boolean.getBoolean('arjdbc.tasks.skip') || ! ( skip && skip != 'false' )
2
+ skip = ENV["SKIP_AR_JDBC_RAKE_REDEFINES"] # jruby -J-Darjdbc.tasks.skip=true -S rake ...
3
+ if !(Java::JavaLang::Boolean.getBoolean('arjdbc.tasks.skip') || ( skip && skip != 'false' ))
4
4
  databases_rake = File.expand_path('tasks/databases.rake', File.dirname(__FILE__))
5
5
  if Rake.application.lookup("db:create")
6
6
  load databases_rake # load the override tasks now
@@ -10,4 +10,4 @@ if defined?(Rake.application) && Rake.application
10
10
  end
11
11
  else
12
12
  warn "ArJdbc: could not load rake tasks - rake not loaded ..."
13
- end
13
+ end
@@ -27,7 +27,7 @@ Rake::DSL.module_eval do
27
27
  end
28
28
 
29
29
  new_task = task(*args, &block)
30
- new_task.comment = old_comment # if old_comment
30
+ new_task.comment = old_comment if old_comment
31
31
  new_task.actions.concat(old_actions) if old_actions
32
32
  new_task.prerequisites.concat(old_prereqs) if old_prereqs
33
33
  new_task
@@ -9,9 +9,9 @@ end
9
9
  module ArJdbc
10
10
  module Tasks
11
11
  class << self
12
-
12
+
13
13
  # API similar to ActiveRecord::Tasks::DatabaseTasks on AR 4.0
14
-
14
+
15
15
  def create(config)
16
16
  tasks_instance(config).create
17
17
  end
@@ -23,7 +23,7 @@ module ArJdbc
23
23
  def purge(config)
24
24
  tasks_instance(config).purge
25
25
  end
26
-
26
+
27
27
  def charset(config)
28
28
  tasks_instance(config).charset
29
29
  end
@@ -39,18 +39,18 @@ module ArJdbc
39
39
  def structure_load(config, filename)
40
40
  tasks_instance(config).structure_load(filename)
41
41
  end
42
-
42
+
43
43
  end
44
44
  end
45
45
  end
46
46
 
47
47
  namespace :db do
48
-
48
+
49
49
  class << self
50
50
  alias_method :_rails_create_database, :create_database
51
51
  alias_method :_rails_drop_database, :drop_database
52
52
  end
53
-
53
+
54
54
  def create_database(config)
55
55
  case config['adapter']
56
56
  when /mysql|postgresql|sqlite/
@@ -68,7 +68,7 @@ namespace :db do
68
68
  ArJdbc::Tasks.drop(config)
69
69
  end
70
70
  end
71
-
71
+
72
72
  redefine_task :charset do # available on 2.3
73
73
  ArJdbc::Tasks.charset ActiveRecord::Base.configurations[rails_env]
74
74
  end
@@ -76,25 +76,25 @@ namespace :db do
76
76
  redefine_task :collation do # available on 2.3
77
77
  ArJdbc::Tasks.collation ActiveRecord::Base.configurations[rails_env]
78
78
  end
79
-
79
+
80
80
  namespace :structure do
81
-
81
+
82
82
  redefine_task :dump do
83
83
  config = ActiveRecord::Base.configurations[rails_env] # current_config
84
84
  filename = structure_sql
85
-
85
+
86
86
  case config['adapter']
87
87
  when /mysql/
88
88
  ActiveRecord::Base.establish_connection(config)
89
89
  File.open(filename, 'w:utf-8') { |f| f << ActiveRecord::Base.connection.structure_dump }
90
90
  when /postgresql/
91
91
  ActiveRecord::Base.establish_connection(config)
92
-
92
+
93
93
  ENV['PGHOST'] = config['host'] if config['host']
94
94
  ENV['PGPORT'] = config['port'].to_s if config['port']
95
95
  ENV['PGPASSWORD'] = config['password'].to_s if config['password']
96
96
  ENV['PGUSER'] = config['username'].to_s if config['username']
97
-
97
+
98
98
  require 'shellwords'
99
99
  search_path = config['schema_search_path']
100
100
  unless search_path.blank?
@@ -102,7 +102,7 @@ namespace :db do
102
102
  end
103
103
  `pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}`
104
104
  raise 'Error dumping database' if $?.exitstatus == 1
105
-
105
+
106
106
  File.open(filename, 'a') { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" }
107
107
  when /sqlite/
108
108
  dbfile = config['database']
@@ -120,7 +120,7 @@ namespace :db do
120
120
  redefine_task :load do
121
121
  config = ActiveRecord::Base.configurations[rails_env] # current_config
122
122
  filename = structure_sql
123
-
123
+
124
124
  case config['adapter']
125
125
  when /mysql/
126
126
  ActiveRecord::Base.establish_connection(config)
@@ -142,7 +142,7 @@ namespace :db do
142
142
  ArJdbc::Tasks.structure_load(config, filename)
143
143
  end
144
144
  end
145
-
145
+
146
146
  def structure_sql
147
147
  ENV['DB_STRUCTURE'] ||= begin
148
148
  root = defined?(Rails.root) ? Rails.root : ( RAILS_ROOT rescue nil )
@@ -153,21 +153,21 @@ namespace :db do
153
153
  end
154
154
  end
155
155
  end
156
-
156
+
157
157
  end
158
-
158
+
159
159
  namespace :test do
160
-
160
+
161
161
  # desc "Recreate the test database from an existent structure.sql file"
162
162
  redefine_task :load_structure => 'db:test:purge' do # not on 2.3
163
163
  begin
164
164
  current_config(:config => ActiveRecord::Base.configurations['test'])
165
- Rake::Task["structure:load"].invoke
165
+ Rake::Task["db:structure:load"].invoke
166
166
  ensure
167
167
  current_config(:config => nil)
168
168
  end
169
169
  end
170
-
170
+
171
171
  # desc "Recreate the test database from a fresh structure.sql file"
172
172
  redefine_task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
173
173
  # same as on 3.2 - but this task gets changed on 2.3 by depending on :load_structure
@@ -197,7 +197,7 @@ namespace :db do
197
197
  end
198
198
  # only does (:purge => :environment) on AR < 3.2
199
199
  task :purge => :load_config if Rake::Task.task_defined?(:load_config)
200
-
200
+
201
201
  end
202
-
202
+
203
203
  end
@@ -1,5 +1,5 @@
1
1
  module ArJdbc
2
- VERSION = "1.3.1"
2
+ VERSION = "1.3.2"
3
3
  # @deprecated
4
4
  module Version
5
5
  # @private 1.2.x compatibility
data/rakelib/02-test.rake CHANGED
@@ -105,6 +105,15 @@ test_task_for 'JNDI', :desc => 'Run tests against a JNDI connection (uses Derby)
105
105
  test_task.libs << 'jdbc-derby/lib'
106
106
  end
107
107
 
108
+ test_task_for :MySQL, :name => 'test_jdbc_mysql',
109
+ :prereqs => 'db:mysql', :database_name => 'MySQL (using adapter: jdbc)' do |test_task|
110
+ test_task.ruby_opts << '-rdb/jdbc_mysql' # replaces require 'db/mysql'
111
+ end
112
+ test_task_for :PostgreSQL, :name => 'test_jdbc_postgresql', :driver => 'postgres',
113
+ :prereqs => 'db:postgresql', :database_name => 'PostgreSQL (using adapter: jdbc)' do |test_task|
114
+ test_task.ruby_opts << '-rdb/jdbc_postgres' # replaces require 'db/postgres'
115
+ end
116
+
108
117
  # TODO Sybase testing is currently broken, please fix it if you're on Sybase :
109
118
  #test_task_for :Sybase, :desc => "Run tests against Sybase (using jTDS driver)"
110
119
  #task :test_sybase_jtds => :test_sybase # alias
@@ -29,6 +29,7 @@ import arjdbc.jdbc.RubyJdbcConnection;
29
29
  import arjdbc.jdbc.Callable;
30
30
 
31
31
  import java.lang.reflect.Field;
32
+ import java.lang.reflect.Proxy;
32
33
  import java.sql.Connection;
33
34
  import java.sql.PreparedStatement;
34
35
  import java.sql.SQLException;
@@ -249,10 +250,13 @@ public class MySQLRubyJdbcConnection extends RubyJdbcConnection {
249
250
  if ( field != null ) {
250
251
  java.util.Timer timer = null;
251
252
  try {
253
+ Connection unwrap = connection.unwrap(Connection.class);
254
+ // when failover is used (LoadBalancedMySQLConnection)
255
+ // we'll end up with a proxy returned not the real thing :
256
+ if ( Proxy.isProxyClass(unwrap.getClass()) ) return;
252
257
  // connection likely: com.mysql.jdbc.JDBC4Connection
253
258
  // or (for 3.0) super class: com.mysql.jdbc.ConnectionImpl
254
- timer = (java.util.Timer)
255
- field.get( connection.unwrap(Connection.class) );
259
+ timer = (java.util.Timer) field.get( unwrap );
256
260
  }
257
261
  catch (SQLException e) {
258
262
  debugMessage( e.toString() );
@@ -499,7 +499,7 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
499
499
  }
500
500
 
501
501
  if ( object instanceof Map ) { // hstore
502
- if ( rawHstoreType ) {
502
+ if ( rawHstoreType == Boolean.TRUE ) {
503
503
  return runtime.newString( resultSet.getString(column) );
504
504
  }
505
505
  // by default we avoid double parsing by driver and than column :
@@ -552,20 +552,25 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
552
552
  return str.toString();
553
553
  }
554
554
 
555
- protected static boolean rawHstoreType = Boolean.getBoolean("arjdbc.postgresql.hstore.raw");
555
+ protected static Boolean rawHstoreType;
556
+ static {
557
+ final String hstoreRaw = System.getProperty("arjdbc.postgresql.hstore.raw");
558
+ if ( hstoreRaw != null ) rawHstoreType = Boolean.parseBoolean(hstoreRaw);
559
+ }
556
560
 
557
- @JRubyMethod(name = "raw_hstore_type?")
561
+ @JRubyMethod(name = "raw_hstore_type?", meta = true)
558
562
  public static IRubyObject useRawHstoreType(final ThreadContext context, final IRubyObject self) {
563
+ if ( rawHstoreType == null ) return context.getRuntime().getNil();
559
564
  return context.getRuntime().newBoolean(rawHstoreType);
560
565
  }
561
566
 
562
- @JRubyMethod(name = "raw_hstore_type=")
567
+ @JRubyMethod(name = "raw_hstore_type=", meta = true)
563
568
  public static IRubyObject setRawHstoreType(final IRubyObject self, final IRubyObject value) {
564
569
  if ( value instanceof RubyBoolean ) {
565
- rawHstoreType = ((RubyBoolean) value).isTrue();
570
+ rawHstoreType = ((RubyBoolean) value).isTrue() ? Boolean.TRUE : Boolean.FALSE;
566
571
  }
567
572
  else {
568
- rawHstoreType = ! value.isNil();
573
+ rawHstoreType = value.isNil() ? null : Boolean.TRUE;
569
574
  }
570
575
  return value;
571
576
  }
@@ -579,12 +584,12 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
579
584
  // - -1 years -2 days
580
585
  protected static boolean rawIntervalType = Boolean.getBoolean("arjdbc.postgresql.iterval.raw");
581
586
 
582
- @JRubyMethod(name = "raw_interval_type?")
587
+ @JRubyMethod(name = "raw_interval_type?", meta = true)
583
588
  public static IRubyObject useRawIntervalType(final ThreadContext context, final IRubyObject self) {
584
589
  return context.getRuntime().newBoolean(rawIntervalType);
585
590
  }
586
591
 
587
- @JRubyMethod(name = "raw_interval_type=")
592
+ @JRubyMethod(name = "raw_interval_type=", meta = true)
588
593
  public static IRubyObject setRawIntervalType(final IRubyObject self, final IRubyObject value) {
589
594
  if ( value instanceof RubyBoolean ) {
590
595
  rawIntervalType = ((RubyBoolean) value).isTrue();
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sieger, Ola Bini and JRuby contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-17 00:00:00.000000000 Z
11
+ date: 2013-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -142,6 +142,7 @@ files:
142
142
  - lib/arjdbc/mssql/utils.rb
143
143
  - lib/arjdbc/mysql.rb
144
144
  - lib/arjdbc/mysql/adapter.rb
145
+ - lib/arjdbc/mysql/bulk_change_table.rb
145
146
  - lib/arjdbc/mysql/column.rb
146
147
  - lib/arjdbc/mysql/connection_methods.rb
147
148
  - lib/arjdbc/mysql/explain_support.rb