activerecord-jdbc-adapter 1.3.11 → 1.3.12

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.
@@ -10,6 +10,26 @@ module ArJdbc
10
10
  # @see ActiveRecord::ConnectionAdapters::JdbcColumn
11
11
  module Column
12
12
 
13
+ def initialize(name, default, sql_type = nil, null = true, collation = nil, strict = false, extra = '')
14
+ if name.is_a?(Hash)
15
+ super # first arg: config
16
+ else
17
+ @strict = strict; @collation = collation; @extra = extra
18
+ super(name, default, sql_type, null)
19
+ # base 4.1: (name, default, sql_type = nil, null = true)
20
+ end
21
+ end unless AR42
22
+
23
+ def initialize(name, default, cast_type, sql_type = nil, null = true, collation = nil, strict = false, extra = '')
24
+ if name.is_a?(Hash)
25
+ super # first arg: config
26
+ else
27
+ @strict = strict; @collation = collation; @extra = extra
28
+ super(name, default, cast_type, sql_type, null)
29
+ # base 4.2: (name, default, cast_type, sql_type = nil, null = true)
30
+ end
31
+ end if AR42
32
+
13
33
  attr_reader :collation, :strict, :extra
14
34
 
15
35
  def extract_default(default)
@@ -34,8 +34,13 @@ ArJdbc::ConnectionMethods.module_eval do
34
34
  properties['zeroDateTimeBehavior'] ||= 'convertToNull'
35
35
  properties['jdbcCompliantTruncation'] ||= 'false'
36
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
37
+ # NOTE: this is "better" than passing what users are used to set on MRI
38
+ # e.g. 'utf8mb4' will fail cause the driver will check for a Java charset
39
+ # ... it's smart enough to detect utf8mb4 from server variables :
40
+ # "character_set_client" && "character_set_connection" (thus UTF-8)
41
+ if encoding = config.key?(:encoding) ? config[:encoding] : 'utf8'
42
+ properties['characterEncoding'] = convert_mysql_encoding(encoding) || encoding
43
+ end
39
44
  if ! ( reconnect = config[:reconnect] ).nil?
40
45
  properties['autoReconnect'] ||= reconnect.to_s
41
46
  # properties['maxReconnects'] ||= '3'
@@ -88,4 +93,53 @@ ArJdbc::ConnectionMethods.module_eval do
88
93
  mysql_connection(config)
89
94
  end
90
95
  alias_method :jdbcmariadb_connection, :mariadb_connection
96
+
97
+ private
98
+
99
+ @@mysql_encodings = nil
100
+
101
+ def convert_mysql_encoding(encoding) # from mysql2's ruby_enc_to_mysql
102
+ ( @@mysql_encodings ||= {
103
+ "big5" => "Big5",
104
+ "dec8" => nil,
105
+ "cp850" => "CP850",
106
+ "hp8" => nil,
107
+ "koi8r" => "KOI8-R",
108
+ "latin1" => "ISO-8859-1",
109
+ "latin2" => "ISO-8859-2",
110
+ "swe7" => nil,
111
+ "ascii" => "US-ASCII",
112
+ #"ujis" => "eucJP-ms",
113
+ #"sjis" => "Shift_JIS",
114
+ "hebrew" => "ISO-8859-8",
115
+ #"tis620" => "TIS-620",
116
+ #"euckr" => "EUC-KR",
117
+ #"koi8u" => "KOI8-R",
118
+ #"gb2312" => "GB2312",
119
+ "greek" => "ISO-8859-7",
120
+ "cp1250" => "Windows-1250",
121
+ #"gbk" => "GBK",
122
+ "latin5" => "ISO-8859-9",
123
+ "armscii8" => nil,
124
+ "utf8" => "UTF-8",
125
+ "ucs2" => "UTF-16BE",
126
+ "cp866" => "IBM866",
127
+ "keybcs2" => nil,
128
+ #"macce" => "macCentEuro",
129
+ #"macroman" => "macRoman",
130
+ "cp852" => "CP852",
131
+ "latin7" => "ISO-8859-13",
132
+ "utf8mb4" => "UTF-8",
133
+ "cp1251" => "Windows-1251",
134
+ "utf16" => "UTF-16",
135
+ "cp1256" => "Windows-1256",
136
+ "cp1257" => "Windows-1257",
137
+ "utf32" => "UTF-32",
138
+ "binary" => "ASCII-8BIT",
139
+ "geostd8" => nil,
140
+ #"cp932" => "Windows-31J",
141
+ #"eucjpms" => "eucJP-ms"
142
+ } )[ encoding ]
143
+ end
144
+
91
145
  end
