From 519e7e5e1236dfb75a7d759e0a143bc9e0e47385 Mon Sep 17 00:00:00 2001 From: Jamis Buck Date: Wed, 8 Mar 2006 16:53:34 +0000 Subject: Fix problem with unloaded ARStore sessions being loaded when they are garbage collected, causing problems if there were AR objects in the session. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3817 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- .../session/active_record_store.rb | 23 +++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'actionpack/lib/action_controller') diff --git a/actionpack/lib/action_controller/session/active_record_store.rb b/actionpack/lib/action_controller/session/active_record_store.rb index 3d84d85ac0..5f3b960b59 100644 --- a/actionpack/lib/action_controller/session/active_record_store.rb +++ b/actionpack/lib/action_controller/session/active_record_store.rb @@ -59,10 +59,8 @@ class CGI cattr_accessor :data_column_name self.data_column_name = 'data' - # Don't try to save if we haven't loaded the session. - before_update :loaded? - before_save :marshal_data! - before_save :raise_on_session_data_overflow! + before_save :marshal_data! + before_save :raise_on_session_data_overflow! class << self # Don't try to reload ARStore::Session in dev mode. @@ -122,22 +120,24 @@ class CGI @data ||= self.class.unmarshal(read_attribute(@@data_column_name)) || {} end + # Has the session been loaded yet? + def loaded? + !! @data + end + private attr_writer :data def marshal_data! + return false if !loaded? write_attribute(@@data_column_name, self.class.marshal(self.data)) end - # Has the session been loaded yet? - def loaded? - !! @data - end - # Ensures that the data about to be stored in the database is not # larger than the data storage column. Raises # ActionController::SessionOverflowError. def raise_on_session_data_overflow! + return false if !loaded? limit = self.class.data_column_size_limit if loaded? and limit and read_attribute(@@data_column_name).size > limit raise ActionController::SessionOverflowError @@ -232,7 +232,12 @@ class CGI @data end + def loaded? + !! @data + end + def save + return false if !loaded? marshaled_data = self.class.marshal(data) if @new_record -- cgit v1.2.3