class GroongaClientModel::Migrator

Attributes

current_version[R]
output[RW]

Public Class Methods

default_search_path() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 26
def default_search_path
  "db/groonga/migrate"
end
new(search_paths) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 34
def initialize(search_paths)
  @output = nil
  @search_paths = Array(search_paths)
  ensure_versions
  ensure_loaded_versions
  @current_version = @loaded_versions.last
  @target_version = nil
end
next_migration_number(number) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 22
def next_migration_number(number)
  [Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % number].max
end

Public Instance Methods

each() { |definition| ... } click to toggle source
# File lib/groonga_client_model/migrator.rb, line 88
def each
  return to_enum(:each) unless block_given?

  current_version = @current_version || 0
  if forward?
    sorted_definitions.each do |definition|
      next if definition.version <= current_version
      next if @target_version and definition.version > @target_version
      yield(definition)
    end
  else
    sorted_definitions.reverse_each do |definition|
      next if definition.version > current_version
      next if @target_version and definition.version <= @target_version
      yield(definition)
    end
  end
end
migrate() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 62
def migrate
  is_forward = forward?
  each do |definition|
    Client.open do |client|
      migration = definition.create_migration(client)
      migration.output = @output
      report(definition) do
        if is_forward
          migration.up
          add_version(client, definition.version)
          @current_version = definition.version
        else
          migration.down
          delete_version(client, definition.version)
          previous_version_index = @versions.index(definition.version) - 1
          if previous_version_index < 0
            @current_version = nil
          else
            @current_version = @versions[previous_version_index]
          end
        end
      end
    end
  end
end
step=(step) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 47
def step=(step)
  if @current_version.nil?
    index = step - 1
  else
    index = @versions.index(@current_version)
    index += step
  end
  if index < 0
    version = 0
  else
    version = @versions[index]
  end
  self.target_version = version
end
target_version=(version) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 43
def target_version=(version)
  @target_version = version
end

Private Instance Methods

add_version(client, version) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 173
def add_version(client, version)
  client.request(:load).
    parameter(:table, version_table_name).
    parameter(:values, [{"_key" => version}].to_json).
    response
end
collect_definitions() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 120
def collect_definitions
  paths = []
  @search_paths.each do |search_path|
    paths |= Dir.glob("#{search_path}/**/[0-9]*_*.rb").collect do |path|
      File.expand_path(path)
    end
  end
  definitions = []
  paths.each do |path|
    definition = Definition.new(path)
    definitions << definition if definition.valid?
  end
  definitions
end
delete_version(client, version) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 180
def delete_version(client, version)
  client.request(:delete).
    parameter(:table, version_table_name).
    parameter(:key, version).
    response
end
ensure_loaded_versions() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 143
def ensure_loaded_versions
  Client.open do |client|
    table_name = version_table_name
    exist = client.object_exist(name: table_name).body
    if exist
      @loaded_versions = client.request(:select).
        parameter(:table, table_name).
        sort_keys([:_key]).
        limit(-1).
        output_columns(["_key"]).
        response.
        records.
        collect(&:_key)
    else
      client.request(:table_create).
        parameter(:name, table_name).
        flags_parameter(:flags, ["TABLE_PAT_KEY"]).
        parameter(:key_type, "UInt64").
        response
      @loaded_versions = []
    end
  end
end
ensure_versions() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 139
def ensure_versions
  @versions = sorted_definitions.collect(&:version)
end
forward?() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 167
def forward?
  @target_version.nil? or
    @current_version.nil? or
    (@target_version > @current_version)
end
mark(text) click to toggle source
# File lib/groonga_client_model/migrator.rb, line 203
def mark(text)
  pre = "=="
  max_width = 79
  post_length = [0, max_width - pre.length - 1 - text.length - 1].max
  post = "=" * post_length
  puts("#{pre} #{text} #{post}")
end
puts(*args) click to toggle source
Calls superclass method
# File lib/groonga_client_model/migrator.rb, line 108
def puts(*args)
  if @output
    @output.puts(*args)
  else
    super
  end
end
report(definition) { || ... } click to toggle source
# File lib/groonga_client_model/migrator.rb, line 187
def report(definition)
  version = definition.version
  name = definition.name
  if forward?
    action = "forward"
  else
    action = "rollback"
  end
  mark("#{version} #{name}: #{action}")
  time = Benchmark.measure do
    yield
  end
  mark("%s %s: %.4fs" % [version, name, time.real])
  puts
end
sorted_definitions() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 135
def sorted_definitions
  @sorted_definitions ||= collect_definitions.sort_by(&:version)
end
version_table_name() click to toggle source
# File lib/groonga_client_model/migrator.rb, line 116
def version_table_name
  "schema_versions"
end