@@ -1,10 +1,10 @@
1
1
  ArJdbc.load_java_part :Oracle
2
2
 
3
- require 'arjdbc/oracle/column'
4
-
5
3
  module ArJdbc
6
4
  module Oracle
7
5
 
6
+ require 'arjdbc/oracle/column'
7
+
8
8
  # @private
9
9
  def self.extended(adapter); initialize!; end
10
10
 
@@ -31,9 +31,7 @@ module ArJdbc
31
31
  end
32
32
 
33
33
  # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
34
- def jdbc_column_class
35
- ::ActiveRecord::ConnectionAdapters::OracleColumn
36
- end
34
+ def jdbc_column_class; Column end
37
35
 
38
36
  # @private
39
37
  @@update_lob_values = true
@@ -485,24 +483,19 @@ module ArJdbc
485
483
  end
486
484
 
487
485
  # @override
488
- def supports_migrations?
489
- true
490
- end
486
+ def supports_migrations?; true end
491
487
 
492
488
  # @override
493
- def supports_primary_key?
494
- true
495
- end
489
+ def supports_primary_key?; true end
496
490
 
497
491
  # @override
498
- def supports_savepoints?
499
- true
500
- end
492
+ def supports_savepoints?; true end
501
493
 
502
494
  # @override
503
- def supports_explain?
504
- true
505
- end
495
+ def supports_explain?; true end
496
+
497
+ # @override
498
+ def supports_views?; true end
506
499
 
507
500
  def explain(arel, binds = [])
508
501
  sql = "EXPLAIN PLAN FOR #{to_sql(arel, binds)}"
@@ -690,3 +683,9 @@ module ActiveRecord::ConnectionAdapters
690
683
  end
691
684
 
692
685
  end
686
+
687
+ module ArJdbc
688
+ module Oracle
689
+ Column = ::ActiveRecord::ConnectionAdapters::OracleColumn
690
+ end
691
+ end
@@ -8,6 +8,9 @@ module ArJdbc
8
8
 
9
9
  # @private
10
10
  AR4_COMPAT = ::ActiveRecord::VERSION::MAJOR > 3 unless const_defined?(:AR4_COMPAT)
11
+ # @private
12
+ AR42_COMPAT = ::ActiveRecord::VERSION::MAJOR > 4 ||
13
+ ( ::ActiveRecord::VERSION::MAJOR == 4 && ::ActiveRecord::VERSION::MINOR >= 2 )
11
14
 
12
15
  require 'arjdbc/postgresql/column'
13
16
  require 'arjdbc/postgresql/explain_support'
@@ -156,15 +159,12 @@ module ArJdbc
156
159
  when Array
157
160
  case column.sql_type
158
161
  when 'point'
159
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
160
- column_class.point_to_string(value)
162
+ Column.point_to_string(value)
161
163
  when 'json'
162
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
163
- column_class.json_to_string(value)
164
+ Column.json_to_string(value)
164
165
  else
165
166
  return super(value, column) unless column.array?
166
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
167
- column_class.array_to_string(value, column, self)
167
+ Column.array_to_string(value, column, self)
168
168
  end
169
169
  when NilClass
170
170
  if column.array? && array_member
@@ -177,21 +177,17 @@ module ArJdbc
177
177
  when Hash
178
178
  case column.sql_type
179
179
  when 'hstore'
180
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
181
- column_class.hstore_to_string(value)
180
+ Column.hstore_to_string(value)
182
181
  when 'json'
183
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
184
- column_class.json_to_string(value)
182
+ Column.json_to_string(value)
185
183
  else super(value, column)
186
184
  end
187
185
  when IPAddr
188
186
  return super unless column.sql_type == 'inet' || column.sql_type == 'cidr'
189
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
190
- column_class.cidr_to_string(value)
187
+ Column.cidr_to_string(value)
191
188
  when Range
192
189
  return super(value, column) unless /range$/ =~ column.sql_type
193
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
194
- column_class.range_to_string(value)
190
+ Column.range_to_string(value)
195
191
  else
196
192
  super(value, column)
197
193
  end
@@ -238,6 +234,11 @@ module ArJdbc
238
234
  :int8range => { :name => "int8range" },
