Module: Familia::Connection::Behavior
- Included in:
- DataType::Connection, Horreum::Connection
- Defined in:
- lib/familia/connection/behavior.rb
Overview
Shared connection behavior for both Horreum and DataType classes
This module extracts common connection management functionality that was previously duplicated between Horreum::Connection and DataType::Connection. It provides:
- URI normalization with logical_database support
- Connection creation methods
- Transaction and pipeline execution methods
- Consistent connection API across object types
Classes including this module must implement:
dbclient(uri = nil)- Connection resolution methodbuild_connection_chain(private) - Chain of Responsibility setup
Instance Method Summary collapse
-
#connect ⇒ Object
Alias for create_dbclient (backward compatibility).
-
#create_dbclient(uri = nil) ⇒ Redis
Creates a new Database connection instance.
-
#multi ⇒ Object
Alias for transaction (alternate naming).
-
#normalize_uri(uri) ⇒ URI
Normalizes various URI formats to a consistent URI object.
-
#pipeline(&block) ⇒ Object
Alias for pipelined (alternate naming).
-
#pipelined {|Redis| ... } ⇒ MultiResult
Executes Redis commands in a pipeline using this object's connection context.
-
#transaction {|Redis| ... } ⇒ MultiResult
Executes a Redis transaction (MULTI/EXEC) using this object's connection context.
-
#uri=(uri) ⇒ URI
Sets the URI for this object's database connection.
-
#url ⇒ Object
Alias for uri (backward compatibility).
-
#url=(uri) ⇒ Object
Alias for uri= (backward compatibility).
Instance Method Details
#connect ⇒ Object
Alias for create_dbclient (backward compatibility)
115 116 117 |
# File 'lib/familia/connection/behavior.rb', line 115 def connect(*) create_dbclient(*) end |
#create_dbclient(uri = nil) ⇒ Redis
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.
109 110 111 112 |
# File 'lib/familia/connection/behavior.rb', line 109 def create_dbclient(uri = nil) parsed_uri = normalize_uri(uri) Familia.create_dbclient(parsed_uri) end |
#multi ⇒ Object
Alias for transaction (alternate naming)
186 187 188 |
# File 'lib/familia/connection/behavior.rb', line 186 def multi(&) transaction(&) end |
#normalize_uri(uri) ⇒ URI
Normalizes various URI formats to a consistent URI object
Handles multiple input types and considers the logical_database setting when uri is nil or Integer. This method is public so connection handlers can use it for consistent URI processing.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/familia/connection/behavior.rb', line 71 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 |
#pipeline(&block) ⇒ Object
Alias for pipelined (alternate naming)
247 248 249 |
# File 'lib/familia/connection/behavior.rb', line 247 def pipeline(&block) pipelined(&block) end |
#pipelined {|Redis| ... } ⇒ MultiResult
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
- 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.
241 242 243 244 |
# File 'lib/familia/connection/behavior.rb', line 241 def pipelined(&block) ensure_relatives_initialized! if respond_to?(:ensure_relatives_initialized!, true) Familia::Connection::PipelineCore.execute_pipeline(-> { dbclient }, &block) end |
#transaction {|Redis| ... } ⇒ MultiResult
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
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.
180 181 182 183 |
# File 'lib/familia/connection/behavior.rb', line 180 def transaction(&) ensure_relatives_initialized! if respond_to?(:ensure_relatives_initialized!, true) Familia::Connection::TransactionCore.execute_transaction(-> { dbclient }, &) end |
#uri=(uri) ⇒ URI
Sets the URI for this object's database connection
124 125 126 |
# File 'lib/familia/connection/behavior.rb', line 124 def uri=(uri) @uri = normalize_uri(uri) end |
#url ⇒ Object
Alias for uri (backward compatibility)
129 130 131 |
# File 'lib/familia/connection/behavior.rb', line 129 def url uri end |
#url=(uri) ⇒ Object
Alias for uri= (backward compatibility)
134 135 136 |
# File 'lib/familia/connection/behavior.rb', line 134 def url=(uri) self.uri = uri end |