Permalink
Browse files

Added MemCacheStore for storing session data in Danga's MemCache syst…

…em [Bob Cottrell]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@330 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent d05fa50 commit 3e74ea89bce85a1e004841421ce6b06a2e47a52f @dhh dhh committed Jan 4, 2005
Showing with 98 additions and 0 deletions.
  1. +3 −0 actionpack/CHANGELOG
  2. +95 −0 actionpack/lib/action_controller/session/mem_cache_store.rb
View
@@ -1,5 +1,8 @@
*SVN*
+* Added MemCacheStore for storing session data in Danga's MemCache system [Bob Cottrell]
+ Depends on: MemCached server (http://www.danga.com/memcached/), MemCache client (http://raa.ruby-lang.org/project/memcache/)
+
* Fixed redirects when the controller and action is named the same. Still haven't fixed same controller, module, and action, though #201 [Josh]
* Fixed problems with running multiple functional tests in Rails under 1.8.2 by including hack for test/unit weirdness
@@ -0,0 +1,95 @@
+# cgi/session/memcached.rb - persistent storage of marshalled session data
+#
+# == Overview
+#
+# This file provides the CGI::Session::MemCache class, which builds
+# persistence of storage data on top of the MemCache library. See
+# cgi/session.rb for more details on session storage managers.
+#
+
+begin
+ require 'cgi/session'
+ require 'memcache'
+
+ class CGI
+ class Session
+ # MemCache-based session storage class.
+ #
+ # This builds upon the top-level MemCache class provided by the
+ # library file memcache.rb. Session data is marshalled and stored
+ # in a memcached cache.
+ class MemCacheStore
+ def check_id(id) #:nodoc:#
+ /[^0-9a-zA-Z]+/ =~ id.to_s ? false : true
+ end
+
+ # Create a new CGI::Session::MemCache 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. The session id must only contain alphanumeric
+ # characters; automatically generated session ids observe
+ # this requirement.
+ #
+ # +option+ is a hash of options for the initialiser. The
+ # following options are recognized:
+ #
+ # cache:: an instance of a MemCache client to use as the
+ # session cache.
+ #
+ # This session's memcache entry will be created if it does
+ # not exist, or retrieved if it does.
+ def initialize(session, options = {})
+ id = session.session_id
+ unless check_id(id)
+ raise ArgumentError, "session_id '%s' is invalid" % id
+ end
+ @cache = options['cache']
+ @session_key = "session:#{id}"
+ @hash = {}
+ end
+
+ # Restore session state from the session's memcache entry.
+ #
+ # Returns the session state as a hash.
+ def restore
+ begin
+ @hash = @cache[@session_key]
+ rescue
+ # Ignore session get failures.
+ end
+ @hash = {} unless @hash
+ @hash
+ end
+
+ # Save session state to the session's memcache entry.
+ def update
+ begin
+ @cache[@session_key] = @hash
+ rescue
+ # Ignore session update failures.
+ end
+ end
+
+ # Update and close the session's memcache entry.
+ def close
+ update
+ end
+
+ # Delete the session's memcache entry.
+ def delete
+ begin
+ @cache.delete(@session_key)
+ rescue
+ # Ignore session delete failures.
+ end
+ @hash = {}
+ end
+ end
+ end
+ end
+rescue LoadError
+ # MemCache wasn't available so neither can the store be
+end

0 comments on commit 3e74ea8

Please sign in to comment.