class Sequel::ConnectionGuard::ModelGuard

An abstraction for safely accessing Sequel models.

@see Sequel.ModelGuard

@api public @since 0.1.0

Public Class Methods

new(ds, &class_body) click to toggle source

@param ds [Sequel::ConnectionGuard::Dataset] @option class_body [Proc]

@api private @since 0.1.0

# File lib/sequel/extensions/connection_guard/model_guard.rb, line 17
def initialize(ds, &class_body)
  @connection_guard = ds.connection_guard
  @table_name = ds.table_name
  @class_body = class_body
  @connected = false
  @model = nil
end

Public Instance Methods

force_execute() { |model| ... } click to toggle source

Unsafely access the model. Will fail if connection fails.

@example

UserGuard.force_execute { |model| model.create(email: 'vova@example.com') }

@param block [Proc] @raise [Sequel::DatabaseConnectionError] connection failure

@api public @since 0.1.0

# File lib/sequel/extensions/connection_guard/model_guard.rb, line 62
def force_execute(&block)
  @connection_guard.force_execute do |connection|
    instantiate_model(connection) unless @connected

    yield @model
  end
rescue Sequel::DatabaseConnectionError => error
  @connected = false
  raise error
end
raw_model() click to toggle source

@api private @since 0.1.0

# File lib/sequel/extensions/connection_guard/model_guard.rb, line 75
def raw_model
  try_instantiate_model if @model.nil?
  @model
end
safe_execute(&block) click to toggle source

Safely access the model.

@example

users = UserGuard.safe_execute do
  alive { |model| model.all }
  dead { [] }
end

@param block [Proc]

@api public @since 0.1.0

# File lib/sequel/extensions/connection_guard/model_guard.rb, line 37
def safe_execute(&block)
  executor = Executor.new
  executor.instance_eval(&block)

  @connection_guard.force_execute do |connection|
    instantiate_model(connection) unless @connected

    executor.on_alive.call(@model)
  end
rescue Sequel::DatabaseConnectionError
  @connected = false

  executor.on_dead&.call
end

Private Instance Methods

instantiate_model(connection) click to toggle source

@raise [Sequel::DatabaseConnectionError] connection failure

@api private @since 0.1.0

# File lib/sequel/extensions/connection_guard/model_guard.rb, line 86
def instantiate_model(connection)
  if @model.nil?
    @model = Class.new(Sequel::Model(connection[@table_name]))
    @model.class_eval(&@class_body) unless @class_body.nil?
  else
    @model.dataset = connection[@table_name]
  end

  @connected = true
end
try_instantiate_model() click to toggle source

@api private @since 0.1.0

# File lib/sequel/extensions/connection_guard/model_guard.rb, line 99
def try_instantiate_model
  @connection_guard.force_execute { |connection| instantiate_model(connection) }
rescue Sequel::DatabaseConnectionError
end