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.
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 |
Instance Method Details
#connect ⇒ Object
45 46 47 |
# File 'lib/familia/horreum/connection.rb', line 45 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:
- FiberTransactionHandler - Fiber:familia_transaction
- DefaultConnectionHandler - Horreum model class-level @dbclient
- GlobalFallbackHandler - Familia.dbclient(uri || logical_database) (global fallback)
Thread-safe lazy initialization using double-checked locking to ensure only a single connection chain is built even under high concurrent load.
34 35 36 37 38 39 40 41 42 43 |
# File 'lib/familia/horreum/connection.rb', line 34 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.
233 234 235 236 |
# File 'lib/familia/horreum/connection.rb', line 233 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.
138 139 140 141 |
# File 'lib/familia/horreum/connection.rb', line 138 def transaction(&) ensure_relatives_initialized! Familia::Connection::TransactionCore.execute_transaction(-> { dbclient }, &) end |