activerecord-jdbc-adapter 1.3.7 → 1.3.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/arjdbc/mssql/column.rb
CHANGED
@@ -50,15 +50,15 @@ module ArJdbc
|
|
50
50
|
def type_cast(value)
|
51
51
|
return nil if value.nil?
|
52
52
|
case type
|
53
|
-
when :integer then value.
|
54
|
-
when :primary_key then value
|
53
|
+
when :integer then ( value.is_a?(String) ? unquote(value) : (value || 0) ).to_i
|
54
|
+
when :primary_key then value.respond_to?(:to_i) ? value.to_i : ((value && 1) || 0)
|
55
55
|
when :decimal then self.class.value_to_decimal(unquote(value))
|
56
56
|
when :date then self.class.string_to_date(value)
|
57
57
|
when :datetime then self.class.string_to_time(value)
|
58
58
|
when :timestamp then self.class.string_to_time(value)
|
59
59
|
when :time then self.class.string_to_dummy_time(value)
|
60
60
|
when :boolean then value == true || (value =~ /^t(rue)?$/i) == 0 || unquote(value) == '1'
|
61
|
-
when :binary then unquote
|
61
|
+
when :binary then unquote(value)
|
62
62
|
else value
|
63
63
|
end
|
64
64
|
end
|
@@ -156,7 +156,7 @@ module ArJdbc
|
|
156
156
|
super(value)
|
157
157
|
end
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
def string_to_binary(value)
|
161
161
|
# this will only allow the adapter to insert binary data with a length
|
162
162
|
# of 7K or less because of a SQL Server statement length policy ...
|
data/lib/arjdbc/mysql/adapter.rb
CHANGED
@@ -19,7 +19,9 @@ module ArJdbc
|
|
19
19
|
# @private
|
20
20
|
def init_connection(jdbc_connection)
|
21
21
|
meta = jdbc_connection.meta_data
|
22
|
-
if meta.driver_major_version
|
22
|
+
if meta.driver_major_version == 1 # TODO check in driver code
|
23
|
+
# assumes MariaDB 1.x currently
|
24
|
+
elsif meta.driver_major_version < 5
|
23
25
|
raise ::ActiveRecord::ConnectionNotEstablished,
|
24
26
|
"MySQL adapter requires driver >= 5.0 got: '#{meta.driver_version}'"
|
25
27
|
elsif meta.driver_major_version == 5 && meta.driver_minor_version < 1
|
@@ -328,11 +330,19 @@ module ArJdbc
|
|
328
330
|
# @override
|
329
331
|
def columns(table_name, name = nil)
|
330
332
|
sql = "SHOW FULL COLUMNS FROM #{quote_table_name(table_name)}"
|
331
|
-
column = ::ActiveRecord::ConnectionAdapters::MysqlAdapter::Column
|
332
333
|
columns = execute(sql, name || 'SCHEMA')
|
334
|
+
strict = strict_mode?
|
335
|
+
column = jdbc_column_class
|
336
|
+
pass_cast_type = respond_to?(:lookup_cast_type)
|
333
337
|
columns.map! do |field|
|
334
|
-
|
335
|
-
|
338
|
+
sql_type = field['Type']
|
339
|
+
null = field['Null'] == "YES"
|
340
|
+
if pass_cast_type
|
341
|
+
cast_type = lookup_cast_type(sql_type)
|
342
|
+
column.new(field['Field'], field['Default'], cast_type, sql_type, null, field['Collation'], strict, field['Extra'])
|
343
|
+
else
|
344
|
+
column.new(field['Field'], field['Default'], sql_type, null, field['Collation'], strict, field['Extra'])
|
345
|
+
end
|
336
346
|
end
|
337
347
|
columns
|
338
348
|
end
|
@@ -576,14 +586,20 @@ module ArJdbc
|
|
576
586
|
return @version ||= begin
|
577
587
|
version = []
|
578
588
|
java_connection = jdbc_connection(true)
|
579
|
-
if java_connection.
|
589
|
+
if java_connection.java_class.name == 'com.mysql.jdbc.ConnectionImpl'
|
580
590
|
version << jdbc_connection.serverMajorVersion
|
581
591
|
version << jdbc_connection.serverMinorVersion
|
582
592
|
version << jdbc_connection.serverSubMinorVersion
|
583
593
|
else
|
584
|
-
|
594
|
+
result = execute 'SELECT VERSION()', 'SCHEMA'
|
595
|
+
result = result.first.values.first # [{"VERSION()"=>"5.5.37-0ubuntu..."}]
|
596
|
+
if match = result.match(/^(\d)\.(\d+)\.(\d+)/)
|
597
|
+
version << match[1].to_i
|
598
|
+
version << match[2].to_i
|
599
|
+
version << match[3].to_i
|
600
|
+
end
|
585
601
|
end
|
586
|
-
version
|
602
|
+
version.freeze
|
587
603
|
end
|
588
604
|
end
|
589
605
|
|
@@ -611,15 +627,26 @@ module ActiveRecord
|
|
611
627
|
class Column < JdbcColumn
|
612
628
|
include ::ArJdbc::MySQL::Column
|
613
629
|
|
614
|
-
def initialize(name, default, sql_type = nil, null = true, collation = nil, strict = false, extra =
|
630
|
+
def initialize(name, default, sql_type = nil, null = true, collation = nil, strict = false, extra = '')
|
615
631
|
if Hash === name
|
616
632
|
super # first arg: config
|
617
633
|
else
|
618
634
|
@strict = strict; @collation = collation; @extra = extra
|
619
635
|
super(name, default, sql_type, null)
|
636
|
+
# base 4.1: (name, default, sql_type = nil, null = true)
|
620
637
|
end
|
621
638
|
end
|
622
639
|
|
640
|
+
def initialize(name, default, cast_type, sql_type = nil, null = true, collation = nil, strict = false, extra = '')
|
641
|
+
if Hash === name
|
642
|
+
super # first arg: config
|
643
|
+
else
|
644
|
+
@strict = strict; @collation = collation; @extra = extra
|
645
|
+
super(name, default, cast_type, sql_type, null)
|
646
|
+
# base 4.2: (name, default, cast_type, sql_type = nil, null = true)
|
647
|
+
end
|
648
|
+
end if ActiveRecord::VERSION::STRING >= '4.2'
|
649
|
+
|
623
650
|
# @note {#ArJdbc::MySQL::Column} uses this to check for boolean emulation
|
624
651
|
def adapter
|
625
652
|
MysqlAdapter
|
@@ -628,8 +655,7 @@ module ActiveRecord
|
|
628
655
|
end
|
629
656
|
|
630
657
|
def initialize(*args)
|
631
|
-
super
|
632
|
-
# configure_connection happens in super
|
658
|
+
super # configure_connection happens in super
|
633
659
|
end
|
634
660
|
|
635
661
|
def jdbc_connection_class(spec)
|
data/lib/arjdbc/mysql/column.rb
CHANGED
@@ -13,12 +13,9 @@ module ArJdbc
|
|
13
13
|
attr_reader :collation, :strict, :extra
|
14
14
|
|
15
15
|
def extract_default(default)
|
16
|
-
if
|
17
|
-
if default.blank?
|
18
|
-
|
19
|
-
else
|
20
|
-
raise ArgumentError, "#{type} columns cannot have a default value: #{default.inspect}"
|
21
|
-
end
|
16
|
+
if blob_or_text_column?
|
17
|
+
return null || strict ? nil : '' if default.blank?
|
18
|
+
raise ArgumentError, "#{type} columns cannot have a default value: #{default.inspect}"
|
22
19
|
elsif missing_default_forged_as_empty_string?(default)
|
23
20
|
nil
|
24
21
|
else
|
@@ -27,10 +24,18 @@ module ArJdbc
|
|
27
24
|
end
|
28
25
|
|
29
26
|
def has_default?
|
30
|
-
return false if
|
27
|
+
return false if blob_or_text_column? #mysql forbids defaults on blob and text columns
|
31
28
|
super
|
32
29
|
end
|
33
30
|
|
31
|
+
def blob_or_text_column?
|
32
|
+
sql_type.index('blob') || type == :text
|
33
|
+
end
|
34
|
+
|
35
|
+
def case_sensitive?
|
36
|
+
collation && !collation.match(/_ci$/)
|
37
|
+
end
|
38
|
+
|
34
39
|
def simplified_type(field_type)
|
35
40
|
if adapter && adapter.emulate_booleans?
|
36
41
|
return :boolean if field_type.downcase.index('tinyint(1)')
|
@@ -5,11 +5,14 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
5
5
|
|
6
6
|
return jndi_connection(config) if jndi_config?(config)
|
7
7
|
|
8
|
+
driver = config[:driver] ||=
|
9
|
+
defined?(::Jdbc::MySQL.driver_name) ? ::Jdbc::MySQL.driver_name : 'com.mysql.jdbc.Driver'
|
10
|
+
|
8
11
|
begin
|
9
12
|
require 'jdbc/mysql'
|
10
13
|
::Jdbc::MySQL.load_driver(:require) if defined?(::Jdbc::MySQL.load_driver)
|
11
14
|
rescue LoadError # assuming driver.jar is on the class-path
|
12
|
-
end
|
15
|
+
end if mysql_driver = driver[0, 10] == 'com.mysql.'
|
13
16
|
|
14
17
|
config[:username] = 'root' unless config.key?(:username)
|
15
18
|
# jdbc:mysql://[host][,failoverhost...][:port]/[database]
|
@@ -23,37 +26,66 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
23
26
|
url << "/#{config[:database]}"
|
24
27
|
config[:url] = url
|
25
28
|
end
|
26
|
-
|
29
|
+
|
30
|
+
mariadb_driver = ! mysql_driver && driver[0, 12] == 'org.mariadb.' # org.mariadb.jdbc.Driver
|
27
31
|
|
28
32
|
properties = ( config[:properties] ||= {} )
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
if mysql_driver
|
34
|
+
properties['zeroDateTimeBehavior'] ||= 'convertToNull'
|
35
|
+
properties['jdbcCompliantTruncation'] ||= 'false'
|
36
|
+
properties['useUnicode'] = 'true' unless properties.key?('useUnicode') # otherwise platform default
|
37
|
+
encoding = config.key?(:encoding) ? config[:encoding] : 'utf8'
|
38
|
+
properties['characterEncoding'] = encoding if encoding
|
39
|
+
if ! ( reconnect = config[:reconnect] ).nil?
|
40
|
+
properties['autoReconnect'] ||= reconnect.to_s
|
41
|
+
# properties['maxReconnects'] ||= '3'
|
42
|
+
# with reconnect fail-over sets connection read-only (by default)
|
43
|
+
# properties['failOverReadOnly'] ||= 'false'
|
44
|
+
end
|
39
45
|
end
|
40
46
|
if config[:sslkey] || sslcert = config[:sslcert] # || config[:use_ssl]
|
41
|
-
properties['useSSL'] ||= true
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
properties['useSSL'] ||= true # supported by MariaDB as well
|
48
|
+
if mysql_driver
|
49
|
+
properties['requireSSL'] ||= true if mysql_driver
|
50
|
+
properties['clientCertificateKeyStoreUrl'] ||= begin
|
51
|
+
java.io.File.new(sslcert).to_url.to_s
|
52
|
+
end if sslcert
|
53
|
+
if sslca = config[:sslca]
|
54
|
+
properties['trustCertificateKeyStoreUrl'] ||= begin
|
55
|
+
java.io.File.new(sslca).to_url.to_s
|
56
|
+
end
|
57
|
+
else
|
58
|
+
properties['verifyServerCertificate'] ||= false if mysql_driver
|
49
59
|
end
|
50
|
-
|
60
|
+
end
|
61
|
+
if mariadb_driver
|
51
62
|
properties['verifyServerCertificate'] ||= false
|
52
63
|
end
|
53
64
|
end
|
65
|
+
if socket = config[:socket]
|
66
|
+
properties['localSocket'] ||= socket if mariadb_driver
|
67
|
+
end
|
54
68
|
|
55
69
|
jdbc_connection(config)
|
56
70
|
end
|
57
71
|
alias_method :jdbcmysql_connection, :mysql_connection
|
58
72
|
alias_method :mysql2_connection, :mysql_connection
|
73
|
+
|
74
|
+
def mariadb_connection(config)
|
75
|
+
config[:adapter_spec] ||= ::ArJdbc::MySQL
|
76
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::MysqlAdapter unless config.key?(:adapter_class)
|
77
|
+
|
78
|
+
return jndi_connection(config) if jndi_config?(config)
|
79
|
+
|
80
|
+
begin
|
81
|
+
require 'jdbc/mariadb'
|
82
|
+
::Jdbc::MariaDB.load_driver(:require) if defined?(::Jdbc::MariaDB.load_driver)
|
83
|
+
rescue LoadError # assuming driver.jar is on the class-path
|
84
|
+
end
|
85
|
+
|
86
|
+
config[:driver] ||= 'org.mariadb.jdbc.Driver'
|
87
|
+
|
88
|
+
mysql_connection(config)
|
89
|
+
end
|
90
|
+
alias_method :jdbcmariadb_connection, :mariadb_connection
|
59
91
|
end
|
@@ -544,9 +544,11 @@ module ArJdbc
|
|
544
544
|
end
|
545
545
|
|
546
546
|
if pk && use_insert_returning? # true by default on AR <= 3.0
|
547
|
-
sql = "#{sql} RETURNING #{quote_column_name(pk)}"
|
547
|
+
sql = "#{sql} RETURNING #{quote_column_name(pk)} INTO ?"
|
548
|
+
exec_insert_returning(sql, name, nil, pk)
|
549
|
+
else
|
550
|
+
execute(sql, name)
|
548
551
|
end
|
549
|
-
execute(sql, name)
|
550
552
|
end
|
551
553
|
protected :insert_sql
|
552
554
|
|
@@ -554,7 +556,7 @@ module ArJdbc
|
|
554
556
|
def sql_for_insert(sql, pk, id_value, sequence_name, binds)
|
555
557
|
unless id_value || pk.nil?
|
556
558
|
if pk && use_insert_returning?
|
557
|
-
sql = "#{sql} RETURNING #{quote_column_name(pk)}"
|
559
|
+
sql = "#{sql} RETURNING #{quote_column_name(pk)} INTO ?"
|
558
560
|
end
|
559
561
|
end
|
560
562
|
[ sql, binds ]
|
@@ -577,11 +579,22 @@ module ArJdbc
|
|
577
579
|
# @override
|
578
580
|
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
579
581
|
if pk && use_insert_returning?
|
580
|
-
|
582
|
+
if sql.is_a?(String) && sql.index('RETURNING')
|
583
|
+
return exec_insert_returning(sql, name, binds, pk)
|
584
|
+
end
|
585
|
+
end
|
586
|
+
super(sql, name, binds) # assume no generated id for table
|
587
|
+
end
|
588
|
+
|
589
|
+
def exec_insert_returning(sql, name, binds, pk = nil)
|
590
|
+
sql = to_sql(sql, binds) if sql.respond_to?(:to_sql)
|
591
|
+
if prepared_statements?
|
592
|
+
log(sql, name, binds) { @connection.execute_insert_returning(sql, binds) }
|
581
593
|
else
|
582
|
-
|
594
|
+
log(sql, name) { @connection.execute_insert_returning(sql, nil) }
|
583
595
|
end
|
584
596
|
end
|
597
|
+
# private :exec_insert_returning
|
585
598
|
|
586
599
|
def next_id_value(sql, sequence_name = nil)
|
587
600
|
# Assume the SQL contains a bind-variable for the ID
|
@@ -670,6 +683,10 @@ module ActiveRecord::ConnectionAdapters
|
|
670
683
|
|
671
684
|
class OracleColumn < JdbcColumn
|
672
685
|
include ::ArJdbc::Oracle::Column
|
686
|
+
|
687
|
+
# def returning_id?; @returning_id ||= nil end
|
688
|
+
# def returning_id!; @returning_id = true end
|
689
|
+
|
673
690
|
end
|
674
691
|
|
675
692
|
end
|
@@ -158,6 +158,9 @@ module ArJdbc
|
|
158
158
|
when 'point'
|
159
159
|
column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
160
160
|
column_class.point_to_string(value)
|
161
|
+
when 'json'
|
162
|
+
column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
163
|
+
column_class.json_to_string(value)
|
161
164
|
else
|
162
165
|
return super(value, column) unless column.array?
|
163
166
|
column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
@@ -822,10 +825,8 @@ module ArJdbc
|
|
822
825
|
when String
|
823
826
|
return "E'#{escape_bytea(value)}'::bytea" if column.type == :binary
|
824
827
|
return "xml '#{quote_string(value)}'" if column.type == :xml
|
825
|
-
|
826
|
-
|
827
|
-
else super
|
828
|
-
end
|
828
|
+
sql_type = column.respond_to?(:sql_type) && column.sql_type
|
829
|
+
sql_type && sql_type[0, 3] == 'bit' ? quote_bit(value) : super
|
829
830
|
when Array
|
830
831
|
if AR4_COMPAT && column.array? # will be always falsy in AR < 4.0
|
831
832
|
column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
@@ -833,6 +834,9 @@ module ArJdbc
|
|
833
834
|
elsif column.type == :json # only in AR-4.0
|
834
835
|
column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
835
836
|
super(column_class.json_to_string(value), column)
|
837
|
+
elsif column.type == :point # only in AR-4.0
|
838
|
+
column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
839
|
+
super(column_class.point_to_string(value), column)
|
836
840
|
else super
|
837
841
|
end
|
838
842
|
when Hash
|
@@ -891,14 +895,13 @@ module ArJdbc
|
|
891
895
|
end if PostgreSQL::AR4_COMPAT
|
892
896
|
|
893
897
|
def escape_bytea(string)
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
end
|
898
|
+
return unless string
|
899
|
+
if supports_hex_escaped_bytea?
|
900
|
+
"\\\\x#{string.unpack("H*")[0]}"
|
901
|
+
else
|
902
|
+
result = ''
|
903
|
+
string.each_byte { |c| result << sprintf('\\\\%03o', c) }
|
904
|
+
result
|
902
905
|
end
|
903
906
|
end
|
904
907
|
|
@@ -917,13 +920,23 @@ module ArJdbc
|
|
917
920
|
# @override
|
918
921
|
def quote_table_name_for_assignment(table, attr)
|
919
922
|
quote_column_name(attr)
|
920
|
-
end if ::ActiveRecord::VERSION::MAJOR
|
923
|
+
end if ::ActiveRecord::VERSION::MAJOR >= 4
|
921
924
|
|
922
925
|
# @override
|
923
926
|
def quote_column_name(name)
|
924
927
|
%("#{name.to_s.gsub("\"", "\"\"")}")
|
925
928
|
end
|
926
929
|
|
930
|
+
# @private
|
931
|
+
def quote_default_value(value, column)
|
932
|
+
# Do not quote function default values for UUID columns
|
933
|
+
if column.type == :uuid && value =~ /\(\)/
|
934
|
+
value
|
935
|
+
else
|
936
|
+
quote(value, column)
|
937
|
+
end
|
938
|
+
end
|
939
|
+
|
927
940
|
# Quote date/time values for use in SQL input.
|
928
941
|
# Includes microseconds if the value is a Time responding to `usec`.
|
929
942
|
# @override
|
@@ -1017,12 +1030,20 @@ module ArJdbc
|
|
1017
1030
|
|
1018
1031
|
# Changes the default value of a table column.
|
1019
1032
|
def change_column_default(table_name, column_name, default)
|
1020
|
-
|
1033
|
+
if column = column_for(table_name, column_name) # (backwards) compatible with AR 3.x - 4.x
|
1034
|
+
execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} SET DEFAULT #{quote_default_value(default, column)}"
|
1035
|
+
else
|
1036
|
+
execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} SET DEFAULT #{quote(default)}"
|
1037
|
+
end
|
1021
1038
|
end # unless const_defined? :SchemaCreation
|
1022
1039
|
|
1023
1040
|
def change_column_null(table_name, column_name, null, default = nil)
|
1024
1041
|
unless null || default.nil?
|
1025
|
-
|
1042
|
+
if column = column_for(table_name, column_name) # (backwards) compatible with AR 3.x - 4.x
|
1043
|
+
execute "UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote_default_value(default, column)} WHERE #{quote_column_name(column_name)} IS NULL"
|
1044
|
+
else
|
1045
|
+
execute "UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL"
|
1046
|
+
end
|
1026
1047
|
end
|
1027
1048
|
execute("ALTER TABLE #{quote_table_name(table_name)} ALTER #{quote_column_name(column_name)} #{null ? 'DROP' : 'SET'} NOT NULL")
|
1028
1049
|
end # unless const_defined? :SchemaCreation
|
@@ -1061,10 +1082,15 @@ module ArJdbc
|
|
1061
1082
|
elsif default =~ /^\(([-+]?[\d\.]+)\)$/ # e.g. "(-1)" for a negative default
|
1062
1083
|
default = $1
|
1063
1084
|
end
|
1064
|
-
klass.new(name, default, oid, type, ! notnull)
|
1085
|
+
klass.new(name, default, oid, type, ! notnull, fmod, self)
|
1065
1086
|
end
|
1066
1087
|
end
|
1067
1088
|
|
1089
|
+
# @private
|
1090
|
+
def column_for(table_name, column_name)
|
1091
|
+
columns(table_name).detect { |c| c.name == column_name.to_s }
|
1092
|
+
end
|
1093
|
+
|
1068
1094
|
# Returns the list of a table's column names, data types, and default values.
|
1069
1095
|
#
|
1070
1096
|
# If the table name is not prefixed with a schema, the database will
|
@@ -1237,8 +1263,12 @@ module ActiveRecord::ConnectionAdapters
|
|
1237
1263
|
class PostgreSQLColumn < JdbcColumn
|
1238
1264
|
include ::ArJdbc::PostgreSQL::Column
|
1239
1265
|
|
1240
|
-
def initialize(name, default, oid_type = nil, sql_type = nil, null = true
|
1241
|
-
|
1266
|
+
def initialize(name, default, oid_type = nil, sql_type = nil, null = true,
|
1267
|
+
fmod = nil, adapter = nil) # added due resolving #oid_type
|
1268
|
+
if oid_type.is_a?(Integer) # the "main" if branch (on AR 4.x)
|
1269
|
+
@oid = oid_type; @fmod = fmod; @adapter = adapter # see Column#oid_type
|
1270
|
+
elsif oid_type.respond_to?(:type_cast) # MRI compatibility
|
1271
|
+
@oid_type = oid_type; # @fmod = fmod; @adapter = adapter
|
1242
1272
|
else # NOTE: AR <= 3.2 : (name, default, sql_type = nil, null = true)
|
1243
1273
|
null, sql_type, oid_type = !! sql_type, oid_type, nil
|
1244
1274
|
end
|
@@ -1261,11 +1291,17 @@ module ActiveRecord::ConnectionAdapters
|
|
1261
1291
|
|
1262
1292
|
end
|
1263
1293
|
|
1294
|
+
# NOTE: seems needed on 4.x due loading of '.../postgresql/oid' which
|
1295
|
+
# assumes: class PostgreSQLAdapter < AbstractAdapter
|
1264
1296
|
remove_const(:PostgreSQLAdapter) if const_defined?(:PostgreSQLAdapter)
|
1265
1297
|
|
1266
1298
|
class PostgreSQLAdapter < JdbcAdapter
|
1267
1299
|
include ::ArJdbc::PostgreSQL
|
1268
1300
|
include ::ArJdbc::PostgreSQL::ExplainSupport
|
1301
|
+
|
1302
|
+
require 'arjdbc/postgresql/oid_types' if ::ArJdbc::PostgreSQL::AR4_COMPAT
|
1303
|
+
include ::ArJdbc::PostgreSQL::OIDTypes if ::ArJdbc::PostgreSQL.const_defined?(:OIDTypes)
|
1304
|
+
|
1269
1305
|
include ::ArJdbc::Util::QuotedCache
|
1270
1306
|
|
1271
1307
|
def initialize(*args)
|