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