
#!/usr/bin/env ruby
require "rubygems"
require "binlog"
require "pstore"

$db = PStore.new("/tmp/foo")

#master_log_file = "mysql-bin.000001"
#master_log_pos = 4

master_log_file = nil
master_log_pos = nil

$db.transaction do
  master_log_file = $db["master_log_file"]
  master_log_pos = $db["master_log_pos"]
end

def save_position(master_log_file, master_log_pos)
  $db.transaction do
    $db["master_log_file"] = master_log_file
    $db["master_log_pos"] = master_log_pos
  end
end

begin
  # XXX: Do not reuse a client instance, after connection goes out.
  client = Binlog::Client.new("mysql://admin:admin@192.168.1.111")
  sleep 0.3 until client.connect

  if master_log_file and master_log_pos
    client.set_position(master_log_file, master_log_pos)
  elsif master_log_pos
    client.position = master_log_pos
  end

  while event = client.wait_for_next_event
    puts "(#{event.event_type})"
    master_log_pos = event.next_position

    case event
    when Binlog::QueryEvent
      puts event.db_name
      puts event.query
      save_position(master_log_file, master_log_pos)
    when Binlog::RowEvent
      puts event.event_type
      puts event.db_name
      puts event.table_name
      p event.columns
      p event.rows
      save_position(master_log_file, master_log_pos)
    when Binlog::RotateEvent
      master_log_file = event.binlog_file
      master_log_pos = event.binlog_pos
      save_position(master_log_file, master_log_pos)
    end
  end
rescue Binlog::Error => e
  puts e
  retry if client.closed?
  raise e
end