gren 0.3.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +7 -0
- data/{History.ja.txt → HISTORY.ja.md} +41 -15
- data/HISTORY.md +92 -0
- data/LICENSE.txt +22 -0
- data/README.ja.md +57 -0
- data/README.md +51 -0
- data/Rakefile +9 -39
- data/bin/gren +2 -7
- data/gren.gemspec +21 -0
- data/lib/gren.rb +3 -3
- data/lib/gren/cli.rb +13 -10
- data/lib/{common → gren/common}/grenfiletest.rb +0 -0
- data/lib/{common → gren/common}/grensnip.rb +1 -1
- data/lib/{common → gren/common}/platform.rb +0 -0
- data/lib/{common → gren/common}/string_snip.rb +0 -0
- data/lib/{common → gren/common}/util.rb +16 -10
- data/lib/{findgrep → gren/findgrep}/findgrep.rb +47 -143
- data/lib/{findgrep → gren/findgrep}/result.rb +1 -1
- data/lib/gren/version.rb +3 -0
- data/test/data/aaa.txt +1 -0
- data/test/data/abc.rb +8 -0
- data/test/data/bbb.txt +1 -0
- data/test/data/ccc.c +1 -0
- data/test/data/sub/ccc.txt +1 -0
- data/test/test_cli.rb +80 -0
- data/test/test_gren.rb +10 -10
- data/test/test_gren_util.rb +3 -2
- data/test/test_string_snip.rb +31 -31
- metadata +67 -177
- data/History.txt +0 -66
- data/Manifest.txt +0 -48
- data/PostInstall.txt +0 -7
- data/README.rdoc +0 -181
- data/bin/grendb +0 -11
- data/bin/grenweb +0 -11
- data/bin/mkgrendb +0 -11
- data/lib/common/display_util.rb +0 -62
- data/lib/grendb/cli.rb +0 -41
- data/lib/grenweb/cli.rb +0 -52
- data/lib/grenweb/database.rb +0 -179
- data/lib/grenweb/grenweb.ru +0 -35
- data/lib/grenweb/grep.rb +0 -52
- data/lib/grenweb/help.rb +0 -39
- data/lib/grenweb/home.rb +0 -39
- data/lib/grenweb/html_renderer.rb +0 -243
- data/lib/grenweb/public/css/gren.css +0 -63
- data/lib/grenweb/public/images/gren-icon-mini.png +0 -0
- data/lib/grenweb/public/images/gren-icon.png +0 -0
- data/lib/grenweb/query.rb +0 -82
- data/lib/grenweb/searcher.rb +0 -129
- data/lib/grenweb/viewer.rb +0 -51
- data/lib/mkgrendb/cli.rb +0 -49
- data/lib/mkgrendb/mkgrendb.rb +0 -230
- data/rake_rdoc_custom.rb +0 -13
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/test/test_grenweb_cli.rb +0 -10
- data/test/test_grenweb_html_renderer.rb +0 -41
- data/test/test_grenweb_query.rb +0 -54
- data/test/test_grenweb_searcher.rb +0 -35
@@ -1,63 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
}
|
3
|
-
|
4
|
-
div.header {
|
5
|
-
}
|
6
|
-
|
7
|
-
div.footer {
|
8
|
-
}
|
9
|
-
|
10
|
-
div.header_home {
|
11
|
-
font-size: 170%;
|
12
|
-
}
|
13
|
-
|
14
|
-
div.footer_home {
|
15
|
-
font-size: 85%;
|
16
|
-
margin-top: 3em;
|
17
|
-
}
|
18
|
-
|
19
|
-
div.search-summary {
|
20
|
-
border-color:#F4CA3F;
|
21
|
-
background-color:#FEFFF0;
|
22
|
-
border-top-style:solid;
|
23
|
-
border-top-width:1px;
|
24
|
-
border-bottom-style:solid;
|
25
|
-
border-bottom-width:1px;
|
26
|
-
margin-bottom:1em;
|
27
|
-
margin-top:1em;
|
28
|
-
padding-bottom:5px;
|
29
|
-
padding-top:5px;
|
30
|
-
padding-left:5px;
|
31
|
-
}
|
32
|
-
|
33
|
-
dt.result-record {
|
34
|
-
font-size: 105%;
|
35
|
-
}
|
36
|
-
|
37
|
-
pre.lines {
|
38
|
-
}
|
39
|
-
|
40
|
-
div.pagination {
|
41
|
-
background-color:#FEFFF0;
|
42
|
-
text-align: center;
|
43
|
-
margin-bottom: 20px;
|
44
|
-
}
|
45
|
-
|
46
|
-
pre {
|
47
|
-
border: 1px solid #dedede;
|
48
|
-
margin-bottom: 5px;
|
49
|
-
padding-left: 5px;
|
50
|
-
background-color: #fdfdfd;
|
51
|
-
font-weight: inherit;
|
52
|
-
margin-top: 5px;
|
53
|
-
padding-top: 5px;
|
54
|
-
padding-bottom: 5px;
|
55
|
-
}
|
56
|
-
|
57
|
-
span.keyword {
|
58
|
-
font-weight: bold;
|
59
|
-
}
|
60
|
-
|
61
|
-
font.version {
|
62
|
-
font-size: 35%;
|
63
|
-
}
|
Binary file
|
Binary file
|
data/lib/grenweb/query.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
#
|
3
|
-
# @file
|
4
|
-
# @brief クエリーの解析
|
5
|
-
# @author ongaeshi
|
6
|
-
# @date 2010/10/21
|
7
|
-
|
8
|
-
require 'rubygems'
|
9
|
-
require 'rack'
|
10
|
-
|
11
|
-
module Grenweb
|
12
|
-
class Query
|
13
|
-
include Rack::Utils
|
14
|
-
attr_reader :query_string
|
15
|
-
|
16
|
-
OPTIONS = [
|
17
|
-
['package', 'p'],
|
18
|
-
['filepath', 'fpath', 'f'],
|
19
|
-
['suffix', 's'],
|
20
|
-
]
|
21
|
-
|
22
|
-
def initialize(request)
|
23
|
-
@query_string = unescape(request.path_info.gsub(/\A\/|\/\z/, ''))
|
24
|
-
init_hash
|
25
|
-
parse
|
26
|
-
end
|
27
|
-
|
28
|
-
def escape_html
|
29
|
-
Rack::Utils::escape_html(@query_string)
|
30
|
-
end
|
31
|
-
|
32
|
-
def empty?
|
33
|
-
keywords.size == 0 && packages.size == 0 && fpaths.size == 0 && suffixs.size == 0
|
34
|
-
end
|
35
|
-
|
36
|
-
def keywords
|
37
|
-
@hash['keywords']
|
38
|
-
end
|
39
|
-
|
40
|
-
def packages
|
41
|
-
calc_param(0)
|
42
|
-
end
|
43
|
-
|
44
|
-
def fpaths
|
45
|
-
calc_param(1)
|
46
|
-
end
|
47
|
-
|
48
|
-
def suffixs
|
49
|
-
calc_param(2)
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def calc_param(index)
|
55
|
-
OPTIONS[index].inject([]){|result, item| result.concat @hash[item] }
|
56
|
-
end
|
57
|
-
|
58
|
-
def init_hash
|
59
|
-
@hash = {}
|
60
|
-
@hash['keywords'] = []
|
61
|
-
|
62
|
-
OPTIONS.flatten.each do |key|
|
63
|
-
@hash[key] = []
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def parse
|
68
|
-
kp = OPTIONS.flatten.join('|')
|
69
|
-
parts = @query_string.scan(/(?:(#{kp}):)?(?:"(.+)"|(\S+))/)
|
70
|
-
|
71
|
-
parts.each do |key, quoted_value, value|
|
72
|
-
text = quoted_value || value
|
73
|
-
unless (key)
|
74
|
-
@hash['keywords'] << text
|
75
|
-
else
|
76
|
-
@hash[key] << text
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
data/lib/grenweb/searcher.rb
DELETED
@@ -1,129 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
#
|
3
|
-
# @file
|
4
|
-
# @brief 検索処理本体
|
5
|
-
# @author ongaeshi
|
6
|
-
# @date 2010/10/13
|
7
|
-
|
8
|
-
require 'rack'
|
9
|
-
require File.join(File.dirname(__FILE__), 'database')
|
10
|
-
require File.join(File.dirname(__FILE__), 'html_renderer')
|
11
|
-
require File.join(File.dirname(__FILE__), 'query')
|
12
|
-
|
13
|
-
module Grenweb
|
14
|
-
class Searcher
|
15
|
-
include Rack::Utils
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
end
|
19
|
-
|
20
|
-
def call(env)
|
21
|
-
@request = Rack::Request.new(env)
|
22
|
-
@query = Query.new(@request)
|
23
|
-
|
24
|
-
@response = Rack::Response.new
|
25
|
-
@response["Content-Type"] = "text/html; charset=UTF-8"
|
26
|
-
|
27
|
-
@nth = 3 # マッチした行の前後何行を表示するか
|
28
|
-
|
29
|
-
@rendeler = HTMLRendeler.new(@request.script_name + '/..')
|
30
|
-
|
31
|
-
if @request.post? or @request['query']
|
32
|
-
post_request
|
33
|
-
else
|
34
|
-
search
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def post_request
|
41
|
-
query = @request['query'] || ''
|
42
|
-
if query.empty?
|
43
|
-
@request.path_info = "/"
|
44
|
-
else
|
45
|
-
@request.path_info = "/#{escape(query)}/"
|
46
|
-
end
|
47
|
-
@response.redirect(@request.url.split(/\?/, 2)[0])
|
48
|
-
@response.to_a
|
49
|
-
end
|
50
|
-
|
51
|
-
def search
|
52
|
-
render_header
|
53
|
-
render_search_box
|
54
|
-
render_search_result
|
55
|
-
render_footer
|
56
|
-
@response.to_a
|
57
|
-
end
|
58
|
-
|
59
|
-
def render_header
|
60
|
-
@response.write @rendeler.header("gren : #{@query.escape_html}", "gren")
|
61
|
-
end
|
62
|
-
|
63
|
-
def render_search_box
|
64
|
-
@response.write @rendeler.search_box(@query.escape_html)
|
65
|
-
end
|
66
|
-
|
67
|
-
def render_search_result
|
68
|
-
if @query.empty?
|
69
|
-
@response.write @rendeler.empty_summary
|
70
|
-
else
|
71
|
-
records, total_records, elapsed = Database.instance.search(@query.keywords, @query.packages, @query.fpaths, @query.suffixs, calcPage, calcLimit)
|
72
|
-
render_search_summary(records, total_records, elapsed)
|
73
|
-
records.each { |record| @response.write(@rendeler.result_record(record, @query.keywords, @nth)) }
|
74
|
-
render_pagination(calcPage, total_records)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def render_search_summary(records, total_records, elapsed)
|
79
|
-
pageStart = calcPage * calcLimit
|
80
|
-
@response.write @rendeler.search_summary(@query.query_string,
|
81
|
-
total_records,
|
82
|
-
(total_records.zero? ? 0 : pageStart + 1)..(pageStart + records.size),
|
83
|
-
elapsed)
|
84
|
-
end
|
85
|
-
|
86
|
-
def render_pagination(page, total_records)
|
87
|
-
return if @query.empty?
|
88
|
-
return if total_records < calcLimit
|
89
|
-
|
90
|
-
last_page = (total_records / calcLimit.to_f).ceil
|
91
|
-
@response.write("<div class='pagination'>\n")
|
92
|
-
if page > 0
|
93
|
-
@response.write(@rendeler.pagination_link(page - 1, "<<"))
|
94
|
-
end
|
95
|
-
last_page.times do |i|
|
96
|
-
if i == page
|
97
|
-
@response.write(@rendeler.pagination_span(i))
|
98
|
-
else
|
99
|
-
@response.write(@rendeler.pagination_link(i, i))
|
100
|
-
end
|
101
|
-
end
|
102
|
-
if page < (last_page - 1)
|
103
|
-
@response.write(@rendeler.pagination_link(page + 1, ">>"))
|
104
|
-
end
|
105
|
-
@response.write("</div>\n")
|
106
|
-
end
|
107
|
-
|
108
|
-
def render_footer
|
109
|
-
@response.write @rendeler.footer
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
# 1ページに表示する最大レコードを計算
|
115
|
-
def calcLimit
|
116
|
-
if @query.keywords.size == 0
|
117
|
-
100
|
118
|
-
else
|
119
|
-
20
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# 現在ページを計算
|
124
|
-
def calcPage
|
125
|
-
(@request['page'] || 0).to_i
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
data/lib/grenweb/viewer.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
#
|
3
|
-
# @file
|
4
|
-
# @brief ソースコードを表示する
|
5
|
-
# @author ongaeshi
|
6
|
-
# @date 2010/10/13
|
7
|
-
|
8
|
-
require 'rack'
|
9
|
-
require File.join(File.dirname(__FILE__), 'database')
|
10
|
-
require File.join(File.dirname(__FILE__), 'html_renderer')
|
11
|
-
|
12
|
-
module Grenweb
|
13
|
-
class Viewer
|
14
|
-
include Rack::Utils
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
end
|
18
|
-
|
19
|
-
def call(env)
|
20
|
-
@request = Rack::Request.new(env)
|
21
|
-
@response = Rack::Response.new
|
22
|
-
@response["Content-Type"] = "text/html; charset=UTF-8"
|
23
|
-
|
24
|
-
record, elapsed = Database.instance.record(req2query)
|
25
|
-
|
26
|
-
@rendeler = HTMLRendeler.new(@request.script_name + '/..')
|
27
|
-
|
28
|
-
if (record)
|
29
|
-
@response.write @rendeler.header("gren : #{record.shortpath}", "gren")
|
30
|
-
@response.write @rendeler.search_box("")
|
31
|
-
@response.write @rendeler.view_summary(record.shortpath, elapsed)
|
32
|
-
@response.write @rendeler.record_content(record)
|
33
|
-
else
|
34
|
-
@response.write @rendeler.header("gren : not found.", "gren")
|
35
|
-
@response.write @rendeler.search_box("")
|
36
|
-
@response.write @rendeler.empty_summary
|
37
|
-
end
|
38
|
-
@response.write @rendeler.footer
|
39
|
-
|
40
|
-
@response.to_a
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def req2query
|
46
|
-
p @request.path_info
|
47
|
-
unescape(@request.path_info.gsub(/\A\/|\/z/, ''))
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
data/lib/mkgrendb/cli.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require 'optparse'
|
3
|
-
require File.join(File.dirname(__FILE__), 'mkgrendb')
|
4
|
-
|
5
|
-
module Mkgrendb
|
6
|
-
class CLI
|
7
|
-
def self.execute(stdout, arguments=[])
|
8
|
-
input_yamls = []
|
9
|
-
isDump = false
|
10
|
-
isFull = false
|
11
|
-
isDelete = false
|
12
|
-
isReport = false
|
13
|
-
|
14
|
-
opt = OptionParser.new "#{File.basename($0)} INPUT_YAML1 [INPUT_YAML2 ...]"
|
15
|
-
opt.on('--ddb', "--default-db", "Create or Update default DB. (Plase set ENV['GRENDB_DEFAULT_DB'])") {|v| input_yamls << ENV['GRENDB_DEFAULT_DB']}
|
16
|
-
opt.on('--full', "Full update DB. (Delete and create)") {|v| isFull = true }
|
17
|
-
opt.on('--delete', "Delete DB. (Not delete yaml)") {|v| isDelete = true }
|
18
|
-
opt.on('--dump', "Dump DB.") {|v| isDump = true }
|
19
|
-
opt.on('--report', "Database Report.") {|v| isReport = true }
|
20
|
-
opt.parse!(arguments)
|
21
|
-
|
22
|
-
input_yamls.concat arguments
|
23
|
-
|
24
|
-
if (input_yamls.size >= 1)
|
25
|
-
input_yamls.each do |input_yaml|
|
26
|
-
obj = Mkgrendb.new(input_yaml)
|
27
|
-
|
28
|
-
if (isFull)
|
29
|
-
obj.full
|
30
|
-
stdout.puts
|
31
|
-
elsif (isDelete)
|
32
|
-
obj.delete
|
33
|
-
stdout.puts
|
34
|
-
elsif (isDump)
|
35
|
-
obj.dump
|
36
|
-
elsif (isReport)
|
37
|
-
obj.report
|
38
|
-
else
|
39
|
-
obj.update
|
40
|
-
stdout.puts
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
else
|
45
|
-
stdout.puts opt.help
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/mkgrendb/mkgrendb.rb
DELETED
@@ -1,230 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
require 'pathname'
|
5
|
-
require 'rubygems'
|
6
|
-
require 'groonga'
|
7
|
-
require 'fileutils'
|
8
|
-
require File.join(File.dirname(__FILE__), '../common/grenfiletest')
|
9
|
-
require File.join(File.dirname(__FILE__), '../common/util')
|
10
|
-
include Gren
|
11
|
-
|
12
|
-
module Mkgrendb
|
13
|
-
class Mkgrendb
|
14
|
-
def initialize(input)
|
15
|
-
input = File.expand_path(input)
|
16
|
-
@input_yaml = input.sub(/\.db$/, ".yaml")
|
17
|
-
@output_db = input.sub(/\.yaml$/, ".db")
|
18
|
-
puts "input_yaml : #{@input_yaml} found."
|
19
|
-
@src = YAML.load(open(@input_yaml).read())
|
20
|
-
@file_count = 0
|
21
|
-
@add_count = 0
|
22
|
-
@update_count = 0
|
23
|
-
@start_time = Time.now
|
24
|
-
end
|
25
|
-
|
26
|
-
def update
|
27
|
-
db_create(@output_db)
|
28
|
-
db_open(@output_db)
|
29
|
-
@src["directory"].each do |dir|
|
30
|
-
dir = File.expand_path(dir)
|
31
|
-
|
32
|
-
if (!FileTest.exist?(dir))
|
33
|
-
puts "[WARNING] : #{dir} (Not found, skip)"
|
34
|
-
elsif (FileTest.directory? dir)
|
35
|
-
db_add_dir(dir)
|
36
|
-
else
|
37
|
-
db_add_file(STDOUT, dir, File.basename(dir))
|
38
|
-
end
|
39
|
-
end
|
40
|
-
@end_time = Time.now
|
41
|
-
print_result
|
42
|
-
end
|
43
|
-
|
44
|
-
def delete
|
45
|
-
db_delete(@output_db)
|
46
|
-
end
|
47
|
-
|
48
|
-
def full
|
49
|
-
delete
|
50
|
-
update
|
51
|
-
end
|
52
|
-
|
53
|
-
def time
|
54
|
-
@end_time - @start_time
|
55
|
-
end
|
56
|
-
|
57
|
-
def print_result
|
58
|
-
puts
|
59
|
-
puts "input_yaml : #{@input_yaml} (#{Util::time_s(time)})"
|
60
|
-
puts "output_db : #{@output_db}*"
|
61
|
-
puts "files : #{@file_count}"
|
62
|
-
puts "add : #{@add_count}"
|
63
|
-
puts "update : #{@update_count}"
|
64
|
-
end
|
65
|
-
|
66
|
-
def dump()
|
67
|
-
db_open(@output_db)
|
68
|
-
|
69
|
-
documents = Groonga::Context.default["documents"]
|
70
|
-
records = documents.select
|
71
|
-
records.each do |record|
|
72
|
-
p record
|
73
|
-
puts "path : #{record.path}"
|
74
|
-
puts "shortpath : #{record.shortpath}"
|
75
|
-
puts "suffix : #{record.suffix}"
|
76
|
-
puts "timestamp : #{record.timestamp.strftime('%Y/%m/%d %H:%M:%S')}"
|
77
|
-
puts "content :", record.content ? record.content[0..64] : nil
|
78
|
-
puts
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def db_create(filename)
|
83
|
-
dbfile = Pathname(File.expand_path(filename))
|
84
|
-
dbdir = dbfile.dirname
|
85
|
-
dbdir.mkpath unless dbdir.exist?
|
86
|
-
|
87
|
-
unless dbfile.exist?
|
88
|
-
Groonga::Database.create(:path => dbfile.to_s)
|
89
|
-
Groonga::Schema.define do |schema|
|
90
|
-
schema.create_table("documents") do |table|
|
91
|
-
table.string("path")
|
92
|
-
table.string("shortpath")
|
93
|
-
table.text("content")
|
94
|
-
table.time("timestamp")
|
95
|
-
table.text("suffix")
|
96
|
-
end
|
97
|
-
|
98
|
-
schema.create_table("terms",
|
99
|
-
:type => :patricia_trie,
|
100
|
-
:key_normalize => true,
|
101
|
-
:default_tokenizer => "TokenBigram") do |table|
|
102
|
-
table.index("documents.path", :with_position => true)
|
103
|
-
table.index("documents.shortpath", :with_position => true)
|
104
|
-
table.index("documents.content", :with_position => true)
|
105
|
-
table.index("documents.suffix", :with_position => true)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
puts "create : #{filename} created."
|
109
|
-
else
|
110
|
-
puts "message : #{filename} already exist."
|
111
|
-
end
|
112
|
-
end
|
113
|
-
private :db_create
|
114
|
-
|
115
|
-
def db_delete(filename)
|
116
|
-
raise "Illegal file name : #{filename}." unless filename =~ /\.db$/
|
117
|
-
Dir.glob("#{filename}*").each do |f|
|
118
|
-
puts "delete : #{f}"
|
119
|
-
FileUtils.rm_r(f)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
private :db_delete
|
123
|
-
|
124
|
-
def db_open(filename)
|
125
|
-
dbfile = Pathname(File.expand_path(filename))
|
126
|
-
|
127
|
-
if dbfile.exist?
|
128
|
-
Groonga::Database.open(dbfile.to_s)
|
129
|
-
puts "open : #{dbfile} open."
|
130
|
-
else
|
131
|
-
raise "error : #{dbfile.to_s} not found!!"
|
132
|
-
end
|
133
|
-
end
|
134
|
-
private :db_open
|
135
|
-
|
136
|
-
def db_add_dir(dirname)
|
137
|
-
searchDirectory(STDOUT, dirname, File.basename(dirname), 0)
|
138
|
-
end
|
139
|
-
private :db_add_dir
|
140
|
-
|
141
|
-
def db_add_file(stdout, filename, shortpath)
|
142
|
-
# 格納するデータ
|
143
|
-
values = {
|
144
|
-
:path => filename,
|
145
|
-
:shortpath => shortpath,
|
146
|
-
:content => nil,
|
147
|
-
:timestamp => File.mtime(filename),
|
148
|
-
:suffix => File::extname(filename),
|
149
|
-
}
|
150
|
-
|
151
|
-
# 検索するデータベース
|
152
|
-
documents = Groonga::Context.default["documents"]
|
153
|
-
|
154
|
-
# 既に登録されているファイルならばそれを上書き、そうでなければ新規レコードを作成
|
155
|
-
_documents = documents.select do |record|
|
156
|
-
record["path"] == values[:path]
|
157
|
-
end
|
158
|
-
|
159
|
-
isNewFile = false
|
160
|
-
|
161
|
-
if _documents.size.zero?
|
162
|
-
document = documents.add
|
163
|
-
isNewFile = true
|
164
|
-
else
|
165
|
-
document = _documents.to_a[0].key
|
166
|
-
end
|
167
|
-
|
168
|
-
# タイムスタンプが新しければデータベースに格納
|
169
|
-
if (document[:timestamp] < values[:timestamp])
|
170
|
-
# 実際に使うタイミングでファイルの内容を読み込み
|
171
|
-
values[:content] = open(filename).read
|
172
|
-
|
173
|
-
# データベースに格納
|
174
|
-
values.each do |key, value|
|
175
|
-
if (key == :path)
|
176
|
-
if (isNewFile)
|
177
|
-
@add_count += 1
|
178
|
-
puts "add_file : #{value}"
|
179
|
-
else
|
180
|
-
@update_count += 1
|
181
|
-
puts "update : #{value}"
|
182
|
-
end
|
183
|
-
end
|
184
|
-
document[key] = value
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
end
|
189
|
-
|
190
|
-
def searchDirectory(stdout, dir, shortdir, depth)
|
191
|
-
Dir.foreach(dir) do |name|
|
192
|
-
next if (name == '.' || name == '..')
|
193
|
-
|
194
|
-
fpath = File.join(dir,name)
|
195
|
-
shortpath = File.join(shortdir,name)
|
196
|
-
|
197
|
-
# 除外ディレクトリならばパス
|
198
|
-
next if ignoreDir?(fpath)
|
199
|
-
|
200
|
-
# 読み込み不可ならばパス
|
201
|
-
next unless FileTest.readable?(fpath)
|
202
|
-
|
203
|
-
# ファイルならば中身を探索、ディレクトリならば再帰
|
204
|
-
case File.ftype(fpath)
|
205
|
-
when "directory"
|
206
|
-
searchDirectory(stdout, fpath, shortpath, depth + 1)
|
207
|
-
when "file"
|
208
|
-
unless ignoreFile?(fpath)
|
209
|
-
db_add_file(stdout, fpath, shortpath)
|
210
|
-
@file_count += 1
|
211
|
-
puts "file_count : #{@file_count}" if (@file_count % 100 == 0)
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
def ignoreDir?(fpath)
|
218
|
-
FileTest.directory?(fpath) &&
|
219
|
-
GrenFileTest::ignoreDir?(fpath)
|
220
|
-
end
|
221
|
-
private :ignoreDir?
|
222
|
-
|
223
|
-
def ignoreFile?(fpath)
|
224
|
-
GrenFileTest::ignoreFile?(fpath) ||
|
225
|
-
GrenFileTest::binary?(fpath)
|
226
|
-
end
|
227
|
-
private :ignoreFile?
|
228
|
-
|
229
|
-
end
|
230
|
-
end
|