123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::TrilogyAdapter

Constant Summary

::ActiveSupport::Callbacks - Included

CALLBACK_FILTER_TYPES

DatabaseStatements - Included

DEFAULT_INSERT_VALUE, HIGH_PRECISION_CURRENT_TIMESTAMP

Quoting - Included

COLUMN_NAME, COLUMN_NAME_WITH_ORDER

AbstractAdapter - Inherited

ADAPTER_NAME, COMMENT_REGEX, DEFAULT_READ_QUERY, EXCEPTION_IMMEDIATE, EXCEPTION_NEVER, EXTENDED_TYPE_MAPS, FIBER_LOCK, SIMPLE_INT, THREAD_LOCK, TYPE_MAP

MySQL::DatabaseStatements - Included

HIGH_PRECISION_CURRENT_TIMESTAMP, READ_QUERY

MySQL::Quoting - Included

COLUMN_NAME, COLUMN_NAME_WITH_ORDER, QUOTED_COLUMN_NAMES, QUOTED_TABLE_NAMES

MySQL::SchemaStatements - Included

CHARSETS_OF_4BYTES_MAXLEN

AbstractMysqlAdapter - Inherited

CR_SERVER_GONE_ERROR, CR_SERVER_LOST, EMULATE_BOOLEANS_TRUE, ER_CANNOT_ADD_FOREIGN, ER_CANNOT_CREATE_TABLE, ER_CLIENT_INTERACTION_TIMEOUT, ER_CONNECTION_KILLED, ER_DATA_TOO_LONG, ER_DB_CREATE_EXISTS, ER_DO_NOT_HAVE_DEFAULT, ER_DUP_ENTRY, ER_FILSORT_ABORT, ER_FK_INCOMPATIBLE_COLUMNS, ER_LOCK_DEADLOCK, ER_LOCK_WAIT_TIMEOUT, ER_NOT_NULL_VIOLATION, ER_NO_REFERENCED_ROW, ER_NO_REFERENCED_ROW_2, ER_OUT_OF_RANGE, ER_QUERY_INTERRUPTED, ER_QUERY_TIMEOUT, ER_ROW_IS_REFERENCED, ER_ROW_IS_REFERENCED_2, EXTENDED_TYPE_MAPS, NATIVE_DATABASE_TYPES

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Trilogy::DatabaseStatements - Included

AbstractMysqlAdapter - Inherited

MySQL::SchemaStatements - Included

MySQL::DatabaseStatements - Included

AbstractAdapter - Inherited

#__callbacks, #__callbacks?,
#active?

Checks whether the connection to the database is still active.

#all_foreign_keys_valid?

Override to check all foreign key constraints in a database.

#database_exists?,
#in_use?
#lock, #logger, #owner, #pool, #pool=,
#prepared_statements
#preventing_writes?

Determines whether writes are currently being prevented.

#replica?,
#requires_reloading?

Returns true if its required to reload the connection between requests for development mode.

#savepoint_errors_invalidate_transactions?

Do TransactionRollbackErrors on savepoints affect the parent transaction?

#supports_advisory_locks?

Does this adapter support application-enforced advisory locking?

#supports_bulk_alter?,
#supports_check_constraints?

Does this adapter support creating check constraints?

#supports_comments?

Does this adapter support metadata comments on database objects (tables, columns, indexes)?

#supports_comments_in_create?

Can comments for tables, columns, and indexes be specified in create/alter table statements?

#supports_common_table_expressions?, #supports_concurrent_connections?,
#supports_datetime_with_precision?

Does this adapter support datetime with precision?

#supports_ddl_transactions?

Does this adapter support DDL rollbacks in transactions? That is, would CREATE TABLE or ALTER TABLE get rolled back by a transaction?

#supports_deferrable_constraints?

Does this adapter support creating deferrable constraints?

#supports_exclusion_constraints?

Does this adapter support creating exclusion constraints?

#supports_explain?

Does this adapter support explain?

#supports_expression_index?

Does this adapter support expression indices?

#supports_extensions?