239
235
  }) if AR4_COMPAT
240
236
 
237
+ NATIVE_DATABASE_TYPES.update(
238
+ :bit => { :name => "bit" },
239
+ :bit_varying => { :name => "bit varying" }
240
+ ) if AR42_COMPAT
241
+
241
242
  def native_database_types
242
243
  NATIVE_DATABASE_TYPES
243
244
  end
@@ -315,21 +316,13 @@ module ArJdbc
315
316
  postgresql_version >= 80200
316
317
  end
317
318
 
318
- def supports_ddl_transactions?
319
- true
320
- end
319
+ def supports_ddl_transactions?; true end
321
320
 
322
- def supports_transaction_isolation?
323
- true
324
- end
321
+ def supports_transaction_isolation?; true end
325
322
 
326
- def supports_index_sort_order?
327
- true
328
- end
323
+ def supports_index_sort_order?; true end
329
324
 
330
- def supports_partial_index?
331
- true
332
- end if AR4_COMPAT
325
+ def supports_partial_index?; true end if AR4_COMPAT
333
326
 
334
327
  # Range data-types weren't introduced until PostgreSQL 9.2.
335
328
  def supports_ranges?
@@ -340,12 +333,13 @@ module ArJdbc
340
333
  true
341
334
  end
342
335
 
336
+ # @override
337
+ def supports_views?; true end
338
+
343
339
  # NOTE: handled by JdbcAdapter we override only to have save-point in logs :
344
340
 
345
341
  # @override
346
- def supports_savepoints?
347
- true
348
- end
342
+ def supports_savepoints?; true end
349
343
 
350
344
  # @override
351
345
  def create_savepoint(name = current_savepoint_name(true))
@@ -832,43 +826,51 @@ module ArJdbc
832
826
  sql_type && sql_type[0, 3] == 'bit' ? quote_bit(value) : super
833
827
  when Array
834
828
  if AR4_COMPAT && column.array? # will be always falsy in AR < 4.0
835
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
836
- "'#{column_class.array_to_string(value, column, self).gsub(/'/, "''")}'"
829
+ "'#{Column.array_to_string(value, column, self).gsub(/'/, "''")}'"
837
830
  elsif column.type == :json # only in AR-4.0
838
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
839
- super(column_class.json_to_string(value), column)
831
+ super(Column.json_to_string(value), column)
840
832
  elsif column.type == :point # only in AR-4.0
841
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
842
- super(column_class.point_to_string(value), column)
833
+ super(Column.point_to_string(value), column)
843
834
  else super
844
835
  end
845
836
  when Hash
846
837
  if column.type == :hstore # only in AR-4.0
847
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
848
- super(column_class.hstore_to_string(value), column)
838
+ super(Column.hstore_to_string(value), column)
849
839
  elsif column.type == :json # only in AR-4.0
850
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
851
- super(column_class.json_to_string(value), column)
840
+ super(Column.json_to_string(value), column)
852
841
  else super
853
842
  end
854
843
  when Range
855
844
  sql_type = column.respond_to?(:sql_type) && column.sql_type
856
845
  if sql_type && sql_type[-5, 5] == 'range' && AR4_COMPAT
857
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
858
- escaped = quote_string(column_class.range_to_string(value))
846
+ escaped = quote_string(Column.range_to_string(value))
859
847
  "'#{escaped}'::#{sql_type}"
860
848
  else super
861
849
  end
862
850
  when IPAddr
863
851
  if column.type == :inet || column.type == :cidr # only in AR-4.0
864
- column_class = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
865
- super(column_class.cidr_to_string(value), column)
852
+ super(Column.cidr_to_string(value), column)
866
853
  else super
867
854
  end
868
855
  else
869
856
  super
870
857
  end
871
- end
858
+ end unless AR42_COMPAT
859
+
860
+ def quote(value, column = nil)
861
+ return super unless column
862
+
863
+ case value
864
+ when Float
865
+ if value.infinite? || value.nan?
866
+ "'#{value.to_s}'"
867
+ else
868
+ super
869
+ end
870
+ else
871
+ super
872
+ end
873
+ end if AR42_COMPAT
872
874
 
873
875
  # Quotes a string, escaping any ' (single quote) and \ (backslash) chars.
874
876
  # @return [String]
@@ -897,7 +899,7 @@ module ArJdbc
897
899
 
898
900
  def quote_bit(value)
899
901
  "B'#{value}'"
