Sha256: 454b5e4aa19fb92d914dbbc4f05e1b4df9f95ad4ac4001869a6a8a49c0879800

Contents?: true

Size: 1.43 KB

Versions: 1

Compression:

Stored size: 1.43 KB

Contents

require 'mega/macro'

module Og

# This error is thrown when you the object you are trynig
# to update is allready updated by another thread.

class StaleObjectError < StandardError
end

# Include this module into entity classes to provide optimistic
# locking suport. For more information on optimistic locking
# please consult:
#
# http://c2.com/cgi/wiki?OptimisticLocking
# http://en.wikipedia.org/wiki/Optimistic_concurrency_control

module Locking
  property :lock_version, Fixnum, :default => 0
  pre "@lock_version = 0", :on => :og_insert

  def self.append_features(base) #:nodoc:
    PropertyUtils.copy_features(self, base)

    super

    base.module_eval do
      def self.enchant
        self.send :alias_method, :update_without_lock, :update
        self.send :alias_method, :update, :update_with_lock
        self.send :alias_method, :save_without_lock, :save
        self.send :alias_method, :save, :save_with_lock
      end
    end
  end
  
  def update_with_lock
    lock = @lock_version
    @lock_version += 1

    unless update_without_lock(:condition => "lock_version=#{lock}") == 1  
      raise(StaleObjectError, 'Attempted to update a stale object')
    end
  end

  def save_with_lock
    lock = @lock_version
    @lock_version += 1

    unless save_without_lock(:condition => "lock_version=#{lock}") == 1  
      raise(StaleObjectError, 'Attempted to update a stale object')
    end
  end
  
end

end

# * George Moschovitis <gm@navel.gr>

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
og-0.23.0 lib/og/mixin/optimistic_locking.rb