Does this adapter support database extensions?

#supports_foreign_keys?

Does this adapter support creating foreign key constraints?

#supports_foreign_tables?

Does this adapter support foreign/external tables?

#supports_index_include?

Does this adapter support including non-key columns?

#supports_index_sort_order?

Does this adapter support index sort order?

#supports_indexes_in_create?

Does this adapter support creating indexes in the same statement as creating the table?

#supports_insert_conflict_target?, #supports_insert_on_duplicate_skip?, #supports_insert_on_duplicate_update?, #supports_insert_returning?,
#supports_json?

Does this adapter support JSON data type?

#supports_lazy_transactions?,
#supports_materialized_views?

Does this adapter support materialized views?

#supports_nulls_not_distinct?,
#supports_optimizer_hints?

Does this adapter support optimizer hints?

#supports_partial_index?

Does this adapter support partial indices?

#supports_partitioned_indexes?, #supports_restart_db_transaction?,
#supports_savepoints?

Does this adapter support savepoints?

#supports_transaction_isolation?

Does this adapter support setting the isolation level for a transaction?

#supports_unique_constraints?

Does this adapter support creating unique constraints?

#supports_validate_constraints?

Does this adapter support creating invalid constraints?

#supports_views?

Does this adapter support views?

#supports_virtual_columns?

Does this adapter support virtual columns?

#use_metadata_table?, #visitor, #reconnect_can_restore_state?, #advisory_locks_enabled?, #async_enabled?, #lock_thread=

DatabaseStatements - Included

SchemaStatements - Included

Instance Method Summary

Trilogy::DatabaseStatements - Included

AbstractMysqlAdapter - Inherited

#charset

Returns the database character set.

#check_constraints,
#collation

Returns the database collation strategy.

#create_database

Create a new MySQL database with optional :charset and :collation.

#current_database,
#drop_table

Drops a table from the database.

#foreign_keys, #index_algorithms, #native_database_types,
#recreate_database

Drops the database specified on the name attribute and creates it again using the provided options.

#rename_index,
#rename_table

Renames a table.

#show_variable

SHOW VARIABLES LIKE ā€˜nameā€™.

#add_index_for_alter, #arel_visitor, #build_statement_pool, #can_perform_case_insensitive_comparison_for?, #change_column_for_alter, #configure_connection, #extended_type_map_key, #handle_warnings, #mismatched_foreign_key, #mismatched_foreign_key_details, #remove_index_for_alter, #rename_column_for_alter, #strip_whitespace_characters,
#sync_timezone_changes

Make sure we carry over any changes to ActiveRecord.default_timezone that have been made since we established the connection.

#translate_exception, #version_string, #warning_ignored?, #add_index, #add_sql_comment!, #begin_db_transaction, #begin_isolated_db_transaction, #build_change_column_default_definition,
#build_change_column_definition

Builds a ChangeColumnDefinition object.

#build_create_index_definition, #build_insert_sql, #case_sensitive_comparison, #change_column, #change_column_comment, #change_column_default, #change_column_null, #change_table_comment, #check_version,
#columns_for_distinct

In MySQL 5.7.5 and up, ONLY_FULL_GROUP_BY affects handling of queries that use DISTINCT and ORDER BY.

#commit_db_transaction, #default_index_type?,
#disable_referential_integrity

REFERENTIAL INTEGRITY ====================================.

#drop_database

Drops a MySQL database.

#each_hash

The two drivers have slightly different ways of yielding hashes of results, so this method must be implemented to provide a uniform interface.

#empty_insert_statement_value,
#error_number

Must return the MySQL error number from the exception, if the exception has an error number.

#exec_restart_db_transaction, #exec_rollback_db_transaction,
#execute_and_free

Mysql2Adapter doesnā€™t have to free a result after using it, but we use this method to write stuff in an abstract way without concerning ourselves about whether it needs to be explicitly freed or not.

#get_advisory_lock, #get_database_version, #primary_keys, #release_advisory_lock, #rename_column, #table_comment, #table_options, #column_definitions, #create_table_info

