Sha256: 0c589a312bb107441284413c102127439bb12c3249a0c05571d2000ed04439e5
Contents?: true
Size: 1.37 KB
Versions: 2
Compression:
Stored size: 1.37 KB
Contents
require 'facet/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
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
og-0.19.0 | lib/og/mixin/optimistic_locking.rb |
og-0.20.0 | lib/og/mixin/optimistic_locking.rb |