gonzui 1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) 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/bdbdbm.rb +118 -0
  31. data/lib/gonzui/cmdapp.rb +14 -0
  32. data/lib/gonzui/cmdapp/app.rb +175 -0
  33. data/lib/gonzui/cmdapp/search.rb +134 -0
  34. data/lib/gonzui/config.rb +117 -0
  35. data/lib/gonzui/content.rb +19 -0
  36. data/lib/gonzui/dbm.rb +673 -0
  37. data/lib/gonzui/deindexer.rb +162 -0
  38. data/lib/gonzui/delta.rb +49 -0
  39. data/lib/gonzui/extractor.rb +347 -0
  40. data/lib/gonzui/fetcher.rb +309 -0
  41. data/lib/gonzui/gettext.rb +144 -0
  42. data/lib/gonzui/importer.rb +84 -0
  43. data/lib/gonzui/indexer.rb +316 -0
  44. data/lib/gonzui/info.rb +80 -0
  45. data/lib/gonzui/license.rb +100 -0
  46. data/lib/gonzui/logger.rb +48 -0
  47. data/lib/gonzui/monitor.rb +177 -0
  48. data/lib/gonzui/progressbar.rb +235 -0
  49. data/lib/gonzui/remover.rb +38 -0
  50. data/lib/gonzui/searcher.rb +330 -0
  51. data/lib/gonzui/searchquery.rb +235 -0
  52. data/lib/gonzui/searchresult.rb +111 -0
  53. data/lib/gonzui/updater.rb +254 -0
  54. data/lib/gonzui/util.rb +415 -0
  55. data/lib/gonzui/vcs.rb +128 -0
  56. data/lib/gonzui/webapp.rb +25 -0
  57. data/lib/gonzui/webapp/advsearch.rb +123 -0
  58. data/lib/gonzui/webapp/filehandler.rb +24 -0
  59. data/lib/gonzui/webapp/jsfeed.rb +61 -0
  60. data/lib/gonzui/webapp/markup.rb +445 -0
  61. data/lib/gonzui/webapp/search.rb +269 -0
  62. data/lib/gonzui/webapp/servlet.rb +319 -0
  63. data/lib/gonzui/webapp/snippet.rb +155 -0
  64. data/lib/gonzui/webapp/source.rb +37 -0
  65. data/lib/gonzui/webapp/stat.rb +137 -0
  66. data/lib/gonzui/webapp/top.rb +63 -0
  67. data/lib/gonzui/webapp/uri.rb +140 -0
  68. data/lib/gonzui/webapp/webrick.rb +48 -0
  69. data/script/console +10 -0
  70. data/script/destroy +14 -0
  71. data/script/generate +14 -0
  72. data/script/makemanifest.rb +21 -0
  73. data/tasks/extconf.rake +13 -0
  74. data/tasks/extconf/autopack.rake +43 -0
  75. data/tasks/extconf/delta.rake +43 -0
  76. data/tasks/extconf/texttokenizer.rake +43 -0
  77. data/tasks/extconf/xmlformatter.rake +43 -0
  78. data/test/_external_tools.rb +13 -0
  79. data/test/_test-util.rb +142 -0
  80. data/test/foo/Makefile.foo +66 -0
  81. data/test/foo/bar.c +5 -0
  82. data/test/foo/bar.h +6 -0
  83. data/test/foo/foo.c +25 -0
  84. data/test/foo/foo.spec +33 -0
  85. data/test/test_apt.rb +42 -0
  86. data/test/test_autopack_extn.rb +7 -0
  87. data/test/test_bdbdbm.rb +79 -0
  88. data/test/test_cmdapp-app.rb +35 -0
  89. data/test/test_cmdapp-search.rb +99 -0
  90. data/test/test_config.rb +28 -0
  91. data/test/test_content.rb +15 -0
  92. data/test/test_dbm.rb +171 -0
  93. data/test/test_deindexer.rb +50 -0
  94. data/test/test_delta.rb +66 -0
  95. data/test/test_extractor.rb +78 -0
  96. data/test/test_fetcher.rb +75 -0
  97. data/test/test_gettext.rb +50 -0
  98. data/test/test_gonzui.rb +11 -0
  99. data/test/test_helper.rb +10 -0
  100. data/test/test_importer.rb +56 -0
  101. data/test/test_indexer.rb +37 -0
  102. data/test/test_info.rb +82 -0
  103. data/test/test_license.rb +49 -0
  104. data/test/test_logger.rb +60 -0
  105. data/test/test_monitor.rb +23 -0
  106. data/test/test_searcher.rb +37 -0
  107. data/test/test_searchquery.rb +27 -0
  108. data/test/test_searchresult.rb +43 -0
  109. data/test/test_texttokenizer.rb +47 -0
  110. data/test/test_updater.rb +95 -0
  111. data/test/test_util.rb +149 -0
  112. data/test/test_vcs.rb +61 -0
  113. data/test/test_webapp-markup.rb +42 -0
  114. data/test/test_webapp-util.rb +19 -0
  115. data/test/test_webapp-xmlformatter.rb +19 -0
  116. metadata +291 -0
@@ -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
+
@@ -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
@@ -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)
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