MySQL::SchemaStatements - Included

MySQL::Quoting - Included

#cast_bound_value, #column_name_matcher, #column_name_with_order_matcher, #quote_column_name, #quote_table_name, #quoted_binary, #quoted_date,
#type_cast

Override type_cast we pass to mysql2 ::Date and ::Time objects instead of Strings since MySQL adapters are able to handle those classes more efficiently.

#unquote_identifier, #unquoted_false, #unquoted_true

MySQL::DatabaseStatements - Included

AbstractAdapter - Inherited

#adapter_name

Returns the human-readable name of the adapter.

#check_all_foreign_keys_valid!

Override to check all foreign key constraints in a database.

#clear_cache!

Clear any caching the database adapter may be doing.

#close

Check the connection back in to the connection pool.

#connect!, #connection_retries, #default_timezone,
#disable_extension

This is meant to be implemented by the adapters that support extensions.

#disable_referential_integrity

Override to turn off referential integrity while executing &block.

#discard!

Immediately forget this connection ever existed.

#disconnect!

Disconnects from the database if already connected.

#enable_extension

This is meant to be implemented by the adapters that support extensions.

#expire

this method must only be called while holding connection poolā€™s mutex.

#extensions

A list of extensions, to be filled in by adapters that support them.

#index_algorithms

A list of index algorithms, to be filled by adapters that support them.

#lease

this method must only be called while holding connection poolā€™s mutex.

#prefetch_primary_key?

Should primary key values be selected from their corresponding sequence before the insert statement? If true, next_sequence_value is called before each insert to set the recordā€™s primary key.

#prepared_statements?,
#raw_connection

Provides access to the underlying database driver for this adapter.

#reconnect!

Disconnects from the database if already connected, and establishes a new connection with the database.

#reset!

Reset the state of this connection, directing the DBMS to clear transactions and other connection-related server-side state.

#retry_deadline,
#role

The role (e.g. :writing) for the current connection.

#schema_cache,
#schema_version

Returns the version identifier of the schema currently available in the database.

#shard

The shard (e.g. :default) for the current connection.

#throw_away!

Removes the connection from the pool and disconnect it.

#unprepared_statement,
#verify!

Checks whether the connection to the database is still active (i.e. not stale).

#any_raw_connection

Returns a raw connection for internal use with methods that are known to both be thread-safe and not rely upon actual server communication.

#arel_visitor, #backoff,
#build_result

Builds the result object.

#build_statement_pool, #can_perform_case_insensitive_comparison_for?, #collector, #column_for, #column_for_attribute,
#configure_connection

Perform any necessary initialization upon the newly-established connection settings, run queries to configure any application-global ā€œsessionā€ variables, etc.

#default_prepared_statements, #extended_type_map_key, #invalidate_transaction, #log, #reconnect, #retryable_connection_error?, #retryable_query_error?, #transform_query, #translate_exception, #translate_exception_class, #type_map,
#valid_raw_connection

Similar to any_raw_connection, but ensures it is validated and connected.

#verified!

Mark the connection as verified.

#warning_ignored?,
#with_raw_connection

Lock the monitor, ensure weā€™re properly connected and transactions are materialized, and then yield the underlying raw connection object.

#without_prepared_statement?,
#add_enum_value

This is meant to be implemented by the adapters that support custom enum types.

#build_insert_sql

Called by ::ActiveRecord::InsertAll, Passed an instance of ::ActiveRecord::InsertAll::Builder, This method implements standard bulk inserts for all databases, but should be overridden by adapters to implement common features with non-standard syntax like handling duplicates or returning values.

#case_insensitive_comparison, #case_sensitive_comparison, #check_if_write_query, #check_version, #clean!, #connection_class,
#create_enum

This is meant to be implemented by the adapters that support custom enum types.

#database_version, #default_index_type?, #default_uniqueness_comparison,
#drop_enum

This is meant to be implemented by the adapters that support custom enum types.

#get_advisory_lock

