Module: Familia::Horreum::Connection
- Includes:
- Connection::Behavior
- Defined in:
- lib/familia/horreum/connection.rb
Overview
Connection - Mixed instance and class-level methods for Valkey connection management Provides connection handling, transactions, and URI normalization for both class-level operations (e.g., Customer.dbclient) and instance-level operations (e.g., customer.dbclient)
Includes shared connection behavior from Familia::Connection::Behavior, providing:
- URI normalization (normalize_uri)
- Connection creation (create_dbclient)
- Transaction method signatures
- Pipeline method signatures
Instance Attribute Summary collapse
-
#uri ⇒ Object
(also: #url)
Returns the value of attribute uri.
Class Method Summary collapse
-
.extended(base) ⇒ Object
Thread-safe mutex initialization when module is extended.
Instance Method Summary collapse
- #connect ⇒ Object
-
#dbclient(uri = nil) ⇒ Redis
Returns the Database connection for the class using Chain of Responsibility pattern.
-
#pipelined(&block) {|Redis| ... } ⇒ MultiResult
(also: #pipeline)
Executes Redis commands in a pipeline using this object's connection context.
-
#transaction {|conn| ... } ⇒ MultiResult
(also: #multi)
Perform a sacred Database transaction ritual.
Methods included from Connection::Behavior
#create_dbclient, #normalize_uri
Instance Attribute Details
#uri ⇒ Object Also known as: url
Returns the value of attribute uri.
20 21 22 |
# File 'lib/familia/horreum/connection.rb', line 20 def uri @uri end |
Class Method Details
.extended(base) ⇒ Object
Thread-safe mutex initialization when module is extended
243 244 245 |
# File 'lib/familia/horreum/connection.rb', line 243 def self.extended(base) base.instance_variable_set(:@class_connection_chain_mutex, Mutex.new) end |
Instance Method Details
#connect ⇒ Object
48 49 50 |
# File 'lib/familia/horreum/connection.rb', line 48 def connect(*) create_dbclient(*) end |
#dbclient(uri = nil) ⇒ Redis
Returns the Database connection for the class using Chain of Responsibility pattern.
This method uses a chain of handlers to resolve connections in priority order:
- FiberPipelineHandler - Fiber:familia_pipeline
- FiberTransactionHandler - Fiber:familia_transaction
- FiberConnectionHandler - Fiber:familia_connection
- ProviderConnectionHandler - User-defined connection provider
- CachedConnectionHandler - Horreum model class-level @dbclient
- CreateConnectionHandler - Fresh connection creation (fallback)
Thread-safe lazy initialization using double-checked locking to ensure only a single connection chain is built even under high concurrent load.
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/familia/horreum/connection.rb', line 37 def dbclient(uri = nil) # Fast path: return existing chain if already initialized return @class_connection_chain.handle(uri) if @class_connection_chain # Slow path: thread-safe initialization @class_connection_chain_mutex.synchronize do @class_connection_chain ||= build_connection_chain end @class_connection_chain.handle(uri) end |
#pipelined(&block) {|Redis| ... } ⇒ MultiResult Also known as: pipeline
Connection Inheritance:
- Uses object's logical_database setting if configured
- Inherits class-level database settings
- Falls back to instance-level dbclient if set
- Uses global connection chain as final fallback
Pipeline Context:
- When called outside global pipeline: Creates local MultiResult
- When called inside global pipeline: Yields to existing pipeline
- Maintains proper Fiber-local state for nested calls
Performance Considerations:
- Best for multiple independent operations on the same object
- Reduces network latency by batching commands
- Commands execute independently (some may succeed, others fail)
Executes Redis commands in a pipeline using this object's connection context.
Batches multiple Redis commands together and sends them in a single network round-trip for improved performance. Uses the object's database and connection settings. Returns a MultiResult object for consistency with global methods.
236 237 238 239 |
# File 'lib/familia/horreum/connection.rb', line 236 def pipelined(&block) ensure_relatives_initialized! Familia::Connection::PipelineCore.execute_pipeline(-> { dbclient }, &block) end |
#transaction {|conn| ... } ⇒ MultiResult Also known as: multi
This method works with the global Familia.transaction context when available
Connection Inheritance:
- Uses object's logical_database setting if configured
- Inherits class-level database settings
- Falls back to instance-level dbclient if set
- Uses global connection chain as final fallback
Transaction Context:
- When called outside global transaction: Creates local MultiResult
- When called inside global transaction: Yields to existing transaction
- Maintains proper Fiber-local state for nested calls
Perform a sacred Database transaction ritual.
This method creates a protective circle around your Database operations, ensuring they all succeed or fail together. It's like a group hug for your data operations, but with more ACID properties.
Executes a Redis transaction (MULTI/EXEC) using this object's connection context.
Provides atomic execution of multiple Redis commands with automatic connection management and operation mode enforcement. Uses the object's database and connection settings. Returns a MultiResult object for consistency with global methods.
141 142 143 144 |
# File 'lib/familia/horreum/connection.rb', line 141 def transaction(&) ensure_relatives_initialized! Familia::Connection::TransactionCore.execute_transaction(-> { dbclient }, &) end |