Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 1679

Show
Ignore:
Timestamp:
07/04/05 21:26:41 (3 years ago)
Author:
bitsweat
Message:

r2807@asus: jeremy | 2005-07-04 18:15:18 -0700
Fingerprint the marshaled data.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/lib/action_controller/session/active_record_store.rb

    r1671 r1679  
    3737      class Session < ActiveRecord::Base 
    3838        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? 
    4241 
    4342        class << self 
     
    9089        def data 
    9190          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) 
    9494          end 
    9595          @data 
     
    101101          end 
    102102 
    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 
    111106          end 
    112107      end 
     
    158153            @@connection.execute <<-end_sql 
    159154              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, 
    161157                #{@@connection.quote_column_name(data_column)} TEXT 
    162158              ) 
     
    184180        def data 
    185181          if @marshaled_data 
     182            @fingerprint = self.class.fingerprint(@marshaled_data) 
    186183            @data, @marshaled_data = self.class.unmarshal(@marshaled_data), nil 
    187             @fingerprint = self.class.fingerprint(@data) 
    188184          end 
    189185          @data 
     
    191187 
    192188        def save! 
     189          marshaled_data = self.class.marshal(data) 
    193190          if @new_record 
    194191            @new_record = false 
     
    199196              VALUES ( 
    200197                #{@@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 
    209209          end 
    210210        end