This is meant to be implemented by the adapters that support advisory locks.

#get_database_version, #internal_metadata, #migration_context, #migrations_paths, #prepared_statements_disabled_cache,
#release_advisory_lock

This is meant to be implemented by the adapters that support advisory locks.

#rename_enum

This is meant to be implemented by the adapters that support custom enum types.

#rename_enum_value

This is meant to be implemented by the adapters that support custom enum types.

#return_value_after_insert?, #schema_migration,
#seconds_idle

Seconds since this connection was returned to the pool.

#steal!

this method must only be called while holding connection poolā€™s mutex (and a desire for segfaults).

#valid_type?, #with_instrumenter

Savepoints - Included

DatabaseLimits - Included

#index_name_length

Returns the maximum length of an index name.

#table_alias_length

Returns the maximum length of a table alias.

#table_name_length

Returns the maximum length of a table name.

#bind_params_length, #max_identifier_length

Quoting - Included

#quote

Quotes the column value to help prevent SQL injection attacks.

#quote_bound_value

Quote a value to be used as a bound parameter of unknown type.

#quote_column_name

Quotes the column name.

#quote_string

Quotes a string, escaping any ā€˜ (single quote) and \ (backslash) characters.

#quote_table_name

Quotes the table name.

#quote_table_name_for_assignment

Override to return the quoted table name for assignment.

#quoted_date

Quote date/time values for use in SQL input.

#quoted_false, #quoted_true,
#type_cast

Cast a value to a type that the database understands.

#unquoted_false, #unquoted_true, #lookup_cast_type, #type_casted_binds, #warn_quote_duration_deprecated,
#cast_bound_value

Cast a value to be used as a bound parameter of unknown type.

#column_name_matcher, #column_name_with_order_matcher,
#lookup_cast_type_from_column

If you are having to call this function, you are likely doing something wrong.

#quote_default_expression, #quoted_binary, #quoted_time, #sanitize_as_sql_comment

DatabaseStatements - Included

#add_transaction_record

Register a record with the current transaction so that its after_commit and after_rollback callbacks can be called.

#begin_db_transaction

Begins the transaction (and turns off auto-committing).

#begin_isolated_db_transaction

Begins the transaction with the isolation level set.

#commit_db_transaction

Commits the transaction (and turns on auto-committing).

#create
#default_sequence_name,
#delete

Executes the delete statement and returns the number of rows affected.

#disable_lazy_transactions!, #empty_insert_statement_value, #enable_lazy_transactions!,
#exec_delete

Executes delete sql statement in the context of this connection using binds as the bind substitutes.

#exec_insert

Executes insert sql statement in the context of this connection using binds as the bind substitutes.

#exec_query

Executes sql statement in the context of this connection using binds as the bind substitutes.

#exec_update

Executes update sql statement in the context of this connection using binds as the bind substitutes.

#execute

Executes the SQL statement in the context of this connection and returns the raw result from the connection adapter.

#high_precision_current_timestamp

Returns an ::Arel SQL literal for the CURRENT_TIMESTAMP for usage with arbitrary precision date/time columns.

#initialize,
#insert

Executes an INSERT query and returns the new recordā€™s ID.

#insert_fixture

Inserts the given fixture into the table.

#insert_fixtures_set,
#reset_sequence!

Set the sequence to the max value of the tableā€™s column.

#restart_db_transaction,
#rollback_db_transaction

Rolls back the transaction (and turns on auto-committing).

#rollback_to_savepoint,
#sanitize_limit

Sanitizes the given LIMIT parameter in order to prevent SQL injection.

#select_all

Returns an ::ActiveRecord::Result instance.

#select_one

Returns a record hash with the column names as keys and column values as values.

#select_rows

Returns an array of arrays containing the field values.

#select_value

Returns a single value from a record.

#select_values

Returns an array of the values of the first column in a select:

#to_sql

Converts an arel AST to SQL.

#transaction

Runs the given block in a database transaction, and returns the result of the block.

#transaction_isolation_levels,
#truncate

Executes the truncate statement.

