update.
[chise/ruby.git] / chise / libchise_r.rb
index f0556f0..525d6c2 100755 (executable)
@@ -16,11 +16,9 @@ module CHISE
       #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
@@ -28,7 +26,8 @@ module CHISE
   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
@@ -75,17 +74,9 @@ module CHISE
 
   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
       }
@@ -96,15 +87,29 @@ module CHISE
       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
@@ -130,10 +135,18 @@ module CHISE
 
       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
@@ -209,7 +222,11 @@ module CHISE
 
     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))
       }