Class RR::ReplicationDifference

  1. lib/rubyrep/replication_difference.rb
Parent: Object

Describes a (record specific) difference between both databases as identifed via change log.

Methods

public class

  1. new

public instance

  1. amend
  2. changes
  3. load
  4. loaded?
  5. session
  6. to_yaml_properties

Constants

OTHER_SIDE = { :left => :right, :right => :left }   Shortcut to calculate the “other” database.
DIFF_TYPES = { :insert => {:insert => :conflict, :update => :conflict, :delete => :conflict, :no_change => :left}, :update => {:insert => :conflict, :update => :conflict, :delete => :conflict, :no_change => :left}, :delete => {:insert => :conflict, :update => :conflict, :delete => :no_change, :no_change => :left}, :no_change => {:insert => :right, :update => :right, :delete => :right, :no_change => :no_change} }   Resulting diff type based on types of left changes (outer hash) and right changes (inner hash)

Attributes

loaded [W] Should be set to true if this ReplicationDifference instance was successfully loaded.
loaders [RW] The current LoggedChangeLoaders instance
type [RW] The type of the difference. Either
  • :left: change in left database
  • :right: change in right database
  • :conflict: change in both databases
  • :no_diff: changes in both databases constitute no difference

Public class methods

new (loaders)

Creates a new ReplicationDifference instance. loaders is teh current LoggedChangeLoaders instance

[show source]
# File lib/rubyrep/replication_difference.rb, line 30
    def initialize(loaders)
      self.loaders = loaders
    end

Public instance methods

amend ()

Amends a difference according to new entries in the change log table

[show source]
# File lib/rubyrep/replication_difference.rb, line 59
    def amend
      loaders.update
      changes[:left].load
      changes[:right].load
      self.type = DIFF_TYPES[changes[:left].type][changes[:right].type]
    end
changes ()

A hash with keys :left and / or :right. Hash values are LoggedChange instances.

[show source]
# File lib/rubyrep/replication_difference.rb, line 24
    def changes
      @changes ||= {}
    end
load ()

Loads a difference

[show source]
# File lib/rubyrep/replication_difference.rb, line 67
    def load
      change_times = {}
      [:left, :right].each do |database|
        changes[database] = LoggedChange.new loaders[database]
        change_times[database] = loaders[database].oldest_change_time
      end
      return if change_times[:left] == nil and change_times[:right] == nil

      oldest = nil
      [:left, :right].each do |database|
        oldest = OTHER_SIDE[database] if change_times[database] == nil
      end
      oldest ||= change_times[:left] <= change_times[:right] ? :left : :right
      changes[oldest].load_oldest

      changes[OTHER_SIDE[oldest]].load_specified(
        session.corresponding_table(oldest, changes[oldest].table),
        changes[oldest].key)

      self.type = DIFF_TYPES[changes[:left].type][changes[:right].type]
      self.loaded = true
    end
loaded? ()

Returns true if a replication difference was loaded

[show source]
# File lib/rubyrep/replication_difference.rb, line 39
    def loaded?
      @loaded
    end
session ()

The current Session.

[show source]
# File lib/rubyrep/replication_difference.rb, line 8
    def session
      @session ||= loaders.session
    end
to_yaml_properties ()

Prevents session and change loaders from going into YAML output

[show source]
# File lib/rubyrep/replication_difference.rb, line 91
    def to_yaml_properties
      instance_variables.sort.reject {|var_name| ['@session', '@loaders'].include? var_name}
    end