900
- end if PostgreSQL::AR4_COMPAT
902
+ end if AR4_COMPAT
901
903
 
902
904
  def escape_bytea(string)
903
905
  return unless string
@@ -1002,7 +1004,7 @@ module ArJdbc
1002
1004
 
1003
1005
  change_column_default(table_name, column_name, default) if options_include_default?(options)
1004
1006
  change_column_null(table_name, column_name, false, default) if notnull
1005
- end if ActiveRecord::VERSION::MAJOR < 4
1007
+ end if ::ActiveRecord::VERSION::MAJOR < 4
1006
1008
 
1007
1009
  # Changes the column of a table.
1008
1010
  def change_column(table_name, column_name, type, options = {})
@@ -1077,7 +1079,7 @@ module ArJdbc
1077
1079
 
1078
1080
  # Returns the list of all column definitions for a table.
1079
1081
  def columns(table_name, name = nil)
1080
- klass = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
1082
+ pass_cast_type = respond_to?(:lookup_cast_type)
1081
1083
  column_definitions(table_name).map do |row|
1082
1084
  # name, type, default, notnull, oid, fmod
1083
1085
  name = row[0]; type = row[1]; default = row[2]
@@ -1091,7 +1093,12 @@ module ArJdbc
1091
1093
  elsif default =~ /^\(([-+]?[\d\.]+)\)$/ # e.g. "(-1)" for a negative default
1092
1094
  default = $1
1093
1095
  end
1094
- klass.new(name, default, oid, type, ! notnull, fmod, self)
1096
+ if pass_cast_type
1097
+ cast_type = lookup_cast_type(type)
1098
+ Column.new(name, default, cast_type, type, ! notnull, fmod, self)
1099
+ else
1100
+ Column.new(name, default, oid, type, ! notnull, fmod, self)
1101
+ end
1095
1102
  end
1096
1103
  end
1097
1104
 
@@ -1121,44 +1128,55 @@ module ArJdbc
1121
1128
  end
1122
1129
  private :column_definitions
1123
1130
 
1131
+ # @private
1132
+ TABLES_SQL = 'SELECT tablename FROM pg_tables WHERE schemaname = ANY (current_schemas(false))'
1133
+
1124
1134
  def tables(name = nil)
1125
- select_values(<<-SQL, 'SCHEMA')
1126
- SELECT tablename
1127
- FROM pg_tables
1128
- WHERE schemaname = ANY (current_schemas(false))
1129
- SQL
1135
+ select_values(TABLES_SQL, 'SCHEMA')
1130
1136
  end
1131
1137
 
1138
+ # @private
1139
+ TABLE_EXISTS_SQL_PREFIX = 'SELECT COUNT(*) as table_count FROM pg_class c'
1140
+ TABLE_EXISTS_SQL_PREFIX << ' LEFT JOIN pg_namespace n ON n.oid = c.relnamespace'
1141
+ if AR42_COMPAT # -- (r)elation/table, (v)iew, (m)aterialized view
1142
+ TABLE_EXISTS_SQL_PREFIX << " WHERE c.relkind IN ('r','v','m')"
1143
+ else
1144
+ TABLE_EXISTS_SQL_PREFIX << " WHERE c.relkind IN ('r','v')"
1145
+ end
1146
+ TABLE_EXISTS_SQL_PREFIX << " AND c.relname = ?"
1147
+
1148
+ # Returns true if table exists.
1149
+ # If the schema is not specified as part of +name+ then it will only find tables within
1150
+ # the current schema search path (regardless of permissions to access tables in other schemas)
1132
1151
  def table_exists?(name)
1133
1152
  schema, table = extract_schema_and_table(name.to_s)
1134
- return false unless table # abstract classes - nil table name
1135
-
1136
- binds = [[ nil, table.gsub(/(^"|"$)/,'') ]]
1137
- binds << [ nil, schema ] if schema
1138
- sql = <<-SQL
1139
- SELECT COUNT(*) as table_count
1140
- FROM pg_tables
1141
- WHERE tablename = ?
1142
- AND schemaname = #{schema ? "?" : "ANY (current_schemas(false))"}
1143
- SQL
1153
+ return false unless table
1154
+
1155
+ binds = [[nil, table]]
1156
+ binds << [nil, schema] if schema
1157
+
1158
+ sql = "#{TABLE_EXISTS_SQL_PREFIX} AND n.nspname = #{schema ? "?" : 'ANY (current_schemas(false))'}"
1144
1159
 
