class CGI::Session::FileStore
storing and from Strings when retrieving.
user is responsible for converting other types to Strings when
This storage type only works directly with String values; the
Implements session storage as a flat file of ‘key=value’ values.
File-based session storage class.
def close
def close update end
def delete
def delete File::unlink @path+".lock" rescue nil File::unlink @path+".new" rescue nil File::unlink @path rescue nil end
def initialize(session, option={})
This session's FileStore file will be created if it does
Defaults to the empty string.
the filename for this session's FileStore file.
suffix:: the prefix to add to the session id when generating
Defaults to "cgi_sid_".
the filename for this session's FileStore file.
prefix:: the prefix to add to the session id when generating
on Unix systems).
file. Defaults to Dir::tmpdir (generally "/tmp"
tmpdir:: the directory to use for storing the FileStore
following options are recognised:
+option+ is a hash of options for the initializer. The
this requirement.
characters; automatically generated session ids observe
created. The session id must only contain alphanumeric
+session+ is the session for which this instance is being
user does not generally need to call it directly.
This constructor is used internally by CGI::Session. The
Create a new FileStore instance.
def initialize(session, option={}) option = {'prefix' => 'cgi_sid_'}.update(option) @path, @hash = session.new_store_file(option) end
def restore
Restore session state from the session's FileStore file.
def restore unless @hash @hash = {} begin lockf = File.open(@path+".lock", "r") lockf.flock File::LOCK_SH f = File.open(@path, 'r') for line in f line.chomp! k, v = line.split('=',2) @hash[CGI.unescape(k)] = Marshal.restore(CGI.unescape(v)) end ensure f&.close lockf&.close end end @hash end
def update
def update return unless @hash begin lockf = File.open(@path+".lock", File::CREAT|File::RDWR, 0600) lockf.flock File::LOCK_EX f = File.open(@path+".new", File::CREAT|File::TRUNC|File::WRONLY, 0600) for k,v in @hash f.printf "%s=%s\n", CGI.escape(k), CGI.escape(String(Marshal.dump(v))) end f.close File.rename @path+".new", @path ensure f&.close lockf&.close end end