#update

Executes the update statement and returns the number of rows affected.

#write_query?

Determines whether the SQL statement is a write query.

#arel_from_relation, #build_fixture_sql, #build_fixture_statements, #build_truncate_statement, #build_truncate_statements, #combine_multi_statements, #default_insert_value, #execute_batch, #extract_table_ref_from_insert_sql, #internal_execute, #last_inserted_id, #raw_execute, #returning_column_values,
#select

Returns an ::ActiveRecord::Result instance.

#single_value_from_rows, #with_multi_statements,
#cacheable_query

This is used in the ::ActiveRecord::StatementCache object.

#exec_insert_all, #exec_restart_db_transaction, #exec_rollback_db_transaction, #explain, #internal_exec_query, #mark_transaction_written_if_write, #query, #query_value, #query_values, #reset_transaction, #truncate_tables,
#with_yaml_fallback

::ActiveRecord::Fixture value is quoted by ::Arel, however scalar values are not quotable.

#sql_for_insert, #to_sql_and_binds

SchemaStatements - Included

#add_belongs_to
#add_check_constraint

Adds a new check constraint to the table.

#add_column

Add a new type column named column_name to table_name.

#add_foreign_key

Adds a new foreign key.

#add_index

Adds a new index to the table.

#add_reference

Adds a reference.

#add_timestamps

Adds timestamps (created_at and updated_at) columns to table_name.

#assume_migrated_upto_version,
#build_create_table_definition

Returns a TableDefinition object containing information about the table that would be created if the same arguments were passed to #create_table.

#change_column

Changes the columnā€™s definition according to the new options.

#change_column_comment

Changes the comment for a column or removes it if nil.

#change_column_default

Sets a new default value for a column:

#change_column_null

Sets or removes a NOT NULL constraint on a column.

#change_table

A block for changing columns in table.

#change_table_comment

Changes the comment for a table or removes it if nil.

#check_constraint_exists?

Checks to see if a check constraint exists on a table for a given check constraint definition.

#check_constraints

Returns an array of check constraints for the given table.

#column_exists?

Checks to see if a column exists in a given table.

#columns

Returns an array of Column objects for the table specified by table_name.

#create_join_table

Creates a new join table with the name created using the lexical order of the first two arguments.

#create_table

Creates a new table with the name table_name.

#data_source_exists?

Checks to see if the data source name exists on the database.

#data_sources

Returns the relation names usable to back Active Record models.

#drop_join_table

Drops the join table specified by the given arguments.

#drop_table

Drops a table from the database.

#foreign_key_exists?

Checks to see if a foreign key exists on a table for a given foreign key definition.

#foreign_keys

Returns an array of foreign keys for the given table.

#index_exists?

Checks to see if an index exists on a table for a given index definition.

#index_name_exists?

Verifies the existence of an index with a given name.

#indexes

Returns an array of indexes for the given table.

#max_index_name_size

Returns the maximum length of an index name in bytes.

#native_database_types

Returns a hash of mappings from the abstract data types to the native database types.

#options_include_default?,
#primary_key

Returns just a tableā€™s primary key.

#remove_belongs_to
#remove_check_constraint

Removes the given check constraint from the table.

#remove_column

Removes the column from the table definition.

#remove_columns

Removes the given columns from the table definition.

#remove_foreign_key

Removes the given foreign key from the table.

#remove_index

Removes the given index from the table.

#remove_reference

Removes the reference(s).

#remove_timestamps

Removes the timestamp columns (created_at and updated_at) from the table definition.

#rename_column

Renames a column.

#rename_index

Renames an index.

#rename_table

Renames a table.

#table_alias_for

Truncates a table alias according to the limits of the current adapter.

#table_comment

Returns the table comment thatā€™s stored in database metadata.

#table_exists?

Checks to see if the table table_name exists on the database.

#table_options,
#tables

Returns an array of table names defined in the database.

#view_exists?

Checks to see if the view view_name exists on the database.

#views

Returns an array of view names defined in the database.

