Module: Familia::Connection
- Includes:
- Middleware, Operations
- Included in:
- Familia
- Defined in:
- lib/familia/connection.rb,
lib/familia/connection/handlers.rb,
lib/familia/connection/middleware.rb,
lib/familia/connection/operations.rb,
lib/familia/connection/pipeline_core.rb,
lib/familia/connection/operation_core.rb,
lib/familia/connection/transaction_core.rb,
lib/familia/connection/individual_command_proxy.rb
Overview
The Connection module provides Database connection management for Familia. It allows easy setup and access to Database clients across different URIs with robust connection pooling for thread safety.
Defined Under Namespace
Modules: Middleware, OperationCore, Operations, PipelineCore, TransactionCore Classes: BaseConnectionHandler, CachedConnectionHandler, CreateConnectionHandler, FiberConnectionHandler, FiberTransactionHandler, IndividualCommandProxy, ProviderConnectionHandler, ResponsibilityChain
Constant Summary collapse
- DefaultConnectionHandler =
CreateConnectionHandler
Instance Attribute Summary collapse
-
#connection_provider ⇒ Proc
The provider should accept a URI string and return a Redis connection already connected to the correct database specified in the URI.
-
#uri ⇒ URI
(also: #url)
The default URI for Database connections.
Attributes included from Middleware
#enable_database_counter, #enable_database_logging
Instance Method Summary collapse
-
#build_connection_chain ⇒ Object
Builds the connection chain with handlers in priority order.
-
#create_dbclient(uri = nil) ⇒ Redis
(also: #connect, #isolated_dbclient)
Creates a new Database connection instance.
-
#dbclient(uri = nil) ⇒ Redis
Retrieves a Database connection using the Chain of Responsibility pattern.
-
#normalize_uri(uri) ⇒ Object
Normalizes various URI formats to a consistent URI object Made public so handlers can use it.
Methods included from Operations
#pipelined, #transaction, #with_dbclient, #with_isolated_dbclient
Methods included from Middleware
#clear_fiber_connection!, #increment_middleware_version!, #middleware_version, #set_fiber_connection
Instance Attribute Details
#connection_provider ⇒ Proc
The provider should accept a URI string and return a Redis connection already connected to the correct database specified in the URI.
36 37 38 |
# File 'lib/familia/connection.rb', line 36 def connection_provider @connection_provider end |
#uri ⇒ URI Also known as: url
Returns The default URI for Database connections.
25 26 27 |
# File 'lib/familia/connection.rb', line 25 def uri @uri end |
Instance Method Details
#build_connection_chain ⇒ Object
Builds the connection chain with handlers in priority order
97 98 99 100 101 102 103 |
# File 'lib/familia/connection.rb', line 97 def build_connection_chain ResponsibilityChain.new .add_handler(Familia::Connection::FiberTransactionHandler.new) .add_handler(FiberConnectionHandler.new) .add_handler(ProviderConnectionHandler.new) .add_handler(CreateConnectionHandler.new) end |
#create_dbclient(uri = nil) ⇒ Redis Also known as: connect, isolated_dbclient
Creates a new Database connection instance.
This method always creates a fresh connection and does not use caching. Each call returns a new Redis client instance that you are responsible for managing and closing when done.
74 75 76 77 78 79 80 81 |
# File 'lib/familia/connection.rb', line 74 def create_dbclient(uri = nil) parsed_uri = normalize_uri(uri) # Register middleware only once, globally register_middleware_once Redis.new(parsed_uri.conf) end |
#dbclient(uri = nil) ⇒ Redis
Retrieves a Database connection using the Chain of Responsibility pattern. Handles DB selection automatically based on the URI.
91 92 93 94 |
# File 'lib/familia/connection.rb', line 91 def dbclient(uri = nil) @connection_chain ||= build_connection_chain @connection_chain.handle(uri) end |
#normalize_uri(uri) ⇒ Object
Normalizes various URI formats to a consistent URI object Made public so handlers can use it
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/familia/connection.rb', line 107 def normalize_uri(uri) case uri when Integer new_uri = Familia.uri.dup new_uri.db = uri new_uri when ->(obj) { obj.is_a?(String) || obj.instance_of?(::String) } URI.parse(uri) when URI uri when nil Familia.uri else raise ArgumentError, "Invalid URI type: #{uri.class.name}" end end |