Class: ActiveRecord::ConnectionAdapters::RactorConnectionHandler::AbstractProxyAdapter
Constant Summary
-
ADAPTER_NAME =
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 18"RactorProxy" -
CAPABILITY_METHOD_PATTERN =
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 21/\Asupports_.*\?\z/ -
PLACEHOLDER_LOGGER =
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 19Object.new.freeze
-
PURE_REMOTE_METHOD_PATTERN =
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 20/\A(?:quote|type_to_sql\z|valid_type\?\z|supports_)/
::ActiveSupport::Callbacks - Included
::ActiveRecord::ConnectionAdapters::SchemaStatements - Included
::ActiveRecord::ConnectionAdapters::DatabaseStatements - Included
DEFAULT_INSERT_VALUE, HIGH_PRECISION_CURRENT_TIMESTAMP, TRANSACTION_ISOLATION_LEVELS
::ActiveRecord::ConnectionAdapters::AbstractAdapter - Inherited
ADAPTER_NAME, COMMENT_REGEX, DEFAULT_READ_QUERY, EXTENDED_TYPE_MAPS, MAX_JITTER, SIMPLE_INT, TYPE_MAP
Class Attribute Summary
::ActiveRecord::ConnectionAdapters::AbstractAdapter - Inherited
| .__callbacks, | |
| .migration_strategy | Allows configuration of migration strategy per adapter type. |
| .migration_strategy? | |
Class Method Summary
::ActiveRecord::ConnectionAdapters::AbstractAdapter - Inherited
| .database_exists? | Does the database for this adapter exist? |
| .dbconsole | Opens a database console session. |
| .find_cmd_and_exec, .type_cast_config_to_boolean, .type_cast_config_to_integer, .validate_default_timezone, .extract_limit, .extract_precision, .extract_scale, .initialize_type_map, .register_class_with_limit, .build_read_query_regexp, .extended_type_map, .new, | |
| .ractor_connection_proxy_class | The |
| .register_class_with_precision, .valid_type? | |
::ActiveSupport::DescendantsTracker - Inherited
Instance Attribute Summary
- #active? ⇒ Boolean readonly
- #connected? ⇒ Boolean readonly
- #connection_token readonly
- #holds_main_connection? ⇒ Boolean readonly
::ActiveRecord::ConnectionAdapters::AbstractAdapter - Inherited
| #__callbacks, | |
| #active? | Checks whether the connection to the database is still active. |
| #connected? | Checks whether the connection to the database was established. |
| #database_exists?, | |
| #in_use? | Alias for AbstractAdapter#owner. |
| #lock, #logger, #migration_strategy, #migration_strategy?, #owner, #pool, #pool=, | |
| #prepared_statements | Alias for AbstractAdapter#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? |
| #sql_notifications?, | |
| #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?, | |
| #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_disabling_indexes?, | |
| #supports_enforced_foreign_keys? | Does this adapter support NOT ENFORCED foreign key 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_update_returning?, | |
| #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? |
| #visitor, #reconnect_can_restore_state?, #advisory_locks_enabled?, #allow_preconnect, #allow_preconnect=, #async_enabled?, #lock_thread=, #needs_reconnect?, #pinned, | |
| #proxied= | When true, this connection is the backend of a ractor proxy connection. |
| #proxied?, #verified? | |
::ActiveRecord::ConnectionAdapters::DatabaseStatements - Included
::ActiveRecord::ConnectionAdapters::SchemaStatements - Included
Instance Method Summary
- #adapter_name
- #begin_db_transaction
- #begin_deferred_transaction(isolation_level = nil)
- #begin_isolated_db_transaction(isolation)
- #build_insert_sql(insert)
- #clear_cache!(new_connection: false)
- #commit_db_transaction
- #connect!
- #discard!
- #disconnect!
- #exec_restart_db_transaction
- #exec_rollback_db_transaction
- #native_database_types
- #quote_column_name(name)
- #quote_table_name(name)
- #raw_connection
- #reconnect!(restore_transactions: false)
- #release_connection
- #remote_schema_creation_accept(node)
- #remove_connection
- #reset!
-
#run_callbacks(kind, &block)
Checkout/checkin callbacks are class-level state that is not Ractor-shareable; the concrete adapter runs them main-side when the connection returns to its pool.
- #schema_creation
- #type_casted_binds(binds)
- #valid_type?(type) ⇒ Boolean
- #verify!
- #adapter_class private
- #affected_rows(result) private
- #arel_visitor private
-
#begin_main_transaction(isolation, joinable)
private
Crosses at the
::ActiveRecord::ConnectionAdapters::TransactionManagerlevel so the connection's own manager tracks the worker's depth. - #bind_params_length private
- #build_statement_pool private
- #call_main_connection(method_name, args, kwargs) private
- #cast_result(result) private
- #collect_warnings(result) private
- #commit_main_transaction private
- #create_table_definition(name, **options) private
- #last_inserted_id(result) private
- #method_missing(name, *args, **kwargs, &block) private
- #perform_query(_raw_connection, intent) private
- #pure_remote_dispatch(method_name, *args, **kwargs, &block) private
- #remote_adapter_call(method_name, args = [], kwargs = {}) private
-
#remote_dispatch(method_name, *args, **kwargs, &block)
private
A lazily begun worker transaction must reach the main connection before remote work that may write through it (e.g.
- #respond_to_missing?(name, include_private = false) ⇒ Boolean private
- #rollback_main_transaction private
- #table_definition_class private
-
#type_map
private
Local casting must match the concrete adapter (e.g.
Proxy - Included
| #boundary_safe_bind | Attribute types may close over procs, so the database value is resolved locally. |
| #checkin_all_connections | For supervisors tearing down worker Ractors, which cannot release their own tokens when they die. |
| #checkin_token, #connection_pinned?, #discard_token, #dump_binds, #dump_column_types, #dump_object, | |
| #main_operation |
|
| #remove_token | |
::ActiveRecord::ConnectionAdapters::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. |
| #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. |
| #max_jitter, #pool_jitter, | |
| #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, #return_value_after_update?, | |
| #role | The role (e.g. |
| #schema_cache, | |
| #schema_version | Returns the version identifier of the schema currently available in the database. |
| #shard | The shard (e.g. |
| #throw_away! | Removes the connection from the pool and disconnect it. |
| #unprepared_statement, #verify, | |
| #verify! | Checks whether the connection to the database is still active (i.e. not stale). |
| #verify_timeout, | |
| #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, #attempt_configure_connection, #backoff, #build_retry_budget, #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, | |
| #ensure_connection_ready | Ensure the connection is ready to execute a query. |
| #extended_type_map_key, #invalidate_transaction, #log, #reconnect, #retryable_connection_error?, #retryable_query_error?, | |
| #skip_verification? | Decide whether the connection can be used without verification. |
| #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. |
| #add_enum_value | This is meant to be implemented by the adapters that support custom enum types. |
| #attempt_retry | Consume from |
| #build_insert_sql | Called by |
| #case_insensitive_comparison, #case_sensitive_comparison, #check_version, #clean!, | |
| #connection_age | Seconds since this connection was established. |
| #connection_descriptor, | |
| #create_enum | This is meant to be implemented by the adapters that support custom enum types. |
| #create_or_find_by_lock | Lock used to read an existing record after a duplicate INSERT in a transaction. |
| #create_virtual_table | This is meant to be implemented by the adapters that support virtual tables. |
| #database_version, #default_index_type?, #downgrade_connection_after_error, | |
| #drop_enum | This is meant to be implemented by the adapters that support custom enum types. |
| #drop_virtual_table | This is meant to be implemented by the adapters that support virtual tables. |
| #expire | this method must only be called while holding connection pool's mutex. |
| #force_retirement | Mark the connection as needing to be retired, as if the age has exceeded the maximum allowed. |
| #get_advisory_lock | This is meant to be implemented by the adapters that support advisory locks. |
| #get_database_version, #inspect, #native_database_types, #prepared_statements_disabled_cache, #ractor_connection_capabilities, #ractor_connection_profile, | |
| #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. |
| #retryable_failure?, #return_value_after_insert?, | |
| #seconds_idle | Seconds since this connection was returned to the pool. |
| #seconds_since_last_activity | Seconds since this connection last communicated with the server. |
| #steal! | this method must only be called while holding connection pool's mutex (and a desire for segfaults). |
| #valid_type?, #instrumenter | |
::ActiveRecord::ConnectionAdapters::Savepoints - Included
::ActiveRecord::ConnectionAdapters::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 | |
::ActiveRecord::ConnectionAdapters::Quoting - Included
| #quote | Quotes the column value to help prevent SQL injection attacks. |
| #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 |
| #unquoted_false, #unquoted_true, | |
| #cast_bound_value | Cast a value to be used as a bound parameter of unknown type. |
| #lookup_cast_type, #quote_default_expression, #quoted_binary, #quoted_time, #sanitize_as_sql_comment, #type_casted_binds | |
::ActiveRecord::ConnectionAdapters::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 | Alias for DatabaseStatements#insert. |
| #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 |
| #exec_insert | Executes insert |
| #exec_query | Executes |
| #exec_update | Executes update |
| #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 |
| #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_isolation_level | Hook point called after an isolated DB transaction is committed or rolled back. |
| #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, | |
| #select_all | Returns an |
| #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, | |
| #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. |
| #affected_rows, #apply_returning_to!, #arel_from_relation, #build_delete_from_statements, #build_fixture_sql, #build_fixture_statements, #build_truncate_statement, #build_truncate_statements, | |
| #cast_result | Receive a native adapter result object and returns an |
| #collect_warnings, #combine_multi_statements, #extract_table_ref_from_insert_sql, #internal_build_intent, #last_inserted_id, #perform_query, #primary_key_for_insert, | |
| #raw_intent_last_inserted_id | The last inserted id computed eagerly for a raw intent: the raw driver result cannot cross the Ractor boundary, so it is read before the response is marshaled. |
| #returning_column_values, #single_value_from_rows, #table_ref_for_insert, #_exec_insert, #begin_deferred_transaction, | |
| #cacheable_query | This is used in the |
| #default_insert_value, #empty_all_tables, #exec_insert_all, #exec_restart_db_transaction, #exec_rollback_db_transaction, | |
| #execute_batch | Executes SQL statements in the context of this connection without returning a result. |
| #execute_intent | Lowest-level abstract execution of a query, called only from the intent itself. |
| #execute_raw_intent | Executes |
| #explain, #finalize_remaining_intents, #finish_intent_log, #handle_warnings, #perform_sync_attempt, #query_all, #query_command, #query_one, #query_rows, #query_value, #query_values, #reset_transaction, #start_intent_log, #to_sql_and_binds, #truncate_tables, | |
| #update_with_result | Executes the update statement and returns an |
| #with_yaml_fallback |
|
::ActiveRecord::ConnectionAdapters::SchemaStatements - Included
| #add_belongs_to | Alias for SchemaStatements#add_reference. |
| #add_check_constraint | Adds a new check constraint to the table. |
| #add_column | Add a new |
| #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 ( |
| #assume_migrated_upto_version, | |
| #build_create_table_definition | Returns a |
| #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 |
| #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_foreign_key | Changes an existing foreign key on a table. |
| #change_table | A block for changing columns in |
| #change_table_comment | Changes the comment for a table or removes it if |
| #check_constraint_exists? | Checks to see if a check constraint exists on a table for a given check constraint definition. |
| #check_constraints | |
| #column_exists? | Checks to see if a column exists in a given table. |
| #columns | Returns an array of |
| #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 |
| #data_source_exists? | Checks to see if the data source |
| #data_sources | Returns the relation names usable to back Active Record models. |
| #disable_index | Prevents an index from being used by queries. |
| #drop_join_table | Drops the join table specified by the given arguments. |
| #drop_table | Drops a table or tables from the database. |
| #enable_index | Enables an index to be used by queries. |
| #foreign_key_exists? | Checks to see if a foreign key exists on a table for a given foreign key definition. |
| #foreign_keys | |
| #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 | |
| #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 | Alias for SchemaStatements#remove_reference. |
| #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 ( |
| #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_options | |
| #tables | Returns an array of table names defined in the database. |
| #view_exists? | Checks to see if the view |
| #views | Returns an array of view names defined in the database. |
| #add_index_sort_order, | |
| #add_options_for_index_columns | Overridden by the |
| #can_remove_index_by_name?, #change_column_comment_sql, #change_index_comment_sql, #change_table_comment_sql, #check_constraint_for, #check_constraint_for!, #check_constraint_name, #column_options_keys, #create_alter_table, #create_index_definition, #create_table_definition, #data_source_sql, #drop_table_sql, #execute_alter_table, | |
| #expression_column_name? | Try to identify whether the given column name is an expression. |
| #extract_foreign_key_action, | |
| #extract_new_comment_value | Alias for SchemaStatements#extract_new_default_value. |
| #extract_new_default_value, | |
| #fetch_by_schema | One read filters by one schema, so tables naming different schemas are read a schema at a time. |
| #fetch_column_definitions, #fetch_table_options, #fetch_type_metadata, #foreign_key_for, #foreign_key_for!, #foreign_key_name, #generate_index_name, #has_expression_column_name?, #index_column_names, #index_name_for_remove, #index_name_options, #insert_versions_sql, #options_for_index_columns, #quoted_scope, #quoted_table_names, #reference_name_for_table, #rename_column_indexes, #rename_table_indexes, #rows_for, #strip_table_name_prefix_and_suffix, #valid_index_options, #validate_change_column_null_argument!, #validate_create_table_options!, #validate_index_length!, #validate_table_length!, #add_columns, #add_index_options, | |
| #build_alter_table_definition | Returns an |
| #build_create_index_definition | Builds a |
| #build_create_join_table_definition | Builds a |
| #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_versions, #foreign_key_column_for, #foreign_key_options, #index_algorithm, #index_name, #internal_string_options_for_primary_key, #quoted_columns_for_index, #remove_constraint, | |
| #schema_creation | Returns an instance of |
| #type_to_sql, #update_table_definition, #valid_column_definition_options, #valid_primary_key_options, #valid_table_definition_options | |
::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
.new(pool, connection_token, profile, config) ⇒ AbstractProxyAdapter
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 23
def initialize(pool, connection_token, profile, config) @adapter_profile = profile super(nil, PLACEHOLDER_LOGGER, nil, config) @connection_token = connection_token @logger = nil @pool = pool @prepared_statements = profile[:prepared_statements] @raw_connection = connection_token @verified = true @capabilities = profile[:capabilities].dup @quoted_column_names = {} @quoted_table_names = {} end
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, **kwargs, &block) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 364
def method_missing(name, *args, **kwargs, &block) return super if name == :marshal_dump || name == :_dump if block raise ActiveRecordError, "Cannot forward a block to #{name} on the main-Ractor connection" end materialize_transactions unless PURE_REMOTE_METHOD_PATTERN.match?(name) remote_adapter_call(name, args, kwargs) end
Instance Attribute Details
#active? ⇒ Boolean (readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 47
def active? connected? && !!remote_adapter_call(:active?) end
#connected? ⇒ Boolean (readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 43
def connected? !@connection_token.nil? end
#connection_token (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 41
attr_reader :connection_token # :nodoc:
#holds_main_connection? ⇒ Boolean (readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 118
def holds_main_connection? # :nodoc: !!(@connection_token && connection_pinned?(@connection_token)) end
Instance Method Details
#adapter_class (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 237
def adapter_class @adapter_profile[:adapter_class] end
#adapter_name
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 37
def adapter_name @adapter_profile[:adapter_name] end
#affected_rows(result) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 279
def affected_rows(result) result.affected_rows end
#arel_visitor (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 221
def arel_visitor @adapter_profile[:arel_visitor_class].new(self) end
#begin_db_transaction
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 184
def begin_db_transaction # :nodoc: with_raw_connection(allow_retry: true, materialize_transactions: false) do begin_main_transaction(nil, true) end end
#begin_deferred_transaction(isolation_level = nil)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 196
def begin_deferred_transaction(isolation_level = nil) # :nodoc: with_raw_connection(allow_retry: true, materialize_transactions: false) do begin_main_transaction(isolation_level, false) end end
#begin_isolated_db_transaction(isolation)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 190
def begin_isolated_db_transaction(isolation) # :nodoc: with_raw_connection(allow_retry: true, materialize_transactions: false) do begin_main_transaction(isolation, true) end end
#begin_main_transaction(isolation, joinable) (private)
Crosses at the ::ActiveRecord::ConnectionAdapters::TransactionManager level so the connection's own manager
tracks the worker's depth.
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 335
def begin_main_transaction(isolation, joinable) token = @connection_token main_operation(connection_pool: @pool) do fetch_connection(token).begin_transaction(isolation: isolation, joinable: joinable, _lazy: false) nil end end
#bind_params_length (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 225
def bind_params_length @adapter_profile[:bind_params_length] end
#build_insert_sql(insert)
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 180
def build_insert_sql(insert) # :nodoc: raise ActiveRecordError, "insert_all/upsert_all can only be executed on the main Ractor" end
#build_statement_pool (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 252
def build_statement_pool nil end
#call_main_connection(method_name, args, kwargs) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 320
def call_main_connection(method_name, args, kwargs) unless token = @connection_token raise ConnectionNotEstablished, "The Ractor-pinned connection has been released" end main_args = ActiveSupport::Ractors.make_shareable(args) main_kwargs = ActiveSupport::Ractors.make_shareable(kwargs) main_operation(connection_pool: @pool) do fetch_connection(token).__send__(method_name, *main_args, **main_kwargs) end end
#cast_result(result) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 275
def cast_result(result) result end
#clear_cache!(new_connection: false)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 113
def clear_cache!(new_connection: false) super remote_adapter_call(:clear_cache!, [], { new_connection: new_connection }) if @connection_token end
#collect_warnings(result) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 283
def collect_warnings(result) result&.warnings end
#commit_db_transaction
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 202
def commit_db_transaction # :nodoc: with_raw_connection(materialize_transactions: false) do commit_main_transaction end end
#commit_main_transaction (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 343
def commit_main_transaction token = @connection_token main_operation(connection_pool: @pool) do connection = fetch_connection(token) unless connection.transaction_open? raise ConnectionNotEstablished, "Cannot commit: the Ractor-pinned connection was reset while the transaction was open, and the server rolled it back" end connection.commit_transaction nil end end
#connect!
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 58
def connect! unless connected? raise ConnectionNotEstablished, "The Ractor-pinned connection has been released" end verify! end
#create_table_definition(name, **options) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 229
def create_table_definition(name, **) table_definition_class.new(self, name, **) end
#discard!
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 82
def discard! if token = @connection_token @connection_token = nil @raw_connection = nil discard_token(token) end reset_transaction end
#disconnect!
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 74
def disconnect! # Disconnect the physical connection while maintaining the lease of that same instance. remote_adapter_call(:disconnect!) if @connection_token @needs_reconnect = false @verified = false reset_transaction end
#exec_restart_db_transaction
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 214
def exec_restart_db_transaction # :nodoc: with_raw_connection(materialize_transactions: false) do remote_adapter_call(:restart_db_transaction) end end
#exec_rollback_db_transaction
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 208
def exec_rollback_db_transaction # :nodoc: with_raw_connection(materialize_transactions: false) do rollback_main_transaction end end
#last_inserted_id(result) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 287
def last_inserted_id(result) result.last_inserted_id end
#native_database_types
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 122
def native_database_types remote_adapter_call(:native_database_types) end
#perform_query(_raw_connection, intent) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 256
def perform_query(_raw_connection, intent) request = QueryRequest.new( sql: intent.processed_sql, binds: intent.binds, name: intent.name, prepare: intent.prepare, batch: intent.batch, allow_retry: intent.allow_retry, ) token = @connection_token response = main_operation(connection_pool: @pool) do request.perform(fetch_connection(token)) end intent.notification_payload[:affected_rows] = response.affected_rows intent.notification_payload[:row_count] = response.row_count response.to_result end
#pure_remote_dispatch(method_name, *args, **kwargs, &block) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 302
def pure_remote_dispatch(method_name, *args, **kwargs, &block) if block raise ActiveRecordError, "Cannot forward a block to #{method_name} on the main-Ractor connection" end remote_adapter_call(method_name, args, kwargs) end
#quote_column_name(name)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 130
def quote_column_name(name) @quoted_column_names[name] ||= remote_adapter_call(:quote_column_name, [name]) end
#quote_table_name(name)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 134
def quote_table_name(name) @quoted_table_names[name] ||= remote_adapter_call(:quote_table_name, [name]) end
#raw_connection
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 148
def raw_connection unless ActiveSupport::Ractors.main? raise ActiveRecordError, "The raw connection of a Ractor-proxied connection can only be accessed from the main Ractor" end unless @connection_token raise ConnectionNotEstablished, "The Ractor-pinned connection has been released" end materialize_transactions disable_lazy_transactions! @raw_connection_dirty = true Proxy.fetch_connection(@connection_token).raw_connection end
#reconnect!(restore_transactions: false)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 65
def reconnect!(restore_transactions: false) # Transaction state is worker-owned, so the physical connection must not restore by itself. remote_adapter_call(:reconnect!, [], { restore_transactions: false }) reset_transaction(restore: restore_transactions) { } @needs_reconnect = false @verified = true self end
#release_connection
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 97
def release_connection if token = @connection_token @connection_token = nil @raw_connection = nil checkin_token(token) end end
#remote_adapter_call(method_name, args = [], kwargs = {}) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 310
def remote_adapter_call(method_name, args = [], kwargs = {}) if args.empty? && kwargs.empty? && CAPABILITY_METHOD_PATTERN.match?(method_name) @capabilities.fetch(method_name) do @capabilities[method_name] = call_main_connection(method_name, args, kwargs) end else call_main_connection(method_name, args, kwargs) end end
#remote_dispatch(method_name, *args, **kwargs, &block) (private)
A lazily begun worker transaction must reach the main connection before
remote work that may write through it (e.g. SQLite3#add_column).
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 293
def remote_dispatch(method_name, *args, **kwargs, &block) if block raise ActiveRecordError, "Cannot forward a block to #{method_name} on the main-Ractor connection" end materialize_transactions remote_adapter_call(method_name, args, kwargs) end
#remote_schema_creation_accept(node)
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 176
def remote_schema_creation_accept(node) # :nodoc: raise ActiveRecordError, "Schema statements can only be executed on the main Ractor" end
#remove_connection
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 105
def remove_connection if token = @connection_token @connection_token = nil @raw_connection = nil remove_token(token) end end
#reset!
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 91
def reset! remote_adapter_call(:reset!) reset_transaction self end
#respond_to_missing?(name, include_private = false) ⇒ Boolean (private)
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 375
def respond_to_missing?(name, include_private = false) return false if name == :marshal_dump || name == :_dump super end
#rollback_main_transaction (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 355
def rollback_main_transaction token = @connection_token main_operation(connection_pool: @pool) do connection = fetch_connection(token) connection.rollback_transaction if connection.transaction_open? nil end end
#run_callbacks(kind, &block)
Checkout/checkin callbacks are class-level state that is not Ractor-shareable; the concrete adapter runs them main-side when the connection returns to its pool.
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 164
def run_callbacks(kind, &block) # :nodoc: if kind == :checkin || kind == :checkout block ? yield : nil else super end end
#schema_creation
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 172
def schema_creation # :nodoc: SchemaCreationProxy.new(self) end
#table_definition_class (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 233
def table_definition_class @adapter_profile[:table_definition_class] end
#type_casted_binds(binds)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 138
def type_casted_binds(binds) return [] if binds.nil? || binds.empty? token = @connection_token binds_payload = dump_binds(binds) main_operation(connection_pool: @pool) do fetch_connection(token).type_casted_binds(Marshal.load(binds_payload)) end end
#type_map (private)
Local casting must match the concrete adapter (e.g. SQLite3's integer limit).
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 242
def type_map if key = extended_type_map_key adapter_class::EXTENDED_TYPE_MAPS.compute_if_absent(key) do adapter_class.extended_type_map(**key) end else adapter_class::TYPE_MAP end end
#valid_type?(type) ⇒ Boolean
# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 126
def valid_type?(type) !native_database_types[type].nil? end
#verify!
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/ractor_connection_handler/abstract_proxy_adapter.rb', line 51
def verify! remote_adapter_call(:verify!) @needs_reconnect = false @verified = true self end