📄 villa.rb
字号:
## # bool = villa.sync() # Method: Synchronize updating contents with the file and the device. # The return value is always `true'. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # This method is useful when another process uses the connected database file. This method # shuold not be used while the transaction is activated. # def sync() mod_sync(@index) end ## # bool = villa.optimize() # Method: Optimize the database. # The return value is always `true'. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # In an alternating succession of deleting and storing with overwrite or concatenate, # dispensable regions accumulate. This method is useful to do away with them. This method # shuold not be used while the transaction is activated. # def optimize() mod_optimize(@index) end ## # num = villa.fsiz() # Method: Get the size of the database file. # The return value is the size of the database file. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # Because of the I/O buffer, the return value may be less than the real size. # def fsiz() mod_fsiz(@index) end ## # num = villa.rnum() # Method: Get the number of the records stored in the database. # The return value is the number of the records stored in the database. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # def rnum() mod_rnum(@index) end ## # num = villa.length() # Method: An alias of `rnum'. # alias length rnum ## # num = villa.size() # Method: An alias of `rnum'. # alias size rnum ## # bool = villa.writable() # Method: Check whether the database handle is a writer or not. # The return value is true if the handle is a writer, false if not. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # def writable() mod_writable(@index) end ## # bool = villa.fatalerror() # Method: Check whether the database has a fatal error or not. # The return value is true if the database has a fatal error, false if not. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # def fatalerror() mod_fatalerror(@index) end ## # bool = villa.tranbegin() # Method: Begin the transaction. # The return value is always `true'. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # If a thread is already in the transaction, the other threads block until the prius is out # of the transaction. Only one transaction can be activated with a database handle at the # same time. # def tranbegin() @tranmutex.lock() MyMutex.synchronize() do begin mod_tranbegin(@index) rescue @tranmutex.unlock() raise() end end end ## # bool = villa.trancommit() # Method: Commit the transaction. # The return value is always `true'. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # Updating a database in the transaction is fixed when it is committed successfully. Any # other thread except for the one which began the transaction should not call this method. # def trancommit() begin mod_trancommit(@index) ensure @tranmutex.unlock() end end ## # bool = villa.tranabort() # Method: Abort the transaction. # The return value is always `true'. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # Updating a database in the transaction is discarded when it is aborted. The state of the # database is rollbacked to before transaction. Any other thread except for the one which # began the transaction should not call this method. # def tranabort() begin mod_tranabort(@index) ensure @tranmutex.unlock() end end ## # villa.transaction() do ... end # Iterator Method: Perform an iterator block in the transaction. # The specified iterator block is performed in the transaction. If the block returns true, # the transaction is committed. If the block returns false or raises any exception, the # transaction is aborted. # def transaction() tranbegin() begin cmt = yield() rescue cmt = false raise() ensure if(cmt) trancommit() else tranabort() end end end ## # villa.each() do |key, val| ... end # Iterator Method: Iterate a process with a pair of a key and a value of each record. # def each() MyMutex.synchronize() do curfirst() while(true) begin key = curkey() val = curval() yield(key, val) curnext() rescue ENOITEM break end end curfirst() end self end ## # villa.each_pair() do |key, val| ... end # Iterator Method: An alias of `each'. # alias each_pair each ## # villa.each_key() do |key| ... end # Iterator Method: Iterate a process with a key of each record. # def each_key() MyMutex.synchronize() do curfirst() while(true) begin key = curkey() curnext() yield(key) rescue ENOITEM break end end curfirst() end self end ## # villa.each_value() do |val| ... end # Iterator Method: Iterate a process with a value of each record. # def each_value() MyMutex.synchronize() do curfirst() while(true) begin val = curval() curnext() yield(val) rescue ENOITEM break end end curfirst() end self end ## # ary = villa.keys() # Method: Get an array of all keys. # The return value is an array of all keys. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # def keys() ary = Array::new(rnum()) MyMutex.synchronize() do begin curfirst() 0.upto(ary.length - 1) do |i| ary[i] = curkey() curnext() end curfirst() rescue ENOITEM end end ary end ## # ary = villa.values() # Method: Get an array of all values. # The return value is an array of all values. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures. # def values() ary = Array::new(rnum()) MyMutex.synchronize() do begin curfirst() 0.upto(ary.length - 1) do |i| ary[i] = curval() curnext() end curfirst() rescue ENOITEM end end ary end ## # str = villa.index(val) # Method: Retrieve a record with a value. # `val' specifies a value. Although it must be an instance of String, binary data is okey. # The return value is the key of the record with the specified value. # An exception of `Villa::EANY' or its sub classes is thrown if an error occures or no record # corresponds. # If two or more records correspond, the first found record is selected. # def index(val) key = nil MyMutex.synchronize() do curfirst() while(true) if(curval() == val) key = curkey() break end curnext() end curfirst() end key end ## # num = villa.to_int() # Method: An alias of `rnum'. # alias to_int rnum ## # num = villa.to_i() # Method: An alias of `to_int'. # alias to_i to_int ## # str = villa.to_str() # Method: Get string standing for the instance. # def to_str if(@index != -1) sprintf("#<Villa:%#x:name=%s:state=open:rnum=%d>", object_id(), @name, rnum()) else sprintf("#<Villa:%#x:name=%s:state=closed>", object_id(), @name) end end ## # str = villa.to_s() # Method: An alias of `to_str'. # alias to_s to_str ## # ary = villa.to_ary() # Method: Get an array of alternation of each pair of a key and a value. # def to_ary ary = Array::new(rnum()) i = 0 each() do |key, val| ary[i] = [key, val] i += 1 end ary end ## # ary = villa.to_a() # Method: An alias of `to_ary'. # alias to_a to_ary ## # hash = villa.to_hash() # Method: Get a hash storing all records. # def to_hash hash = Hash::new() each() do |key, val| hash[key] || hash[key] = val end hash end ## # hash = villa.to_h() # Method: An alias of `to_hash'. # alias to_h to_hash ## # str = villa.inspect() # Method: An alias of `to_str'. # alias inspect to_strend#----------------------------------------------------------------# Alias definition of class methods#----------------------------------------------------------------class << Villa alias open newend# END OF FILE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -