mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Initial
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
begin
|
||||
|
||||
require 'active_record'
|
||||
require 'cgi'
|
||||
require 'cgi/session'
|
||||
|
||||
# Contributed by Tim Bates
|
||||
class CGI
|
||||
class Session
|
||||
# ActiveRecord database based session storage class.
|
||||
#
|
||||
# Implements session storage in a database using the ActiveRecord ORM library. Assumes that the database
|
||||
# has a table called +sessions+ with columns +id+ (numeric, primary key), +sessid+ and +data+ (text).
|
||||
# The session data is stored in the +data+ column in YAML format; the user is responsible for ensuring that
|
||||
# only data that can be YAMLized is stored in the session.
|
||||
class ActiveRecordStore
|
||||
# The ActiveRecord class which corresponds to the database table.
|
||||
class Session < ActiveRecord::Base
|
||||
serialize :data
|
||||
# Isn't this class definition beautiful?
|
||||
end
|
||||
|
||||
# Create a new ActiveRecordStore instance. This constructor is used internally by CGI::Session.
|
||||
# The user does not generally need to call it directly.
|
||||
#
|
||||
# +session+ is the session for which this instance is being created.
|
||||
#
|
||||
# +option+ is currently ignored as no options are recognized.
|
||||
#
|
||||
# This session's ActiveRecord database row will be created if it does not exist, or opened if it does.
|
||||
def initialize(session, option=nil)
|
||||
@session = Session.find_first(["sessid = '%s'", session.session_id])
|
||||
if @session
|
||||
@data = @session.data
|
||||
else
|
||||
@session = Session.new("sessid" => session.session_id, "data" => {})
|
||||
end
|
||||
end
|
||||
|
||||
# Update and close the session's ActiveRecord object.
|
||||
def close
|
||||
return unless @session
|
||||
update
|
||||
@session = nil
|
||||
end
|
||||
|
||||
# Close and destroy the session's ActiveRecord object.
|
||||
def delete
|
||||
return unless @session
|
||||
@session.destroy
|
||||
@session = nil
|
||||
end
|
||||
|
||||
# Restore session state from the session's ActiveRecord object.
|
||||
def restore
|
||||
return unless @session
|
||||
@data = @session.data
|
||||
end
|
||||
|
||||
# Save session state in the session's ActiveRecord object.
|
||||
def update
|
||||
return unless @session
|
||||
@session.data = @data
|
||||
@session.save
|
||||
end
|
||||
end #ActiveRecordStore
|
||||
end #Session
|
||||
end #CGI
|
||||
|
||||
rescue LoadError
|
||||
# Couldn't load Active Record, so don't make this store available
|
||||
end
|
||||
9
actionpack/lib/action_controller/session/drb_server.rb
Normal file
9
actionpack/lib/action_controller/session/drb_server.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
#!/usr/local/bin/ruby -w
|
||||
|
||||
# This is a really simple session storage daemon, basically just a hash,
|
||||
# which is enabled for DRb access.
|
||||
|
||||
require 'drb'
|
||||
|
||||
DRb.start_service('druby://127.0.0.1:9192', Hash.new)
|
||||
DRb.thread.join
|
||||
31
actionpack/lib/action_controller/session/drb_store.rb
Normal file
31
actionpack/lib/action_controller/session/drb_store.rb
Normal file
@@ -0,0 +1,31 @@
|
||||
require 'cgi'
|
||||
require 'cgi/session'
|
||||
require 'drb'
|
||||
|
||||
class CGI #:nodoc:all
|
||||
class Session
|
||||
class DRbStore
|
||||
@@session_data = DRbObject.new(nil, 'druby://localhost:9192')
|
||||
|
||||
def initialize(session, option=nil)
|
||||
@session_id = session.session_id
|
||||
end
|
||||
|
||||
def restore
|
||||
@h = @@session_data[@session_id] || {}
|
||||
end
|
||||
|
||||
def update
|
||||
@@session_data[@session_id] = @h
|
||||
end
|
||||
|
||||
def close
|
||||
update
|
||||
end
|
||||
|
||||
def delete
|
||||
@@session_data.delete(@session_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user