Class: ActiveRecord::ConnectionAdapters::CipherStashPGAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- ActiveRecord::ConnectionAdapters::CipherStashPGAdapter
- Includes:
- ActiveRecord::ConnectionAdapters::CipherStashPG::DatabaseStatements, ActiveRecord::ConnectionAdapters::CipherStashPG::Quoting, ActiveRecord::ConnectionAdapters::CipherStashPG::ReferentialIntegrity, ActiveRecord::ConnectionAdapters::CipherStashPG::SchemaStatements
- Defined in:
- lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb,
lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb,
lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb
Overview
Active Record PostgreSQL Adapter
The PostgreSQL adapter works with the native C (github.com/ged/ruby-pg) driver.
Options:
-
:host
- Defaults to a Unix-domain socket in /tmp. On machines without Unix-domain sockets, the default is to connect to localhost. -
:port
- Defaults to 5432. -
:username
- Defaults to be the same as the operating system name of the user running the application. -
:password
- Password to be used if the server demands password authentication. -
:database
- Defaults to be the same as the username. -
:schema_search_path
- An optional schema search path for the connection given as a string of comma-separated schema names. This is backward-compatible with the:schema_order
option. -
:encoding
- An optional client encoding that is used in aSET client_encoding TO <encoding>
call on the connection. -
:min_messages
- An optional client min messages that is used in aSET client_min_messages TO <min_messages>
call on the connection. -
:variables
- An optional hash of additional parameters that will be used inSET SESSION key = val
calls on the connection. -
:insert_returning
- An optional boolean to control the use ofRETURNING
forINSERT
statements defaults to true.
Any further options are used as connection parameters to libpq. See www.postgresql.org/docs/current/static/libpq-connect.html for the list of parameters.
In addition, default connection parameters of libpq can be set per environment variables. See www.postgresql.org/docs/current/static/libpq-envars.html .
Defined Under Namespace
Classes: MoneyDecoder, StatementPool
Constant Summary collapse
- ADAPTER_NAME =
"CipherStashPG"
- NATIVE_DATABASE_TYPES =
{ primary_key: "bigserial primary key", string: { name: "character varying" }, text: { name: "text" }, integer: { name: "integer", limit: 4 }, bigint: { name: "bigint" }, float: { name: "float" }, decimal: { name: "decimal" }, datetime: {}, # set dynamically based on datetime_type timestamp: { name: "timestamp" }, timestamptz: { name: "timestamptz" }, time: { name: "time" }, date: { name: "date" }, daterange: { name: "daterange" }, numrange: { name: "numrange" }, tsrange: { name: "tsrange" }, tstzrange: { name: "tstzrange" }, int4range: { name: "int4range" }, int8range: { name: "int8range" }, binary: { name: "bytea" }, boolean: { name: "boolean" }, xml: { name: "xml" }, tsvector: { name: "tsvector" }, hstore: { name: "hstore" }, inet: { name: "inet" }, cidr: { name: "cidr" }, macaddr: { name: "macaddr" }, uuid: { name: "uuid" }, json: { name: "json" }, jsonb: { name: "jsonb" }, ltree: { name: "ltree" }, citext: { name: "citext" }, point: { name: "point" }, line: { name: "line" }, lseg: { name: "lseg" }, box: { name: "box" }, path: { name: "path" }, polygon: { name: "polygon" }, circle: { name: "circle" }, bit: { name: "bit" }, bit_varying: { name: "bit varying" }, money: { name: "money" }, interval: { name: "interval" }, oid: { name: "oid" }, enum: {} # special type https://www.postgresql.org/docs/current/datatype-enum.html }
- OID =
:nodoc:
CipherStashPG::OID
Constants included from ActiveRecord::ConnectionAdapters::CipherStashPG::Quoting
ActiveRecord::ConnectionAdapters::CipherStashPG::Quoting::QUOTED_COLUMN_NAMES, ActiveRecord::ConnectionAdapters::CipherStashPG::Quoting::QUOTED_TABLE_NAMES
Class Method Summary collapse
- .database_exists?(config) ⇒ Boolean
- .dbconsole(config, options = {}) ⇒ Object
-
.initialize_type_map(m) ⇒ Object
:nodoc:.
-
.native_database_types ⇒ Object
:nodoc:.
- .new_client(conn_params) ⇒ Object
Instance Method Summary collapse
-
#active? ⇒ Boolean
Is this connection alive and ready for queries?.
-
#add_enum_value(type_name, value, options = {}) ⇒ Object
Add enum value to an existing enum type.
-
#build_insert_sql(insert) ⇒ Object
:nodoc:.
-
#check_version ⇒ Object
:nodoc:.
-
#create_enum(name, values, **options) ⇒ Object
Given a name and an array of values, creates an enum type.
-
#create_unlogged_tables ⇒ Object
:singleton-method: PostgreSQL allows the creation of “unlogged” tables, which do not record data in the PostgreSQL Write-Ahead Log.
-
#datetime_type ⇒ Object
:singleton-method: PostgreSQL supports multiple types for DateTimes.
-
#default_index_type?(index) ⇒ Boolean
:nodoc:.
-
#disable_extension(name, force: false) ⇒ Object
Removes an extension from the database.
-
#discard! ⇒ Object
:nodoc:.
-
#disconnect! ⇒ Object
Disconnects from the database if already connected.
-
#drop_enum(name, values = nil, **options) ⇒ Object
Drops an enum type.
- #enable_extension(name) ⇒ Object
-
#enum_types ⇒ Object
Returns a list of defined enum types, and their values.
- #extension_available?(name) ⇒ Boolean
- #extension_enabled?(name) ⇒ Boolean
- #extensions ⇒ Object
-
#get_advisory_lock(lock_id) ⇒ Object
:nodoc:.
-
#get_database_version ⇒ Object
Returns the version of the connected PostgreSQL server.
- #index_algorithms ⇒ Object
-
#initialize ⇒ CipherStashPGAdapter
constructor
Initializes and connects a PostgreSQL adapter.
-
#max_identifier_length ⇒ Object
Returns the configured supported identifier length supported by PostgreSQL.
-
#native_database_types ⇒ Object
:nodoc:.
-
#reconnect! ⇒ Object
Close then reopen the connection.
-
#release_advisory_lock(lock_id) ⇒ Object
:nodoc:.
-
#reload_type_map ⇒ Object
:nodoc:.
-
#rename_enum(name, options = {}) ⇒ Object
Rename an existing enum type to something else.
-
#rename_enum_value(type_name, options = {}) ⇒ Object
Rename enum value on an existing enum type.
- #reset! ⇒ Object
-
#return_value_after_insert?(column) ⇒ Boolean
:nodoc:.
-
#session_auth=(user) ⇒ Object
Set the authorized user for this session.
- #set_standard_conforming_strings ⇒ Object
- #supports_advisory_locks? ⇒ Boolean
- #supports_bulk_alter? ⇒ Boolean
- #supports_check_constraints? ⇒ Boolean
- #supports_comments? ⇒ Boolean
- #supports_common_table_expressions? ⇒ Boolean
- #supports_datetime_with_precision? ⇒ Boolean
- #supports_ddl_transactions? ⇒ Boolean
- #supports_deferrable_constraints? ⇒ Boolean
- #supports_exclusion_constraints? ⇒ Boolean
- #supports_explain? ⇒ Boolean
- #supports_expression_index? ⇒ Boolean
- #supports_extensions? ⇒ Boolean
- #supports_foreign_keys? ⇒ Boolean
- #supports_foreign_tables? ⇒ Boolean
- #supports_index_include? ⇒ Boolean
- #supports_index_sort_order? ⇒ Boolean
- #supports_insert_on_conflict? ⇒ Boolean (also: #supports_insert_on_duplicate_skip?, #supports_insert_on_duplicate_update?, #supports_insert_conflict_target?)
- #supports_insert_returning? ⇒ Boolean
- #supports_json? ⇒ Boolean
- #supports_lazy_transactions? ⇒ Boolean
- #supports_materialized_views? ⇒ Boolean
- #supports_nulls_not_distinct? ⇒ Boolean
- #supports_optimizer_hints? ⇒ Boolean
- #supports_partial_index? ⇒ Boolean
- #supports_partitioned_indexes? ⇒ Boolean
- #supports_pgcrypto_uuid? ⇒ Boolean
- #supports_restart_db_transaction? ⇒ Boolean
- #supports_savepoints? ⇒ Boolean
- #supports_transaction_isolation? ⇒ Boolean
- #supports_unique_keys? ⇒ Boolean
- #supports_validate_constraints? ⇒ Boolean
- #supports_views? ⇒ Boolean
- #supports_virtual_columns? ⇒ Boolean
-
#table_name_length ⇒ Object
Returns the maximum length of a table name.
- #use_insert_returning? ⇒ Boolean
Methods included from ActiveRecord::ConnectionAdapters::CipherStashPG::DatabaseStatements
#begin_db_transaction, #begin_isolated_db_transaction, #build_explain_clause, #commit_db_transaction, #exec_delete, #exec_insert, #exec_query, #exec_restart_db_transaction, #exec_rollback_db_transaction, #execute, #explain, #high_precision_current_timestamp, #internal_exec_query, #query, #raw_execute, #write_query?
Methods included from ActiveRecord::ConnectionAdapters::CipherStashPG::SchemaStatements
#add_column, #add_exclusion_constraint, #add_foreign_key, #add_index, #add_index_options, #add_unique_key, #build_change_column_default_definition, #build_change_column_definition, #build_create_index_definition, #change_column, #change_column_comment, #change_column_default, #change_column_null, #change_table_comment, #check_constraints, #client_min_messages, #client_min_messages=, #collation, #columns_for_distinct, #create_database, #create_schema, #create_schema_dumper, #ctype, #current_database, #current_schema, #default_sequence_name, #drop_database, #drop_schema, #drop_table, #encoding, #exclusion_constraint_options, #exclusion_constraints, #foreign_key_column_for, #foreign_keys, #foreign_table_exists?, #foreign_tables, #index_name, #index_name_exists?, #indexes, #pk_and_sequence_for, #primary_keys, #quoted_include_columns_for_index, #recreate_database, #remove_exclusion_constraint, #remove_index, #remove_unique_key, #rename_column, #rename_index, #rename_table, #reset_pk_sequence!, #schema_creation, #schema_exists?, #schema_names, #schema_search_path, #schema_search_path=, #serial_sequence, #set_pk_sequence!, #table_comment, #table_options, #type_to_sql, #unique_key_options, #unique_keys, #update_table_definition, #validate_check_constraint, #validate_constraint, #validate_foreign_key
Methods included from ActiveRecord::ConnectionAdapters::CipherStashPG::ReferentialIntegrity
#all_foreign_keys_valid?, #check_all_foreign_keys_valid!, #disable_referential_integrity
Methods included from ActiveRecord::ConnectionAdapters::CipherStashPG::Quoting
#check_int_in_range, #column_name_matcher, #column_name_with_order_matcher, #escape_bytea, #lookup_cast_type_from_column, #quote, #quote_column_name, #quote_default_expression, #quote_schema_name, #quote_string, #quote_table_name, #quote_table_name_for_assignment, #quoted_binary, #quoted_date, #type_cast, #unescape_bytea
Constructor Details
#initialize ⇒ CipherStashPGAdapter
Initializes and connects a PostgreSQL adapter.
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 229 def initialize(connection, logger, connection_parameters, config) super(connection, logger, config) @connection_parameters = connection_parameters || {} # @local_tz is initialized as nil to avoid warnings when connect tries to use it @local_tz = nil @max_identifier_length = nil configure_connection add_pg_encoders add_pg_decoders @type_map = Type::HashLookupTypeMap.new initialize_type_map @local_tz = execute("SHOW TIME ZONE", "SCHEMA").first["TimeZone"] @use_insert_returning = @config.key?(:insert_returning) ? self.class.type_cast_config_to_boolean(@config[:insert_returning]) : true end |
Class Method Details
.database_exists?(config) ⇒ Boolean
248 249 250 251 252 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 248 def self.database_exists?(config) !!ActiveRecord::Base.postgres_cipherstash_conection(config) rescue ActiveRecord::NoDatabaseError false end |
.dbconsole(config, options = {}) ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 96 def dbconsole(config, = {}) pg_config = config.configuration_hash ENV["PGUSER"] = pg_config[:username] if pg_config[:username] ENV["PGHOST"] = pg_config[:host] if pg_config[:host] ENV["PGPORT"] = pg_config[:port].to_s if pg_config[:port] ENV["PGPASSWORD"] = pg_config[:password].to_s if pg_config[:password] && [:include_password] ENV["PGSSLMODE"] = pg_config[:sslmode].to_s if pg_config[:sslmode] ENV["PGSSLCERT"] = pg_config[:sslcert].to_s if pg_config[:sslcert] ENV["PGSSLKEY"] = pg_config[:sslkey].to_s if pg_config[:sslkey] ENV["PGSSLROOTCERT"] = pg_config[:sslrootcert].to_s if pg_config[:sslrootcert] if pg_config[:variables] ENV["PGOPTIONS"] = pg_config[:variables].filter_map do |name, value| "-c #{name}=#{value.to_s.gsub(/[ \\]/, '\\\\\0')}" unless value == ":default" || value == :default end.join(" ") end find_cmd_and_exec("psql", config.database) end |
.initialize_type_map(m) ⇒ Object
:nodoc:
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 531 def initialize_type_map(m) # :nodoc: m.register_type "int2", Type::Integer.new(limit: 2) m.register_type "int4", Type::Integer.new(limit: 4) m.register_type "int8", Type::Integer.new(limit: 8) m.register_type "oid", OID::Oid.new m.register_type "float4", Type::Float.new m.alias_type "float8", "float4" m.register_type "text", Type::Text.new register_class_with_limit m, "varchar", Type::String m.alias_type "char", "varchar" m.alias_type "name", "varchar" m.alias_type "bpchar", "varchar" m.register_type "bool", Type::Boolean.new register_class_with_limit m, "bit", OID::Bit register_class_with_limit m, "varbit", OID::BitVarying m.register_type "date", OID::Date.new m.register_type "money", OID::Money.new m.register_type "bytea", OID::Bytea.new m.register_type "point", OID::Point.new m.register_type "hstore", OID::Hstore.new m.register_type "json", Type::Json.new m.register_type "jsonb", OID::Jsonb.new m.register_type "cidr", OID::Cidr.new m.register_type "inet", OID::Inet.new m.register_type "uuid", OID::Uuid.new m.register_type "xml", OID::Xml.new m.register_type "tsvector", OID::SpecializedString.new(:tsvector) m.register_type "macaddr", OID::Macaddr.new m.register_type "citext", OID::SpecializedString.new(:citext) m.register_type "ltree", OID::SpecializedString.new(:ltree) m.register_type "line", OID::SpecializedString.new(:line) m.register_type "lseg", OID::SpecializedString.new(:lseg) m.register_type "box", OID::SpecializedString.new(:box) m.register_type "path", OID::SpecializedString.new(:path) m.register_type "polygon", OID::SpecializedString.new(:polygon) m.register_type "circle", OID::SpecializedString.new(:circle) register_class_with_precision m, "time", Type::Time register_class_with_precision m, "timestamp", OID::Timestamp register_class_with_precision m, "timestamptz", OID::TimestampWithTimeZone m.register_type "numeric" do |_, fmod, sql_type| precision = extract_precision(sql_type) scale = extract_scale(sql_type) # The type for the numeric depends on the width of the field, # so we'll do something special here. # # When dealing with decimal columns: # # places after decimal = fmod - 4 & 0xffff # places before decimal = (fmod - 4) >> 16 & 0xffff if fmod && (fmod - 4 & 0xffff).zero? # FIXME: Remove this class, and the second argument to # lookups on PG Type::DecimalWithoutScale.new(precision: precision) else OID::Decimal.new(precision: precision, scale: scale) end end m.register_type "interval" do |*args, sql_type| precision = extract_precision(sql_type) OID::Interval.new(precision: precision) end end |
.native_database_types ⇒ Object
:nodoc:
347 348 349 350 351 352 353 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 347 def self.native_database_types # :nodoc: @native_database_types ||= begin types = NATIVE_DATABASE_TYPES.dup types[:datetime] = types[datetime_type] types end end |
.new_client(conn_params) ⇒ Object
59 60 61 62 63 64 65 66 67 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 59 def new_client(conn_params) ::CipherStashPG.connect(**conn_params) rescue ::CipherStashPG::Error => error if conn_params && conn_params[:dbname] && error..include?(conn_params[:dbname]) raise ActiveRecord::NoDatabaseError else raise ActiveRecord::ConnectionNotEstablished, error. end end |
Instance Method Details
#active? ⇒ Boolean
Is this connection alive and ready for queries?
255 256 257 258 259 260 261 262 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 255 def active? @lock.synchronize do @connection.query "SELECT 1" end true rescue ::CipherStashPG::Error false end |
#add_enum_value(type_name, value, options = {}) ⇒ Object
Add enum value to an existing enum type.
577 578 579 580 581 582 583 584 585 586 587 588 589 590 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 577 def add_enum_value(type_name, value, = {}) before, after = .values_at(:before, :after) sql = +"ALTER TYPE #{quote_table_name(type_name)} ADD VALUE '#{value}'" if before && after raise ArgumentError, "Cannot have both :before and :after at the same time" elsif before sql << " BEFORE '#{before}'" elsif after sql << " AFTER '#{after}'" end execute(sql).tap { reload_type_map } end |
#build_insert_sql(insert) ⇒ Object
:nodoc:
416 417 418 419 420 421 422 423 424 425 426 427 428 429 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 416 def build_insert_sql(insert) # :nodoc: sql = +"INSERT #{insert.into} #{insert.values_list}" if insert.skip_duplicates? sql << " ON CONFLICT #{insert.conflict_target} DO NOTHING" elsif insert.update_duplicates? sql << " ON CONFLICT #{insert.conflict_target} DO UPDATE SET " sql << insert. { |column| "#{insert.model.quoted_table_name}.#{column} IS NOT DISTINCT FROM excluded.#{column}" } sql << insert.updatable_columns.map { |column| "#{column}=excluded.#{column}" }.join(",") end sql << " RETURNING #{insert.returning}" if insert.returning sql end |
#check_version ⇒ Object
:nodoc:
431 432 433 434 435 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 431 def check_version # :nodoc: if database_version < 90300 raise "Your version of PostgreSQL (#{database_version}) is too old. Active Record supports PostgreSQL >= 9.3." end end |
#create_enum(name, values, **options) ⇒ Object
Given a name and an array of values, creates an enum type.
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 455 def create_enum(name, values) sql_values = values.map { |s| "'#{s}'" }.join(", ") query = <<~SQL DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_type t WHERE t.typname = '#{name}' ) THEN CREATE TYPE \"#{name}\" AS ENUM (#{sql_values}); END IF; END $$; SQL exec_query(query) end |
#create_unlogged_tables ⇒ Object
:singleton-method: PostgreSQL allows the creation of “unlogged” tables, which do not record data in the PostgreSQL Write-Ahead Log. This can make the tables faster, but significantly increases the risk of data loss if the database crashes. As a result, this should not be used in production environments. If you would like all created tables to be unlogged in the test environment you can add the following line to your test.rb file:
ActiveRecord::ConnectionAdapters::CipherStashPGAdapter.create_unlogged_tables = true
81 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 81 class_attribute :create_unlogged_tables, default: false |
#datetime_type ⇒ Object
:singleton-method: PostgreSQL supports multiple types for DateTimes. By default, if you use datetime
in migrations, Rails will translate this to a PostgreSQL “timestamp without time zone”. Change this in an initializer to use another NATIVE_DATABASE_TYPES. For example, to store DateTimes as “timestamp with time zone”:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :timestamptz
Or if you are adding a custom type:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:my_custom_type] = { name: "my_custom_type_name" }
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :my_custom_type
If you’re using :ruby
as your config.active_record.schema_format
and you change this setting, you should immediately run bin/rails db:migrate
to update the types in your schema.rb.
104 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 104 class_attribute :datetime_type, default: :timestamp |
#default_index_type?(index) ⇒ Boolean
:nodoc:
412 413 414 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 412 def default_index_type?(index) # :nodoc: index.using == :btree || super end |
#disable_extension(name, force: false) ⇒ Object
Removes an extension from the database.
:force
-
Set to
:cascade
to drop dependent objects as well. Defaults to false.
490 491 492 493 494 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 490 def disable_extension(name) exec_query("DROP EXTENSION IF EXISTS \"#{name}\" CASCADE").tap { reload_type_map } end |
#discard! ⇒ Object
:nodoc:
296 297 298 299 300 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 296 def discard! # :nodoc: super @connection.socket_io.reopen(IO::NULL) rescue nil @connection = nil end |
#disconnect! ⇒ Object
Disconnects from the database if already connected. Otherwise, this method does nothing.
289 290 291 292 293 294 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 289 def disconnect! @lock.synchronize do super @connection.close rescue nil end end |
#drop_enum(name, values = nil, **options) ⇒ Object
Drops an enum type.
If the if_exists: true
option is provided, the enum is dropped only if it exists. Otherwise, if the enum doesn’t exist, an error is raised.
The values
parameter will be ignored if present. It can be helpful to provide this in a migration’s change
method so it can be reverted. In that case, values
will be used by #create_enum.
562 563 564 565 566 567 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 562 def drop_enum(name, values = nil, **) query = <<~SQL DROP TYPE#{' IF EXISTS' if [:if_exists]} #{quote_table_name(name)}; SQL internal_exec_query(query) end |
#enable_extension(name) ⇒ Object
367 368 369 370 371 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 367 def enable_extension(name) exec_query("CREATE EXTENSION IF NOT EXISTS \"#{name}\"").tap { reload_type_map } end |
#enum_types ⇒ Object
Returns a list of defined enum types, and their values.
441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 441 def enum_types query = <<~SQL SELECT type.typname AS name, string_agg(enum.enumlabel, ',' ORDER BY enum.enumsortorder) AS value FROM pg_enum AS enum JOIN pg_type AS type ON (type.oid = enum.enumtypid) GROUP BY type.typname; SQL exec_query(query, "SCHEMA").cast_values end |
#extension_available?(name) ⇒ Boolean
379 380 381 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 379 def extension_available?(name) query_value("SELECT true FROM pg_available_extensions WHERE name = #{quote(name)}", "SCHEMA") end |
#extension_enabled?(name) ⇒ Boolean
383 384 385 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 383 def extension_enabled?(name) query_value("SELECT installed_version IS NOT NULL FROM pg_available_extensions WHERE name = #{quote(name)}", "SCHEMA") end |
#extensions ⇒ Object
387 388 389 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 387 def extensions exec_query("SELECT extname FROM pg_extension", "SCHEMA").cast_values end |
#get_advisory_lock(lock_id) ⇒ Object
:nodoc:
353 354 355 356 357 358 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 353 def get_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer") end query_value("SELECT pg_try_advisory_lock(#{lock_id})") end |
#get_database_version ⇒ Object
Returns the version of the connected PostgreSQL server.
407 408 409 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 407 def get_database_version # :nodoc: @connection.server_version end |
#index_algorithms ⇒ Object
200 201 202 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 200 def index_algorithms { concurrently: "CONCURRENTLY" } end |
#max_identifier_length ⇒ Object
Returns the configured supported identifier length supported by PostgreSQL
392 393 394 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 392 def max_identifier_length @max_identifier_length ||= query_value("SHOW max_identifier_length", "SCHEMA").to_i end |
#native_database_types ⇒ Object
:nodoc:
302 303 304 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 302 def native_database_types #:nodoc: NATIVE_DATABASE_TYPES end |
#reconnect! ⇒ Object
Close then reopen the connection.
265 266 267 268 269 270 271 272 273 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 265 def reconnect! @lock.synchronize do super @connection.reset configure_connection rescue ::CipherStashPG::ConnectionBad connect end end |
#release_advisory_lock(lock_id) ⇒ Object
:nodoc:
360 361 362 363 364 365 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 360 def release_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer") end query_value("SELECT pg_advisory_unlock(#{lock_id})") end |
#reload_type_map ⇒ Object
:nodoc:
299 300 301 302 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 299 def reload_type_map # :nodoc: type_map.clear initialize_type_map end |
#rename_enum(name, options = {}) ⇒ Object
Rename an existing enum type to something else.
570 571 572 573 574 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 570 def rename_enum(name, = {}) to = .fetch(:to) { raise ArgumentError, ":to is required" } exec_query("ALTER TYPE #{quote_table_name(name)} RENAME TO #{to}").tap { reload_type_map } end |
#rename_enum_value(type_name, options = {}) ⇒ Object
Rename enum value on an existing enum type.
593 594 595 596 597 598 599 600 601 602 603 604 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 593 def rename_enum_value(type_name, = {}) unless database_version >= 10_00_00 # >= 10.0 raise ArgumentError, "Renaming enum values is only supported in PostgreSQL 10 or later" end from = .fetch(:from) { raise ArgumentError, ":from is required" } to = .fetch(:to) { raise ArgumentError, ":to is required" } execute("ALTER TYPE #{quote_table_name(type_name)} RENAME VALUE '#{from}' TO '#{to}'").tap { reload_type_map } end |
#reset! ⇒ Object
275 276 277 278 279 280 281 282 283 284 285 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 275 def reset! @lock.synchronize do clear_cache! reset_transaction unless @connection.transaction_status == ::CipherStashPG::PQTRANS_IDLE @connection.query "ROLLBACK" end @connection.query "DISCARD ALL" configure_connection end end |
#return_value_after_insert?(column) ⇒ Boolean
:nodoc:
300 301 302 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 300 def return_value_after_insert?(column) # :nodoc: column.auto_populated? end |
#session_auth=(user) ⇒ Object
Set the authorized user for this session
397 398 399 400 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 397 def session_auth=(user) clear_cache! execute("SET SESSION AUTHORIZATION #{user}") end |
#set_standard_conforming_strings ⇒ Object
306 307 308 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 306 def set_standard_conforming_strings execute("SET standard_conforming_strings = on", "SCHEMA") end |
#supports_advisory_locks? ⇒ Boolean
314 315 316 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 314 def supports_advisory_locks? true end |
#supports_bulk_alter? ⇒ Boolean
133 134 135 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 133 def supports_bulk_alter? true end |
#supports_check_constraints? ⇒ Boolean
161 162 163 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 161 def supports_check_constraints? true end |
#supports_comments? ⇒ Boolean
181 182 183 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 181 def supports_comments? true end |
#supports_common_table_expressions? ⇒ Boolean
345 346 347 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 345 def supports_common_table_expressions? true end |
#supports_datetime_with_precision? ⇒ Boolean
173 174 175 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 173 def supports_datetime_with_precision? true end |
#supports_ddl_transactions? ⇒ Boolean
310 311 312 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 310 def supports_ddl_transactions? true end |
#supports_deferrable_constraints? ⇒ Boolean
196 197 198 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 196 def supports_deferrable_constraints? true end |
#supports_exclusion_constraints? ⇒ Boolean
237 238 239 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 237 def supports_exclusion_constraints? true end |
#supports_explain? ⇒ Boolean
318 319 320 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 318 def supports_explain? true end |
#supports_expression_index? ⇒ Boolean
149 150 151 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 149 def supports_expression_index? true end |
#supports_extensions? ⇒ Boolean
322 323 324 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 322 def supports_extensions? true end |
#supports_foreign_keys? ⇒ Boolean
157 158 159 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 157 def supports_foreign_keys? true end |
#supports_foreign_tables? ⇒ Boolean
330 331 332 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 330 def supports_foreign_tables? true end |
#supports_index_include? ⇒ Boolean
217 218 219 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 217 def supports_index_include? database_version >= 11_00_00 # >= 11.0 end |
#supports_index_sort_order? ⇒ Boolean
137 138 139 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 137 def supports_index_sort_order? true end |
#supports_insert_on_conflict? ⇒ Boolean Also known as: supports_insert_on_duplicate_skip?, supports_insert_on_duplicate_update?, supports_insert_conflict_target?
193 194 195 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 193 def supports_insert_on_conflict? database_version >= 90500 end |
#supports_insert_returning? ⇒ Boolean
189 190 191 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 189 def supports_insert_returning? true end |
#supports_json? ⇒ Boolean
177 178 179 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 177 def supports_json? true end |
#supports_lazy_transactions? ⇒ Boolean
349 350 351 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 349 def supports_lazy_transactions? true end |
#supports_materialized_views? ⇒ Boolean
326 327 328 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 326 def supports_materialized_views? true end |
#supports_nulls_not_distinct? ⇒ Boolean
292 293 294 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 292 def supports_nulls_not_distinct? database_version >= 15_00_00 # >= 15.0 end |
#supports_optimizer_hints? ⇒ Boolean
338 339 340 341 342 343 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 338 def supports_optimizer_hints? unless defined?(@has_pg_hint_plan) @has_pg_hint_plan = extension_available?("pg_hint_plan") end @has_pg_hint_plan end |
#supports_partial_index? ⇒ Boolean
145 146 147 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 145 def supports_partial_index? true end |
#supports_partitioned_indexes? ⇒ Boolean
141 142 143 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 141 def supports_partitioned_indexes? database_version >= 110_000 end |
#supports_pgcrypto_uuid? ⇒ Boolean
334 335 336 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 334 def supports_pgcrypto_uuid? database_version >= 90400 end |
#supports_restart_db_transaction? ⇒ Boolean
273 274 275 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 273 def supports_restart_db_transaction? database_version >= 12_00_00 # >= 12.0 end |
#supports_savepoints? ⇒ Boolean
185 186 187 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 185 def supports_savepoints? true end |
#supports_transaction_isolation? ⇒ Boolean
153 154 155 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 153 def supports_transaction_isolation? true end |
#supports_unique_keys? ⇒ Boolean
241 242 243 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 241 def supports_unique_keys? true end |
#supports_validate_constraints? ⇒ Boolean
165 166 167 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 165 def supports_validate_constraints? true end |
#supports_views? ⇒ Boolean
169 170 171 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 169 def supports_views? true end |
#supports_virtual_columns? ⇒ Boolean
231 232 233 |
# File 'lib/active_record/connection_adapters/7.0/postgres_cipherstash_adapter.rb', line 231 def supports_virtual_columns? database_version >= 120_000 # >= 12.0 end |
#table_name_length ⇒ Object
Returns the maximum length of a table name.
612 613 614 615 616 617 |
# File 'lib/active_record/connection_adapters/7.1/postgres_cipherstash_adapter.rb', line 612 def table_name_length # PostgreSQL automatically creates an index for PRIMARY KEY with name consisting of # truncated table name and "_pkey" suffix fitting into max_identifier_length number of characters. # We allow smaller table names to be able to correctly rename this index when renaming the table. max_identifier_length - "_pkey".length end |
#use_insert_returning? ⇒ Boolean
402 403 404 |
# File 'lib/active_record/connection_adapters/6.1/postgres_cipherstash_adapter.rb', line 402 def use_insert_returning? @use_insert_returning end |