2006年06月12日

CGI::Session 4.14がリリースされました

6月11日付で、CGI::Session 4.14がリリースされました。
Changesに書いてある内容を追いかけてみます。

訳文を書いていますが、あまり信用しないでください(^_^;。

NEW: The find() command now has better documentation.

「find()コマンドのドキュメントが新しくなった」ということかな?次にfind()の変更についての記述があるので、ここは軽く流します。

FIX: find() no longer changes the access or modified times

「find()はaccessとmodifiedの時刻を変更しないようになった」かな?
これまでのバージョンでは、find()メソッドを使用して保存されているセッションデータを検索した場合でも、_SESSION_ATIMEが書き換えられてしまっていたようです。
このため、古いセッションを探して削除するような処理にはfind()を使えない、ということになってしまっていました。これがこのfixで解消されたのでしょう。

FIX: param() called with two parameters now returns the value set, if any

「param()は二つのパラメータで呼ばれた時に、設定した値を返すようになった」かな?
これまでは、param()に二つのパラメータを渡す、つまりキーと値を指定して値を書き換えた時に、常に真値(数値の1)を返していました。
これが、このfixで、設定した値をそのまま返すようになったようです。

ソースを読んでみたところ、param()は
    $s->param($name1 => $value1, $name2 => $value2 [,...]);
という記述を許可しています。一度に複数のキーと値のセットを変更できるということですね。
この呼び出しの場合、param()が返す値は$value1になるようです。
これはドキュメントに書いていない方法なので、使う場合には注意した方がよさそうです。

FIX: driver, serializer, and id generator names are now untainted

「driver、serializer、そしてid生成名はuntaintされるようになった」かな?
これまで、インスタンス生成時に渡される
"driver:DB_File;serializer:FreezeThaw"
のようなData Source Nameは、分割されてもuntaint処理はされていなかったようです。これが、
"CGI::Session::Driver::" . ($self->{_DSN}->{driver} =~ /(.*)/)[0]
のように、untaint処理をしてからモジュール名を生成するようになっていました。

INTERNAL: automatic flushing has been documented to be unreliable, ...

ちょっと長いので文章を切りました。実際にはこう書いてあります。
INTERNAL: automatic flushing has been documented to be unreliable, although it was recommended in the past. Automatic flushing can be affected adversely in persistent environments and in some cases by third party software. There are also some cases in which flushing happened automatically in 3.x, but quit working with 4.x. See these tickets for details.

http://rt.cpan.org/Ticket/Display.html?id=17541
http://rt.cpan.org/Ticket/Display.html?id=17299
長くて、ボクの英語力では訳文を載せることはできません(^_^;。意味としては「自動フラッシュは3.xの頃は動作していたが、4.xではしないようにしてください」みたいな感じのようです。ああ、これすら怪しいかも…。

二つあるURLの一つ目は、DESTROYブロックでflush()メソッドを呼び出すようにするとおかしなことになる、ということのようです。

二つ目もflush()メソッドに関することのようです。

Session.pmのdiffを見ても、これに関するソースコードの修正は無さそうでした。見落としている可能性はありますが。
ドキュメントには、flush()メソッドの項に文章が追加されています。
Synchronizes data in memory with the copy serialized by the driver. Call flush() if you need to access the session from outside the current session object. You should at least call flush() before your program exits.

As a last resort, CGI::Session will automatically call flush for you just before the program terminates or session object goes out of scope. This automatic behavior was the recommended behavior until the 4.x series. Automatic flushing has since proven to be unreliable, and in some cases is now required in places that worked with 3.x. For further details see:
この後に、さっきのURL二つが続きます。

前半はプログラム実行中にflush()メソッドを使うべき、みたいな記述だと思うのですが、間違っているかもしれない文章を書いて、たまたまそれを見つけた人が混乱してしまうかもしれないので、原文そのままにしておきます。
以上、曖昧な点の多い文章になってしまいましたが、CGI::Session 4.14の今回のUpdateについてでした。
posted by はしもと at 03:04| Comment(0) | TrackBack(0) | Perl
この記事へのコメント

この記事へのトラックバック