1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#!/usr/bin/env ruby
unless respond_to?(:spawn, true)
puts("Ruby 1.9 is required.")
exit(false)
end
require 'ostruct'
require 'optparse'
require 'tempfile'
require 'time'
options = OpenStruct.new
options.groonga = "groonga"
options.show_result = false
options.report_progress = true
option_parser = OptionParser.new do |parser|
parser.banner += " DATABASE COMMAND_FILE1 ..."
parser.on("--groonga=PATH",
"Use PATH as groonga command path") do |path|
options.groonga = path
end
parser.on("--[no-]show-result",
"Show result of command") do |boolean|
options.show_result = boolean
end
parser.on("--[no-]report-progress",
"Report progress") do |boolean|
options.report_progress = boolean
end
end
database, *command_files = option_parser.parse!(ARGV)
if database.nil?
puts(option_parser)
exit(false)
end
i = 0
command_files.each do |path|
File.open(path) do |file|
file.each_line do |command|
if options.report_progress
i += 1
puts("#{Time.now.iso8601}: #{i} commands done.") if (i % 1000).zero?
end
command = command.chomp
base_name = File.basename($0, ".*")
log = Tempfile.new("#{base_name}-log")
command_file = Tempfile.new("#{base_name}-command")
command_file.puts(command)
command_file.close
command_line = [options.groonga,
"--log-path", log.path,
"--file", command_file.path]
command_file << "-n" unless File.exist?(database)
command_line << database
result = Tempfile.new("#{base_name}-result")
pid = spawn(*command_line, :out => result.fileno)
pid, status = Process.waitpid2(pid)
unless status.success?
puts("failed to run: (#{status.exitstatus}): " +
"[#{command_line.join(' ')}]")
puts("command:")
puts(command)
puts("result:")
result.open
puts(result.read)
next
# exit(false)
end
if options.show_result
result.open
puts(result.read)
end
log.open
log.each_line do |log_line|
case log_line
when /grn_fin \((\d+)\)/
n_unfreed_allocations = $1.to_i
unless n_unfreed_allocations.zero?
puts("maybe memory leak: #{n_unfreed_allocations}: <#{command}>")
exit(false)
end
end
end
end
end
end
|