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