Module: ArJdbc::PostgreSQL
- Included in:
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- Defined in:
- lib/arjdbc/postgresql/adapter.rb,
lib/arjdbc/postgresql/column.rb,
lib/arjdbc/postgresql/oid_types.rb
Overview
Strives to provide Rails built-in PostgreSQL adapter (API) compatibility.
Defined Under Namespace
Classes: ArjdbcTypeMapInitializer
Constant Summary collapse
- ADAPTER_NAME =
'PostgreSQL'.freeze
- NATIVE_DATABASE_TYPES =
{ primary_key: 'bigserial primary key', bigint: { name: 'bigint' }, binary: { name: 'bytea' }, bit: { name: 'bit' }, bit_varying: { name: 'bit varying' }, boolean: { name: 'boolean' }, box: { name: 'box' }, char: { name: 'char' }, cidr: { name: 'cidr' }, circle: { name: 'circle' }, citext: { name: 'citext' }, date: { name: 'date' }, daterange: { name: 'daterange' }, datetime: { name: 'timestamp' }, decimal: { name: 'decimal' }, # :limit => 1000 float: { name: 'float' }, hstore: { name: 'hstore' }, inet: { name: 'inet' }, int4range: { name: 'int4range' }, int8range: { name: 'int8range' }, integer: { name: 'integer' }, interval: { name: 'interval' }, # This doesn't get added to AR's postgres adapter until 5.1 but it fixes broken tests in 5.0 ... json: { name: 'json' }, jsonb: { name: 'jsonb' }, line: { name: 'line' }, lseg: { name: 'lseg' }, ltree: { name: 'ltree' }, macaddr: { name: 'macaddr' }, money: { name: 'money' }, numeric: { name: 'numeric' }, numrange: { name: 'numrange' }, oid: { name: 'oid' }, path: { name: 'path' }, point: { name: 'point' }, polygon: { name: 'polygon' }, string: { name: 'character varying' }, text: { name: 'text' }, time: { name: 'time' }, timestamp: { name: 'timestamp' }, tsrange: { name: 'tsrange' }, tstzrange: { name: 'tstzrange' }, tsvector: { name: 'tsvector' }, uuid: { name: 'uuid' }, xml: { name: 'xml' } }
Class Method Summary collapse
Instance Method Summary collapse
- #adapter_name ⇒ Object
-
#add_order_by_for_association_limiting!(sql, options) ⇒ Object
ORDER BY clause for the passed order option.
- #all_schemas ⇒ Object
-
#clear_cache! ⇒ Object
We need to make sure to deallocate all the prepared statements since apparently calling close on the statement object doesn't always free the server resources and calling 'DISCARD ALL' fails if we are inside a transaction.
-
#client_min_messages ⇒ Object
Returns the current client message level.
-
#client_min_messages=(level) ⇒ Object
Set the client message level.
-
#configure_connection ⇒ Object
Configures the encoding, verbosity, schema search path, and time zone of the connection.
-
#default_index_type?(index) ⇒ Boolean
From AR 5.1 postgres_adapter.rb.
-
#default_sequence_name(table_name, pk = "id") ⇒ Object
:nodoc:.
- #disable_extension(name) ⇒ Object
- #enable_extension(name) ⇒ Object
- #escape_bytea(string) ⇒ Object
- #exec_insert(sql, name, binds, pk = nil, sequence_name = nil) ⇒ Object
- #explain(arel, binds = []) ⇒ Object
- #extension_enabled?(name) ⇒ Boolean
- #extensions ⇒ Object
-
#get_advisory_lock(lock_id) ⇒ Object
Came from postgres_adapter.
- #index_algorithms ⇒ Object
- #jdbc_column_class ⇒ Object
- #last_insert_id_result(sequence_name) ⇒ Object
-
#max_identifier_length ⇒ Object
(also: #table_alias_length, #index_name_length)
Returns the max identifier length supported by PostgreSQL.
- #native_database_types ⇒ Object
- #postgresql_version ⇒ Object
- #quote_table_name(name) ⇒ Object
-
#release_advisory_lock(lock_id) ⇒ Object
Came from postgres_adapter.
-
#remove_column(table_name, column_name, type = nil, options = {}) ⇒ Object
Need to clear the cache even though the AR adapter doesn't for some reason.
- #reset! ⇒ Object
-
#session_auth=(user) ⇒ Object
Set the authorized user for this session.
- #set_client_encoding(encoding) ⇒ Object
-
#set_standard_conforming_strings ⇒ Object
Enable standard-conforming strings if available.
-
#standard_conforming_strings=(enable) ⇒ Object
Enable standard-conforming strings if available.
- #standard_conforming_strings? ⇒ Boolean
- #supports_advisory_locks? ⇒ Boolean
- #supports_bulk_alter? ⇒ Boolean
- #supports_comments? ⇒ Boolean
- #supports_datetime_with_precision? ⇒ Boolean
- #supports_ddl_transactions? ⇒ Boolean
- #supports_explain? ⇒ Boolean
- #supports_expression_index? ⇒ Boolean
- #supports_extensions? ⇒ Boolean
- #supports_foreign_keys? ⇒ Boolean
-
#supports_foreign_tables? ⇒ Boolean
we don't really support this yet, its a reminder :).
- #supports_hex_escaped_bytea? ⇒ Boolean
- #supports_index_sort_order? ⇒ Boolean
- #supports_insert_with_returning? ⇒ Boolean
- #supports_json? ⇒ Boolean
- #supports_materialized_views? ⇒ Boolean
- #supports_partial_index? ⇒ Boolean
- #supports_pgcrypto_uuid? ⇒ Boolean
-
#supports_ranges? ⇒ Boolean
Range data-types weren't introduced until PostgreSQL 9.2.
- #supports_savepoints? ⇒ Boolean
-
#supports_standard_conforming_strings? ⇒ Boolean
Does PostgreSQL support standard conforming strings?.
- #supports_transaction_isolation? ⇒ Boolean
- #supports_validate_constraints? ⇒ Boolean
- #supports_views? ⇒ Boolean
- #truncate(table_name, name = nil) ⇒ Object
- #use_insert_returning? ⇒ Boolean
- #valid_type?(type) ⇒ Boolean
Class Method Details
.jdbc_connection_class ⇒ Object
38 39 40 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 38 def self.jdbc_connection_class ::ActiveRecord::ConnectionAdapters::PostgreSQLJdbcConnection end |
Instance Method Details
#adapter_name ⇒ Object
47 48 49 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 47 def adapter_name ADAPTER_NAME end |
#add_order_by_for_association_limiting!(sql, options) ⇒ Object
ORDER BY clause for the passed order option.
PostgreSQL does not allow arbitrary ordering when using DISTINCT ON, so we work around this by wrapping the SQL as a sub-select and ordering in that query.
452 453 454 455 456 457 458 459 460 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 452 def add_order_by_for_association_limiting!(sql, ) return sql if [:order].blank? order = [:order].split(',').collect { |s| s.strip }.reject(&:blank?) order.map! { |s| 'DESC' if s =~ /\bdesc$/i } order = order.zip((0...order.size).to_a).map { |s,i| "id_list.alias_#{i} #{s}" }.join(', ') sql.replace "SELECT * FROM (#{sql}) AS id_list ORDER BY #{order}" end |
#all_schemas ⇒ Object
430 431 432 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 430 def all_schemas select('SELECT nspname FROM pg_namespace').map { |row| row["nspname"] } end |
#clear_cache! ⇒ Object
We need to make sure to deallocate all the prepared statements since apparently calling close on the statement object doesn't always free the server resources and calling 'DISCARD ALL' fails if we are inside a transaction
406 407 408 409 410 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 406 def clear_cache! super # Make sure all query plans are *really* gone @connection.execute 'DEALLOCATE ALL' if active? end |
#client_min_messages ⇒ Object
Returns the current client message level.
435 436 437 438 439 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 435 def return nil if redshift? # not supported on Redshift # Need to use #execute so we don't try to access the type map before it is initialized execute('SHOW client_min_messages', 'SCHEMA').values.first.first end |
#client_min_messages=(level) ⇒ Object
Set the client message level.
442 443 444 445 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 442 def (level) # Not supported on Redshift redshift? ? nil : super end |
#configure_connection ⇒ Object
Configures the encoding, verbosity, schema search path, and time zone of the connection.
This is called on connection.connect and should not be called manually.
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 109 def configure_connection #if encoding = config[:encoding] # The client_encoding setting is set by the driver and should not be altered. # If the driver detects a change it will abort the connection. # see http://jdbc.postgresql.org/documentation/91/connect.html # self.set_client_encoding(encoding) #end self. = config[:min_messages] || 'warning' self.schema_search_path = config[:schema_search_path] || config[:schema_order] # Use standard-conforming strings if available so we don't have to do the E'...' dance. set_standard_conforming_strings # If using Active Record's time zone support configure the connection to return # TIMESTAMP WITH ZONE types in UTC. # (SET TIME ZONE does not use an equals sign like other SET variables) if ActiveRecord::Base.default_timezone == :utc execute("SET time zone 'UTC'", 'SCHEMA') elsif tz = local_tz execute("SET time zone '#{tz}'", 'SCHEMA') end unless redshift? # SET statements from :variables config hash # http://www.postgresql.org/docs/8.3/static/sql-set.html (config[:variables] || {}).map do |k, v| if v == ':default' || v == :default # Sets the value to the global or compile default execute("SET SESSION #{k} TO DEFAULT", 'SCHEMA') elsif ! v.nil? execute("SET SESSION #{k} TO #{quote(v)}", 'SCHEMA') end end end |
#default_index_type?(index) ⇒ Boolean
From AR 5.1 postgres_adapter.rb
305 306 307 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 305 def default_index_type?(index) # :nodoc: index.using == :btree || super end |
#default_sequence_name(table_name, pk = "id") ⇒ Object
:nodoc:
420 421 422 423 424 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 420 def default_sequence_name(table_name, pk = "id") #:nodoc: serial_sequence(table_name, pk) rescue ActiveRecord::StatementInvalid %Q("#{table_name}_#{pk}_seq") end |
#disable_extension(name) ⇒ Object
313 314 315 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 313 def disable_extension(name) execute("DROP EXTENSION IF EXISTS \"#{name}\" CASCADE") end |
#enable_extension(name) ⇒ Object
309 310 311 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 309 def enable_extension(name) execute("CREATE EXTENSION IF NOT EXISTS \"#{name}\"") end |
#escape_bytea(string) ⇒ Object
quote_string implemented as native
464 465 466 467 468 469 470 471 472 473 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 464 def escape_bytea(string) return unless string if supports_hex_escaped_bytea? "\\x#{string.unpack("H*")[0]}" else result = '' string.each_byte { |c| result << sprintf('\\\\%03o', c) } result end end |
#exec_insert(sql, name, binds, pk = nil, sequence_name = nil) ⇒ Object
367 368 369 370 371 372 373 374 375 376 377 378 379 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 367 def exec_insert(sql, name, binds, pk = nil, sequence_name = nil) val = super if !use_insert_returning? && pk unless sequence_name table_ref = extract_table_ref_from_insert_sql(sql) sequence_name = default_sequence_name(table_ref, pk) return val unless sequence_name end last_insert_id_result(sequence_name) else val end end |
#explain(arel, binds = []) ⇒ Object
381 382 383 384 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 381 def explain(arel, binds = []) sql, binds = to_sql_and_binds(arel, binds) ActiveRecord::ConnectionAdapters::PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query("EXPLAIN #{sql}", 'EXPLAIN', binds)) end |
#extension_enabled?(name) ⇒ Boolean
317 318 319 320 321 322 323 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 317 def extension_enabled?(name) if supports_extensions? rows = select_rows("SELECT EXISTS(SELECT * FROM pg_available_extensions WHERE name = '#{name}' AND installed_version IS NOT NULL)", 'SCHEMA') available = rows.first.first # true/false or 't'/'f' available == true || available == 't' end end |
#extensions ⇒ Object
325 326 327 328 329 330 331 332 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 325 def extensions if supports_extensions? rows = select_rows "SELECT extname from pg_extension", "SCHEMA" rows.map { |row| row.first } else [] end end |
#get_advisory_lock(lock_id) ⇒ Object
Came from postgres_adapter
345 346 347 348 349 350 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 345 def get_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "Postgres requires advisory lock ids to be a signed 64 bit integer") end select_value("SELECT pg_try_advisory_lock(#{lock_id});") end |
#index_algorithms ⇒ Object
334 335 336 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 334 def index_algorithms { :concurrently => 'CONCURRENTLY' } end |
#jdbc_column_class ⇒ Object
43 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 43 def jdbc_column_class; ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn end |
#last_insert_id_result(sequence_name) ⇒ Object
426 427 428 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 426 def last_insert_id_result(sequence_name) exec_query("SELECT currval('#{sequence_name}')", 'SQL') end |
#max_identifier_length ⇒ Object Also known as: table_alias_length, index_name_length
Returns the max identifier length supported by PostgreSQL
361 362 363 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 361 def max_identifier_length @max_identifier_length ||= select_one('SHOW max_identifier_length', 'SCHEMA'.freeze)['max_identifier_length'].to_i end |
#native_database_types ⇒ Object
193 194 195 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 193 def native_database_types NATIVE_DATABASE_TYPES end |
#postgresql_version ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 51 def postgresql_version @postgresql_version ||= begin version = @connection.database_product if match = version.match(/([\d\.]*\d).*?/) version = match[1].split('.').map(&:to_i) # PostgreSQL version representation does not have more than 4 digits # From version 10 onwards, PG has changed its versioning policy to # limit it to only 2 digits. i.e. in 10.x, 10 being the major # version and x representing the patch release # Refer to: # https://www.postgresql.org/support/versioning/ # https://www.postgresql.org/docs/10/static/libpq-status.html -> PQserverVersion() # for more info if version.size >= 3 (version[0] * 100 + version[1]) * 100 + version[2] elsif version.size == 2 if version[0] >= 10 version[0] * 100 * 100 + version[1] else (version[0] * 100 + version[1]) * 100 end elsif version.size == 1 version[0] * 100 * 100 else 0 end else 0 end end end |
#quote_table_name(name) ⇒ Object
476 477 478 479 480 481 482 483 484 485 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 476 def quote_table_name(name) schema, name_part = extract_pg_identifier_from_name(name.to_s) unless name_part quote_column_name(schema) else table_name, name_part = extract_pg_identifier_from_name(name_part) "#{quote_column_name(schema)}.#{quote_column_name(table_name)}" end end |
#release_advisory_lock(lock_id) ⇒ Object
Came from postgres_adapter
353 354 355 356 357 358 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 353 def release_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "Postgres requires advisory lock ids to be a signed 64 bit integer") end select_value("SELECT pg_advisory_unlock(#{lock_id})") end |
#remove_column(table_name, column_name, type = nil, options = {}) ⇒ Object
Need to clear the cache even though the AR adapter doesn't for some reason
491 492 493 494 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 491 def remove_column(table_name, column_name, type = nil, = {}) super clear_cache! end |
#reset! ⇒ Object
412 413 414 415 416 417 418 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 412 def reset! clear_cache! reset_transaction @connection.rollback # Have to deal with rollbacks differently than the AR adapter @connection.execute 'DISCARD ALL' @connection.configure_connection end |
#session_auth=(user) ⇒ Object
Set the authorized user for this session.
339 340 341 342 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 339 def session_auth=(user) clear_cache! execute "SET SESSION AUTHORIZATION #{user}" end |
#set_client_encoding(encoding) ⇒ Object
102 103 104 105 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 102 def set_client_encoding(encoding) ActiveRecord::Base.logger.warn "client_encoding is set by the driver and should not be altered, ('#{encoding}' ignored)" ActiveRecord::Base.logger.debug "Set the 'allowEncodingChanges' driver property (e.g. using config[:properties]) if you need to override the client encoding when doing a copy." end |
#set_standard_conforming_strings ⇒ Object
Enable standard-conforming strings if available.
202 203 204 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 202 def set_standard_conforming_strings self.standard_conforming_strings=(true) end |
#standard_conforming_strings=(enable) ⇒ Object
Enable standard-conforming strings if available.
207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 207 def standard_conforming_strings=(enable) = self. begin self. = 'panic' value = enable ? "on" : "off" execute("SET standard_conforming_strings = #{value}", 'SCHEMA') @standard_conforming_strings = ( value == "on" ) rescue @standard_conforming_strings = :unsupported ensure self. = end end |
#standard_conforming_strings? ⇒ Boolean
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 221 def standard_conforming_strings? if @standard_conforming_strings.nil? = self. begin self. = 'panic' value = select_one('SHOW standard_conforming_strings', 'SCHEMA')['standard_conforming_strings'] @standard_conforming_strings = ( value == "on" ) rescue @standard_conforming_strings = :unsupported ensure self. = end end @standard_conforming_strings == true # return false if :unsupported end |
#supports_advisory_locks? ⇒ Boolean
239 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 239 def supports_advisory_locks?; true end |
#supports_bulk_alter? ⇒ Boolean
259 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 259 def supports_bulk_alter?; true end |
#supports_comments? ⇒ Boolean
263 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 263 def supports_comments?; true end |
#supports_datetime_with_precision? ⇒ Boolean
261 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 261 def supports_datetime_with_precision?; true end |
#supports_ddl_transactions? ⇒ Boolean
237 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 237 def supports_ddl_transactions?; true end |
#supports_explain? ⇒ Boolean
241 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 241 def supports_explain?; true end |
#supports_expression_index? ⇒ Boolean
243 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 243 def supports_expression_index?; true end |
#supports_extensions? ⇒ Boolean
300 301 302 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 300 def supports_extensions? postgresql_version >= 90200 end |
#supports_foreign_keys? ⇒ Boolean
245 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 245 def supports_foreign_keys?; true end |
#supports_foreign_tables? ⇒ Boolean
we don't really support this yet, its a reminder :)
271 272 273 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 271 def supports_foreign_tables? # we don't really support this yet, its a reminder :) postgresql_version >= 90300 end |
#supports_hex_escaped_bytea? ⇒ Boolean
275 276 277 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 275 def supports_hex_escaped_bytea? postgresql_version >= 90000 end |
#supports_index_sort_order? ⇒ Boolean
249 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 249 def supports_index_sort_order?; true end |
#supports_insert_with_returning? ⇒ Boolean
287 288 289 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 287 def supports_insert_with_returning? postgresql_version >= 80200 end |
#supports_json? ⇒ Boolean
283 284 285 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 283 def supports_json? postgresql_version >= 90200 end |
#supports_materialized_views? ⇒ Boolean
279 280 281 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 279 def supports_materialized_views? postgresql_version >= 90300 end |
#supports_partial_index? ⇒ Boolean
251 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 251 def supports_partial_index?; true end |
#supports_pgcrypto_uuid? ⇒ Boolean
291 292 293 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 291 def supports_pgcrypto_uuid? postgresql_version >= 90400 end |
#supports_ranges? ⇒ Boolean
Range data-types weren't introduced until PostgreSQL 9.2.
296 297 298 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 296 def supports_ranges? postgresql_version >= 90200 end |
#supports_savepoints? ⇒ Boolean
253 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 253 def supports_savepoints?; true end |
#supports_standard_conforming_strings? ⇒ Boolean
Does PostgreSQL support standard conforming strings?
266 267 268 269 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 266 def supports_standard_conforming_strings? standard_conforming_strings? @standard_conforming_strings != :unsupported end |
#supports_transaction_isolation? ⇒ Boolean
255 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 255 def supports_transaction_isolation?; true end |
#supports_validate_constraints? ⇒ Boolean
247 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 247 def supports_validate_constraints?; true end |
#supports_views? ⇒ Boolean
257 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 257 def supports_views?; true end |
#truncate(table_name, name = nil) ⇒ Object
530 531 532 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 530 def truncate(table_name, name = nil) execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name end |
#use_insert_returning? ⇒ Boolean
95 96 97 98 99 100 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 95 def use_insert_returning? if @use_insert_returning.nil? @use_insert_returning = supports_insert_with_returning? end @use_insert_returning end |
#valid_type?(type) ⇒ Boolean
197 198 199 |
# File 'lib/arjdbc/postgresql/adapter.rb', line 197 def valid_type?(type) !native_database_types[type].nil? end |