1145
1160
  log(sql, 'SCHEMA', binds) do
1146
- @connection.execute_query_raw(sql, binds).first["table_count"] > 0
1161
+ @connection.execute_query_raw(sql, binds).first['table_count'] > 0
1147
1162
  end
1148
1163
  end
1149
1164
 
1165
+ def index_name_exists?(table_name, index_name, default)
1166
+ exec_query(<<-SQL, 'SCHEMA').rows.first[0].to_i > 0
1167
+ SELECT COUNT(*)
1168
+ FROM pg_class t
1169
+ INNER JOIN pg_index d ON t.oid = d.indrelid
1170
+ INNER JOIN pg_class i ON d.indexrelid = i.oid
1171
+ WHERE i.relkind = 'i'
1172
+ AND i.relname = '#{index_name}'
1173
+ AND t.relname = '#{table_name}'
1174
+ AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) )
1175
+ SQL
1176
+ end if AR42_COMPAT
1177
+
1150
1178
  # @private
1151
1179
  IndexDefinition = ::ActiveRecord::ConnectionAdapters::IndexDefinition
1152
- if ActiveRecord::VERSION::MAJOR < 3 ||
1153
- ( ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1 )
1154
- # NOTE: make sure we accept 6 arguments (>= 3.2) as well as 5 (<= 3.1) :
1155
- # allow 6 on 3.1 : Struct.new(:table, :name, :unique, :columns, :lengths)
1156
- IndexDefinition.class_eval do
1157
- def initialize(table, name, unique = nil, columns = nil, lengths = nil, orders = nil)
1158
- super(table, name, unique, columns, lengths) # @see {#indexes}
1159
- end
1160
- end
1161
- end
1162
1180
 
1163
1181
  # Returns an array of indexes for the given table.
1164
1182
  def indexes(table_name, name = nil)
@@ -1169,9 +1187,9 @@ module ArJdbc
1169
1187
  INNER JOIN pg_index d ON t.oid = d.indrelid
1170
1188
  INNER JOIN pg_class i ON d.indexrelid = i.oid
1171
1189
  WHERE i.relkind = 'i'
1172
- AND d.indisprimary = 'f'
1173
- AND t.relname = '#{table_name}'
1174
- AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) )
1190
+ AND d.indisprimary = 'f'
1191
+ AND t.relname = '#{table_name}'
1192
+ AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) )
1175
1193
  ORDER BY i.relname
1176
1194
  SQL
1177
1195
 
@@ -1198,13 +1216,13 @@ module ArJdbc
1198
1216
  desc_order_columns = inddef.scan(/(\w+) DESC/).flatten
1199
1217
  orders = desc_order_columns.any? ? Hash[ desc_order_columns.map { |column| [column, :desc] } ] : {}
1200
1218
 
1201
- if ActiveRecord::VERSION::MAJOR > 3 # AR4 supports `where` and `using` index options
1219
+ if ::ActiveRecord::VERSION::MAJOR > 3 # AR4 supports `where` and `using` index options
1202
1220
  where = inddef.scan(/WHERE (.+)$/).flatten[0]
1203
1221
  using = inddef.scan(/USING (.+?) /).flatten[0].to_sym
1204
1222
 
1205
1223
  IndexDefinition.new(table_name, index_name, unique, column_names, [], orders, where, nil, using)
1206
1224
  else
1207
- IndexDefinition.new(table_name, index_name, unique, column_names, [], orders)
1225
+ new_index_definition(table_name, index_name, unique, column_names, [], orders)
1208
1226
  end
1209
1227
  end
1210
1228
  end
@@ -1212,6 +1230,16 @@ module ArJdbc
1212
1230
  result
1213
1231
  end
1214
1232
 
1233
+ # @private
1234
+ def column_name_for_operation(operation, node)
1235
+ case operation
1236
+ when 'maximum' then 'max'
1237
+ when 'minimum' then 'min'
1238
+ when 'average' then 'avg'
1239
+ else operation.downcase
1240
+ end
1241
+ end if AR42_COMPAT
1242
+
1215
1243
  private
1216
1244
 
1217
1245
  def translate_exception(exception, message)
@@ -1225,20 +1253,12 @@ module ArJdbc
1225
1253
  end
1226
1254
  end
1227
1255
 
1228
- # Extracts the table and schema name from +name+
1256
+ # @private `Utils.extract_schema_and_table` from AR
1229
1257
  def extract_schema_and_table(name)
