Module: RedisCopy

Defined in:
lib/redis-copy.rb,
lib/redis-copy/ui.rb,
lib/redis-copy/cli.rb,
lib/redis-copy/version.rb,
lib/redis-copy/strategy.rb,
lib/redis-copy/key-emitter.rb,
lib/redis-copy/ui/auto_run.rb,
lib/redis-copy/strategy/new.rb,
lib/redis-copy/ui/command_line.rb,
lib/redis-copy/strategy/classic.rb

Defined Under Namespace

Modules: KeyEmitter, Strategy, UI Classes: CLI

Constant Summary collapse

VERSION =
'0.0.3'

Class Method Summary collapse

Class Method Details

.copy(source, destination, options = {}) ⇒ Object

Parameters:

  • source (String)
  • destination (String)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/redis-copy.rb', line 17

def copy(source, destination, options = {})
  ui = UI.load(options)

  source = redis_from(source)
  destination = redis_from(destination)

  ui.abort('source cannot equal destination!') if same_redis?(source, destination)

  key_emitter = KeyEmitter.load(source, ui, options)
  strategem = Strategy.load(source, destination, ui, options)

  dest_empty = !(destination.randomkey) # randomkey returns string unless db empty.

  return false unless ui.confirm? <<-EODESC.strip_heredoc
    Source:      #{source.client.id}
    Destination: #{destination.client.id} (#{dest_empty ? '' : 'NOT '}empty)
    Key Emitter: #{key_emitter}
    Strategy:    #{strategem}
  EODESC

  ui.abort('Destination not empty!') unless dest_empty or options[:allow_nonempty]

  key_emitter.keys.each_with_object(Hash.new {0}) do |key, stats|
    success = strategem.copy(key)
    stats[success ? :success : :failure] += 1
    stats[:attempt] += 1

    unless success
      ui.notify("FAIL: #{key.dump}")
      ui.abort if options[:fail_fast]
    end
    ui.notify("PROGRESS: #{stats.inspect}") if (stats[:attempt] % 1000).zero?
  end.tap do |stats|
    ui.notify("DONE: #{stats.inspect}")
  end
end