Sha256: 8820e482656a71e5bcca28db86fc37780316691cb9d61cf4588e9f0973f4495a

Contents?: true

Size: 1.55 KB

Versions: 5

Compression:

Stored size: 1.55 KB

Contents

require 'dm-core'
require 'active_support/core_ext/class/attribute'

# Implements DataMapper-specific session store.

module Rails
  module DataMapper

    class SessionStore < ActionDispatch::Session::AbstractStore

      class Session

        include ::DataMapper::Resource

        property :id,         Serial
        property :session_id, String,   :required => true, :unique => true
        property :data,       Object,   :required => true
        property :updated_at, DateTime,                    :index => true

        def self.name
          'session'
        end

        def data
          attribute_get(:data) || {}
        end

      end

      SESSION_RECORD_KEY = 'rack.session.record'.freeze

      class_attribute :session_class
      self.session_class = Session

      private

      def get_session(env, sid)
        sid ||= generate_sid
        session = find_session(sid)
        env[SESSION_RECORD_KEY] = session
        [ sid, session.data ]
      end

      def set_session(env, sid, session_data)
        session            = get_session_resource(env, sid)
        session.data       = session_data
        session.updated_at = Time.now if session.dirty?
        session.save ? sid : false
      end

      def get_session_resource(env, sid)
        if env[ENV_SESSION_OPTIONS_KEY][:id].nil?
          env[SESSION_RECORD_KEY] = find_session(sid)
        else
          env[SESSION_RECORD_KEY] ||= find_session(sid)
        end
      end

      def find_session(sid)
        self.class.session_class.first_or_new(:session_id => sid)
      end

    end

  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
dm-rails-1.0.4 lib/dm-rails/session_store.rb
dm-rails-1.0.3 lib/dm-rails/session_store.rb
dm-rails-1.0.2 lib/dm-rails/session_store.rb
dm-rails-1.0.1 lib/dm-rails/session_store.rb
dm-rails-1.0.0 lib/dm-rails/session_store.rb