class DpStmMap::ClientTransactionManager

Public Class Methods

new(current_values, reference_counts, transaction_log) click to toggle source
# File lib/dp_stm_map/Manager.rb, line 317
def initialize current_values, reference_counts, transaction_log
  @current_values=current_values
  @reference_counts=reference_counts
  @transaction_log=transaction_log
end

Public Instance Methods

apply_transaction(transitions, new_values) click to toggle source
# File lib/dp_stm_map/Manager.rb, line 324
def apply_transaction transitions, new_values

  values_to_remove=Set.new
  values_to_add={}
  references_to_change={}

  transitions.each do |k,(old,new)|
    current=@current_values[k]
    raise StaleTransactionError, "transaction changing stale state" if (current != old)

    next if old == new

    if new && !@reference_counts.has_references?(new)
      unless new_values.has_key? new
        raise StaleTransactionError, "referencing not existing data"
      else
        values_to_add[new]=new_values[new]
      end

    end
  end

  transitions.each do |k,(old,new)|
    if (old != new)
      values_to_remove << old
      references_to_change[k]=new
      @current_values[k]=new
      @reference_counts.add_reference(new) if new
      @reference_counts.remove_reference(old) if old
    end
  end

  values_to_remove=values_to_remove.select {|v| v && !@reference_counts.has_references?(v)}

  # unless references_to_change.empty?
  @transaction_log.store_transaction references_to_change, values_to_add, values_to_remove.to_set.to_a
  # end



end