1230
- schema, table = name.split('.', 2)
1231
-
1232
- unless table # A table was provided without a schema
1233
- table = schema
1234
- schema = nil
1235
- end
1236
-
1237
- if name =~ /^"/ # Handle quoted table names
1238
- table = name
1239
- schema = nil
1240
- end
1241
- [schema, table]
1258
+ result = name.scan(/[^".\s]+|"[^"]*"/)[0, 2]
1259
+ result.each { |m| m.gsub!(/(^"|"$)/, '') }
1260
+ result.unshift(nil) if result.size == 1 # schema == nil
1261
+ result # [schema, table]
1242
1262
  end
1243
1263
 
1244
1264
  def extract_pg_identifier_from_name(name)
@@ -1321,8 +1341,8 @@ module ActiveRecord::ConnectionAdapters
1321
1341
 
1322
1342
  @table_alias_length = nil
1323
1343
 
1324
- @use_insert_returning = config.key?(:insert_returning) ?
1325
- self.class.type_cast_config_to_boolean(config[:insert_returning]) : nil
1344
+ @use_insert_returning = @config.key?(:insert_returning) ?
1345
+ self.class.type_cast_config_to_boolean(@config[:insert_returning]) : nil
1326
1346
  end
1327
1347
 
1328
1348
  class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition
@@ -1392,6 +1412,18 @@ module ActiveRecord::ConnectionAdapters
1392
1412
  def json(name, options = {})
1393
1413
  column(name, 'json', options)
1394
1414
  end
1415
+
1416
+ def jsonb(name, options = {})
1417
+ column(name, :jsonb, options)
1418
+ end
1419
+
1420
+ def bit(name, options)
1421
+ column(name, 'bit', options)
1422
+ end
1423
+
1424
+ def bit_varying(name, options)
1425
+ column(name, 'bit varying', options)
1426
+ end
1395
1427
  end
1396
1428
 
1397
1429
  class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
@@ -1402,7 +1434,7 @@ module ActiveRecord::ConnectionAdapters
1402
1434
  options[:default] = options.fetch(:default, 'uuid_generate_v4()')
1403
1435
  options[:primary_key] = true
1404
1436
  column name, type, options
1405
- end if ActiveRecord::VERSION::MAJOR > 3 # 3.2 super expects (name)
1437
+ end if ::ActiveRecord::VERSION::MAJOR > 3 # 3.2 super expects (name)
1406
1438
 
1407
1439
  def column(name, type = nil, options = {})
1408
1440
  super
@@ -1416,7 +1448,7 @@ module ActiveRecord::ConnectionAdapters
1416
1448
 
1417
1449
  private
1418
1450
 
1419
- if ActiveRecord::VERSION::MAJOR > 3
1451
+ if ::ActiveRecord::VERSION::MAJOR > 3
1420
1452
 
1421
1453
  def create_column_definition(name, type)
1422
1454
  ColumnDefinition.new name, type
@@ -1445,7 +1477,7 @@ module ActiveRecord::ConnectionAdapters
1445
1477
 
1446
1478
  def update_table_definition(table_name, base)
1447
1479
  Table.new(table_name, base)
1448
- end if ActiveRecord::VERSION::MAJOR > 3
1480
+ end if ::ActiveRecord::VERSION::MAJOR > 3
1449
1481
 
1450
1482
  def jdbc_connection_class(spec)
1451
1483
  ::ArJdbc::PostgreSQL.jdbc_connection_class
@@ -1456,10 +1488,16 @@ module ActiveRecord::ConnectionAdapters
1456
1488
  ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
1457
1489
  end
1458
1490
 
1459
- if ActiveRecord::VERSION::MAJOR < 4 # Rails 3.x compatibility
1491
+ if ::ActiveRecord::VERSION::MAJOR < 4 # Rails 3.x compatibility
1460
1492
  PostgreSQLJdbcConnection.raw_array_type = true if PostgreSQLJdbcConnection.raw_array_type? == nil
1461
1493
  PostgreSQLJdbcConnection.raw_hstore_type = true if PostgreSQLJdbcConnection.raw_hstore_type? == nil
1462
1494
  end
1463
1495
 
1464
1496
  end
1465
1497
  end
1498
+
1499
+ module ArJdbc
1500
+ module PostgreSQL
1501
+ Column = ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn
1502
+ end
1503
+ end