gonzui 1.2-x86-mswin32-60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. data/AUTHORS.txt +9 -0
  2. data/History.txt +5539 -0
  3. data/Manifest.txt +115 -0
  4. data/PostInstall.txt +17 -0
  5. data/README.rdoc +149 -0
  6. data/Rakefile +28 -0
  7. data/bin/gonzui-db +167 -0
  8. data/bin/gonzui-import +177 -0
  9. data/bin/gonzui-remove +58 -0
  10. data/bin/gonzui-search +68 -0
  11. data/bin/gonzui-server +176 -0
  12. data/bin/gonzui-update +53 -0
  13. data/data/gonzui/catalog/catalog.ja +80 -0
  14. data/data/gonzui/doc/favicon.ico +0 -0
  15. data/data/gonzui/doc/folder.png +0 -0
  16. data/data/gonzui/doc/gonzui.css +279 -0
  17. data/data/gonzui/doc/gonzui.js +111 -0
  18. data/data/gonzui/doc/text.png +0 -0
  19. data/data/gonzuirc.sample +29 -0
  20. data/ext/autopack/autopack.c +88 -0
  21. data/ext/autopack/extconf.rb +3 -0
  22. data/ext/delta/delta.c +147 -0
  23. data/ext/delta/extconf.rb +5 -0
  24. data/ext/texttokenizer/extconf.rb +5 -0
  25. data/ext/texttokenizer/texttokenizer.c +93 -0
  26. data/ext/xmlformatter/extconf.rb +5 -0
  27. data/ext/xmlformatter/xmlformatter.c +207 -0
  28. data/lib/gonzui.rb +59 -0
  29. data/lib/gonzui/apt.rb +193 -0
  30. data/lib/gonzui/autopack.so +0 -0
  31. data/lib/gonzui/bdbdbm.rb +118 -0
  32. data/lib/gonzui/cmdapp.rb +14 -0
  33. data/lib/gonzui/cmdapp/app.rb +175 -0
  34. data/lib/gonzui/cmdapp/search.rb +134 -0
  35. data/lib/gonzui/config.rb +117 -0
  36. data/lib/gonzui/content.rb +19 -0
  37. data/lib/gonzui/dbm.rb +673 -0
  38. data/lib/gonzui/deindexer.rb +162 -0
  39. data/lib/gonzui/delta.rb +49 -0
  40. data/lib/gonzui/delta.so +0 -0
  41. data/lib/gonzui/extractor.rb +347 -0
  42. data/lib/gonzui/fetcher.rb +309 -0
  43. data/lib/gonzui/gettext.rb +144 -0
  44. data/lib/gonzui/importer.rb +84 -0
  45. data/lib/gonzui/indexer.rb +316 -0
  46. data/lib/gonzui/info.rb +80 -0
  47. data/lib/gonzui/license.rb +100 -0
  48. data/lib/gonzui/logger.rb +48 -0
  49. data/lib/gonzui/monitor.rb +177 -0
  50. data/lib/gonzui/progressbar.rb +235 -0
  51. data/lib/gonzui/remover.rb +38 -0
  52. data/lib/gonzui/searcher.rb +330 -0
  53. data/lib/gonzui/searchquery.rb +235 -0
  54. data/lib/gonzui/searchresult.rb +111 -0
  55. data/lib/gonzui/texttokenizer.so +0 -0
  56. data/lib/gonzui/updater.rb +254 -0
  57. data/lib/gonzui/util.rb +415 -0
  58. data/lib/gonzui/vcs.rb +128 -0
  59. data/lib/gonzui/webapp.rb +25 -0
  60. data/lib/gonzui/webapp/advsearch.rb +123 -0
  61. data/lib/gonzui/webapp/filehandler.rb +24 -0
  62. data/lib/gonzui/webapp/jsfeed.rb +61 -0
  63. data/lib/gonzui/webapp/markup.rb +445 -0
  64. data/lib/gonzui/webapp/search.rb +269 -0
  65. data/lib/gonzui/webapp/servlet.rb +319 -0
  66. data/lib/gonzui/webapp/snippet.rb +155 -0
  67. data/lib/gonzui/webapp/source.rb +37 -0
  68. data/lib/gonzui/webapp/stat.rb +137 -0
  69. data/lib/gonzui/webapp/top.rb +63 -0
  70. data/lib/gonzui/webapp/uri.rb +140 -0
  71. data/lib/gonzui/webapp/webrick.rb +48 -0
  72. data/lib/gonzui/webapp/xmlformatter.so +0 -0
  73. data/script/console +10 -0
  74. data/script/destroy +14 -0
  75. data/script/generate +14 -0
  76. data/script/makemanifest.rb +21 -0
  77. data/tasks/extconf.rake +13 -0
  78. data/tasks/extconf/autopack.rake +43 -0
  79. data/tasks/extconf/delta.rake +43 -0
  80. data/tasks/extconf/texttokenizer.rake +43 -0
  81. data/tasks/extconf/xmlformatter.rake +43 -0
  82. data/test/_external_tools.rb +13 -0
  83. data/test/_test-util.rb +142 -0
  84. data/test/foo/Makefile.foo +66 -0
  85. data/test/foo/bar.c +5 -0
  86. data/test/foo/bar.h +6 -0
  87. data/test/foo/foo.c +25 -0
  88. data/test/foo/foo.spec +33 -0
  89. data/test/test_apt.rb +42 -0
  90. data/test/test_autopack_extn.rb +7 -0
  91. data/test/test_bdbdbm.rb +79 -0
  92. data/test/test_cmdapp-app.rb +35 -0
  93. data/test/test_cmdapp-search.rb +99 -0
  94. data/test/test_config.rb +28 -0
  95. data/test/test_content.rb +15 -0
  96. data/test/test_dbm.rb +171 -0
  97. data/test/test_deindexer.rb +50 -0
  98. data/test/test_delta.rb +66 -0
  99. data/test/test_extractor.rb +78 -0
  100. data/test/test_fetcher.rb +75 -0
  101. data/test/test_gettext.rb +50 -0
  102. data/test/test_gonzui.rb +11 -0
  103. data/test/test_helper.rb +10 -0
  104. data/test/test_importer.rb +56 -0
  105. data/test/test_indexer.rb +37 -0
  106. data/test/test_info.rb +82 -0
  107. data/test/test_license.rb +49 -0
  108. data/test/test_logger.rb +60 -0
  109. data/test/test_monitor.rb +23 -0
  110. data/test/test_searcher.rb +37 -0
  111. data/test/test_searchquery.rb +27 -0
  112. data/test/test_searchresult.rb +43 -0
  113. data/test/test_texttokenizer.rb +47 -0
  114. data/test/test_updater.rb +95 -0
  115. data/test/test_util.rb +149 -0
  116. data/test/test_vcs.rb +61 -0
  117. data/test/test_webapp-markup.rb +42 -0
  118. data/test/test_webapp-util.rb +19 -0
  119. data/test/test_webapp-xmlformatter.rb +19 -0
  120. metadata +292 -0
