Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
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...
commit 3e74ea89bce85a1e004841421ce6b06a2e47a52f 1 parent d05fa50
David Heinemeier Hansson dhh authored
3  actionpack/CHANGELOG
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
95 actionpack/lib/action_controller/session/mem_cache_store.rb
View
@@ -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
Please sign in to comment.
Something went wrong with that request. Please try again.