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) # パッケージの条件追加