#add_column_for_alter, #add_index_sort_order,
#add_options_for_index_columns

Overridden by the MySQL adapter for supporting index lengths and by the PostgreSQL adapter for supporting operator classes.

#add_timestamps_for_alter, #can_remove_index_by_name?, #change_column_default_for_alter, #check_constraint_for, #check_constraint_for!, #check_constraint_name, #column_options_keys, #create_alter_table, #create_table_definition, #data_source_sql,
#expression_column_name?

Try to identify whether the given column name is an expression.

#extract_foreign_key_action,
#extract_new_comment_value
#extract_new_default_value, #fetch_type_metadata, #foreign_key_for, #foreign_key_for!, #foreign_key_name, #generate_index_name, #index_column_names, #index_name_for_remove, #index_name_options, #insert_versions_sql, #options_for_index_columns, #quoted_scope, #reference_name_for_table, #remove_column_for_alter, #remove_columns_for_alter, #remove_timestamps_for_alter, #rename_column_indexes, #rename_column_sql, #rename_table_indexes, #strip_table_name_prefix_and_suffix, #validate_change_column_null_argument!, #validate_create_table_options!, #validate_index_length!, #validate_table_length!, #add_columns, #add_index_options,
#build_add_column_definition

Builds an AlterTable object for adding a column to a table.

#build_change_column_default_definition
#build_create_index_definition

Builds a CreateIndexDefinition object.

#build_create_join_table_definition

Builds a TableDefinition object for a join table.

#bulk_change_table, #check_constraint_options,
#columns_for_distinct

Given a set of columns and an ORDER BY clause, returns the columns for a SELECT DISTINCT.

#create_schema_dumper, #distinct_relation_for_primary_key, #dump_schema_information, #foreign_key_column_for, #foreign_key_options, #index_algorithm, #index_name, #internal_string_options_for_primary_key, #quoted_columns_for_index,
#schema_creation

Returns an instance of SchemaCreation, which can be used to visit a schema definition object and return DDL.

#type_to_sql, #update_table_definition, #valid_column_definition_options, #valid_primary_key_options, #valid_table_definition_options

::ActiveRecord::Migration::JoinTable - Included

::ActiveSupport::Callbacks - Included

#run_callbacks

Runs the callbacks for the given event.

#halted_callback_hook

A hook invoked every time a before callback is halted.

Constructor Details

.newTrilogyAdapter

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 102

def initialize(...)
  super

  if @config[:prepared_statements]
    raise ArgumentError, "Trilogy currently doesn't support prepared statements. Remove `prepared_statements: true` from your database configuration."
  end

  # Trilogy ignore `socket` if `host is set. We want the opposite to allow
  # configuring UNIX domain sockets via `DATABASE_URL`.
  @config.delete(:host) if @config[:socket]
end

Class Method Details

.initialize_type_map(m) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 89

def initialize_type_map(m)
  super

  m.register_type(%r(char)i) do |sql_type|
    limit = extract_limit(sql_type)
    Type.lookup(:string, adapter: :trilogy, limit: limit)
  end

  m.register_type %r(^enum)i, Type.lookup(:string, adapter: :trilogy)
  m.register_type %r(^set)i,  Type.lookup(:string, adapter: :trilogy)
end

.new_client(config)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 57

def new_client(config)
  config[:ssl_mode] = parse_ssl_mode(config[:ssl_mode]) if config[:ssl_mode]
  ::Trilogy.new(config)
rescue ::Trilogy::Error => error
  raise translate_connect_error(config, error)
end

.parse_ssl_mode(mode)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 64

def parse_ssl_mode(mode)
  return mode if mode.is_a? Integer

  m = mode.to_s.upcase
  m = "SSL_MODE_#{m}" unless m.start_with? "SSL_MODE_"

  SSL_MODES.fetch(m.to_sym, mode)
end

.translate_connect_error(config, error)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 73

