diff options
Diffstat (limited to 'lib/cgi')
-rw-r--r-- | lib/cgi/session/pstore.rb | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/cgi/session/pstore.rb b/lib/cgi/session/pstore.rb new file mode 100644 index 000000000..d681d994a --- /dev/null +++ b/lib/cgi/session/pstore.rb @@ -0,0 +1,78 @@ +require 'cgi/session' +require 'pstore' + +class CGI + class Session + def []=(key, val) + unless @write_lock + @write_lock = true + end + unless @data + @data = @dbman.restore + end + #@data[key] = String(val) + @data[key] = val + end + + class PStore + def check_id(id) + /[^0-9a-zA-Z]/ =~ id.to_s ? false : true + end + + def initialize session, option={} + dir = option['tmpdir'] || ENV['TMP'] || '/tmp' + prefix = option['prefix'] || '' + id = session.session_id + unless check_id(id) + raise ArgumentError, "session_id `%s' is invalid" % id + end + path = dir+"/"+prefix+id + path.untaint + unless File::exist? path + @hash = {} + end + @p = ::PStore.new path + end + + def restore + unless @hash + @p.transaction do + begin + @hash = @p['hash'] + rescue + @hash = {} + end + end + end + @hash + end + + def update + @p.transaction do + @p['hash'] = @hash + end + end + + def close + update + end + + def delete + path = @p.path + File::unlink path + end + + end + end +end + +if $0 == __FILE__ + STDIN.reopen("/dev/null") + cgi = CGI.new + session = CGI::Session.new cgi, 'database_manager' => CGI::Session::PStore + session['key'] = {'k' => 'v'} + puts session['key'].class + fail unless Hash === session['key'] + puts session['key'].inspect + fail unless session['key'].inspect == '{"k"=>"v"}' +end |