summaryrefslogtreecommitdiff
path: root/lib/cgi/session
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-07-15 07:35:14 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-07-15 07:35:14 +0000
commit9ef8a2a5db011a0071a4232b368b1cc4d2346351 (patch)
tree566ed5a268701be4d60000769972440d4b6c553c /lib/cgi/session
parentbdfce148a7f85a14e24c6365e72ba59241c4be9f (diff)
* 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
Diffstat (limited to 'lib/cgi/session')
-rw-r--r--lib/cgi/session/pstore.rb78
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 0000000000..d681d994a9
--- /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