Changeset 3817
- Timestamp:
- 03/08/06 16:53:34 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/actionpack/lib/action_controller/session/active_record_store.rb
r3563 r3817 60 60 self.data_column_name = 'data' 61 61 62 # Don't try to save if we haven't loaded the session. 63 before_update :loaded? 64 before_save :marshal_data! 65 before_save :raise_on_session_data_overflow! 62 before_save :marshal_data! 63 before_save :raise_on_session_data_overflow! 66 64 67 65 class << self … … 123 121 end 124 122 123 # Has the session been loaded yet? 124 def loaded? 125 !! @data 126 end 127 125 128 private 126 129 attr_writer :data 127 130 128 131 def marshal_data! 132 return false if !loaded? 129 133 write_attribute(@@data_column_name, self.class.marshal(self.data)) 130 end131 132 # Has the session been loaded yet?133 def loaded?134 !! @data135 134 end 136 135 … … 139 138 # ActionController::SessionOverflowError. 140 139 def raise_on_session_data_overflow! 140 return false if !loaded? 141 141 limit = self.class.data_column_size_limit 142 142 if loaded? and limit and read_attribute(@@data_column_name).size > limit … … 233 233 end 234 234 235 def loaded? 236 !! @data 237 end 238 235 239 def save 240 return false if !loaded? 236 241 marshaled_data = self.class.marshal(data) 237 242 trunk/actionpack/test/activerecord/active_record_store_test.rb
r3563 r3817 63 63 end 64 64 65 def session_id_column 66 "session_id" 67 end 68 65 69 def setup 66 70 session_class.create_table! … … 83 87 assert_kind_of CGI::Session::ActiveRecordStore::Session, @new_session.model 84 88 assert_equal({ 'foo' => 'bar' }, @new_session.model.data) 89 end 90 91 def test_save_unloaded_session 92 c = session_class.connection 93 bogus_class = c.quote(Base64.encode64("\004\010o:\vBlammo\000")) 94 c.insert("INSERT INTO #{session_class.table_name} ('#{session_id_column}', 'data') VALUES ('abcdefghijklmnop', #{bogus_class})") 95 96 sess = session_class.find_by_session_id('abcdefghijklmnop') 97 assert_not_nil sess 98 assert !sess.loaded? 99 100 # because the session is not loaded, the save should be a no-op. If it 101 # isn't, this'll try and unmarshall the bogus class, and should get an error. 102 assert_nothing_raised { sess.save } 85 103 end 86 104 … … 111 129 112 130 class DeprecatedActiveRecordStoreTest < ActiveRecordStoreTest 131 def session_id_column 132 "sessid" 133 end 134 113 135 def setup 114 136 session_class.connection.execute 'create table old_sessions (id integer primary key, sessid text unique, data text)'