Changeset 1679
- Timestamp:
- 07/04/05 21:26:41 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/actionpack/lib/action_controller/session/active_record_store.rb
r1671 r1679 37 37 class Session < ActiveRecord::Base 38 38 self.table_name = 'sessions' 39 before_create :marshal_data! 40 before_update :marshal_data_if_changed! 41 after_save :clear_data_cache! 39 before_save :marshal_data! 40 before_update :data_changed? 42 41 43 42 class << self … … 90 89 def data 91 90 unless @data 92 @data = self.class.unmarshal(read_attribute('data')) 93 @fingerprint = self.class.fingerprint(@data) 91 marshaled_data = read_attribute('data') 92 @fingerprint = self.class.fingerprint(marshaled_data) 93 @data = self.class.unmarshal(marshaled_data) 94 94 end 95 95 @data … … 101 101 end 102 102 103 def marshal_data_if_changed! 104 if @data and @fingerprint != self.class.fingerprint(@data) 105 marshal_data! 106 end 107 end 108 109 def clear_data_cache! 110 @data = @fingerprint = nil 103 def data_changed? 104 old_fingerprint, @fingerprint = @fingerprint, self.class.fingerprint(read_attribute('data')) 105 old_fingerprint != @fingerprint 111 106 end 112 107 end … … 158 153 @@connection.execute <<-end_sql 159 154 CREATE TABLE #{table_name} ( 160 #{@@connection.quote_column_name(session_id_column)} TEXT PRIMARY KEY, 155 id INTEGER PRIMARY KEY, 156 #{@@connection.quote_column_name(session_id_column)} TEXT UNIQUE, 161 157 #{@@connection.quote_column_name(data_column)} TEXT 162 158 ) … … 184 180 def data 185 181 if @marshaled_data 182 @fingerprint = self.class.fingerprint(@marshaled_data) 186 183 @data, @marshaled_data = self.class.unmarshal(@marshaled_data), nil 187 @fingerprint = self.class.fingerprint(@data)188 184 end 189 185 @data … … 191 187 192 188 def save! 189 marshaled_data = self.class.marshal(data) 193 190 if @new_record 194 191 @new_record = false … … 199 196 VALUES ( 200 197 #{@@connection.quote(session_id)}, 201 #{@@connection.quote(self.class.marshal(data))} ) 202 end_sql 203 elsif self.class.fingerprint(data) != @fingerprint 204 @@connection.update <<-end_sql, 'Update session' 205 UPDATE #{@@table_name} 206 SET #{@@connection.quote_column_name(@@data_column)}=#{@@connection.quote(self.class.marshal(data))} 207 WHERE #{@@connection.quote_column_name(@@session_id_column)}=#{@@connection.quote(session_id)} 208 end_sql 198 #{@@connection.quote(marshaled_data)} ) 199 end_sql 200 else 201 old_fingerprint, @fingerprint = @fingerprint, self.class.fingerprint(marshaled_data) 202 if old_fingerprint != @fingerprint 203 @@connection.update <<-end_sql, 'Update session' 204 UPDATE #{@@table_name} 205 SET #{@@connection.quote_column_name(@@data_column)}=#{@@connection.quote(marshaled_data)} 206 WHERE #{@@connection.quote_column_name(@@session_id_column)}=#{@@connection.quote(session_id)} 207 end_sql 208 end 209 209 end 210 210 end