Module: Familia::Horreum::Connection
- Included in:
- Familia::Horreum
- 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)
Instance Attribute Summary collapse
-
#uri ⇒ Object
(also: #url)
Returns the value of attribute uri.
Instance Method Summary collapse
- #connect ⇒ Object
-
#create_dbclient(uri = nil) ⇒ Object
Creates a new Database connection instance using the class/instance configuration.
-
#dbclient(uri = nil) ⇒ Redis
Returns the Database connection for the class using Chain of Responsibility pattern.
-
#normalize_uri(uri) ⇒ Object
Normalizes various URI formats to a consistent URI object Considers the class/instance logical_database when uri is nil or Integer.
-
#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.
Instance Attribute Details
#uri ⇒ Object Also known as: url
Returns the value of attribute uri.
10 11 12 |
# File 'lib/familia/horreum/connection.rb', line 10 def uri @uri end |
Instance Method Details
#connect ⇒ Object
58 59 60 |
# File 'lib/familia/horreum/connection.rb', line 58 def connect(*) create_dbclient(*) end |
#create_dbclient(uri = nil) ⇒ Object
Creates a new Database connection instance using the class/instance configuration
39 40 41 42 |
# File 'lib/familia/horreum/connection.rb', line 39 def create_dbclient(uri = nil) parsed_uri = normalize_uri(uri) Familia.create_dbclient(parsed_uri) 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)
53 54 55 56 |
# File 'lib/familia/horreum/connection.rb', line 53 def dbclient(uri = nil) @class_connection_chain ||= build_connection_chain @class_connection_chain.handle(uri) end |
#normalize_uri(uri) ⇒ Object
Normalizes various URI formats to a consistent URI object Considers the class/instance logical_database when uri is nil or Integer
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/familia/horreum/connection.rb', line 14 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 # Use logical_database if available, otherwise fall back to Familia.uri if respond_to?(:logical_database) && logical_database new_uri = Familia.uri.dup new_uri.db = logical_database new_uri else Familia.uri end else raise ArgumentError, "Invalid URI type: #{uri.class.name}" end 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.
246 247 248 249 |
# File 'lib/familia/horreum/connection.rb', line 246 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.
151 152 153 154 |
# File 'lib/familia/horreum/connection.rb', line 151 def transaction(&) ensure_relatives_initialized! Familia::Connection::TransactionCore.execute_transaction(-> { dbclient }, &) end |