Parent

Methods

Included Modules

Class/Module Index [+]

Quicksearch

RR::DirectTableScan

Scans two tables for differences. Doesn't have any reporting functionality by itself. Instead DirectTableScan#run yields all the differences for the caller to do with as it pleases. Usage:

1. Create a new DirectTableScan object and hand it all necessary information
2. Call DirectTableScan#run to do the actual comparison
3. The block handed to DirectTableScan#run receives all differences

Attributes

left_caster[RW]

The TypeCastingCursor for the left table

right_caster[RW]

The TypeCastingCursor for the right table

Public Class Methods

new(session, left_table, right_table = nil) click to toggle source

Creates a new DirectTableScan instance

* session: a Session object representing the current database session
* left_table: name of the table in the left database
* right_table: name of the table in the right database. If not given, same like left_table
# File lib/rubyrep/direct_table_scan.rb, line 23
def initialize(session, left_table, right_table = nil)
  super
end

Public Instance Methods

run(&blck) click to toggle source

Runs the table scan. Calls the block for every found difference. Differences are yielded with 2 parameters

* type: describes the difference, either :left (row only in left table), :right (row only in right table) or :conflict
* row: For :left or :right cases a hash describing the row; for :conflict an array of left and right row.
       A row is a hash of column_name => value pairs.
# File lib/rubyrep/direct_table_scan.rb, line 33
def run(&blck)
  left_cursor = right_cursor = nil
  left_cursor = session.left.select_cursor(
    :table => left_table,
    :row_buffer_size => scan_options[:row_buffer_size],
    :type_cast => true
  )
  right_cursor = session.right.select_cursor(
    :table => right_table,
    :row_buffer_size => scan_options[:row_buffer_size],
    :type_cast => true
  )
  left_row = right_row = nil
  update_progress 0 # ensures progress bar is printed even if there are no records
  while left_row or right_row or left_cursor.next? or right_cursor.next?
    # if there is no current left row, _try_ to load the next one
    left_row ||= left_cursor.next_row if left_cursor.next?
    # if there is no current right row, _try_ to load the next one
    right_row ||= right_cursor.next_row if right_cursor.next?
    rank = rank_rows left_row, right_row
    case rank
    when -1
      yield :left, left_row
      left_row = nil
      update_progress 1
    when 1
      yield :right, right_row
      right_row = nil
      update_progress 1
    when 0
      update_progress 2
      if not left_row == right_row
        yield :conflict, [left_row, right_row]
      end
      left_row = right_row = nil
    end
    # check for corresponding right rows
  end
ensure
  [left_cursor, right_cursor].each {|cursor| cursor.clear if cursor}
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.