Class: RR::ReplicationDifference

Inherits:
Object
  • Object
show all
Defined in:
lib/rubyrep/replication_difference.rb

Overview

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

Constant Summary collapse

OTHER_SIDE =

Shortcut to calculate the “other” database.

{
  :left => :right,
  :right => :left
}
DIFF_TYPES =

Resulting diff type based on types of left changes (outer hash) and right changes (inner hash)

{
  :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}
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(loaders) ⇒ ReplicationDifference

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



30
31
32
# File 'lib/rubyrep/replication_difference.rb', line 30

def initialize(loaders)
  self.loaders = loaders
end

Instance Attribute Details

#loaded=(value) ⇒ Object (writeonly)

Should be set to true if this ReplicationDifference instance was successfully loaded.



36
37
38
# File 'lib/rubyrep/replication_difference.rb', line 36

def loaded=(value)
  @loaded = value
end

#loadersObject

The current LoggedChangeLoaders instance



13
14
15
# File 'lib/rubyrep/replication_difference.rb', line 13

def loaders
  @loaders
end

#typeObject

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



20
21
22
# File 'lib/rubyrep/replication_difference.rb', line 20

def type
  @type
end

Instance Method Details

#amendObject

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



59
60
61
62
63
64
# 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

#changesObject

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



24
25
26
# File 'lib/rubyrep/replication_difference.rb', line 24

def changes
  @changes ||= {}
end

#loadObject

Loads a difference



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 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?Boolean

Returns true if a replication difference was loaded

Returns:

  • (Boolean)


39
40
41
# File 'lib/rubyrep/replication_difference.rb', line 39

def loaded?
  @loaded
end

#sessionObject

The current Session.



8
9
10
# File 'lib/rubyrep/replication_difference.rb', line 8

def session
  @session ||= loaders.session
end

#to_yaml_propertiesObject

Prevents session and change loaders from going into YAML output



91
92
93
# File 'lib/rubyrep/replication_difference.rb', line 91

def to_yaml_properties
  instance_variables.sort.reject {|var_name| ['@session', '@loaders'].include? var_name}
end