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