activerecord-jdbc-adapter 1.3.15 → 1.3.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +14 -0
- data/lib/arjdbc/mysql/adapter.rb +160 -19
- data/lib/arjdbc/mysql/bulk_change_table.rb +7 -4
- data/lib/arjdbc/postgresql/adapter.rb +107 -54
- data/lib/arjdbc/postgresql/base/oid.rb +21 -1
- data/lib/arjdbc/postgresql/column.rb +117 -33
- data/lib/arjdbc/postgresql/oid_types.rb +17 -12
- data/lib/arjdbc/sqlite3/adapter.rb +1 -1
- data/lib/arjdbc/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7cf55d725c96e138c32eea755df27374aa764038
|
4
|
+
data.tar.gz: 9f5e8cf34fc6099b8958ef3de9bacffaf746dc6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d75af524f18547b955e6a5b00964536223b382d052b69a7fbce062ba142a5bcb85ccf7ba3918838653756c0e582cbf62852568f3239399b7e00efe749ec7a8b7
|
7
|
+
data.tar.gz: 4f2e9693c5d1eb81f69741e0b1e8d06911d05273564a67910a77da073141609d5c81d1b751c715c2de7adb79956622b36e216493bcb40649bb2157bebcee3d8a
|
data/History.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## 1.3.16 (04/13/15)
|
2
|
+
|
3
|
+
- [h2] allow jdbch2 adapter to use jdbc-h2 1.4 (#639)
|
4
|
+
- [postgres] quote and type_cast should not be overriden on 4.2
|
5
|
+
- [postgres] fix table column resolution (slightly align it to our needs) on 4.2
|
6
|
+
- [postgres] re-arrange Column internals as some helpers end-up on Adapter in 4.2
|
7
|
+
- [mysql] change_column table is redefined on AR 4.2 so that it uses _sql version
|
8
|
+
- [mysql] more tuning/compatibility backports for AR 4.2 (working booleans #626)
|
9
|
+
- [mysql] type-map support copy-pasta from AR 4.2 (closer to full compat) (#617)
|
10
|
+
- [postgres] improved support for Amazon Redshift (based on user feedback #403)
|
11
|
+
- fixed problem with create table statements with references in MySQL (#629)
|
12
|
+
- fix RecordNotUnique reference in ArJdbc::SQlite3 (#634)
|
13
|
+
- [postgres] add support for jsonb column type (#633 #635 #637)
|
14
|
+
|
1
15
|
## 1.3.15 (03/09/15)
|
2
16
|
|
3
17
|
- [informix] adapter undefined method 'column_types' with Rails 4.x (#622)
|
data/lib/arjdbc/mysql/adapter.rb
CHANGED
@@ -7,7 +7,9 @@ module ArJdbc
|
|
7
7
|
module MySQL
|
8
8
|
|
9
9
|
# @private
|
10
|
-
|
10
|
+
AR40 = ::ActiveRecord::VERSION::MAJOR > 3
|
11
|
+
# @private
|
12
|
+
AR42 = ::ActiveRecord::VERSION::STRING >= '4.2'
|
11
13
|
|
12
14
|
require 'arjdbc/mysql/column'
|
13
15
|
require 'arjdbc/mysql/bulk_change_table'
|
@@ -16,6 +18,9 @@ module ArJdbc
|
|
16
18
|
|
17
19
|
include BulkChangeTable if const_defined? :BulkChangeTable
|
18
20
|
|
21
|
+
# @private
|
22
|
+
ActiveRecordError = ::ActiveRecord::ActiveRecordError
|
23
|
+
|
19
24
|
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
20
25
|
def self.jdbc_connection_class
|
21
26
|
::ActiveRecord::ConnectionAdapters::MySQLJdbcConnection
|
@@ -77,10 +82,10 @@ module ArJdbc
|
|
77
82
|
execute("SET #{encoding} #{variable_assignments}", :skip_logging)
|
78
83
|
end
|
79
84
|
|
80
|
-
def strict_mode?
|
85
|
+
def strict_mode?
|
81
86
|
config.key?(:strict) ?
|
82
87
|
self.class.type_cast_config_to_boolean(config[:strict]) :
|
83
|
-
|
88
|
+
AR40 # strict_mode is default since AR 4.0
|
84
89
|
end
|
85
90
|
|
86
91
|
# @private
|
@@ -166,7 +171,7 @@ module ArJdbc
|
|
166
171
|
else
|
167
172
|
ActiveRecord::SchemaMigration.create_table
|
168
173
|
end
|
169
|
-
end if
|
174
|
+
end if AR40
|
170
175
|
|
171
176
|
# HELPER METHODS ===========================================
|
172
177
|
|
@@ -200,7 +205,16 @@ module ArJdbc
|
|
200
205
|
else
|
201
206
|
super
|
202
207
|
end
|
203
|
-
end
|
208
|
+
end unless AR42
|
209
|
+
|
210
|
+
# @private since AR 4.2
|
211
|
+
def _quote(value)
|
212
|
+
if value.is_a?(Type::Binary::Data)
|
213
|
+
"x'#{value.hex}'"
|
214
|
+
else
|
215
|
+
super
|
216
|
+
end
|
217
|
+
end if AR42
|
204
218
|
|
205
219
|
# @override
|
206
220
|
def quote_column_name(name)
|
@@ -229,6 +243,11 @@ module ArJdbc
|
|
229
243
|
true
|
230
244
|
end
|
231
245
|
|
246
|
+
# @override
|
247
|
+
def supports_indexes_in_create?
|
248
|
+
true
|
249
|
+
end
|
250
|
+
|
232
251
|
# @override
|
233
252
|
def supports_transaction_isolation?
|
234
253
|
# MySQL 4 technically support transaction isolation, but it is affected by
|
@@ -247,6 +266,10 @@ module ArJdbc
|
|
247
266
|
(version[0] == 5 && version[1] >= 7) || version[0] >= 6
|
248
267
|
end
|
249
268
|
|
269
|
+
def index_algorithms
|
270
|
+
{ :default => 'ALGORITHM = DEFAULT', :copy => 'ALGORITHM = COPY', :inplace => 'ALGORITHM = INPLACE' }
|
271
|
+
end if AR42
|
272
|
+
|
250
273
|
# @override
|
251
274
|
def supports_transaction_isolation?(level = nil)
|
252
275
|
version[0] && version[0] >= 5 # MySQL 5+
|
@@ -335,12 +358,8 @@ module ArJdbc
|
|
335
358
|
# @private
|
336
359
|
IndexDefinition = ::ActiveRecord::ConnectionAdapters::IndexDefinition
|
337
360
|
|
338
|
-
|
339
|
-
|
340
|
-
INDEX_TYPES = [ :fulltext, :spatial ]
|
341
|
-
INDEX_USINGS = [ :btree, :hash ]
|
342
|
-
|
343
|
-
end
|
361
|
+
INDEX_TYPES = [ :fulltext, :spatial ] if AR40
|
362
|
+
INDEX_USINGS = [ :btree, :hash ] if AR40
|
344
363
|
|
345
364
|
# Returns an array of indexes for the given table.
|
346
365
|
# @override
|
@@ -373,7 +392,7 @@ module ArJdbc
|
|
373
392
|
# Returns an array of `Column` objects for the table specified.
|
374
393
|
# @override
|
375
394
|
def columns(table_name, name = nil)
|
376
|
-
sql = "SHOW FULL COLUMNS FROM #{quote_table_name(table_name)}"
|
395
|
+
sql = "SHOW FULL #{AR40 ? 'FIELDS' : 'COLUMNS'} FROM #{quote_table_name(table_name)}"
|
377
396
|
columns = execute(sql, name || 'SCHEMA')
|
378
397
|
strict = strict_mode?
|
379
398
|
pass_cast_type = respond_to?(:lookup_cast_type)
|
@@ -561,6 +580,11 @@ module ArJdbc
|
|
561
580
|
execute(change_column_sql)
|
562
581
|
end
|
563
582
|
|
583
|
+
# @private
|
584
|
+
def change_column(table_name, column_name, type, options = {})
|
585
|
+
execute("ALTER TABLE #{quote_table_name(table_name)} #{change_column_sql(table_name, column_name, type, options)}")
|
586
|
+
end if AR42
|
587
|
+
|
564
588
|
# @override
|
565
589
|
def rename_column(table_name, column_name, new_column_name)
|
566
590
|
options = {}
|
@@ -570,7 +594,7 @@ module ArJdbc
|
|
570
594
|
options[:default] = column.default if type != :text && type != :binary
|
571
595
|
options[:null] = column.null
|
572
596
|
else
|
573
|
-
raise
|
597
|
+
raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
|
574
598
|
end
|
575
599
|
|
576
600
|
current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
|
@@ -646,7 +670,7 @@ module ArJdbc
|
|
646
670
|
when 0..0xfff; "varbinary(#{limit})"
|
647
671
|
when nil; "blob"
|
648
672
|
when 0x1000..0xffffffff; "blob(#{limit})"
|
649
|
-
else raise
|
673
|
+
else raise ActiveRecordError, "No binary type has character length #{limit}"
|
650
674
|
end
|
651
675
|
when 'integer'
|
652
676
|
case limit
|
@@ -655,7 +679,7 @@ module ArJdbc
|
|
655
679
|
when 3; 'mediumint'
|
656
680
|
when nil, 4, 11; 'int(11)' # compatibility with MySQL default
|
657
681
|
when 5..8; 'bigint'
|
658
|
-
else raise
|
682
|
+
else raise ActiveRecordError, "No integer type has byte size #{limit}"
|
659
683
|
end
|
660
684
|
when 'text'
|
661
685
|
case limit
|
@@ -663,7 +687,7 @@ module ArJdbc
|
|
663
687
|
when nil, 0x100..0xffff; 'text'
|
664
688
|
when 0x10000..0xffffff; 'mediumtext'
|
665
689
|
when 0x1000000..0xffffffff; 'longtext'
|
666
|
-
else raise
|
690
|
+
else raise ActiveRecordError, "No text type has character length #{limit}"
|
667
691
|
end
|
668
692
|
else
|
669
693
|
super
|
@@ -675,8 +699,91 @@ module ArJdbc
|
|
675
699
|
"VALUES ()"
|
676
700
|
end
|
677
701
|
|
702
|
+
# @note since AR 4.2
|
703
|
+
def valid_type?(type)
|
704
|
+
! native_database_types[type].nil?
|
705
|
+
end
|
706
|
+
|
707
|
+
def clear_cache!
|
708
|
+
super
|
709
|
+
reload_type_map
|
710
|
+
end if AR42
|
711
|
+
|
712
|
+
# @private since AR 4.2
|
713
|
+
def prepare_column_options(column, types)
|
714
|
+
spec = super
|
715
|
+
spec.delete(:limit) if column.type == :boolean
|
716
|
+
spec
|
717
|
+
end if AR42
|
718
|
+
|
719
|
+
# @private
|
720
|
+
Type = ActiveRecord::Type if AR42
|
721
|
+
|
678
722
|
protected
|
679
723
|
|
724
|
+
# @private
|
725
|
+
def initialize_type_map(m)
|
726
|
+
super
|
727
|
+
|
728
|
+
register_class_with_limit m, %r(char)i, MysqlString
|
729
|
+
|
730
|
+
m.register_type %r(tinytext)i, Type::Text.new(limit: 2**8 - 1)
|
731
|
+
m.register_type %r(tinyblob)i, Type::Binary.new(limit: 2**8 - 1)
|
732
|
+
m.register_type %r(text)i, Type::Text.new(limit: 2**16 - 1)
|
733
|
+
m.register_type %r(blob)i, Type::Binary.new(limit: 2**16 - 1)
|
734
|
+
m.register_type %r(mediumtext)i, Type::Text.new(limit: 2**24 - 1)
|
735
|
+
m.register_type %r(mediumblob)i, Type::Binary.new(limit: 2**24 - 1)
|
736
|
+
m.register_type %r(longtext)i, Type::Text.new(limit: 2**32 - 1)
|
737
|
+
m.register_type %r(longblob)i, Type::Binary.new(limit: 2**32 - 1)
|
738
|
+
m.register_type %r(^float)i, Type::Float.new(limit: 24)
|
739
|
+
m.register_type %r(^double)i, Type::Float.new(limit: 53)
|
740
|
+
|
741
|
+
register_integer_type m, %r(^bigint)i, limit: 8
|
742
|
+
register_integer_type m, %r(^int)i, limit: 4
|
743
|
+
register_integer_type m, %r(^mediumint)i, limit: 3
|
744
|
+
register_integer_type m, %r(^smallint)i, limit: 2
|
745
|
+
register_integer_type m, %r(^tinyint)i, limit: 1
|
746
|
+
|
747
|
+
m.alias_type %r(tinyint\(1\))i, 'boolean' if emulate_booleans
|
748
|
+
m.alias_type %r(set)i, 'varchar'
|
749
|
+
m.alias_type %r(year)i, 'integer'
|
750
|
+
m.alias_type %r(bit)i, 'binary'
|
751
|
+
|
752
|
+
m.register_type(%r(datetime)i) do |sql_type|
|
753
|
+
precision = extract_precision(sql_type)
|
754
|
+
MysqlDateTime.new(precision: precision)
|
755
|
+
end
|
756
|
+
|
757
|
+
m.register_type(%r(enum)i) do |sql_type|
|
758
|
+
limit = sql_type[/^enum\((.+)\)/i, 1]
|
759
|
+
.split(',').map{|enum| enum.strip.length - 2}.max
|
760
|
+
MysqlString.new(limit: limit)
|
761
|
+
end
|
762
|
+
end if AR42
|
763
|
+
|
764
|
+
# @private
|
765
|
+
def register_integer_type(mapping, key, options)
|
766
|
+
mapping.register_type(key) do |sql_type|
|
767
|
+
if /unsigned/i =~ sql_type
|
768
|
+
Type::UnsignedInteger.new(options)
|
769
|
+
else
|
770
|
+
Type::Integer.new(options)
|
771
|
+
end
|
772
|
+
end
|
773
|
+
end if AR42
|
774
|
+
|
775
|
+
# MySQL is too stupid to create a temporary table for use subquery, so we have
|
776
|
+
# to give it some prompting in the form of a subsubquery. Ugh!
|
777
|
+
# @note since AR 4.2
|
778
|
+
def subquery_for(key, select)
|
779
|
+
subsubselect = select.clone
|
780
|
+
subsubselect.projections = [key]
|
781
|
+
|
782
|
+
subselect = Arel::SelectManager.new(select.engine)
|
783
|
+
subselect.project Arel.sql(key.name)
|
784
|
+
subselect.from subsubselect.as('__active_record_temp')
|
785
|
+
end if AR42
|
786
|
+
|
680
787
|
def quoted_columns_for_index(column_names, options = {})
|
681
788
|
length = options[:length] if options.is_a?(Hash)
|
682
789
|
|
@@ -741,6 +848,40 @@ module ArJdbc
|
|
741
848
|
end
|
742
849
|
end
|
743
850
|
|
851
|
+
# @private
|
852
|
+
def emulate_booleans; ::ArJdbc::MySQL.emulate_booleans?; end # due AR 4.2
|
853
|
+
public :emulate_booleans
|
854
|
+
|
855
|
+
# @private
|
856
|
+
class MysqlDateTime < Type::DateTime
|
857
|
+
private
|
858
|
+
|
859
|
+
def has_precision?
|
860
|
+
precision || 0
|
861
|
+
end
|
862
|
+
end if AR42
|
863
|
+
|
864
|
+
# @private
|
865
|
+
class MysqlString < Type::String
|
866
|
+
def type_cast_for_database(value)
|
867
|
+
case value
|
868
|
+
when true then "1"
|
869
|
+
when false then "0"
|
870
|
+
else super
|
871
|
+
end
|
872
|
+
end
|
873
|
+
|
874
|
+
private
|
875
|
+
|
876
|
+
def cast_value(value)
|
877
|
+
case value
|
878
|
+
when true then "1"
|
879
|
+
when false then "0"
|
880
|
+
else super
|
881
|
+
end
|
882
|
+
end
|
883
|
+
end if AR42
|
884
|
+
|
744
885
|
end
|
745
886
|
end
|
746
887
|
|
@@ -772,9 +913,9 @@ module ActiveRecord
|
|
772
913
|
|
773
914
|
end
|
774
915
|
|
775
|
-
def initialize(*args)
|
776
|
-
|
777
|
-
end
|
916
|
+
#def initialize(*args)
|
917
|
+
# super # configure_connection happens in super
|
918
|
+
#end
|
778
919
|
|
779
920
|
def jdbc_connection_class(spec)
|
780
921
|
::ArJdbc::MySQL.jdbc_connection_class
|
@@ -3,10 +3,13 @@ module ArJdbc
|
|
3
3
|
module BulkChangeTable
|
4
4
|
|
5
5
|
# @private
|
6
|
-
AR41 = ActiveRecord::VERSION::STRING >= '4.1'
|
6
|
+
AR41 = ::ActiveRecord::VERSION::STRING >= '4.1'
|
7
7
|
|
8
8
|
# @private
|
9
|
-
|
9
|
+
#ActiveRecordError = ActiveRecord::ActiveRecordError
|
10
|
+
|
11
|
+
# @private
|
12
|
+
ChangeColumnDefinition = ::ActiveRecord::ConnectionAdapters::ChangeColumnDefinition if AR41
|
10
13
|
|
11
14
|
# @override
|
12
15
|
def supports_bulk_alter?; true end
|
@@ -106,12 +109,12 @@ module ArJdbc
|
|
106
109
|
schema_creation.accept ChangeColumnDefinition.new column, current_type, options
|
107
110
|
end if AR41
|
108
111
|
|
109
|
-
def remove_column_sql(table_name, column_name, type = nil, options =
|
112
|
+
def remove_column_sql(table_name, column_name, type = nil, options = nil)
|
110
113
|
"DROP #{quote_column_name(column_name)}"
|
111
114
|
end
|
112
115
|
|
113
116
|
def remove_columns_sql(table_name, *column_names)
|
114
|
-
column_names.map {|column_name| remove_column_sql(table_name, column_name) }
|
117
|
+
column_names.map { |column_name| remove_column_sql(table_name, column_name) }
|
115
118
|
end
|
116
119
|
|
117
120
|
def add_index_sql(table_name, column_name, options = {})
|
@@ -16,6 +16,12 @@ module ArJdbc
|
|
16
16
|
require 'arjdbc/postgresql/explain_support'
|
17
17
|
require 'arjdbc/postgresql/schema_creation' # AR 4.x
|
18
18
|
|
19
|
+
# @private
|
20
|
+
IndexDefinition = ::ActiveRecord::ConnectionAdapters::IndexDefinition
|
21
|
+
|
22
|
+
# @private
|
23
|
+
Type = ::ActiveRecord::Type if AR42_COMPAT
|
24
|
+
|
19
25
|
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
20
26
|
def self.jdbc_connection_class
|
21
27
|
::ActiveRecord::ConnectionAdapters::PostgreSQLJdbcConnection
|
@@ -54,8 +60,8 @@ module ArJdbc
|
|
54
60
|
def postgresql_version
|
55
61
|
@postgresql_version ||=
|
56
62
|
begin
|
57
|
-
|
58
|
-
if
|
63
|
+
version = select_version
|
64
|
+
if version =~ /PostgreSQL (\d+)\.(\d+)\.(\d+)/
|
59
65
|
($1.to_i * 10000) + ($2.to_i * 100) + $3.to_i
|
60
66
|
else
|
61
67
|
0
|
@@ -63,6 +69,21 @@ module ArJdbc
|
|
63
69
|
end
|
64
70
|
end
|
65
71
|
|
72
|
+
def select_version
|
73
|
+
@_version ||= select_value('SELECT version()')
|
74
|
+
end
|
75
|
+
private :select_version
|
76
|
+
|
77
|
+
def redshift?
|
78
|
+
# SELECT version() :
|
79
|
+
# PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.647
|
80
|
+
if ( redshift = config[:redshift] ).nil?
|
81
|
+
redshift = !! (select_version || '').index('Redshift')
|
82
|
+
end
|
83
|
+
redshift
|
84
|
+
end
|
85
|
+
private :redshift?
|
86
|
+
|
66
87
|
def use_insert_returning?
|
67
88
|
if @use_insert_returning.nil?
|
68
89
|
@use_insert_returning = supports_insert_with_returning?
|
@@ -97,16 +118,16 @@ module ArJdbc
|
|
97
118
|
execute("SET time zone 'UTC'", 'SCHEMA')
|
98
119
|
elsif tz = local_tz
|
99
120
|
execute("SET time zone '#{tz}'", 'SCHEMA')
|
100
|
-
end
|
121
|
+
end unless redshift?
|
101
122
|
|
102
123
|
# SET statements from :variables config hash
|
103
124
|
# http://www.postgresql.org/docs/8.3/static/sql-set.html
|
104
125
|
(config[:variables] || {}).map do |k, v|
|
105
126
|
if v == ':default' || v == :default
|
106
127
|
# Sets the value to the global or compile default
|
107
|
-
execute("SET SESSION #{k
|
128
|
+
execute("SET SESSION #{k} TO DEFAULT", 'SCHEMA')
|
108
129
|
elsif ! v.nil?
|
109
|
-
execute("SET SESSION #{k
|
130
|
+
execute("SET SESSION #{k} TO #{quote(v)}", 'SCHEMA')
|
110
131
|
end
|
111
132
|
end
|
112
133
|
end
|
@@ -163,7 +184,7 @@ module ArJdbc
|
|
163
184
|
case column.sql_type
|
164
185
|
when 'point'
|
165
186
|
jdbc_column_class.point_to_string(value)
|
166
|
-
when 'json'
|
187
|
+
when 'json', 'jsonb'
|
167
188
|
jdbc_column_class.json_to_string(value)
|
168
189
|
else
|
169
190
|
return super(value, column) unless column.array?
|
@@ -181,7 +202,7 @@ module ArJdbc
|
|
181
202
|
case column.sql_type
|
182
203
|
when 'hstore'
|
183
204
|
jdbc_column_class.hstore_to_string(value)
|
184
|
-
when 'json'
|
205
|
+
when 'json', 'jsonb'
|
185
206
|
jdbc_column_class.json_to_string(value)
|
186
207
|
else super(value, column)
|
187
208
|
end
|
@@ -194,7 +215,23 @@ module ArJdbc
|
|
194
215
|
else
|
195
216
|
super(value, column)
|
196
217
|
end
|
197
|
-
end if AR4_COMPAT
|
218
|
+
end if AR4_COMPAT && ! AR42_COMPAT
|
219
|
+
|
220
|
+
# @private
|
221
|
+
def _type_cast(value)
|
222
|
+
case value
|
223
|
+
when Type::Binary::Data
|
224
|
+
# Return a bind param hash with format as binary.
|
225
|
+
# See http://deveiate.org/code/pg/PGconn.html#method-i-exec_prepared-doc
|
226
|
+
# for more information
|
227
|
+
{ value: value.to_s, format: 1 }
|
228
|
+
when OID::Xml::Data, OID::Bit::Data
|
229
|
+
value.to_s
|
230
|
+
else
|
231
|
+
super
|
232
|
+
end
|
233
|
+
end if AR42_COMPAT
|
234
|
+
private :_type_cast if AR42_COMPAT
|
198
235
|
|
199
236
|
NATIVE_DATABASE_TYPES = {
|
200
237
|
:primary_key => "serial primary key",
|
@@ -227,6 +264,7 @@ module ArJdbc
|
|
227
264
|
:macaddr => { :name => "macaddr" },
|
228
265
|
:uuid => { :name => "uuid" },
|
229
266
|
:json => { :name => "json" },
|
267
|
+
:jsonb => { :name => "jsonb" },
|
230
268
|
:ltree => { :name => "ltree" },
|
231
269
|
# ranges :
|
232
270
|
:daterange => { :name => "daterange" },
|
@@ -249,6 +287,7 @@ module ArJdbc
|
|
249
287
|
end
|
250
288
|
|
251
289
|
# Adds `:array` option to the default set provided by the `AbstractAdapter`.
|
290
|
+
# @override
|
252
291
|
def prepare_column_options(column, types)
|
253
292
|
spec = super
|
254
293
|
spec[:array] = 'true' if column.respond_to?(:array) && column.array
|
@@ -257,6 +296,7 @@ module ArJdbc
|
|
257
296
|
end if AR4_COMPAT
|
258
297
|
|
259
298
|
# Adds `:array` as a valid migration key.
|
299
|
+
# @override
|
260
300
|
def migration_keys
|
261
301
|
super + [:array]
|
262
302
|
end if AR4_COMPAT
|
@@ -744,11 +784,15 @@ module ArJdbc
|
|
744
784
|
|
745
785
|
# Returns the current client message level.
|
746
786
|
def client_min_messages
|
787
|
+
return nil if redshift? # not supported on Redshift
|
747
788
|
select_value('SHOW client_min_messages', 'SCHEMA')
|
748
789
|
end
|
749
790
|
|
750
791
|
# Set the client message level.
|
751
792
|
def client_min_messages=(level)
|
793
|
+
# NOTE: for now simply ignore the writer (no warn on Redshift) so that
|
794
|
+
# the AR copy-pasted PpstgreSQL parts stay the same as much as possible
|
795
|
+
return nil if redshift? # not supported on Redshift
|
752
796
|
execute("SET client_min_messages TO '#{level}'", 'SCHEMA')
|
753
797
|
end
|
754
798
|
|
@@ -834,6 +878,8 @@ module ArJdbc
|
|
834
878
|
"'#{jdbc_column_class.array_to_string(value, column, self).gsub(/'/, "''")}'"
|
835
879
|
elsif column.type == :json # only in AR-4.0
|
836
880
|
super(jdbc_column_class.json_to_string(value), column)
|
881
|
+
elsif column.type == :jsonb # only in AR-4.0
|
882
|
+
super(jdbc_column_class.json_to_string(value), column)
|
837
883
|
elsif column.type == :point # only in AR-4.0
|
838
884
|
super(jdbc_column_class.point_to_string(value), column)
|
839
885
|
else super
|
@@ -843,6 +889,8 @@ module ArJdbc
|
|
843
889
|
super(jdbc_column_class.hstore_to_string(value), column)
|
844
890
|
elsif column.type == :json # only in AR-4.0
|
845
891
|
super(jdbc_column_class.json_to_string(value), column)
|
892
|
+
elsif column.type == :jsonb # only in AR-4.0
|
893
|
+
super(jdbc_column_class.json_to_string(value), column)
|
846
894
|
else super
|
847
895
|
end
|
848
896
|
when Range
|
@@ -862,13 +910,22 @@ module ArJdbc
|
|
862
910
|
end
|
863
911
|
end unless AR42_COMPAT
|
864
912
|
|
865
|
-
|
866
|
-
|
867
|
-
|
913
|
+
# @private
|
914
|
+
def _quote(value)
|
868
915
|
case value
|
916
|
+
when Type::Binary::Data
|
917
|
+
"'#{escape_bytea(value.to_s)}'"
|
918
|
+
when OID::Xml::Data
|
919
|
+
"xml '#{quote_string(value.to_s)}'"
|
920
|
+
when OID::Bit::Data
|
921
|
+
if value.binary?
|
922
|
+
"B'#{value}'"
|
923
|
+
elsif value.hex?
|
924
|
+
"X'#{value}'"
|
925
|
+
end
|
869
926
|
when Float
|
870
927
|
if value.infinite? || value.nan?
|
871
|
-
"'#{value
|
928
|
+
"'#{value}'"
|
872
929
|
else
|
873
930
|
super
|
874
931
|
end
|
@@ -876,6 +933,7 @@ module ArJdbc
|
|
876
933
|
super
|
877
934
|
end
|
878
935
|
end if AR42_COMPAT
|
936
|
+
private :_quote if AR42_COMPAT
|
879
937
|
|
880
938
|
# Quotes a string, escaping any ' (single quote) and \ (backslash) chars.
|
881
939
|
# @return [String]
|
@@ -932,7 +990,7 @@ module ArJdbc
|
|
932
990
|
# @override
|
933
991
|
def quote_table_name_for_assignment(table, attr)
|
934
992
|
quote_column_name(attr)
|
935
|
-
end if
|
993
|
+
end if AR4_COMPAT
|
936
994
|
|
937
995
|
# @override
|
938
996
|
def quote_column_name(name)
|
@@ -1088,9 +1146,8 @@ module ArJdbc
|
|
1088
1146
|
# Returns the list of all column definitions for a table.
|
1089
1147
|
def columns(table_name, name = nil)
|
1090
1148
|
column = jdbc_column_class
|
1091
|
-
|
1092
|
-
|
1093
|
-
# name, type, default, notnull, oid, fmod
|
1149
|
+
column_definitions(table_name).map! do |row|
|
1150
|
+
# |name, type, default, notnull, oid, fmod|
|
1094
1151
|
name = row[0]; type = row[1]; default = row[2]
|
1095
1152
|
notnull = row[3]; oid = row[4]; fmod = row[5]
|
1096
1153
|
# oid = OID::TYPE_MAP.fetch(oid.to_i, fmod.to_i) { OID::Identity.new }
|
@@ -1102,18 +1159,41 @@ module ArJdbc
|
|
1102
1159
|
elsif default =~ /^\(([-+]?[\d\.]+)\)$/ # e.g. "(-1)" for a negative default
|
1103
1160
|
default = $1
|
1104
1161
|
end
|
1105
|
-
|
1106
|
-
|
1107
|
-
column.new(name, default, cast_type, type, ! notnull, fmod, self)
|
1108
|
-
else
|
1109
|
-
column.new(name, default, oid, type, ! notnull, fmod, self)
|
1110
|
-
end
|
1162
|
+
|
1163
|
+
column.new(name, default, oid, type, ! notnull, fmod, self)
|
1111
1164
|
end
|
1112
1165
|
end
|
1113
1166
|
|
1167
|
+
# @private documented above
|
1168
|
+
def columns(table_name)
|
1169
|
+
column = jdbc_column_class
|
1170
|
+
# Limit, precision, and scale are all handled by the superclass.
|
1171
|
+
column_definitions(table_name).map! do |row|
|
1172
|
+
# |name, type, default, notnull, oid, fmod|
|
1173
|
+
name = row[0]; type = row[1]; default = row[2]
|
1174
|
+
notnull = row[3]; oid = row[4]; fmod = row[5]
|
1175
|
+
notnull = notnull == 't' if notnull.is_a?(String) # JDBC gets true/false
|
1176
|
+
|
1177
|
+
oid_type = get_oid_type(oid.to_i, fmod.to_i, name, type)
|
1178
|
+
default_value = extract_value_from_default(oid, default)
|
1179
|
+
default_function = extract_default_function(default_value, default)
|
1180
|
+
|
1181
|
+
column.new(name, default_value, oid_type, type, ! notnull, default_function, oid, self)
|
1182
|
+
end
|
1183
|
+
end if AR42_COMPAT
|
1184
|
+
|
1185
|
+
# @private only for API compatibility
|
1186
|
+
def new_column(name, default, cast_type, sql_type = nil, null = true, default_function = nil)
|
1187
|
+
jdbc_column_class.new(name, default, cast_type, sql_type, null, default_function)
|
1188
|
+
end if AR42_COMPAT
|
1189
|
+
|
1114
1190
|
# @private
|
1115
1191
|
def column_for(table_name, column_name)
|
1116
|
-
|
1192
|
+
column_name = column_name.to_s
|
1193
|
+
for column in columns(table_name)
|
1194
|
+
return column if column.name == column_name
|
1195
|
+
end
|
1196
|
+
nil
|
1117
1197
|
end
|
1118
1198
|
|
1119
1199
|
# Returns the list of a table's column names, data types, and default values.
|
@@ -1188,9 +1268,6 @@ module ArJdbc
|
|
1188
1268
|
SQL
|
1189
1269
|
end if AR42_COMPAT
|
1190
1270
|
|
1191
|
-
# @private
|
1192
|
-
IndexDefinition = ::ActiveRecord::ConnectionAdapters::IndexDefinition
|
1193
|
-
|
1194
1271
|
# Returns an array of indexes for the given table.
|
1195
1272
|
def indexes(table_name, name = nil)
|
1196
1273
|
# NOTE: maybe it's better to leave things of to the JDBC API ?!
|
@@ -1304,33 +1381,6 @@ module ActiveRecord::ConnectionAdapters
|
|
1304
1381
|
|
1305
1382
|
class PostgreSQLColumn < JdbcColumn
|
1306
1383
|
include ::ArJdbc::PostgreSQL::Column
|
1307
|
-
|
1308
|
-
def initialize(name, default, oid_type = nil, sql_type = nil, null = true,
|
1309
|
-
fmod = nil, adapter = nil) # added due resolving #oid_type
|
1310
|
-
if oid_type.is_a?(Integer) # the "main" if branch (on AR 4.x)
|
1311
|
-
@oid = oid_type; @fmod = fmod; @adapter = adapter # see Column#oid_type
|
1312
|
-
elsif oid_type.respond_to?(:type_cast) # MRI compatibility
|
1313
|
-
@oid_type = oid_type; # @fmod = fmod; @adapter = adapter
|
1314
|
-
else # NOTE: AR <= 3.2 : (name, default, sql_type = nil, null = true)
|
1315
|
-
null, sql_type, oid_type = !! sql_type, oid_type, nil
|
1316
|
-
end
|
1317
|
-
if sql_type.to_s[-2, 2] == '[]' && ArJdbc::PostgreSQL::AR4_COMPAT
|
1318
|
-
@array = true if respond_to?(:array)
|
1319
|
-
super(name, default, sql_type[0..-3], null)
|
1320
|
-
else
|
1321
|
-
@array = false if respond_to?(:array)
|
1322
|
-
super(name, default, sql_type, null)
|
1323
|
-
end
|
1324
|
-
|
1325
|
-
@default_function = default if has_default_function?(@default, default)
|
1326
|
-
end
|
1327
|
-
|
1328
|
-
private
|
1329
|
-
|
1330
|
-
def has_default_function?(default_value, default)
|
1331
|
-
! default_value && ( %r{\w+\(.*\)} === default )
|
1332
|
-
end
|
1333
|
-
|
1334
1384
|
end
|
1335
1385
|
|
1336
1386
|
# NOTE: seems needed on 4.x due loading of '.../postgresql/oid' which
|
@@ -1341,8 +1391,9 @@ module ActiveRecord::ConnectionAdapters
|
|
1341
1391
|
include ::ArJdbc::PostgreSQL
|
1342
1392
|
include ::ArJdbc::PostgreSQL::ExplainSupport
|
1343
1393
|
|
1344
|
-
require 'arjdbc/postgresql/oid_types' if
|
1394
|
+
require 'arjdbc/postgresql/oid_types' if AR4_COMPAT
|
1345
1395
|
include ::ArJdbc::PostgreSQL::OIDTypes if ::ArJdbc::PostgreSQL.const_defined?(:OIDTypes)
|
1396
|
+
include ::ArJdbc::PostgreSQL::ColumnHelpers if AR42_COMPAT
|
1346
1397
|
|
1347
1398
|
include ::ArJdbc::Util::QuotedCache
|
1348
1399
|
|
@@ -1354,6 +1405,8 @@ module ActiveRecord::ConnectionAdapters
|
|
1354
1405
|
|
1355
1406
|
@table_alias_length = nil
|
1356
1407
|
|
1408
|
+
initialize_type_map(@type_map = Type::HashLookupTypeMap.new) if AR42_COMPAT
|
1409
|
+
|
1357
1410
|
@use_insert_returning = @config.key?(:insert_returning) ?
|
1358
1411
|
self.class.type_cast_config_to_boolean(@config[:insert_returning]) : nil
|
1359
1412
|
end
|
@@ -275,6 +275,25 @@ module ActiveRecord
|
|
275
275
|
end
|
276
276
|
end
|
277
277
|
|
278
|
+
class Jsonb < Type
|
279
|
+
def type_cast_for_write(value)
|
280
|
+
# roundtrip to ensure uniform uniform types
|
281
|
+
# TODO: This is not an efficient solution.
|
282
|
+
stringified = ConnectionAdapters::PostgreSQLColumn.json_to_string(value)
|
283
|
+
type_cast(stringified)
|
284
|
+
end
|
285
|
+
|
286
|
+
def type_cast(value)
|
287
|
+
return if value.nil?
|
288
|
+
|
289
|
+
ConnectionAdapters::PostgreSQLColumn.string_to_json value
|
290
|
+
end
|
291
|
+
|
292
|
+
def accessor
|
293
|
+
ActiveRecord::Store::StringKeyedHashAccessor
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
278
297
|
class TypeMap
|
279
298
|
def initialize
|
280
299
|
@mapping = {}
|
@@ -382,6 +401,7 @@ module ActiveRecord
|
|
382
401
|
register_type 'circle', OID::Identity.new
|
383
402
|
register_type 'hstore', OID::Hstore.new
|
384
403
|
register_type 'json', OID::Json.new
|
404
|
+
register_type 'jsonb', OID::Jsonb.new
|
385
405
|
register_type 'ltree', OID::Identity.new
|
386
406
|
|
387
407
|
register_type 'cidr', OID::Cidr.new
|
@@ -389,4 +409,4 @@ module ActiveRecord
|
|
389
409
|
end
|
390
410
|
end
|
391
411
|
end
|
392
|
-
end
|
412
|
+
end
|
@@ -6,46 +6,134 @@ module ArJdbc
|
|
6
6
|
[ /postgre/i, lambda { |cfg, column| column.extend(Column) } ]
|
7
7
|
end
|
8
8
|
|
9
|
+
# @private these are defined on the Adapter class since 4.2
|
10
|
+
module ColumnHelpers
|
11
|
+
|
12
|
+
def extract_limit(sql_type) # :nodoc:
|
13
|
+
case sql_type
|
14
|
+
when /^bigint/i, /^int8/i then 8
|
15
|
+
when /^smallint/i then 2
|
16
|
+
when /^timestamp/i then nil
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Extracts the value from a PostgreSQL column default definition.
|
23
|
+
def extract_value_from_default(oid, default) # :nodoc:
|
24
|
+
case default
|
25
|
+
# Quoted types
|
26
|
+
when /\A[\(B]?'(.*)'::/m
|
27
|
+
$1.gsub(/''/, "'")
|
28
|
+
# Boolean types
|
29
|
+
when 'true', 'false'
|
30
|
+
default
|
31
|
+
# Numeric types
|
32
|
+
when /\A\(?(-?\d+(\.\d*)?)\)?(::bigint)?\z/
|
33
|
+
$1
|
34
|
+
# Object identifier types
|
35
|
+
when /\A-?\d+\z/
|
36
|
+
$1
|
37
|
+
else
|
38
|
+
# Anything else is blank, some user type, or some function
|
39
|
+
# and we can't know the value of that, so return nil.
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def extract_default_function(default_value, default) # :nodoc:
|
45
|
+
default if ! default_value && ( %r{\w+\(.*\)} === default )
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
9
50
|
# Column behavior based on PostgreSQL adapter in Rails.
|
10
51
|
# @see ActiveRecord::ConnectionAdapters::JdbcColumn
|
11
52
|
module Column
|
12
53
|
|
54
|
+
attr_accessor :array
|
55
|
+
|
56
|
+
def initialize(name, default, cast_type, sql_type = nil, null = true, default_function = nil,
|
57
|
+
oid = nil, adapter = nil) # added arguments
|
58
|
+
if sql_type.to_s[-2, 2] == '[]'
|
59
|
+
@array = true
|
60
|
+
super(name, default, cast_type, sql_type[0..-3], null)
|
61
|
+
else
|
62
|
+
@array = false
|
63
|
+
super(name, default, cast_type, sql_type, null)
|
64
|
+
end
|
65
|
+
|
66
|
+
@oid = oid # used on Java side - expects @oid on Column instances
|
67
|
+
#@adapter = adapter
|
68
|
+
|
69
|
+
@default_function = default_function
|
70
|
+
end
|
71
|
+
|
72
|
+
end if AR42_COMPAT
|
73
|
+
|
74
|
+
# @private (AR < 4.2 version) documented above
|
75
|
+
module Column
|
76
|
+
|
77
|
+
def initialize(name, default, oid_type = nil, sql_type = nil, null = true,
|
78
|
+
fmod = nil, adapter = nil) # added due resolving #oid_type
|
79
|
+
if oid_type.is_a?(Integer) # the "main" if branch (on AR 4.x)
|
80
|
+
@oid = oid_type; @fmod = fmod; @adapter = adapter # see Column#oid_type
|
81
|
+
elsif oid_type.respond_to?(:type_cast) # MRI compatibility
|
82
|
+
@oid_type = oid_type; # @fmod = fmod; @adapter = adapter
|
83
|
+
else # NOTE: AR <= 3.2 : (name, default, sql_type = nil, null = true)
|
84
|
+
null, sql_type, oid_type = !! sql_type, oid_type, nil
|
85
|
+
end
|
86
|
+
if sql_type.to_s[-2, 2] == '[]' && ArJdbc::PostgreSQL::AR4_COMPAT
|
87
|
+
@array = true if respond_to?(:array)
|
88
|
+
super(name, default, sql_type[0..-3], null)
|
89
|
+
else
|
90
|
+
@array = false if respond_to?(:array)
|
91
|
+
super(name, default, sql_type, null)
|
92
|
+
end
|
93
|
+
|
94
|
+
@default_function = extract_default_function(@default, default)
|
95
|
+
end
|
96
|
+
|
13
97
|
def self.included(base)
|
14
98
|
# NOTE: assumes a standalone PostgreSQLColumn class
|
15
|
-
class << base
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end if AR4_COMPAT
|
99
|
+
base_meta = class << base; self end
|
100
|
+
base_meta.send :attr_accessor, :money_precision
|
101
|
+
|
102
|
+
# Loads pg_array_parser if available. String parsing can be
|
103
|
+
# performed quicker by a native extension, which will not create
|
104
|
+
# a large amount of Ruby objects that will need to be garbage
|
105
|
+
# collected. pg_array_parser has a C and Java extension
|
106
|
+
begin
|
107
|
+
require 'pg_array_parser'
|
108
|
+
base_meta.send :include, PgArrayParser
|
109
|
+
rescue LoadError
|
110
|
+
if AR42_COMPAT
|
111
|
+
require 'active_record/connection_adapters/postgresql/array_parser'
|
112
|
+
else
|
113
|
+
require 'arjdbc/postgresql/base/array_parser'
|
114
|
+
end
|
115
|
+
base_meta.send :include, ActiveRecord::ConnectionAdapters::PostgreSQL::ArrayParser
|
116
|
+
end if AR4_COMPAT
|
34
117
|
|
35
|
-
|
118
|
+
base_meta.send :include, Cast
|
36
119
|
|
37
|
-
|
120
|
+
base.send :include, ColumnHelpers
|
38
121
|
end
|
39
122
|
|
123
|
+
if AR4_COMPAT && ! AR42_COMPAT
|
124
|
+
|
40
125
|
# @private
|
41
126
|
def oid_type
|
42
127
|
@oid_type ||= begin
|
43
128
|
raise "oid not defined" unless oid = (@oid ||= nil)
|
44
129
|
@adapter.get_oid_type(oid.to_i, @fmod.to_i, name)
|
45
130
|
end
|
46
|
-
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# @private
|
134
|
+
def accessor; oid_type.accessor end
|
47
135
|
|
48
|
-
|
136
|
+
end
|
49
137
|
|
50
138
|
( attr_accessor :array; def array?; array; end ) if AR4_COMPAT
|
51
139
|
|
@@ -110,6 +198,9 @@ module ArJdbc
|
|
110
198
|
# JSON
|
111
199
|
when /\A'(.*)'::json\z/
|
112
200
|
$1
|
201
|
+
# JSONB
|
202
|
+
when /\A'(.*)'::jsonb\z/
|
203
|
+
$1
|
113
204
|
# Object identifier types
|
114
205
|
when /\A-?\d+\z/
|
115
206
|
$1
|
@@ -146,6 +237,7 @@ module ArJdbc
|
|
146
237
|
case type ||= self.type
|
147
238
|
when :hstore then self.class.string_to_hstore value
|
148
239
|
when :json then self.class.string_to_json value
|
240
|
+
when :jsonb then self.class.string_to_json value
|
149
241
|
when :cidr, :inet then self.class.string_to_cidr value
|
150
242
|
when :macaddr then value
|
151
243
|
when :tsvector then value
|
@@ -198,15 +290,6 @@ module ArJdbc
|
|
198
290
|
|
199
291
|
private
|
200
292
|
|
201
|
-
def extract_limit(sql_type)
|
202
|
-
case sql_type
|
203
|
-
when /^bigint/i; 8
|
204
|
-
when /^smallint/i; 2
|
205
|
-
when /^timestamp/i; nil
|
206
|
-
else super
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
293
|
# Extracts the scale from PostgreSQL-specific data types.
|
211
294
|
def extract_scale(sql_type)
|
212
295
|
# Money type has a fixed scale of 2.
|
@@ -302,6 +385,7 @@ module ArJdbc
|
|
302
385
|
when 'uuid' then :uuid
|
303
386
|
# JSON type
|
304
387
|
when 'json' then :json
|
388
|
+
when 'jsonb' then :jsonb
|
305
389
|
# Small and big integer types
|
306
390
|
when /^(?:small|big)int$/ then :integer
|
307
391
|
when /(num|date|tstz|ts|int4|int8)range$/
|
@@ -550,6 +634,6 @@ module ArJdbc
|
|
550
634
|
|
551
635
|
end
|
552
636
|
|
553
|
-
end
|
637
|
+
end unless AR42_COMPAT
|
554
638
|
end
|
555
639
|
end
|
@@ -10,11 +10,10 @@ module ArJdbc
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# @private
|
13
|
-
|
14
|
-
|
15
|
-
OID = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
|
13
|
+
OID = ::ActiveRecord::ConnectionAdapters::PostgreSQL::OID
|
16
14
|
|
17
|
-
|
15
|
+
# @private
|
16
|
+
module OIDTypes
|
18
17
|
|
19
18
|
# @override
|
20
19
|
def enable_extension(name)
|
@@ -44,7 +43,7 @@ module ArJdbc
|
|
44
43
|
}
|
45
44
|
end unless AR42_COMPAT
|
46
45
|
|
47
|
-
def get_oid_type(oid, fmod, column_name, sql_type = '')
|
46
|
+
def get_oid_type(oid, fmod, column_name, sql_type = '')
|
48
47
|
if !type_map.key?(oid)
|
49
48
|
load_additional_types(type_map, [oid])
|
50
49
|
end
|
@@ -79,7 +78,8 @@ module ArJdbc
|
|
79
78
|
end
|
80
79
|
|
81
80
|
def type_map
|
82
|
-
# NOTE: our type_map is lazy
|
81
|
+
# NOTE: our type_map is lazy (on AR < 4.2)
|
82
|
+
# ... since it's only used for `adapter.accessor`
|
83
83
|
@type_map ||= begin
|
84
84
|
if type_map = @@type_map_cache[ type_cache_key ]
|
85
85
|
type_map.dup
|
@@ -150,10 +150,10 @@ module ArJdbc
|
|
150
150
|
end
|
151
151
|
end unless AR42_COMPAT
|
152
152
|
|
153
|
-
def initialize_type_map(m)
|
153
|
+
def initialize_type_map(m)
|
154
154
|
register_class_with_limit m, 'int2', OID::Integer
|
155
|
-
m
|
156
|
-
m
|
155
|
+
register_class_with_limit m, 'int4', OID::Integer
|
156
|
+
register_class_with_limit m, 'int8', OID::Integer
|
157
157
|
m.alias_type 'oid', 'int2'
|
158
158
|
m.register_type 'float4', OID::Float.new
|
159
159
|
m.alias_type 'float8', 'float4'
|
@@ -221,7 +221,7 @@ module ArJdbc
|
|
221
221
|
load_additional_types(m)
|
222
222
|
end if AR42_COMPAT
|
223
223
|
|
224
|
-
def load_additional_types(type_map, oids = nil)
|
224
|
+
def load_additional_types(type_map, oids = nil)
|
225
225
|
if supports_ranges?
|
226
226
|
query = <<-SQL
|
227
227
|
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
|
@@ -235,11 +235,16 @@ module ArJdbc
|
|
235
235
|
SQL
|
236
236
|
end
|
237
237
|
|
238
|
+
initializer = OID::TypeMapInitializer.new(type_map)
|
239
|
+
|
238
240
|
if oids
|
239
|
-
query
|
241
|
+
query << "WHERE t.oid::integer IN (%s)" % oids.join(", ")
|
242
|
+
else
|
243
|
+
if initializer.respond_to?(:query_conditions_for_initial_load)
|
244
|
+
query << initializer.query_conditions_for_initial_load(type_map)
|
245
|
+
end
|
240
246
|
end
|
241
247
|
|
242
|
-
initializer = OID::TypeMapInitializer.new(type_map)
|
243
248
|
records = execute(query, 'SCHEMA')
|
244
249
|
initializer.run(records)
|
245
250
|
end if AR42_COMPAT
|
@@ -534,7 +534,7 @@ module ArJdbc
|
|
534
534
|
# column *column_name* is not unique
|
535
535
|
if msg.index('UNIQUE constraint failed: ') ||
|
536
536
|
msg =~ /column(s)? .* (is|are) not unique/
|
537
|
-
return RecordNotUnique.new(message, exception)
|
537
|
+
return ::ActiveRecord::RecordNotUnique.new(message, exception)
|
538
538
|
end
|
539
539
|
end
|
540
540
|
super
|
data/lib/arjdbc/version.rb
CHANGED
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.
|
4
|
+
version: 1.3.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|