activerecord-jdbc-adapter 1.3.7 → 1.3.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.
- checksums.yaml +4 -4
- data/.travis.yml +33 -3
- data/Appraisals +11 -5
- data/Gemfile +21 -15
- data/History.md +31 -1
- data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
- data/lib/arel/visitors/firebird.rb +7 -10
- data/lib/arel/visitors/h2.rb +9 -0
- data/lib/arel/visitors/sql_server.rb +21 -2
- data/lib/arjdbc/h2/adapter.rb +31 -2
- data/lib/arjdbc/h2/connection_methods.rb +1 -1
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/column.rb +2 -1
- data/lib/arjdbc/mssql/adapter.rb +40 -23
- data/lib/arjdbc/mssql/column.rb +4 -4
- data/lib/arjdbc/mysql/adapter.rb +36 -10
- data/lib/arjdbc/mysql/column.rb +12 -7
- data/lib/arjdbc/mysql/connection_methods.rb +53 -21
- data/lib/arjdbc/oracle/adapter.rb +22 -5
- data/lib/arjdbc/postgresql/adapter.rb +54 -18
- data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
- data/lib/arjdbc/postgresql/base/oid.rb +460 -0
- data/lib/arjdbc/postgresql/column.rb +50 -15
- data/lib/arjdbc/postgresql/oid_types.rb +126 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +4 -2
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/02-test.rake +3 -30
- data/src/java/arjdbc/derby/DerbyModule.java +0 -8
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +1 -0
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +2 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +8 -8
- data/src/java/arjdbc/mssql/MSSQLModule.java +50 -19
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +1 -0
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +6 -6
- data/src/java/arjdbc/oracle/OracleModule.java +1 -1
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +66 -2
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +23 -10
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +1 -0
- data/src/java/arjdbc/util/CallResultSet.java +826 -0
- data/src/java/arjdbc/util/QuotingUtils.java +14 -7
- metadata +8 -3
- data/lib/arjdbc/postgresql/array_parser.rb +0 -89
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdd070e64ed269bffd40cf0a8664f09964f771d5
|
4
|
+
data.tar.gz: 1e14ca7c497d7bddb3bbdca2bcfa4da04acfebcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19d45b4f7f4edcace3341a1641b24ee7e3e98bb8e2f7a4853cfa9cc6877eeffbbc5e56f86e2f98e37c9df6af3a85a0afa02a346f381498a87e71d36ddffa3eae
|
7
|
+
data.tar.gz: 349a9d32b318d73fc0f549a81c2dc5d38367629e1694597e47efae4aeea2ff6ca70e1f07cb750d453955781378f021149a2ae46994b111667db66d39a3a5f87c
|
data/.travis.yml
CHANGED
@@ -13,6 +13,7 @@ gemfile:
|
|
13
13
|
- gemfiles/rails32.gemfile
|
14
14
|
- gemfiles/rails40.gemfile
|
15
15
|
- gemfiles/rails41.gemfile
|
16
|
+
- gemfiles/rails42.gemfile
|
16
17
|
env:
|
17
18
|
- JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=mysql
|
18
19
|
- JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=mysql PREPARED_STATEMENTS=false
|
@@ -34,13 +35,17 @@ env:
|
|
34
35
|
# TODO: not sure why it can't connect :
|
35
36
|
#- JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=jdbc
|
36
37
|
#- JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=jdbc
|
38
|
+
jdk:
|
39
|
+
- openjdk6
|
37
40
|
branches:
|
38
41
|
only:
|
39
42
|
- master
|
40
|
-
-
|
43
|
+
- /.*-stable$/
|
44
|
+
- next
|
45
|
+
- /^test-.*/
|
41
46
|
matrix:
|
42
|
-
|
43
|
-
|
47
|
+
allow_failures:
|
48
|
+
- gemfile: gemfiles/rails42.gemfile
|
44
49
|
exclude:
|
45
50
|
# Rails 4 prefers Ruby 2.0 (or at least >= 1.9.3) :
|
46
51
|
- rvm: jruby
|
@@ -92,3 +97,28 @@ matrix:
|
|
92
97
|
- rvm: jruby
|
93
98
|
gemfile: gemfiles/rails41.gemfile
|
94
99
|
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=jdbc
|
100
|
+
# Rails 4.2 will not support Ruby 1.8 :
|
101
|
+
- rvm: jruby
|
102
|
+
gemfile: gemfiles/rails42.gemfile
|
103
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=mysql
|
104
|
+
- rvm: jruby
|
105
|
+
gemfile: gemfiles/rails42.gemfile
|
106
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=postgresql
|
107
|
+
- rvm: jruby
|
108
|
+
gemfile: gemfiles/rails42.gemfile
|
109
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=sqlite3
|
110
|
+
- rvm: jruby
|
111
|
+
gemfile: gemfiles/rails42.gemfile
|
112
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=derby
|
113
|
+
- rvm: jruby
|
114
|
+
gemfile: gemfiles/rails42.gemfile
|
115
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=h2
|
116
|
+
- rvm: jruby
|
117
|
+
gemfile: gemfiles/rails42.gemfile
|
118
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=hsqldb
|
119
|
+
- rvm: jruby
|
120
|
+
gemfile: gemfiles/rails42.gemfile
|
121
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=jndi
|
122
|
+
- rvm: jruby
|
123
|
+
gemfile: gemfiles/rails42.gemfile
|
124
|
+
env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" DB=jdbc
|
data/Appraisals
CHANGED
@@ -12,20 +12,26 @@ appraise "rails31" do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
appraise "rails32" do
|
15
|
-
gem "activerecord", "~> 3.2.
|
15
|
+
gem "activerecord", "~> 3.2.18", :require => false
|
16
16
|
end
|
17
17
|
|
18
18
|
appraise "rails40" do
|
19
19
|
# NOTE: make sure you're using --1.9 with AR-4.0
|
20
|
-
gem "activerecord", "~> 4.0.
|
20
|
+
gem "activerecord", "~> 4.0.6", :require => false
|
21
21
|
end
|
22
22
|
|
23
23
|
appraise "rails41" do
|
24
|
-
# NOTE: make sure you're using --1.9 with AR-4.
|
25
|
-
|
24
|
+
# NOTE: make sure you're using --1.9 with AR-4.0
|
25
|
+
gem "activerecord", "~> 4.1.2", :require => false
|
26
|
+
end
|
27
|
+
|
28
|
+
appraise "rails42" do
|
29
|
+
# NOTE: make sure you're using --1.9 with AR-4.0
|
30
|
+
if branch = ( ENV['rails_branch'] || 'master' )
|
26
31
|
gem "activerecord", :github => 'rails/rails', :branch => branch, :require => false
|
27
32
|
gem 'rails', :github => 'rails/rails', :branch => branch
|
33
|
+
gem 'arel', :github => 'rails/arel', :branch => 'master'
|
28
34
|
else
|
29
|
-
gem "activerecord", '4.
|
35
|
+
# gem "activerecord", '4.2.0.rc1', :require => false
|
30
36
|
end
|
31
37
|
end
|
data/Gemfile
CHANGED
@@ -1,29 +1,26 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
3
|
if version = ENV['AR_VERSION']
|
4
|
-
|
4
|
+
if version.index('/') && ::File.exist?(version)
|
5
|
+
gem 'activerecord', :path => version
|
6
|
+
elsif version =~ /^[0-9abcdef]+$/
|
7
|
+
gem 'activerecord', :github => 'rails/rails', :ref => version
|
8
|
+
elsif version.index('.').nil?
|
9
|
+
gem 'activerecord', :github => 'rails/rails', :branch => version
|
10
|
+
else
|
11
|
+
gem 'activerecord', version, :require => nil
|
12
|
+
end
|
5
13
|
else
|
6
14
|
gem 'activerecord', :require => nil
|
7
15
|
end
|
16
|
+
|
8
17
|
gem 'thread_safe', :require => nil # "optional" - we can roll without it
|
18
|
+
|
9
19
|
if defined?(JRUBY_VERSION) && JRUBY_VERSION < '1.7.0'
|
10
20
|
gem 'jruby-openssl', :platform => :jruby
|
11
21
|
end
|
12
22
|
|
13
|
-
|
14
|
-
gem 'ruby-debug', :require => nil # if ENV['DEBUG']
|
15
|
-
group :doc do
|
16
|
-
gem 'yard', :require => nil
|
17
|
-
gem 'yard-method-overrides', :github => 'kares/yard-method-overrides', :require => nil
|
18
|
-
gem 'kramdown', :require => nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
if RUBY_VERSION < '1.9'
|
23
|
-
gem 'rake', '< 10.2.0', :require => nil
|
24
|
-
else
|
25
|
-
gem 'rake', :require => nil
|
26
|
-
end
|
23
|
+
gem 'rake', '~> 10.3.2', :require => nil
|
27
24
|
gem 'appraisal', '~> 0.5.2', :require => nil
|
28
25
|
|
29
26
|
# appraisal ignores group block declarations :
|
@@ -36,6 +33,15 @@ gem 'simplecov', :require => nil, :group => :test
|
|
36
33
|
gem 'bcrypt-ruby', '~> 3.0.0', :require => nil, :group => :test
|
37
34
|
#gem 'trinidad_dbpool', :require => nil, :group => :test
|
38
35
|
|
36
|
+
group :development do
|
37
|
+
gem 'ruby-debug', :require => nil # if ENV['DEBUG']
|
38
|
+
group :doc do
|
39
|
+
gem 'yard', :require => nil
|
40
|
+
gem 'yard-method-overrides', :github => 'kares/yard-method-overrides', :require => nil
|
41
|
+
gem 'kramdown', :require => nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
39
45
|
group :rails do
|
40
46
|
gem 'erubis', :require => nil
|
41
47
|
# NOTE: due rails/activerecord/test/cases/session_store/session_test.rb
|
data/History.md
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
## 1.3.8 (06/27/14)
|
2
|
+
|
3
|
+
- [mysql] updated so that we can run with non-official driver (+ against MariaDB)
|
4
|
+
- [postgres] quote fix failure with ColumnDefinition on AR 4.0.6.rc2
|
5
|
+
- [mssql] performance improvements :
|
6
|
+
* "optimized" quote_name_part in Java + avoid bytes copying in quoteCharWith
|
7
|
+
* throwing exceptions in the hot path results in slow code
|
8
|
+
* minor performance improvements to mssql type_cast
|
9
|
+
- [mssql] fix remove_column on AR < 3.2
|
10
|
+
- [mssql] dealing with column that need quoting (e.g. ids with spaces) in ORDER
|
11
|
+
special care needs to be performed on AR <= 3.2 - Arel < '4.0' (closing #551)
|
12
|
+
- [mssql] correct default value quoting + update on change when non null with default
|
13
|
+
- [mssql] backport database ('.' in name) quoting fix from sqlserver adapter
|
14
|
+
- get the "correct" (AR::Base) record.class on AR 4.1 (#555)
|
15
|
+
- [oracle] support disabling generated keys `-Darjdbc.oracle.generated_keys=false`
|
16
|
+
- [postgres] fix returning generated keys + use *arjdbc.postgresql.generated_keys*
|
17
|
+
- [oracle] working `config[:insert_returning] = true` support (using prepared calls)
|
18
|
+
- [mysql] improve column instantiation - make sure strict/extra passed correctly
|
19
|
+
- [postgres] backport rails fix for not quoting array defaults correctly
|
20
|
+
- [postgres] handle the accessor (e.g. for hstore) added in AR 4.1 (#535)
|
21
|
+
- [postgres] handle oid_types resolution on AR 4.x (compat with MRI on Rails)
|
22
|
+
- [postgres] align Column's (string) cast helpers with AR 4.1
|
23
|
+
- [postgres] quote/cast compat with 4.x + do not quote default function values
|
24
|
+
- [postgres] align array parser with latest from AR 4.1
|
25
|
+
- [postgresl] Column AR 4.x compatibility methods: `number?` and `text?`
|
26
|
+
- [h2] should have it's own arel visitor class (`Arel::Visitors::H2`)
|
27
|
+
- [h2] support for latest beta of next major release - H2 database **1.4**
|
28
|
+
|
29
|
+
Code Contributors (in no particular order): Michael J. Cohen
|
30
|
+
|
1
31
|
## 1.3.7 (04/14/14)
|
2
32
|
|
3
33
|
- [postgres] set prepared values with array columns on AR < 4.0 correctly
|
@@ -14,7 +44,7 @@
|
|
14
44
|
- FireBird's DB meta-identifier is 31 chars maximum, thanks @mariuz (#538)
|
15
45
|
- [derby] add emulate booleans option for derby adapter
|
16
46
|
|
17
|
-
Code Contributors (in no particular order):
|
47
|
+
Code Contributors (in no particular order): Mark Fraser, Pierrick Rouxel, @iaddict
|
18
48
|
|
19
49
|
## 1.3.6 (02/04/14)
|
20
50
|
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'arjdbc/mysql'
|
@@ -5,18 +5,15 @@ module Arel
|
|
5
5
|
class Firebird < Arel::Visitors::ToSql
|
6
6
|
|
7
7
|
def visit_Arel_Nodes_SelectStatement o, a = nil
|
8
|
-
lim_off =
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
lim_off = ''
|
9
|
+
lim_off << "FIRST #{do_visit o.limit.expr, a} " if o.limit
|
10
|
+
lim_off << " SKIP #{do_visit o.offset.expr, a}" if o.offset
|
11
|
+
lim_off.strip!
|
12
12
|
|
13
|
-
sql =
|
14
|
-
|
15
|
-
("ORDER BY #{o.orders.map { |x| do_visit x, a }.join(', ')}" unless o.orders.empty?),
|
16
|
-
].compact.join ' '
|
17
|
-
|
18
|
-
sql.sub!(/\A(\s*SELECT\s)/i, '\&' + lim_off + ' ') unless lim_off.empty?
|
13
|
+
sql = o.cores.map { |x| do_visit_select_core x, a }.join
|
14
|
+
sql << " ORDER BY #{o.orders.map { |x| do_visit x, a }.join(', ')}" unless o.orders.empty?
|
19
15
|
|
16
|
+
sql.sub!(/\A(\s*SELECT\s)/i, "\&#{lim_off} ") unless lim_off.empty?
|
20
17
|
sql
|
21
18
|
end
|
22
19
|
|
@@ -15,7 +15,7 @@ module Arel
|
|
15
15
|
end
|
16
16
|
|
17
17
|
unless o.orders.empty?
|
18
|
-
select_order_by = "ORDER BY #{o.orders
|
18
|
+
select_order_by = "ORDER BY #{do_visit_columns(o.orders, a).join(', ')}"
|
19
19
|
end
|
20
20
|
|
21
21
|
select_count = false
|
@@ -95,13 +95,32 @@ module Arel
|
|
95
95
|
|
96
96
|
def determine_order_by x, a
|
97
97
|
unless x.groups.empty?
|
98
|
-
"ORDER BY #{x.groups
|
98
|
+
"ORDER BY #{do_visit_columns(x.groups, a).join(', ')}"
|
99
99
|
else
|
100
100
|
table_pk = find_left_table_pk(x.froms, a)
|
101
101
|
table_pk == 'NULL' ? nil : "ORDER BY #{table_pk}"
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
+
def do_visit_columns(colls, a)
|
106
|
+
colls.map { |x| do_visit x, a }
|
107
|
+
end
|
108
|
+
|
109
|
+
# @private
|
110
|
+
NON_SIMPLE_ORDER_COLUMN = /\sASC|\sDESC|\sCASE|\sCOLLATE|[\.,\[\(]/i # MIN(width)
|
111
|
+
|
112
|
+
def do_visit_columns(colls, a)
|
113
|
+
colls = colls.map { |x| do_visit x, a }
|
114
|
+
colls.map! do |x|
|
115
|
+
if x !~ NON_SIMPLE_ORDER_COLUMN && x.to_i == 0
|
116
|
+
@connection.quote_column_name(x)
|
117
|
+
else
|
118
|
+
x
|
119
|
+
end
|
120
|
+
end
|
121
|
+
colls
|
122
|
+
end if Arel::VERSION < '4.0.0'
|
123
|
+
|
105
124
|
def row_num_literal order_by
|
106
125
|
Arel::Nodes::SqlLiteral.new("ROW_NUMBER() OVER (#{order_by}) as _row_num")
|
107
126
|
end
|
data/lib/arjdbc/h2/adapter.rb
CHANGED
@@ -74,7 +74,7 @@ module ArJdbc
|
|
74
74
|
|
75
75
|
# @see ActiveRecord::ConnectionAdapters::Jdbc::ArelSupport
|
76
76
|
def self.arel_visitor_type(config = nil)
|
77
|
-
|
77
|
+
require 'arel/visitors/h2'; ::Arel::Visitors::H2
|
78
78
|
end
|
79
79
|
|
80
80
|
ADAPTER_NAME = 'H2'.freeze
|
@@ -242,6 +242,35 @@ module ArJdbc
|
|
242
242
|
execute('DROP ALL OBJECTS')
|
243
243
|
end
|
244
244
|
|
245
|
+
# @private
|
246
|
+
def database_path(base_only = false)
|
247
|
+
db_path = jdbc_connection(true).getSession.getDataHandler.getDatabasePath
|
248
|
+
return db_path if base_only
|
249
|
+
if File.exist?(mv_path = "#{db_path}.mv.db")
|
250
|
+
return mv_path
|
251
|
+
else
|
252
|
+
"#{db_path}.h2.db"
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# @override
|
257
|
+
def jdbc_connection(unwrap = nil)
|
258
|
+
java_connection = raw_connection.connection
|
259
|
+
return java_connection unless unwrap
|
260
|
+
if java_connection.java_class.name == 'org.h2.jdbc.JdbcConnection'
|
261
|
+
return java_connection
|
262
|
+
end
|
263
|
+
connection_class = java.sql.Connection.java_class
|
264
|
+
if java_connection.wrapper_for?(connection_class)
|
265
|
+
java_connection.unwrap(connection_class) # java.sql.Wrapper.unwrap
|
266
|
+
elsif java_connection.respond_to?(:connection)
|
267
|
+
# e.g. org.apache.tomcat.jdbc.pool.PooledConnection
|
268
|
+
java_connection.connection # getConnection
|
269
|
+
else
|
270
|
+
java_connection
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
245
274
|
private
|
246
275
|
|
247
276
|
def change_column_null(table_name, column_name, null, default = nil)
|
@@ -267,5 +296,5 @@ module ActiveRecord::ConnectionAdapters
|
|
267
296
|
class H2Adapter < JdbcAdapter
|
268
297
|
include ArJdbc::H2
|
269
298
|
end
|
270
|
-
|
299
|
+
|
271
300
|
end
|
@@ -16,7 +16,7 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
16
16
|
if db[0, 4] == 'mem:' || db[0, 5] == 'file:' || db[0, 5] == 'hsql:'
|
17
17
|
"jdbc:h2:#{db}"
|
18
18
|
else
|
19
|
-
"jdbc:h2:file:#{db}"
|
19
|
+
"jdbc:h2:file:#{File.expand_path(db)}"
|
20
20
|
end
|
21
21
|
end
|
22
22
|
config[:driver] ||= defined?(::Jdbc::H2.driver_name) ? ::Jdbc::H2.driver_name : 'org.h2.Driver'
|
Binary file
|
data/lib/arjdbc/jdbc/column.rb
CHANGED
@@ -21,7 +21,8 @@ module ActiveRecord
|
|
21
21
|
default = args.shift
|
22
22
|
end
|
23
23
|
end
|
24
|
-
# super : (name, default, sql_type = nil, null = true)
|
24
|
+
# super <= 4.1: (name, default, sql_type = nil, null = true)
|
25
|
+
# super master: (name, default, cast_type, sql_type = nil, null = true)
|
25
26
|
super(name, default_value(default), *args)
|
26
27
|
init_column(name, default, *args)
|
27
28
|
end
|
data/lib/arjdbc/mssql/adapter.rb
CHANGED
@@ -220,9 +220,22 @@ module ArJdbc
|
|
220
220
|
end
|
221
221
|
|
222
222
|
def quote_column_name(name)
|
223
|
-
name.to_s.split('.')
|
224
|
-
|
225
|
-
|
223
|
+
name = name.to_s.split('.')
|
224
|
+
name.map! { |n| quote_name_part(n) } # "[#{name}]"
|
225
|
+
name.join('.')
|
226
|
+
end
|
227
|
+
|
228
|
+
def quote_database_name(name)
|
229
|
+
quote_name_part(name.to_s)
|
230
|
+
end
|
231
|
+
|
232
|
+
# Does not quote function default values for UUID columns
|
233
|
+
def quote_default_value(value, column)
|
234
|
+
if column.type == :uuid && value =~ /\(\)/
|
235
|
+
value
|
236
|
+
else
|
237
|
+
quote(value)
|
238
|
+
end
|
226
239
|
end
|
227
240
|
|
228
241
|
ADAPTER_NAME = 'MSSQL'.freeze
|
@@ -303,7 +316,7 @@ module ArJdbc
|
|
303
316
|
|
304
317
|
def use_database(database = nil)
|
305
318
|
database ||= config[:database]
|
306
|
-
execute "USE #{
|
319
|
+
execute "USE #{quote_database_name(database)}" unless database.blank?
|
307
320
|
end
|
308
321
|
|
309
322
|
# @private
|
@@ -326,11 +339,11 @@ module ArJdbc
|
|
326
339
|
def drop_database(name)
|
327
340
|
current_db = current_database
|
328
341
|
use_database('master') if current_db.to_s == name
|
329
|
-
execute "DROP DATABASE #{
|
342
|
+
execute "DROP DATABASE #{quote_database_name(name)}"
|
330
343
|
end
|
331
344
|
|
332
345
|
def create_database(name, options = {})
|
333
|
-
execute "CREATE DATABASE #{
|
346
|
+
execute "CREATE DATABASE #{quote_database_name(name)}"
|
334
347
|
end
|
335
348
|
|
336
349
|
def database_exists?(name)
|
@@ -388,38 +401,43 @@ module ArJdbc
|
|
388
401
|
|
389
402
|
# @override
|
390
403
|
def change_column(table_name, column_name, type, options = {})
|
404
|
+
column = columns(table_name).find { |c| c.name.to_s == column_name.to_s }
|
391
405
|
|
392
|
-
indexes =
|
393
|
-
|
394
|
-
|
395
|
-
if options_include_default?(options) || (column_object && column_object.type != type.to_sym)
|
406
|
+
indexes = EMPTY_ARRAY
|
407
|
+
if options_include_default?(options) || (column && column.type != type.to_sym)
|
396
408
|
remove_default_constraint(table_name, column_name)
|
397
409
|
indexes = indexes(table_name).select{ |index| index.columns.include?(column_name.to_s) }
|
398
410
|
remove_indexes(table_name, column_name)
|
399
411
|
end
|
400
412
|
|
401
|
-
|
413
|
+
if ! options[:null].nil? && options[:null] == false && ! options[:default].nil?
|
414
|
+
execute "UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote_default_value(options[:default], column)} WHERE #{quote_column_name(column_name)} IS NULL"
|
415
|
+
clear_cached_table(table_name)
|
416
|
+
end
|
402
417
|
change_column_type(table_name, column_name, type, options)
|
403
418
|
change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
|
404
419
|
|
405
|
-
#
|
406
|
-
|
407
|
-
execute "CREATE INDEX #{quote_table_name(index.name)} ON #{quote_table_name(table_name)} (#{
|
420
|
+
indexes.each do |index| # add any removed indexes back
|
421
|
+
index_columns = index.columns.map { |c| quote_column_name(c) }.join(', ')
|
422
|
+
execute "CREATE INDEX #{quote_table_name(index.name)} ON #{quote_table_name(table_name)} (#{index_columns})"
|
408
423
|
end
|
409
424
|
end
|
410
425
|
|
411
426
|
def change_column_type(table_name, column_name, type, options = {})
|
412
|
-
clear_cached_table(table_name)
|
413
427
|
sql = "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
414
|
-
sql
|
415
|
-
execute(sql)
|
428
|
+
sql << (options[:null] ? " NULL" : " NOT NULL") if options.has_key?(:null)
|
429
|
+
result = execute(sql)
|
430
|
+
clear_cached_table(table_name)
|
431
|
+
result
|
416
432
|
end
|
417
433
|
|
418
434
|
def change_column_default(table_name, column_name, default)
|
419
|
-
clear_cached_table(table_name)
|
420
435
|
remove_default_constraint(table_name, column_name)
|
421
436
|
unless default.nil?
|
422
|
-
|
437
|
+
column = columns(table_name).find { |c| c.name.to_s == column_name.to_s }
|
438
|
+
result = execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT DF_#{table_name}_#{column_name} DEFAULT #{quote_default_value(default, column)} FOR #{quote_column_name(column_name)}"
|
439
|
+
clear_cached_table(table_name)
|
440
|
+
result
|
423
441
|
end
|
424
442
|
end
|
425
443
|
|
@@ -428,10 +446,9 @@ module ArJdbc
|
|
428
446
|
# remove_columns(:posts, :foo, :bar) old syntax : remove_columns(:posts, [:foo, :bar])
|
429
447
|
clear_cached_table(table_name)
|
430
448
|
|
449
|
+
column_names = column_names.flatten
|
431
450
|
return do_remove_column(table_name, column_names.first) if column_names.size == 1
|
432
|
-
column_names.
|
433
|
-
do_remove_column(table_name, column_name)
|
434
|
-
end
|
451
|
+
column_names.each { |column_name| do_remove_column(table_name, column_name) }
|
435
452
|
end
|
436
453
|
|
437
454
|
def do_remove_column(table_name, column_name)
|
@@ -569,7 +586,7 @@ module ArJdbc
|
|
569
586
|
raise "no columns for table: #{table_name}" if columns.empty?
|
570
587
|
end
|
571
588
|
# NOTE: if still no PK column simply get something for ORDER BY ...
|
572
|
-
"#{table_name}.#{(primary_column || columns.first).name}"
|
589
|
+
"#{quote_table_name(table_name)}.#{quote_column_name((primary_column || columns.first).name)}"
|
573
590
|
end
|
574
591
|
|
575
592
|
# Support for executing a stored procedure.
|