def translate_connect_error(config, error)
  case error.error_code
  when ER_DBACCESS_DENIED_ERROR, ER_BAD_DB_ERROR
    ActiveRecord::NoDatabaseError.db_error(config[:database])
  when ER_ACCESS_DENIED_ERROR
    ActiveRecord::DatabaseConnectionError.username_error(config[:username])
  else
    if error.message.include?("TRILOGY_DNS_ERROR")
      ActiveRecord::DatabaseConnectionError.hostname_error(config[:host])
    else
      ActiveRecord::ConnectionNotEstablished.new(error.message)
    end
  end
end

Instance Attribute Details

#active?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 146

def active?
  !(@raw_connection.nil? || @raw_connection.closed?) && @lock.synchronize { @raw_connection&.ping } || false
rescue ::Trilogy::Error
  false
end

#savepoint_errors_invalidate_transactions?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 132

def savepoint_errors_invalidate_transactions?
  true
end

#supports_comments?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 120

def supports_comments?
  true
end

#supports_comments_in_create?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 124

def supports_comments_in_create?
  true
end

#supports_json?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 116

def supports_json?
  !mariadb? && database_version >= "5.7.8"
end

#supports_lazy_transactions?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 136

def supports_lazy_transactions?
  true
end

#supports_savepoints?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 128

def supports_savepoints?
  true
end

Instance Method Details

#connect (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 196

def connect
  @raw_connection = self.class.new_client(@config)
rescue ConnectionNotEstablished => ex
  raise ex.set_pool(@pool)
end

#default_prepared_statements (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 241

def default_prepared_statements
  false
end

#discard!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 162

def discard!
  @lock.synchronize do
    super
    @raw_connection&.discard!
    @raw_connection = nil
  end
end

#disconnect!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 154

def disconnect!
  @lock.synchronize do
    super
    @raw_connection&.close
    @raw_connection = nil
  end
end

#each_hash(result) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 175

def each_hash(result)
  return to_enum(:each_hash, result) unless block_given?

  keys = result.fields.map(&:to_sym)
  result.rows.each do |row|
    hash = {}
    idx = 0
    row.each do |value|
      hash[keys[idx]] = value
      idx += 1
    end
    yield hash
  end

  nil
end

#error_number(exception) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 192

def error_number(exception)
  exception.error_code if exception.respond_to?(:error_code)
end

#full_version (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 208

def full_version
  schema_cache.database_version.full_version_string
end

#get_full_version (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 212

def get_full_version
  with_raw_connection(allow_retry: true, materialize_transactions: false) do |conn|
    conn.server_info[:version]
  end
end

#quote_string(string)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 140

def quote_string(string)
  with_raw_connection(allow_retry: true, materialize_transactions: false) do |conn|
    conn.escape(string)
  end
end

#reconnect (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 202

def reconnect
  @raw_connection&.close
  @raw_connection = nil
  connect
end

#reset!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 152

alias reset! reconnect!

#text_type?(type) ⇒ Boolean (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 171

def text_type?(type)
  TYPE_MAP.lookup(type).is_a?(Type::String) || TYPE_MAP.lookup(type).is_a?(Type::Text)
end

#translate_exception(exception, message:, sql:, binds:) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb', line 218

def translate_exception(exception, message:, sql:, binds:)
  if exception.is_a?(::Trilogy::TimeoutError) && !exception.error_code
    return ActiveRecord::AdapterTimeout.new(message, sql: sql, binds: binds, connection_pool: @pool)
  end
  error_code = exception.error_code if exception.respond_to?(:error_code)

  case error_code
  when ER_SERVER_SHUTDOWN
    return ConnectionFailed.new(message, connection_pool: @pool)
  end

  case exception
  when Errno::EPIPE, SocketError, IOError
    return ConnectionFailed.new(message, connection_pool: @pool)
  when ::Trilogy::Error
    if /Connection reset by peer|TRILOGY_CLOSED_CONNECTION|TRILOGY_INVALID_SEQUENCE_ID|TRILOGY_UNEXPECTED_PACKET/.match?(exception.message)
      return ConnectionFailed.new(message, connection_pool: @pool)
    end
  end

  super
end