Sha256: 8895c27139f3a02815ad165b68d9168296d41f6798bcf5ef373cd596a0ef2f9b

Contents?: true

Size: 1.77 KB

Versions: 2

Compression:

Stored size: 1.77 KB

Contents

module DataMapper
  module Lock
    module Optimistic
      
      ##
      # Validate _model_'s lock_version before attempting
      # to save or destroy.
      
      def self.included model
        model.extend ClassMethods
        model.before :destroy, :validate_lock_version
        model.before :save, :validate_lock_version
        model.before :save, :increment_lock_version
      end
      
      ##
      # Validate the lock version.
      #
      #  * Lets new records passed
      #  * Lets un-altered records passed
      #  * Lets the record pass unless the lock_version has been changed
      #
      # === Raises
      #
      #   DataMapper::Lock::StaleRecordError
      #
      
      def validate_lock_version
        if !new? && dirty?
          if lock_version_altered?
            raise DataMapper::Lock::StaleRecordError.new(self, @latest_record)
          end
        end
      end
      
      ##
      # Check if the lock_version has been altered and
      # return the latest record.
      
      def lock_version_altered?
        @latest_record = self.class.get original_attributes[:id] || id
        @latest_record.lock_version != lock_version
      end
      
      ##
      # Increment the lock_version.
      
      def increment_lock_version
        self.lock_version += 1
      end
      
      module ClassMethods
        
        ##
        # Provide optimistic locking support.
        #
        # This method adds a property named :lock_version
        # which is used to track alterations made, preventing
        # multi-thread/process rece conditions while updating or
        # destroying records.
        
        def lock_optimistic options = {}
          property :lock_version, Integer, :nullable => true, :default => 0
        end
        
      end
    end
  end
end 

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dm-lock-1.0.0 lib/dm-lock/optimistic.rb
dm-lock-0.0.1 lib/dm-lock/optimistic.rb