#dir = @location + subdir
dir = DataSource::DB_DIR.path + subdir
dir.each_entry {|f|
- #p f
next if f.to_s == "." || f.to_s == ".."
- #next if f.to_s =~ /\.txt\Z/
- #yield(f.unescape_win_filename.unescape.to_s)
- yield(f.to_s)
+ next if f.to_s =~ /\.txt\Z/
+ yield(f.unescape_win_filename.unescape.to_s)
}
end
end
class DataSource_R
NONE = 0
Berkeley_DB = 1
- DB_DIR = "/cygdrive/c/chise/chise-db"
+ #DB_DIR = "/cygdrive/c/chise/chise-db"
+ DB_DIR = CHISE::DB_DIR
def initialize(type=Berkeley_DB, loc=DB_DIR, subtype=0, modemask=0755)
@type = type
class AttributeTable
def initialize(dir, cat, keytype, name, amask, mmask)
- @name = name
-
- #qp name
- dbdir = dir + cat + keytype
- path = dbdir + name.path.escape.escape_win_filename
-
- if amask == BDB::RDONLY
- raise unless FileTest.exist?(path.to_s)
- end
- #qp path.to_s
- @db = BDB::Hash.open(path.to_s, nil, amask)
+ @dir, @cat, @keytype, @name, @amask, @mmask = dir, cat, keytype, name, amask, mmask
+ @db = nil
+ setup_db
at_exit {
close
}
begin
@db.sync
@db.close
+ # @db = nil
rescue => e
p e
end
end
- def get(k) @db.get(k); end
- def put(k, v) @db.put(k, v); end
+ def get(k) setup_db; @db.get(k); end
+ def put(k, v) setup_db; @db.put(k, v); end
- def each() @db.each {|k, v| yield(k, v) } end
+ def each() setup_db; @db.each {|k, v| yield(k, v) } end
+
+ private
+ def setup_db
+ return if @db
+ dbdir = @dir + @cat + @keytype
+ path = dbdir + @name.path.escape.escape_win_filename
+ #TODO: should make dir.
+ if @amask == BDB::RDONLY
+ raise unless FileTest.exist?(path.to_s)
+ end
+ #qp path.to_s
+ @db = BDB::Hash.open(path.to_s, nil, @amask)
+ end
end
module TableAccessModule
return true if @db
- #qp @ds.location, @category, @keyvalue, @name, @access, @ds.modemask
begin
- @db = AttributeTable.new(@ds.location, @category, @keyvalue,
- @name, access, @ds.modemask)
+ db_dir = @ds.location
+ modemask = @ds.modemask
+ rescue
+ db_dir = CHISE::DataSource::DB_DIR.path
+ modemask = 0755
+ end
+
+ #qp db_dir, @category, @keyvalue, @name, @access, modemask
+ begin
+ @db = AttributeTable.new(db_dir, @category, @keyvalue,
+ @name, access, modemask)
return false if @db.nil?
@access = access
rescue => e
def each_char
setup_db
- raise "@db is nil." if @db.nil?
+ if @db.nil?
+ #raise "@db is nil."+@name
+ p "@db is nil."+@name
+ return nil
+ end
@db.each {|code_point, cid|
yield(code_point, parse_c_string(cid))
}