class Wyrm::Hole

This bypasses the need to marshal objects between two pumps. It uses a queue of the record arrays instead.

Attributes

dst_db[R]
options[R]
queue_size[R]
src_db[R]

Public Class Methods

new( src_db, dst_db, drop_tables: true, queue_size: Mouth::DEFAULT_QUEUE_SIZE ) click to toggle source
# File lib/wyrm/hole.rb, line 78
def initialize( src_db, dst_db, drop_tables: true, queue_size: Mouth::DEFAULT_QUEUE_SIZE )
  # called only once per run, so not really a performance issue
  @drop_tables = drop_tables
  @queue_size = queue_size

  @src_db = maybe_deebe src_db
  @dst_db = maybe_deebe dst_db

  @src_db.extension :schema_dumper
end

Public Instance Methods

call() click to toggle source
# File lib/wyrm/hole.rb, line 140
def call
  if drop_tables?
    logger.info "dropping tables"
    drop_tables src_db.tables
  end
  transfer_schema { transfer_tables }
end
drop_tables?() click to toggle source
# File lib/wyrm/hole.rb, line 90
def drop_tables?; @drop_tables end
dst_pump() click to toggle source
# File lib/wyrm/hole.rb, line 104
def dst_pump
  @dst_pump ||= Pump.new db: dst_db, **pump_options
end
mouth() click to toggle source
# File lib/wyrm/hole.rb, line 92
def mouth
  @mouth ||= Mouth.new queue_size: queue_size
end
pump_options() click to toggle source
# File lib/wyrm/hole.rb, line 96
def pump_options
  {io: mouth, codec: QueueCodec, logger: logger}
end
src_pump() click to toggle source
# File lib/wyrm/hole.rb, line 100
def src_pump
  @src_pump ||= Pump.new db: src_db, **pump_options
end
transfer_schema( ) { |self| ... } click to toggle source
# File lib/wyrm/hole.rb, line 129
def transfer_schema( &transfer_table_block )
  create_tables
  yield self if block_given? # transfer tables here
  create_indexes
end
transfer_table( table_name ) click to toggle source
# File lib/wyrm/hole.rb, line 108
def transfer_table( table_name )
  src_pump.table_name = dst_pump.table_name = table_name

  if src_pump.table_dataset.empty?
    logger.info "No records in #{table_name}"
    return
  end

  # Use threads so the db read/writes aren't waiting for one another.
  recv_thread = Thread.new{ dst_pump.restore }
  send_thread = Thread.new{ src_pump.dump }

  send_thread.join
  recv_thread.join
ensure
  mouth.reset
  src_pump.table_name = dst_pump.table_name = nil
end
transfer_tables() click to toggle source
# File lib/wyrm/hole.rb, line 135
def transfer_tables
  logger.info "transferring tables"
  src_db.tables.each {|table_name| transfer_table table_name }
end