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)
117 118 119 |
# File 'lib/familia/connection/behavior.rb', line 117 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.
111 112 113 114 |
# File 'lib/familia/connection/behavior.rb', line 111 def create_dbclient(uri = nil) parsed_uri = normalize_uri(uri) Familia.create_dbclient(parsed_uri) end |
#multi ⇒ Object
Alias for transaction (alternate naming)
188 189 190 |
# File 'lib/familia/connection/behavior.rb', line 188 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.
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/familia/connection/behavior.rb', line 73 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)
249 250 251 |
# File 'lib/familia/connection/behavior.rb', line 249 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.
243 244 245 246 |
# File 'lib/familia/connection/behavior.rb', line 243 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.
182 183 184 185 |
# File 'lib/familia/connection/behavior.rb', line 182 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
126 127 128 |
# File 'lib/familia/connection/behavior.rb', line 126 def uri=(uri) @uri = normalize_uri(uri) end |
#url ⇒ Object
Alias for uri (backward compatibility)
131 132 133 |
# File 'lib/familia/connection/behavior.rb', line 131 def url uri end |
#url=(uri) ⇒ Object
Alias for uri= (backward compatibility)
136 137 138 |
# File 'lib/familia/connection/behavior.rb', line 136 def url=(uri) self.uri = uri end |