[#29469] エラーを捕まえたいのですが ... — Sakae Kobayashi <sakae@...>

困った時に出てくる、小林榮です。

12 messages 2001/05/01

[#29490] Re: [ruby-talk:14555] Ruby as a Mac OS/X scripting language — maili31s@... (SugHimsi == SUGIHARA Hiroshi)

すぎむし速報。↓だそうです。

12 messages 2001/05/02

[#29524] tr range? — kiri@...

桐山です。

17 messages 2001/05/06
[#29526] Re: tr range? — Koji Arai <JCA02266@...> 2001/05/06

新井です。

[#29644] rwiki.rb でエラー — norio goto <goto@...>

お世話になります、後藤@横河工事です。

18 messages 2001/05/14
[#29645] Re: rwiki.rb でエラー — m_seki@... 2001/05/14

[#29646] Re: rwiki.rb でエラー — norio goto <goto@...> 2001/05/14

後藤@横河工事です。

[#29675] with(obj){ } が欲しい。 — Take_tk <ggb03124@...>

例によって、ワタシ好みののりクエストですみません。

24 messages 2001/05/15
[#29694] Re: with(obj){ } が欲しい。 — "K.Kosako" <kosako@...> 2001/05/17

Take_tkさんの<20010515205133.DFBA.GGB03124@nifty.ne.jp>から

[#29707] OBJECT DAY2001 — "K.Kosako" <kosako@...>

OBJECT DAY2001から帰ってきました。

71 messages 2001/05/18
[#29712] Re: OBJECT DAY2001 — matz@... (Yukihiro Matsumoto) 2001/05/18

まつもと ゆきひろです

[#29719] Re: OBJECT DAY2001 — WATANABE Tetsuya <tetsu@...> 2001/05/21

渡辺哲也です。

[#29731] YARPC 19101 (Re: OBJECT DAY2001) — TAKAHASHI Masayoshi <maki@...> 2001/05/21

YARPC関連で動いてお騒がせしている(_o_)高橋征義です。

[#29792] Re: YARPC 19101 — akira yamada / やまだあきら <akira@...> 2001/05/27

[#29794] Re: YARPC 19101 — Minero Aoki <aamine@...> 2001/05/27

あおきです。

[#29803] Re: YARPC 19101 — Hiroshi IGARASHI <iga@...> 2001/05/27

いがらしです。

[#29721] Cygwin で Ruby をコンパイルするとエラーがでます。 — "Inoue" <inoue@...>

はじめまして、最近Rubyをはじめました井上と申します。

10 messages 2001/05/21

[#29788] marshaled time format differ — IWATSUKI Hiroyuki <don@...>

岩月と申します。

19 messages 2001/05/25
[#29789] Re: marshaled time format differ — matz@... (Yukihiro Matsumoto) 2001/05/25

まつもと ゆきひろです

[#29790] Re: marshaled time format differ — IWATSUKI Hiroyuki <don@...> 2001/05/26

岩月と申します。

[#29823] Re: marshaled time format differ — IWATSUKI Hiroyuki <don@...> 2001/05/27

岩月と申します。

[#29853] "" で行われる展開を eval 無しで… — ABE Shigeru <shiger-a@...>

 みなさま、はじめまして。阿部といいます。

17 messages 2001/05/28
[#29854] Re: "" で行われる展開を eval 無しで… — rubikitch <rubikitch@...> 2001/05/28

From: ABE Shigeru <shiger-a@nifty.com>

[#29941] Ruby ライセンスについて — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

38 messages 2001/05/31
[#29942] Re: Ruby ライセンスについて — Takahiro Kambe <taca@...> 2001/05/31

In message <991297854.779223.23013.nullmailer@ev.netlab.zetabits.com>

[#29944] Re: Ruby ライセンスについて — "Akinori MUSHA" <knu@...> 2001/05/31

At Thu, 31 May 2001 18:00:18 +0900,

[ruby-list:29468] Re: [ruby-ext:01642] Re: o_dbm

From: akira yamada / やまだあきら <akira@...>
Date: 2001-05-01 02:05:48 UTC
List: ruby-list #29468
Fri, 27 Apr 2001 00:54:15 +0900 頃の
   Mail-Count: 29431
      Subject: [ruby-list:29431] Re: [ruby-ext:01642] Re: o_dbm   
についてのお話にて 石塚圭樹  さん曰く… 
(石 == keiju@ishitsuka.com (石塚圭樹) さん)

>> この「微妙な問題」というのはどういうものですか?

In article 29431, <200104261245.VAA10795.keiju@ishitsuka.com>
石> メモリ中のオブジェクトとデータベースから持ってきたオブジェクトが実際には
石> 同じじゃないってことかしら...

なるほど. 注意が必要ですね. 

>>>> あと require "dbm" ですが gdbm でも動作するようなので
>>>> どっちかえらべるとうれしいかもしれないと思うのですがどうでしょうか. 

bdbをうまく使ってやるとロックとかうまく扱えそうな感じがしますね. 

というか, なんとかEX/SHロックをかけられるようにならないかと
いろいろ—ロックファイルを使って…とかもやってみたんですが, 
結局DBM/GDBMでは難しいなあというところで落ち着きました. 
# BDB_Adapterを作って, それならロックもいけるよ
# というのに挑戦するのがまっとうかなあ, と. 

ただ, その過程でいくつかbugらしきものを見付けたので
patchを作ってみました. いかがでしょうか. 

-- 

 やまだ あきら <URL:http://arika.org/>
 (akira@arika.org, akira@ruby-lang.org or akira@ad-hoc.org)

--- /usr/lib/ruby/1.6/o_dbm.rb	Tue Apr 24 23:02:41 2001
+++ o_dbm.rb	Tue May  1 10:59:38 2001
@@ -181,9 +181,9 @@
 
   def root_names
     keys = []
-    each_keys do
+    each_key do
       |key|
-      keys.push = keys
+      keys.push(key)
     end
     keys
   end
@@ -191,7 +191,7 @@
 
   def size
     no = 0
-    each_keys do
+    each_key do
       |key|
       no += 1
     end
@@ -286,7 +286,7 @@
     if mode != SCAN_CACHE_ONLY
       @db.each_key do
 	|key|
-	yield key unless mode == SCANL_DB_ONLY or @read_cache[key] == NULL
+	yield key if mode == SCAN_DB_ONLY or @read_cache[key] == NULL
       end
     end
   end
@@ -327,8 +327,8 @@
       end
       @transaction_mode = STATIC_TRANSACTION_MODE
       @current_transaction = StaticTransaction.new(self, mode, outer)
-      @current_transaction.transaction do
-	yield @current_transaction
+      @current_transaction.transaction do |current_transaction|
+	yield current_transaction
       end
     else
       if @transaction_mode == STATIC_TRANSACTION_MODE
@@ -368,8 +368,7 @@
       txn.outer.write_cache = txn.write_cache.dup
       txn.outer.delete_cache = txn.delete_cache.dup
     else
-      close(HOLD_READ_CACHE)
-      @db = @db_adapter.open(@db_name)
+      flush_db
     end
   end
   
@@ -418,6 +417,7 @@
     for key, value in @write_cache
       @db[key] = Marshal.dump(value)
     end
+    @db.commit
     @write_cache.clear
   end
   private :flush_db
@@ -511,7 +511,7 @@
     def transaction
       @status = START
       begin
-	txn, value = catch(ABORT_LABEL){[nil, yield(@current_transaction)]}
+	txn, value = catch(ABORT_LABEL){[nil, yield(self)]}
 	if txn
 	  @status = ABORTING
 	  unless txn.equal?(self)
@@ -552,7 +552,7 @@
     def checkpoint
       case @status
       when START
-	@odbm.flush(txn)
+	@odbm.flush(self)
       when COMMITED, ABORTED
 	Transaction.Fail ErrClosedTransaction
       end
@@ -637,7 +637,7 @@
 
     # store value with <key>
     def []=(key, value)
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "[]"
+      ODBM.Fail ErrAdapterInterfaceNotImplement, "[]="
     end
 
     def has_key?(key)
@@ -665,6 +665,11 @@
       ODBM.Fail ErrAdapterInterfaceNotImplement, "delete"
     end
 
+    # commit database
+    def commit
+      ODBM.Fail ErrAdapterInterfaceNotImplement, "commit"
+    end
+
     # close database
     def close
       ODBM.Fail ErrAdapterInterfaceNotImplement, "close"
@@ -674,6 +679,10 @@
   autoload :DBM, "dbm"
   class DBM_Adapter<DB_Adapter
     def self.open(name)
+      new(name)
+    end
+
+    def initialize(name)
       @db = DBM.open(name)
     end
 
@@ -682,7 +691,7 @@
     end
 
     def []=(key, value)
-      @db[key] = valuep
+      @db[key] = value
     end
 
     def key?(key)
@@ -701,7 +710,16 @@
       @db.each_value &block
     end
 
+    def delete(key)
+      @db.delete(key)
+    end
+
+    def commit
+      # noop
+    end
+
     def close
+      commit
       @db.close
       @db = nil
     end
@@ -709,48 +727,69 @@
 
   autoload :GDBM, "gdbm"
   class GDBM_Adapter<DBM_Adapter
-    def self.open(name)
+    def initialize(name)
       @db = GDBM.open(name)
     end
   end
 
   autoload :SDBM, "sdbm"
   class SDBM_Adapter<DBM_Adapter
-    def self.open(name)
+    def initialize(name)
       @db = SDBM.open(name)
     end
   end
 
   class PHash_Adapter<DB_Adapter
     def self.open(name)
+      new(name)
+    end
+
+    def initialize(name)
       @db_name = name
-      @db = File.open(name)
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "open"
+      if File.exist?(name)
+        file = File::open(name, 'r')
+	begin
+	  @hash = Marshal.load(file)
+	ensure
+	  file.close
+	end
+      else
+        @hash = {}
+      end
     end
 
     # restore value with <key> 
     def [](key)
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "[]"
+      @hash[key]
     end
 
     # store value with <key>
     def []=(key, value)
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "[]"
+      @hash[key] = value
     end
 
     # access all keys in database.
     def each_key(&block)
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "each_key"
+      @hash.each_key {|key| block.call(key)}
     end
 
     # delete value with <key>
     def delete(key)
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "delete"
+      @hash.delete(key)
+    end
+
+    # commit database
+    def commit
+      newfile = @db_name + '.new'
+      file = open(newfile, 'w')
+      Marshal.dump(@hash, file)
+      file.close
+      File.rename(newfile, @db_name)
     end
 
     # close database
     def close
-      ODBM.Fail ErrAdapterInterfaceNotImplement, "close"
+      commit
     end
   end
 end

 

In This Thread