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

Update and close the session's FileStore file.
def close
  update
end

def delete

Close and delete the session's FileStore file.
def delete
  File::unlink @path+".lock" rescue nil
  File::unlink @path+".new" rescue nil
  File::unlink @path rescue nil
end

def initialize(session, option={})

not exist, or opened if it does.
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

Returns the session state as a hash.

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

Save session state to the session's FileStore file.
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