lib/knj/objects.rb in knjrbfw-0.0.52 vs lib/knj/objects.rb in knjrbfw-0.0.53
- old
+ new
@@ -17,10 +17,11 @@
@locks = {}
@data = {}
@lock_require = Monitor.new
require "wref" if @args[:cache] == :weak and !Kernel.const_defined?(:Wref)
+ require "#{@args[:array_enumerator_path]}array_enumerator" if @args[:array_enum] and !Kernel.const_defined?(:Array_enumerator)
#Set up various events.
@events = Knj::Event_handler.new
@events.add_event(:name => :no_html, :connections_max => 1)
@events.add_event(:name => :no_name, :connections_max => 1)
@@ -560,22 +561,37 @@
raise "Invalid key: '#{key}'."
end
end
end
- @args[:db].q(sql, qargs) do |d_obs|
+ if @args[:array_enum]
+ enum = Enumerator.new do |yielder|
+ @args[:db].q(sql, qargs) do |d_obs|
+ yielder << self.get(classname, d_obs)
+ end
+ end
+
if block
- block.call(self.get(classname, d_obs))
+ enum.each(&block)
+ return nil
else
- ret << self.get(classname, d_obs)
+ return Array_enumerator.new(enum)
end
- end
-
- if !block
- return ret
else
- return nil
+ @args[:db].q(sql, qargs) do |d_obs|
+ if block
+ block.call(self.get(classname, d_obs))
+ else
+ ret << self.get(classname, d_obs)
+ end
+ end
+
+ if !block
+ return ret
+ else
+ return nil
+ end
end
end
#Add a new object to the database and to the cache.
#===Examples
@@ -723,11 +739,11 @@
#Delete an object. Both from the database and from the cache.
#===Examples
# user = ob.get(:User, 1)
# ob.delete(user)
- def delete(object)
+ def delete(object, args = nil)
#Return false if the object has already been deleted.
return false if object.deleted?
classname = object.class.classname.to_sym
self.call("object" => object, "signal" => "delete_before")
@@ -737,11 +753,11 @@
if @args[:datarow]
#If autodelete is set by 'has_many'-method, go through it and delete the various objects first.
object.class.autodelete_data.each do |adel_data|
self.list(adel_data[:classname], {adel_data[:colname].to_s => object.id}) do |obj_del|
- self.delete(obj_del)
+ self.delete(obj_del, args)
end
end
#If depend is set by 'has_many'-method, check if any objects exists and raise error if so.
object.class.depending_data.each do |dep_data|
@@ -754,15 +770,21 @@
#Delete any translations that has been set on the object by 'has_translation'-method.
if object.class.translations
_kas.trans_del(object)
end
- @args[:db].delete(object.table, {:id => obj_id})
+ #If a buffer is given in arguments, then use that to delete the object.
+ if args and buffer = args[:db_buffer]
+ buffer.delete(object.table, {:id => obj_id})
+ else
+ @args[:db].delete(object.table, {:id => obj_id})
+ end
end
@ids_cache[classname].delete(obj_id.to_i) if @ids_cache_should.key?(classname)
self.call("object" => object, "signal" => "delete")
object.destroy
+ return nil
end
#Deletes several objects as one. If running datarow-mode it checks all objects before it starts to actually delete them. Its faster than deleting every single object by itself...
def deletes(objs)
if !@args[:datarow]
\ No newline at end of file