lib/milkode/cdweb/lib/database.rb in milkode-0.5.0 vs lib/milkode/cdweb/lib/database.rb in milkode-0.5.1
- old
+ new
@@ -8,10 +8,11 @@
require 'rubygems'
require 'pathname'
require 'singleton'
require 'groonga'
require 'milkode/common/dbdir'
+require 'milkode/cdstk/yaml_file_wrapper'
include Milkode
module Milkode
class Database
include Singleton
@@ -20,14 +21,22 @@
def self.setup(db_dir)
@@db_dir = db_dir
end
+ attr_reader :yaml
+
def initialize
- open(@@db_dir || Dbdir.default_dir)
+ db_dir = @@db_dir || Dbdir.default_dir
+ open(db_dir)
+ @yaml = YamlFileWrapper.load_if(db_dir)
end
+ def yaml_reload
+ @yaml = YamlFileWrapper.load_if(@@db_dir || Dbdir.default_dir)
+ end
+
def open(db_dir)
dbfile = Dbdir.expand_groonga_path(db_dir)
if File.exist? dbfile
Groonga::Database.open(dbfile)
@@ -41,14 +50,10 @@
def record(shortpath)
table = @documents.select { |record| record.shortpath == shortpath }
return table.records[0]
end
- def fileNum
- @documents.select.size
- end
-
def search(patterns, packages, fpaths, suffixs, offset = 0, limit = -1)
# @todo fpathを厳密に検索するには、検索結果からさらに先頭からのパスではないものを除外する
records, total_records = searchMain(patterns, packages, fpaths, suffixs, offset, limit)
end
@@ -86,14 +91,24 @@
def totalRecords
reopen_patch
@documents.select.size
end
+ # yamlからパッケージの総数を得る
+ def yaml_package_num
+ @yaml.contents.size
+ end
+
# @sample test/test_database.rb:43 TestDatabase#t_fileList
def fileList(base)
base_parts = base.split("/")
base_depth = base_parts.length
+
+ # 'depth==0'の時はMilkodeYaml#contentsからファイルリストを生成して高速化
+ if (base_depth == 0)
+ return @yaml.contents.sort_by{|v| v.name}.map{|v| [v.name, false] }
+ end
# shortpathにマッチするものだけに絞り込む
if (base == "")
records = @documents.select.records
else
@@ -147,11 +162,11 @@
yield r if block_given?
r.record_id.delete
end
end
end
-
+
private
def reopen_patch
# 削除系のコマンドが上手く動作しないためのパッチ
# 本質的な解決にはなっていないと思う
@@ -211,10 +226,10 @@
{:key => "timestamp", :order => "descending"}],
:offset => offset,
:limit => limit)
# ファイル名でソート
- # @todo 本当はこっちが望ましい
+ # @todo 本当はこっちが望ましいが、パッケージ検索を正確にしないことには出来ない
# records = table.sort([{:key => "shortpath", :order => "ascending"}],
# :offset => offset,
# :limit => limit)
# パッケージの条件追加