1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/cgi/session/pstore.rb
matz 9ef8a2a5db * lib/matrix.rb: remove elements conversion to_f, to_i, to_r.
* lib/cgi/session/pstore.rb: add new file.

* process.c (proc_getgroups, proc_setmaxgroups): fix typo.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4072 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-07-15 07:35:14 +00:00

78 lines
1.3 KiB
Ruby

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