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