lib/knj/objects.rb in knjrbfw-0.0.4 vs lib/knj/objects.rb in knjrbfw-0.0.7

- old
+ new

@@ -6,48 +6,50 @@ @args = Knj::ArrayExt.hash_sym(args) @args[:col_id] = :id if !@args[:col_id] @args[:class_pre] = "class_" if !@args[:class_pre] @args[:module] = Kernel if !@args[:module] @objects = {} - @objects_mutex = Mutex.new @events = Knj::Event_handler.new @events.add_event( :name => :no_html, :connections_max => 1 ) + @events.add_event( + :name => :no_date, + :connections_max => 1 + ) raise "No DB given." if !@args[:db] raise "No class path given." if !@args[:class_path] and (@args[:require] or !@args.has_key?(:require)) end + def init_class(classname) + return false if @objects.has_key?(classname) + @objects[classname] = {} + end + #Returns a cloned version of the @objects variable. Cloned because iteration on it may crash some of the other methods in Ruby 1.9+ def objects objs_cloned = {} - @objects_mutex.synchronize do - @objects.each do |classn, newhash| - objs_cloned[classn] = newhash.clone - end - end + @objects.keys.each do |key| + objs_cloned[key] = @objects[key].clone + end return objs_cloned end def db return @args[:db] end def count_objects count = 0 - @objects_mutex.synchronize do - @objects.each do |key, value| - value.each do |id, object| - count += 1 - end - end - end + @objects.keys.each do |key| + count += @objects[key].length + end return count end def connect(args, &block) @@ -94,18 +96,24 @@ end end end def requireclass(classname) - return nil if !@args[:require] and @args.has_key?(:require) - classname = classname.to_s - - if !Knj::Php.class_exists(classname) + classname = classname.to_sym + + if !@args[:require] and @args.has_key?(:require) + @objects[classname] = {} if !@objects.has_key?(classname) + return nil + end + + if !@objects.has_key?(classname) filename = @args[:class_path] + "/#{@args[:class_pre]}#{classname.downcase}.rb" filename_req = @args[:class_path] + "/#{@args[:class_pre]}#{classname.downcase}" raise "Class file could not be found: #{filename}." if !File.exists?(filename) require filename_req + @args[:module].const_get(classname).load_columns(Knj::Hash_methods.new(:args => args, :ob => self, :db => @args[:db])) + @objects[classname] = {} end end def get(classname, data) classname = classname.to_sym @@ -118,34 +126,25 @@ id = data.to_i elsif raise Knj::Errors::InvalidData, "Unknown data: '#{data.class.to_s}'." end - return @objects[classname][id] if @objects.has_key?(classname) and @objects[classname].has_key?(id) - - retobj = nil - @objects_mutex.synchronize do - if !@objects.has_key?(classname) - self.requireclass(classname) - @objects[classname] = {} - end - - if @args[:datarow] - @objects[classname][id] = @args[:module].const_get(classname).new(Knj::Hash_methods.new( - :ob => self, - :data => data - )) - else - args = [data] - args = args | @args[:extra_args] if @args[:extra_args] - @objects[classname][id] = @args[:module].const_get(classname).new(*args) - end - - return @objects[classname][id] - end - - raise "Something went wrong." + return @objects[classname][id] if @objects.has_key?(classname) and @objects[classname].has_key?(id) + self.requireclass(classname) if !@objects.has_key?(classname) + + if @args[:datarow] + @objects[classname][id] = @args[:module].const_get(classname).new(Knj::Hash_methods.new( + :ob => self, + :data => data + )) + else + args = [data] + args = args | @args[:extra_args] if @args[:extra_args] + @objects[classname][id] = @args[:module].const_get(classname).new(*args) + end + + return @objects[classname][id] end def get_by(classname, args = {}) classname = classname.to_sym self.requireclass(classname) @@ -273,14 +272,14 @@ obs = self.list(classname, args[:list_args]) else obs = self.list(classname) end - if Knj::Php.class_exists("Dictionary") + if RUBY_VERSION[0..2] == 1.8 and Knj::Php.class_exists("Dictionary") list = Dictionary.new else - list = Hash.new + list = {} end if args[:addnew] or args[:add] list["0"] = _("Add new") elsif args[:choose] @@ -428,13 +427,11 @@ #errstr += "Class: #{object.class.name}.\n" #errstr += "ID: #{object.id}.\n" #errstr += "Could not find object ID in cache." #raise errstr #else - @objects_mutex.synchronize do - @objects[classname].delete(object.id.to_i) - end + @objects[classname].delete(object.id.to_i) #end end def unset_class(classname) if classname.is_a?(Array) @@ -446,13 +443,11 @@ end classname = classname.to_sym return false if !@objects.has_key?(classname) - @objects_mutex.synchronize do - @objects[classname] = {} - end + @objects[classname] = {} end # Delete an object. Both from the database and from the cache. def delete(object) self.call("object" => object, "signal" => "delete_before") @@ -506,40 +501,35 @@ classn.each do |realclassn| self.clean(realclassn) end else return false if !@objects.has_key?(classn) - @objects_mutex.synchronize do - @objects[classn] = {} - GC.start - end + @objects[classn] = {} + GC.start end end def clean_all classnames = [] - @objects_mutex.synchronize do - @objects.each do |classn, hash_list| - classnames << classn - end - - classnames.each do |classn| - @objects[classn] = {} - end - end + @objects.keys.each do |classn| + classnames << classn + end + + classnames.each do |classn| + @objects[classn] = {} + end GC.start end def clean_recover - @objects_mutex.synchronize do - @objects.each do |classn, hash_list| - classobj = Kernel.const_get(classn) - ObjectSpace.each_object(classobj) do |obj| - @objects[classn][obj.id] = obj - end - end - end + @objects.keys.each do |classn| + data = @objects[classn] + classobj = Kernel.const_get(classn) + ObjectSpace.each_object(classobj) do |obj| + data[obj.id] = obj + end + end end def sqlhelper(list_args, args) if args[:db] db = args[:db] \ No newline at end of file