class DatabaseRollbacker::DataMapper::Rollbacker

Public Class Methods

new() click to toggle source
# File lib/database_rollbacker/data_mapper/rollbacker.rb, line 4
def initialize
  @savepoints = []
  @repository = :default
end

Public Instance Methods

clean() click to toggle source
# File lib/database_rollbacker/data_mapper/rollbacker.rb, line 50
def clean
  DataMapper.repository(@repository) do |repository|
    adapter = repository.adapter
    while adapter.current_transaction do
      adapter.current_transaction.rollback
      adapter.pop_transaction
    end
  end
  @savepoints = []
end
rollback(savepoint_name) click to toggle source
# File lib/database_rollbacker/data_mapper/rollbacker.rb, line 26
def rollback(savepoint_name)
  savepoint = fetch_savepoint(savepoint_name)
  raise ArgumentError.new("savepoint not found") unless savepoint.present?
  DataMapper.repository(@repository) do |repository|
    adapter = repository.adapter
    while adapter.current_transaction
      transaction_id = adapter
        .current_transaction
        .instance_variable_get("@transaction_primitives")
        .values
        .last
        .id
      adapter.current_transaction.rollback
      adapter.pop_transaction
      break if transaction_id == savepoint.savepoint_id
    end
    while @savepoints.present? do
      last_savepoint_name = @savepoints.last.name
      @savepoints.pop
      break if last_savepoint_name == savepoint_name
    end
  end
end
save(savepoint_name) click to toggle source
# File lib/database_rollbacker/data_mapper/rollbacker.rb, line 9
def save(savepoint_name)
  raise ArgumentError.new('duplicate savepoint name') if savepoint_exist?(savepoint_name)
  DataMapper.repository(@repository) do |repository|
    transaction = DataMapper::Transaction.new(repository)
    transaction.begin
    repository.adapter.push_transaction(transaction)
    transaction_id = transaction
      .instance_variable_get("@transaction_primitives")
      .values
      .last
      .id
    @savepoints.push DatabaseRollbacker::Savepoint.new(
      savepoint_name,
      transaction_id)
  end
end

Private Instance Methods

fetch_savepoint(savepoint_name) click to toggle source
# File lib/database_rollbacker/data_mapper/rollbacker.rb, line 67
def fetch_savepoint(savepoint_name)
  @savepoints.find { |s| s.name == savepoint_name }
end
savepoint_exist?(savepoint_name) click to toggle source
# File lib/database_rollbacker/data_mapper/rollbacker.rb, line 63
def savepoint_exist?(savepoint_name)
  @savepoints.any? { |s| s.name == savepoint_name }
end