# # o_dbm.rb - オブジェクト指向データベース風Object Base DBM # $Release Version: 0.5.1$ # $Revision: 1.9 $ # $Date: 2002/07/12 04:46:28 $ # by Keiju ISHITSUKA(Nippon Rational Inc.) # # -- # # # require "e2mmap" class ObjectDBM @RELEASE_VERSION = "0.5.1" @LAST_UPDATE_DATE = "02/07/12" @RCS_ID='-$Id: o_dbm.rb,v 1.9 2002/07/12 04:46:28 keiju Exp keiju $-' extend Exception2MessageMapper # トップトランザクションでしか実行できないオペレーションを実行しよう # とした. def_exception(:ErrOnlyUsableTopTransaction, "The operation (%s) can only be executed in the top level transaction.") # トランザクション内でないと実行できないオペレーションを実行しようと # しました. def_exception(:ErrOnlyUsableInTransaction, "The operation (%s) can only be executed within a transaction.") # 静的トランザクションと動的トランザクションを混在して利用することは # できません. def_exception(:ErrMixedTransaction, "Static transactions and dynamic transactions cannot be mixed together.") def_exception(:ErrAdapterInterfaceNotImplement, "Adapter interfase(%s) is not implemented.") include Enumerable ODBM = ObjectDBM STATIC_TRANSACTION_MODE = :ObjectDBM__STATIC_TRANSACTION_MODE DYNAMIC_TRANSACTION_MODE = :ObjectDBM__DYNAMIC_TRANSACTION_MODE NO_CACHING = :ObjectDBM__NO_CACHING READ_CACHING = :ObjectDBM__READ_CACHING UPDATE_CACHING = :ObjectDBM__UPDATE_CACHING CLEAR_READ_CACHE = :ObjectDBM__CLEAR_READ_CACHE HOLD_READ_CACHE = :ObjectDBM__HOLD_READ_CACHE SCAN_DB = :ObjectDBM__SCAN_DB SCAN_CACHE_ONLY = :ObjectDBM__SCAN_CACHE_ONLY SCAN_DB_ONLY = :ObjectDBM__SCAN_DB_ONLY READ = :ObjectDBM__READ UPDATE = :ObjectDBM__UPDATE ABORT = :ObjectDBM__ABORT NULL = :ODBM__NULL TRANSACTIONAL_OPERATIONS = [ "[]", "update", "[]=", "delete", "indexes", "root_names", "keys", "roots", "values", "size", "has_root_name?", "root_name?", "include?", "has_root?", "root?", "each", "each_pair", "each_root_name", "each_root", "each_value", "commit", "abort" ] #---------------------------------------------------------------------- # # initialize and terminating - # initialize # #---------------------------------------------------------------------- def initialize(dbm_name, adapter = DBMAdapter) @db_adapter = adapter @db_name = File.expand_path(dbm_name) @db = nil @default_value = nil @transaction_mode = nil @default_caching_mode = nil @read_cache = nil @write_cache = nil @delete_cache = nil @current_transaction = nil disable_transactional_methods end def disable_transactional_methods for op in TRANSACTIONAL_OPERATIONS instance_eval %[ def #{op}(*opts) error_not_transaction_start("#{op}") end ], __FILE__, __LINE__ - 5 end end private :disable_transactional_methods def enable_transactional_methods for op in TRANSACTIONAL_OPERATIONS (class< def self.open(name) new(name) end def initialize(name) ODBM.Fail ErrAdapterInterfaceNotImplement, "initialize" #@db end # restore value with def [](key) ODBM.Fail ErrAdapterInterfaceNotImplement, "[]" end # store value with def []=(key, value) ODBM.Fail ErrAdapterInterfaceNotImplement, "[]=" end # testing for which the db have a key def has_key?(key) @db.each_key do |k| return true if k == key end end alias key? has_key? alias include? has_key? # access all assoc in database. def each(&block) @db.each_key{|key|yield key, @db[key]} end # access all keys in database. def each_key(&block) ODBM.Fail ErrAdapterInterfaceNotImplement, "each_key" end # access all values in database. def each_value(&block) @db.each_key{|key|yield @db[key]} end # delete value with def delete(key) ODBM.Fail ErrAdapterInterfaceNotImplement, "delete" end # flush database def flush ODBM.Fail ErrAdapterInterfaceNotImplement, "flush" end # close database def close ODBM.Fail ErrAdapterInterfaceNotImplement, "close" end end module HashLikeInterface def db ODBM.Fail ErrAdapterInterfaceNotImplement, "db" end def [](key) materialize_value(db[key]) end def []=(key, value) db[key] = serialize_value(value) end def has_key?(key) db.key?(key) end def each db.each{|k, v| yield k, materialize_value(v)} end def each_key(&block) db.each_key &block end def each_value db.each_value{|v| yield materialize_value(v)} end def delete(key) db.delete(key) end def serialize_value(v) ODBM.Fail ErrAdapterInterfaceNotImplement, "serialize_value(v)" end def materialize_value(v) ODBM.Fail ErrAdapterInterfaceNotImplement, "materialize_value(v)" end end autoload :DBM, "dbm" class DBM_Adapter