data/lib/gonzui.rb ADDED
@@ -0,0 +1,59 @@
1
+ # -*- mode: ruby -*-
2
+ #
3
+ # gonzui - a source code search engine.
4
+ #
5
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
6
+ # All rights reserved.
7
+ # This is free software with ABSOLUTELY NO WARRANTY.
8
+ #
9
+ # You can redistribute it and/or modify it under the terms of
10
+ # the GNU General Public License version 2.
11
+ #
12
+ #require 'rubygems'
13
+
14
+ $LOAD_PATH << "lib"
15
+ $LOAD_PATH << "ext"
16
+
17
+ module Gonzui
18
+ VERSION = "1.2"
19
+ SYSCONFDIR = "."
20
+ PKGDATADIR = File.join(__FILE__, "..", "..", "data", "gonzui")
21
+ GONZUI_URI = "http://gonzui.sourceforge.net"
22
+ HTTP_PORT = 46984
23
+ class GonzuiError < StandardError; end
24
+ end
25
+
26
+ require "gonzui/util"
27
+ require "gonzui/gettext"
28
+
29
+ begin # for Rake task
30
+ require 'gonzui/autopack'
31
+ require 'gonzui/delta'
32
+ require "gonzui/texttokenizer"
33
+ rescue LoadError
34
+ end
35
+
36
+ require "gonzui/dbm"
37
+ require "gonzui/bdbdbm"
38
+ require "gonzui/monitor"
39
+
40
+ require "gonzui/content"
41
+ require "gonzui/fetcher"
42
+ require "gonzui/updater"
43
+ require "gonzui/importer"
44
+ require "gonzui/remover"
45
+ require "gonzui/vcs"
46
+
47
+ require "gonzui/apt"
48
+ require "gonzui/config"
49
+ require "gonzui/deindexer"
50
+ require "gonzui/extractor"
51
+ require "gonzui/indexer"
52
+ require "gonzui/info"
53
+ require "gonzui/license"
54
+ require "gonzui/logger"
55
+ require 'gonzui/searcher'
56
+ require 'gonzui/searchquery'
57
+ require 'gonzui/searchresult'
58
+
59
+
data/lib/gonzui/apt.rb ADDED
@@ -0,0 +1,193 @@
1
+ #
2
+ # apt.rb - an interface library for apt
3
+ #
4
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ module Gonzui
13
+ class AptGetError < GonzuiError; end
14
+
15
+ module AptGet
16
+ extend Util
17
+
18
+ AptGetRegistry = {}
19
+
20
+ module_function
21
+ def available?
22
+ begin
23
+ require_command("apt-get")
24
+ return true
25
+ rescue CommandNotFoundError
26
+ return false
27
+ end
28
+ end
29
+
30
+ def get_apt_type
31
+ require_command("apt-get")
32
+ apt_type = :unknown
33
+ IO.popen("apt-get --version").each {|line|
34
+ if m = /^\*Ver: Standard \.(.*)$/.match(line)
35
+ apt_type = m[1].intern
36
+ end
37
+ }
38
+ return apt_type
39
+ end
40
+
41
+ def new(config, package_name)
42
+ apt_type = get_apt_type
43
+ if klass = AptGetRegistry[apt_type]
44
+ return klass.new(config, package_name)
45
+ else
46
+ raise AptGetError.new("#{apt_type}: unsupported apt type")
47
+ end
48
+ end
49
+
50
+ def register(klass)
51
+ assert(!AptGetRegistry.include?(klass.apt_type))
52
+ AptGetRegistry[klass.apt_type] = klass
53
+ end
54
+ end
55
+
56
+ class AbstractAptGet
57
+ include Util
58
+ include TemporaryDirectoryUtil
59
+
60
+ def initialize(config, package_name)
61
+ @config = config
62
+ @package_name = package_name
63
+ @apt_options = ""
64
+ @cleaning_procs = []
65
+ set_temporary_directory(config.temporary_directory)
66
+ end
67
+
68
+ def run_apt_get
69
+ cd = "cd"
70
+ cd << " /d" if (/mswin|mingw|bccwin/ =~ RUBY_PLATFORM)
71
+ command_line = sprintf("#{cd} %s && apt-get -qq %s source %s >/dev/null 2>&1",
72
+ shell_escape(self.temporary_directory),
73
+ @apt_options,
74
+ shell_escape(@package_name))
75
+ status = system(command_line)
76
+ raise AptGetError.new("#{@package_name}: unable to get sources") if
77
+ status == false
78
+ end
79
+
80
+ def extract_package
81
+ NotImplementedError.new("should be implemented in a sub class")
82
+ end
83
+
84
+ def add_cleaning_proc(proc)
85
+ @cleaning_procs.push(proc)
86
+ end
87
+
88
+ public
89
+ def extract
90
+ prepare_temporary_directory
91
+ run_apt_get
92
+ return extract_package
93
+ end
94
+
95
+ def clean
96
+ @cleaning_procs.each {|proc| proc.call }
97
+ clean_temporary_directory
98
+ end
99
+ end
100
+
101
+ class DebAptGet < AbstractAptGet
102
+ def self.apt_type
103
+ :deb
104
+ end
105
+
106
+ def find_archive(directory)
107
+ Dir.entries_without_dots(directory).map {|entry|
108
+ File.join(directory, entry)
109
+ }.find {|file_name|
110
+ Extractor.supported_file?(file_name)
111
+ }
112
+ end
113
+
114
+ def find_deb_source_directory
115
+ entries = Dir.entries_without_dots(self.temporary_directory)
116
+ directory = entries.map {|entry|
117
+ File.join(self.temporary_directory, entry)
118
+ }.find {|path|
119
+ File.directory?(path)
120
+ }
121
+ raise AptGetError.new("#{@package_name}: source directory not found") if
122
+ directory.nil?
123
+ return directory
124
+ end
125
+
126
+ def remove_deb_files
127
+ Dir.entries(self.temporary_directory).each {|entry|
128
+ file_name = File.join(self.temporary_directory, entry)
129
+ File.unlink(file_name) if File.file?(file_name)
130
+ }
131
+ end
132
+
133
+ def contains_single_tarball?(directory)
134
+ entries = Dir.entries_without_dots(directory)
135
+ entries.delete("debian")
136
+ entries.delete("CVS") # some packages have it
137
+ entries.length == 1 and Extractor.supported_file?(entries.first)
138
+ end
139
+
140
+ def extract_package
141
+ remove_deb_files
142
+ source_directory = find_deb_source_directory
143
+ if contains_single_tarball?(source_directory)
144
+ archive_file_name = find_archive(source_directory)
145
+ extractor = Extractor.new(@config, archive_file_name)
146
+ add_cleaning_proc(lambda{ extractor.clean_temporary_directory })
147
+ return extractor.extract
148
+ else
149
+ return source_directory
150
+ end
151
+ end
152
+
153
+ AptGet.register(self)
154
+ end
155
+
156
+ class RPMAptGet < AbstractAptGet
157
+ def self.apt_type
158
+ :rpm
159
+ end
160
+
161
+ def initialize(config, package_name)
162
+ super(config, package_name)
163
+ @apt_options = "-d"
164
+ end
165
+
166
+ def srpm_file?(file_name)
167
+ /\.src\.rpm$/.match(file_name)
168
+ end
169
+
170
+ def find_srpm_file
171
+ entries = Dir.entries_without_dots(self.temporary_directory)
172
+ raise AptGetError.new("#{@package_name}: download failed") if
173
+ entries.length != 1
174
+
175
+ candidate = entries.first
176
+ raise AptGetError.new("#{@package_name}: SRPM not found") unless
177
+ srpm_file?(candidate)
178
+ return File.join(self.temporary_directory, candidate)
179
+ end
180
+
181
+ # FIXME: It cannot handle multiple tar balls in a single
182
+ # package like FC2's emacs including emacs, Mule-UCS, .
183
+ private
184
+ def extract_package
185
+ srpm_file_name = find_srpm_file
186
+ extractor = Extractor.new(@config, srpm_file_name)
187
+ add_cleaning_proc(lambda{ extractor.clean_temporary_directory })
188
+ return extractor.extract
189
+ end
190
+
191
+ AptGet.register(self)
192
+ end
193
+ end
Binary file
@@ -0,0 +1,118 @@
1
+ #
2
+ # bdbdbm.rb - bdb implementation of gonzui DB
3
+ #
4
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ require 'bdb'
13
+
14
+ module Gonzui
15
+ class BDBDBM < AbstractDBM
16
+ def initialize(config, read_only = false)
17
+ retried = false
18
+ begin
19
+ @db_mode = if read_only then BDB::RDONLY else BDB::CREATE end
20
+ env_flags = BDB::CREATE | BDB::INIT_MPOOL | BDB::INIT_LOCK
21
+ options = {}
22
+ options["set_cachesize"] = config.db_cache_size
23
+ @db_env = BDB::Env.new(config.db_directory, env_flags, options)
24
+ super(config, read_only)
25
+ rescue BDB::Fatal => e
26
+ raise e if retried
27
+ retried = true
28
+ #
29
+ # "Lock table is out of available locker entries"
30
+ # error ocasionally occurs if a process using
31
+ # Gonzui::BDMDBM is killed by SIGKILL forcibly. In
32
+ # that case, we can remove Berkeley DB Environment
33
+ # to solve the error.
34
+ #
35
+ BDB::Env.remove(config.db_directory, BDB::FORCE)
36
+ retry
37
+ end
38
+ end
39
+
40
+ private
41
+ def do_open_db(name, key_type, value_type, dupsort)
42
+ options = {}
43
+ options["env"] = @db_env
44
+ if key_type == AutoPack::ID && !dupsort
45
+ options["set_array_base"] = 0
46
+ options["set_store_value"] = value_type.store if value_type.store
47
+ options["set_fetch_value"] = value_type.fetch if value_type.fetch
48
+ db = BDB::Recno.open(name.to_s, nil, @db_mode, 0644, options)
49
+ else
50
+ options["set_flags"] = BDB::DUPSORT if dupsort
51
+ options["set_store_key"] = key_type.store if key_type.store
52
+ options["set_fetch_key"] = key_type.fetch if key_type.fetch
53
+ options["set_store_value"] = value_type.store if value_type.store
54
+ options["set_fetch_value"] = value_type.fetch if value_type.fetch
55
+ db = BDB::Btree.open(name.to_s, nil, @db_mode, 0644, options)
56
+ end
57
+ db.extend(BDBExtension)
58
+ return db
59
+ end
60
+
61
+ public
62
+ def close
63
+ super
64
+ @db_env.close
65
+ end
66
+
67
+ def find_all_by_prefix(pattern)
68
+ results = []
69
+ self.word_wordid.each_by_prefix(pattern) {|word, word_id|
70
+ results.concat(collect_all_results(word_id))
71
+ }
72
+ return results
73
+ end
74
+ end
75
+
76
+ module BDBExtension
77
+ def duplicates(key , assoc = false)
78
+ super(key, assoc) rescue super(key, 0) # hack for Windows
79
+ end
80
+
81
+ def each_by_prefix(prefix)
82
+ values = []
83
+ cursor = self.cursor
84
+ begin
85
+ if pair = cursor.set_range(prefix)
86
+ begin
87
+ k, v = pair
88
+ break unless k[0, prefix.length] == prefix
89
+ yield(k, v)
90
+ end while pair = cursor.next
91
+ end
92
+ return values
93
+ ensure
94
+ cursor.close
95
+ end
96
+ end
97
+
98
+ def delete_both(key, value)
99
+ cursor = self.cursor
100
+ begin
101
+ pair = cursor.get(BDB::GET_BOTH, key, value)
102
+ cursor.delete unless pair.nil?
103
+ ensure
104
+ cursor.close
105
+ end
106
+ end
107
+
108
+ def get_last_key
109
+ cursor = self.cursor
110
+ begin
111
+ k, v = cursor.last
112
+ return k
113
+ ensure
114
+ cursor.close
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,14 @@
1
+ #
2
+ # cmdapp.rb - a library for command line applications
3
+ #
4
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ require 'gonzui/cmdapp/app.rb'
13
+ require 'gonzui/cmdapp/search.rb'
14
+
@@ -0,0 +1,175 @@
1
+ #
2
+ # app.rb - command line application framework
3
+ #
4
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ require 'getoptlong'
13
+
14
+ # gonzui applications use UTF-8 for the internal encoding.
15
+ $KCODE = "u"
16
+
17
+ module Gonzui
18
+ class CommandLineApplication
19
+ include Util
20
+ extend Util
21
+
22
+ def initialize
23
+ @config = Config.new
24
+
25
+ # ~/.gonzuirc has precedence over /etc/gonzuirc
26
+ file_names = []
27
+ file_names.push(File.join(ENV['HOME'], ".gonzuirc")) if ENV['HOME']
28
+ file_names.push(File.join(SYSCONFDIR, "gonzuirc"))
29
+ file_names.each {|file_name|
30
+ if File.exist?(file_name)
31
+ @config.load(file_name)
32
+ break
33
+ end
34
+ }
35
+ end
36
+
37
+ def parse_options_to_hash(option_table)
38
+ begin
39
+ options = {}
40
+ parser = GetoptLong.new
41
+ parser.set_options(*option_table)
42
+ parser.quiet = true
43
+ parser.each_option {|name, arg|
44
+ options[name.sub(/^--/, "")] = arg
45
+ }
46
+ return options
47
+ rescue => e
48
+ eprintf("%s", e.message)
49
+ end
50
+ end
51
+
52
+ def show_version
53
+ printf("%s %s\n", program_name, Gonzui::VERSION)
54
+ exit
55
+ end
56
+
57
+ def dump_config
58
+ @config.dump
59
+ exit
60
+ end
61
+
62
+ def be_quiet
63
+ devnull = if windows? then "NUL" else "/dev/null" end
64
+ STDOUT.reopen(devnull)
65
+ end
66
+
67
+ def ensure_db_directory_available
68
+ eprintf "#{@config.db_directory}: DB directory not found" unless
69
+ File.directory?(@config.db_directory)
70
+ end
71
+
72
+ def show_usage
73
+ do_show_usage
74
+ cache_size = @config.db_cache_size / 1024 ** 2
75
+ puts " --gonzuirc=FILE specify alternate run control file"
76
+ puts " --dump-config dump configuration"
77
+ puts " -d, --db-dir=DIR use DB directory DIR"
78
+ puts " --db-cache=NUM use NUM megabytes of DB cache [#{cache_size}]"
79
+ puts " --list-formats list all supported formats"
80
+ puts " --help show this help message"
81
+ puts " -q, --quiet suppress all normal output"
82
+ puts " -v, --verbose output progress and statistics"
83
+ puts " --version print version information and exit"
84
+ exit
85
+ end
86
+
87
+ def show_formats
88
+ max = LangScan::modules.sort_by {|m| m.name.length }.last.name.length
89
+ LangScan::modules.sort_by {|m| m.name }.each {|m|
90
+ printf("%-#{max}s %s\n", m.name, m.abbrev)
91
+ }
92
+ exit
93
+ end
94
+
95
+ def process_common_options(options)
96
+ show_version if options["version"]
97
+ show_usage if options["help"]
98
+ show_formats if options["list-formats"]
99
+ @config.quiet = true if options["quiet"]
100
+ @config.verbose = true if options["verbose"]
101
+ @config.load(File.expand_path(options["gonzuirc"])) if
102
+ options["gonzuirc"]
103
+ @config.db_directory = File.expand_path(options["db-dir"]) if
104
+ options["db-dir"]
105
+ @config.db_cache_size = (options["db-cache"].to_f * 1024 ** 2).to_i if
106
+ options["db-cache"]
107
+
108
+ UTF8.set_preference(@config.encoding_preference)
109
+ set_verbosity(@config.verbose)
110
+ be_quiet if @config.quiet
111
+ dump_config if options["dump-config"]
112
+ end
113
+
114
+ def parse_options
115
+ option_table = [
116
+ ["--help", GetoptLong::NO_ARGUMENT],
117
+ ["--version", GetoptLong::NO_ARGUMENT],
118
+ ["--quiet", "-q", GetoptLong::NO_ARGUMENT],
119
+ ["--verbose", "-v", GetoptLong::NO_ARGUMENT],
120
+ ["--db-dir", "-d", GetoptLong::REQUIRED_ARGUMENT],
121
+ ["--db-cache", GetoptLong::REQUIRED_ARGUMENT],
122
+ ["--list-formats", GetoptLong::NO_ARGUMENT],
123
+ ["--dump-config", GetoptLong::NO_ARGUMENT],
124
+ ["--gonzuirc", GetoptLong::REQUIRED_ARGUMENT]
125
+ ]
126
+ option_table.concat(do_get_option_table)
127
+ options = parse_options_to_hash(option_table)
128
+ process_common_options(options)
129
+ do_process_options(options)
130
+ end
131
+
132
+ def init_logger
133
+ @logger = Logger.new(@config.gonzui_log_file)
134
+ end
135
+
136
+ def init_logger_with_stderr
137
+ @logger = Logger.new(@config.gonzui_log_file)
138
+ @logger.attach(STDERR)
139
+ end
140
+
141
+ def start
142
+ begin
143
+ do_start
144
+ rescue Interrupt, Errno::EPIPE
145
+ end
146
+ end
147
+
148
+
149
+ # Hook methods
150
+ def do_show_usage
151
+ raise NotImplementedError.new
152
+ end
153
+
154
+ def do_start
155
+ raise NotImplementedError.new
156
+ end
157
+
158
+ def do_process_options(options)
159
+ raise NotImplementedError.new
160
+ end
161
+
162
+ def do_get_option_table
163
+ raise NotImplementedError.new
164
+ end
165
+
166
+ def self.start
167
+ app = self.new
168
+ begin
169
+ app.start
170
+ rescue IncompatibleDBError => e
171
+ eprintf("%s", e.message)
172
+ end
173
+ end
174
+ end
175
+ end