Catalyst::Plugin::Session の flash ではまった
Store::DBIC を使ってるのだけど、flash が使えなくてはまった。
そのとき出たログは、sessions テーブル の row が見つからないから update できないよーってもの。
row が見つからないっていうから id の照合順序とかそのへんを疑ったりしても何も変わらず。
で、もう一度 Manual とかを見直したら、sessions テーブルの構造がちょっとだけ違ってた。
俺が作った sessions テーブルは
CREATE TABLE `sessions` ( `id` char(72) NOT NULL, `session_data` text NOT NULL, `expires` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
こんなんで、正しくは、
CREATE TABLE `sessions` ( `id` char(72) NOT NULL, `session_data` text, `expires` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
こう。phpMyAdmin で出力してるから余計な情報がくっついちゃってるけれども。
で、最初の例でも通常のセッション管理だけなら問題ない(多分。使えてたし)。けれど、flash を使う時に問題が発生する。
なぜなら flash データを保持するときは、expires に値を入力しないから。
で、expires に値が無いため、デフォルト値の 0 が設定される。すると、$c->delete_expired_sessions を実行した場合に期限切れとして flash データが削除されてしまうのだ。これが正しいほうの例であれば、expires には 0 ではなく null が設定され、その場合は delete_expired_sessions の対象ではなくなる。そういうことみたい。
ということで、つまらないミスのせいではまったけど、繰り返さないようにメモしとこう。