X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=vendor%2Frails%2Factionpack%2Flib%2Faction_controller%2Fsession%2Fmem_cache_store.rb;fp=vendor%2Frails%2Factionpack%2Flib%2Faction_controller%2Fsession%2Fmem_cache_store.rb;h=2f08af663da021fa22865416700047376f61c2ef;hb=d115f2e23823271635bad69229a42cd8ac68debe;hp=0000000000000000000000000000000000000000;hpb=37cb670bf3ddde90b214e591f100ed4446469484;p=depot.git diff --git a/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb b/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb new file mode 100644 index 0000000..2f08af6 --- /dev/null +++ b/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb @@ -0,0 +1,98 @@ +# 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_library_or_gem '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. + # + # +options+ is a hash of options for the initializer. The + # following options are recognized: + # + # cache:: an instance of a MemCache client to use as the + # session cache. + # + # expires:: an expiry time value to use for session entries in + # the session cache. +expires+ is interpreted in seconds + # relative to the current time if itÂ’s less than 60*60*24*30 + # (30 days), or as an absolute Unix time (e.g., Time#to_i) if + # greater. If +expires+ is +0+, or not passed on +options+, + # the entry will never expire. + # + # 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'] || MemCache.new('localhost') + @expires = options['expires'] || 0 + @session_key = "session:#{id}" + @session_data = {} + # Add this key to the store if haven't done so yet + unless @cache.get(@session_key) + @cache.add(@session_key, @session_data, @expires) + end + end + + # Restore session state from the session's memcache entry. + # + # Returns the session state as a hash. + def restore + @session_data = @cache[@session_key] || {} + end + + # Save session state to the session's memcache entry. + def update + @cache.set(@session_key, @session_data, @expires) + end + + # Update and close the session's memcache entry. + def close + update + end + + # Delete the session's memcache entry. + def delete + @cache.delete(@session_key) + @session_data = {} + end + + def data + @session_data + end + + end + end + end +rescue LoadError + # MemCache wasn't available so neither can the store be +end