1 # Copyright (C) 2002-2004 Kouichirou Eto, All rights reserved.
6 require "chise/rbchise"
11 class DBS # collection of DBs. not yet
14 class ADB < BDB::Hash # A DataBase.
20 # p ["at_exit", @filename, @modified]
22 # p ["close", @filename, @modified]
23 self.close #これがないと、うまくデータベースがセーブされないのです。
28 def self.open_create(filename)
29 ADB.open(filename, nil, BDB::CREATE | BDB::EXCL) #上書きはしない
34 if key.char_length == 1
35 return "?"+key #Stringだったら引く前に?を足す
38 #key = key.to_s if key.is_a?(Numeric) #NumberだったらStringにする。
39 #ここで && key ! =~ /^\?/ をいれると、?自身を検索できなくなってしまう。
43 def myget(key) #keyキーを引いて返す
45 v = get(key) #存在しなかったらnilを返すことになる
49 def myput(key, v) #keyにvをいれる
56 class DB # abstract class for DataBase
58 return @pre + CHISE.unix_to_win(t) + @post if CHISE.windows?
59 return @pre + t + @post
63 File.dirname(get_filename(t))
69 keys.each {|key| open_db(key) }
75 next if ! File.file?(f)
81 t = CHISE.win_to_unix(f)
82 t.sub!(%r|^#{@pre}|, "")
83 t.sub!(%r|#{@post}$|, "") if @post != ""
97 return nil if get(t) #すでにopenしていたら再openはしない。
99 bdb = ADB.open(get_filename(t), nil, 0)
100 @dbs[t] = bdb if bdb != nil
102 p ["open error", get_filename(t)]; return nil
107 def make_db(t, h=nil) #tという名前でhという中身のデータベースを作る
108 return nil if get(t) #すでにある場合はreturn
109 Dir.mkdir(get_dirname(t)) unless FileTest.exist?(get_dirname(t))
112 db = ADB.open_create(get_filename(t)) #上書きはしない
115 k = "?"+k if k.is_a?(String)
121 p ["make error", get_filename(t)]; return nil
126 def make_db_no_question_mark(t, h=nil) #tという名前でhという中身のデータベースを作る
127 return nil if get(t) #すでにある場合はreturn
128 Dir.mkdir(get_dirname(t)) unless FileTest.exist?(get_dirname(t))
131 db = ADB.open_create(get_filename(t)) #上書きはしない
134 # k = "?"+k if k.is_a?(String)
140 p ["make error", get_filename(t)]; return nil
145 def remove_db(t) #tという名前のデータベースを消去する
152 File.unlink(get_filename(t)) if FileTest.file?(get_filename(t))
154 p ["unlink error", get_filename(t)]; return nil
157 Dir.rmdir(dn) if FileTest.directory?(dn) && Dir.entries(dn).length <= 2 #空directoryだったら消す
162 return s.to_i if s =~ /^\d+$/
169 file = get_filename(t)
170 open("#{file}.txt", "w"){|out|
171 # out.binmode.sync = true
173 ar.map! {|k, v| [to_num(k), to_num(v)] }
175 out.printf("%s\t%s\n", k, v)
181 def each_db() @dbs.to_a.sort.each {|t, db| yield(t, db) } end
182 def dump_all() each_db {|t, db| dump_db(t) } end
183 def close_all() each_db {|t, db| db.close } end
184 def keys() @dbs.keys end
187 return unless block_given?
193 k.sub!(/^\?/, "") if k =~ /^\?/ #冒頭の?は取り除く
194 vv = get(t, k) #p ["each", t, k, v, vv]
200 return unless block_given?
204 ar.map! {|k, v| [to_num(k), to_num(v)] }
206 k.sub!(/^\?/, "") if k =~ /^\?/ #冒頭の?は取り除く
207 vv = get(t, k) #p ["each", t, k, v, vv]
212 def get(t, key=nil) #tというデータベースのkeyキーを引いて返す
214 return db if key.nil?
219 def put(t, key, v) #tというデータベースのkeyにvをいれる
226 db.myput(key, v) #putする
230 class CharDB < DB # An Attribute DataBase. Key is in UTF8-MCS.
235 dir = Config.instance.db_dir
236 @glob, @pre, @post = "#{dir}/system-char-id/*", "#{dir}/system-char-id/", ""
240 def get_all(u8) #全データベースのu8キーを引いてHashにまとめて返す
244 atrs[t] = v if v != nil
250 class CodesysDB < DB # A CodeSystem DataBase.
255 dir = Config.instance.db_dir
256 @glob, @pre, @post = "#{dir}/*/system-char-id", "#{dir}/", "/system-char-id"
260 #def keys() @dbs.keys.sort end #どんなCodesysの情報を持っているかの一覧
261 def keys() @dbs.keys end #どんなCodesysの情報を持っているかの一覧
266 return Codesys.new(t)
274 @dbs = CodesysDB.instance
277 def keys() #どんなコードポイントの情報を持っているかの一覧
278 ks = @dbs.get(@name).keys
279 # if @name =~ /jisx0208/ #特別処理
280 # n = @dbs.get("=jis-x0208").keys
281 # # p ["keys", @name, ks, n]
284 ks.map! {|k| to_num(k) }
289 v = @dbs.get(@name, key)
291 # if @name =~ /jisx0208/ #jisx0208が含まれている場合だけ特別処理する
292 # return @dbs.get("=jis-x0208", key)
298 return unless block_given?
304 k.sub!(/^\?/, "") if k =~ /^\?/ #冒頭の?は取り除く
305 vv = @dbs.get(@name, k) #p ["each", t, k, v, vv]
311 return unless block_given?
315 ar.map! {|k, v| [to_num(k), to_num(v)] }
317 k.sub!(/^\?/, "") if k =~ /^\?/ #冒頭の?は取り除く
318 vv = @dbs.get(@name, k) #p ["each", t, k, v, vv]
326 db = CodesysDB.instance
327 @common = db.get_codesys("=jis-x0208")
328 @newest = db.get_codesys("japanese-jisx0208-1990")
332 char = @common.get(code)
333 return char unless char.nil?
334 char = @newest.get(code)
335 return char unless char.nil?