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