Class: DatabaseRollbacker::DataMapper::Rollbacker

Inherits:
Object
  • Object
show all
Defined in:
lib/database_rollbacker/data_mapper/rollbacker.rb

Instance Method Summary collapse

Constructor Details

#initializeRollbacker

Returns a new instance of Rollbacker.



4
5
6
7
# File 'lib/database_rollbacker/data_mapper/rollbacker.rb', line 4

def initialize
  @savepoints = []
  @repository = :default
end

Instance Method Details

#cleanObject



50
51
52
53
54
55
56
57
58
59
# 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) ⇒ Object

Raises:

  • (ArgumentError)


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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