三浦@大阪電通大です。

From: 金光雅夫 (KANEMITSU Masao) <masao-k / a-net.email.ne.jp>
Subject: [ruby-list:35988] Re: Cookie
Date: Sun, 22 Sep 2002 09:55:16 +0900

> > # 一つ思い付いたのですが、マーシャリング機能を用いて
> > # 色々なdatabase_managerに接続できるようなクラスを作っても
> > # おもしろいかもしれません。
> > --------------------------------------------------------------
> > 「三浦真磁」
> > snj / users.sourceforge.jp
> 
> すばらしいっ!!!
> 
ちょっとネタで作ってみました。

動作にはCGI及びCGI::Sessionが必要です。
基本的にCGI::Sessionと同じ使い方ですが、唯一の異なる点が
これ一つであらゆるdatabase_managerで文字列以外のオブジェクトを
扱えてしまう点です。
CGI::Session.new ( ... )とする代わりに
CGI::Session::WithMarshaling.new ( ... )として下さい。

仕組みはオリジナルのCGI::Sessionを委譲先にして
[]メソッドと[]=メソッドを呼び出す際、その中でキーに対応する
値を対象にマーシャリング機能を使用しています。また、
そのままではコントロールコードが含まれているため
CGIクラスのURLエンコード・デコード機能も用いています。

とりあえずdatabase_managerはFileStoreで動作確認を取ってますが
冗談にもテストが十分とは言えない状態です。しかし理論上、
文字列を扱えるdatabase_managerではIOクラスのインスタンス、特異オブジェクト
以外の全ての型のオブジェクトを扱えるようになるはずです。

注意点はマーシャルダンプした値以外がデータベース中に混ざらないようにとか、
セッションを復元する際の型の確認とか、そのあたりになると思います。
後、欠点はわずかに処理が遅くなるとか…。

==ここから

#[  N A M E  ] CGI/Session/WithMarshaling
#[LAST UPDATE] 2002/09/22 Sun.
#[A U T H O R] Shinji Miura
#                   Copyright(C) Shinji Miura 2002

require 'cgi'
require 'cgi/session.rb'

class CGI
  class Session

    require 'delegate'

    class WithMarshaling < DelegateClass (CGI::Session)

      def initialize(request, option={})
	@session_man = CGI::Session.new (request, option={})
	super (@session_man)
      end

      def [](key)
	Marshal.load (CGI.unescape @session_man[key])
      end

      def []=(key, val)
	@session_man[key] = CGI.escape (Marshal.dump val)
      end

    end
  end
end

==ここまで
--------------------------------------------------------------
「三浦真磁」
snj / users.sourceforge.jp