summaryrefslogtreecommitdiff
path: root/storage/mroonga/vendor/groonga/lib/mrb/scripts/command_line/grndb.rb
diff options
context:
space:
mode:
Diffstat (limited to 'storage/mroonga/vendor/groonga/lib/mrb/scripts/command_line/grndb.rb')
-rw-r--r--storage/mroonga/vendor/groonga/lib/mrb/scripts/command_line/grndb.rb169
1 files changed, 169 insertions, 0 deletions
diff --git a/storage/mroonga/vendor/groonga/lib/mrb/scripts/command_line/grndb.rb b/storage/mroonga/vendor/groonga/lib/mrb/scripts/command_line/grndb.rb
new file mode 100644
index 00000000000..96a99c80223
--- /dev/null
+++ b/storage/mroonga/vendor/groonga/lib/mrb/scripts/command_line/grndb.rb
@@ -0,0 +1,169 @@
+module Groonga
+ module CommandLine
+ class Grndb
+ def initialize(argv)
+ @command, *@arguments = argv
+ @succeeded = true
+ @executed = false
+ @database_path = nil
+ end
+
+ def run
+ slop = create_slop
+ rest = nil
+ begin
+ rest = slop.parse(@arguments)
+ rescue Slop::Error
+ $stderr.puts($!.message)
+ return false
+ end
+
+ if slop.help?
+ $stdout.puts(slop.help)
+ return true
+ end
+
+ unless @executed
+ if rest.empty?
+ $stderr.puts("No command is specified.")
+ else
+ $stderr.puts("Unknown command: <#{rest.first}>")
+ end
+ return false
+ end
+
+ @succeeded
+ end
+
+ private
+ def create_slop
+ slop = Slop.new
+ command_name = File.basename(@command)
+ slop.banner = "Usage: #{command_name} COMMAND [OPTIONS] DB_PATH"
+ slop_enable_help(slop)
+
+ slop.command "check" do |command|
+ command.description "Check database"
+ slop_enable_help(command)
+
+ command.run do |options, arguments|
+ run_command(options, arguments) do |database, new_arguments|
+ check(database, options, new_arguments)
+ end
+ end
+ end
+
+ slop.command "recover" do |command|
+ command.description "Recover database"
+ slop_enable_help(command)
+
+ command.run do |options, arguments|
+ run_command(options, arguments) do |database, new_arguments|
+ recover(database, options, new_arguments)
+ end
+ end
+ end
+
+ slop
+ end
+
+ def slop_enable_help(slop)
+ slop.on("-h", "--help", "Display this help message.", :tail => true)
+ end
+
+ def open_database(arguments)
+ if arguments.empty?
+ $stderr.puts("Database path is missing")
+ @succeesed = false
+ return
+ end
+
+ database = nil
+ @database_path, *rest_arguments = arguments
+ begin
+ database = Database.open(@database_path)
+ rescue Error => error
+ $stderr.puts("Failed to open database: <#{@database_path}>")
+ $stderr.puts(error.message)
+ @succeeded = false
+ return
+ end
+
+ begin
+ yield(database, rest_arguments)
+ ensure
+ database.close
+ end
+ end
+
+ def run_command(options, arguments)
+ @executed = true
+
+ if options.help?
+ $stdout.puts(options.help)
+ return
+ end
+
+ open_database(arguments) do |database|
+ yield(database)
+ end
+ end
+
+ def recover(database, options, arguments)
+ begin
+ database.recover
+ rescue Error => error
+ $stderr.puts("Failed to recover database: <#{@database_path}>")
+ $stderr.puts(error.message)
+ @succeeded = false
+ end
+ end
+
+ def check(database, options, arguments)
+ if database.locked?
+ message =
+ "Database is locked. " +
+ "It may be broken. " +
+ "Re-create the database."
+ $stdout.puts(message)
+ @succeeded = false
+ end
+
+ database.each do |object|
+ case object
+ when IndexColumn
+ next unless object.locked?
+ message =
+ "[#{object.name}] Index column is locked. " +
+ "It may be broken. " +
+ "Re-create index by '#{@command} recover #{@database_path}'."
+ $stdout.puts(message)
+ @succeeded = false
+ when Column
+ next unless object.locked?
+ name = object.name
+ message =
+ "[#{name}] Data column is locked. " +
+ "It may be broken. " +
+ "(1) Truncate the column (truncate #{name}) or " +
+ "clear lock of the column (lock_clear #{name}) " +
+ "and (2) load data again."
+ $stdout.puts(message)
+ @succeeded = false
+ when Table
+ next unless object.locked?
+ name = object.name
+ message =
+ "[#{name}] Table is locked. " +
+ "It may be broken. " +
+ "(1) Truncate the table (truncate #{name}) or " +
+ "clear lock of the table (lock_clear #{name}) " +
+ "and (2) load data again."
+ $stdout.puts(message)
+ @succeeded = false
+ end
+ end
+ end
+ end
+ end
+end