From: <bla...@us...> - 2003-12-27 18:17:56
|
Update of /cvsroot/ngetsuite/ngetsuite/ngetsuite In directory sc8-pr-cvs1:/tmp/cvs-serv30444 Modified Files: db.rb downloader.rb group.rb queue.rb queue_file.rb Log Message: major cleanup of db abstraction Index: db.rb =================================================================== RCS file: /cvsroot/ngetsuite/ngetsuite/ngetsuite/db.rb,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** db.rb 6 Nov 2003 16:02:17 -0000 1.17 --- db.rb 27 Dec 2003 18:13:36 -0000 1.18 *************** *** 2,6 **** module Db @@db_handler = nil ! ## Exceptions class TableNotFoundException < Exception --- 2,6 ---- module Db @@db_handler = nil ! ## Exceptions class TableNotFoundException < Exception *************** *** 31,34 **** --- 31,99 ---- class MissingAttrReader < NameError end + ## End of exceptions + + class DbField + # Some simple procedures to convert ruby internal types to db format + @@todb = Hash.new + @@todb['default'] = proc {|x| x} + @@todb['datetime'] = proc {|date| date.strftime('%Y-%m-%d %H:%M:%S')} + @@todb['int'] = proc {|i| i.to_s} + @@todb['smallint'] = proc {|i| i.to_s} + @@todb['varchar'] = proc {|x| + x.respond_to?('to_s') ? x.to_s : x + } + + @@fromdb = Hash.new + @@fromdb['default'] = proc {|x| x} + @@fromdb['datetime'] = proc {|datestr| + #datestr => 2003-12-27 01:58:43 + date, time = datestr.to_s.split(' ') + y, m, d = date.split('-') + h, min, s = time.split(':') + Time.local(y, m, d, h, min, s) + } + @@fromdb['int'] = proc {|str| str.to_i} + @@fromdb['smallint'] = proc {|str| str.to_i} + @@fromdb['double'] = proc {|str| str.to_f} + + + attr_reader :name, :type, :null, :key, :default, :extra + + def initialize(name, type, null, key, default, extra) + @name, @type, @null, @key, @default, @extra = + name, type, null, key, default, extra + end + + def todb(value) + if @@todb.has_key? @type + @@todb[@type].call(value) + else + @@todb['default'].call(value) + end + end + + def fromdb(value) + if @@fromdb.has_key? @type + @@fromdb[@type].call(value) + else + @@fromdb['default'].call(value) + end + end + + def key? + @key == 'PRI' + end + + # True if this field can be NULL + def null? + @null == 'YES' + end + + # A field is mandatory when it cannot be NULL and + # does not have a default value + def mandatory? + (not null?) and (@default == '') and (@extra != 'auto_increment') + end + end class DbList *************** *** 45,55 **** return unless @sth table = @@tables[@klass] ! attrs = @@attrs[table] ids = @@ids[table] @sth.fetch_hash do |row| ! ids_value = ids.collect { |id| row[id] } o = @klass.new(*ids_value) ! attrs.each { |attr,mandatory| ! o.method('_'+attr+'=').call(row[attr]) if row.has_key? attr } yield o --- 110,127 ---- return unless @sth table = @@tables[@klass] ! fields = @@fields[table] ids = @@ids[table] @sth.fetch_hash do |row| ! ids_value = ids.collect { |id| ! field = fields[id] ! field.fromdb(row[id]) ! } o = @klass.new(*ids_value) ! fields.each { |name, field| ! next if field.key? ! next if not row.has_key? name ! next if not row[name] ! value = field.fromdb(row[name]) ! o.method('_'+name+'=').call(value) } yield o *************** *** 57,62 **** end end - - ## End of exceptions def Db.dbh --- 129,132 ---- *************** *** 69,76 **** end - ## Database registry @@tables = Hash.new ! @@attrs = Hash.new @@ids = Hash.new --- 139,145 ---- end ## Database registry @@tables = Hash.new ! @@fields = Hash.new @@ids = Hash.new *************** *** 79,86 **** end ! def Db.attrs(klass, attrs_list) table = @@tables[klass] ! @@attrs[table] = attrs_list ! build_classattrs(klass) end --- 148,155 ---- end ! def Db.fields(klass, fields) table = @@tables[klass] ! @@fields[table] = fields ! build_accessors(klass) end *************** *** 105,110 **** end ! def attrs(klass) ! @@attrs[Db.get_table(klass)] end --- 174,179 ---- end ! def fields(klass) ! @@fields[Db.get_table(klass)] end *************** *** 113,155 **** end ! def Db.build_classattrs(klass) ! table = Db.get_table(klass) ! attrs_list = @@attrs[table] ! attrs_list.each { |attr, mandatory| ! if !respond_to?('_'+attr) ! # Defines the reader ! eval <<-"end_eval" ! class #{klass} ! attr_reader :_#{attr} ! end ! end_eval ! end ! if !respond_to?('_'+attr+'=') ! # Defines the writer ! eval <<-"end_eval" ! class #{klass} ! attr_writer :_#{attr} ! end ! end_eval ! end ! } ! ! ids = @@ids[table] ! ids.each { |id| ! # Defines the setter except for keys ! #puts "def default getter for key #{id}" eval <<-"end_eval" class #{klass} ! attr_reader :_#{id} end end_eval ! } end def update_from_db table = Db.get_table(self.class) ! req = 'select ' + attrs(self.class).keys.map{|key| "`#{key}`" }.join(',') req += " from #{table} where " + ids_constraint --- 182,216 ---- end ! def Db.build_accessors(klass) ! table = Db.get_table(klass) ! fields = @@fields[table] ! fields.each { |name, field| ! if !respond_to?('_'+name) ! # Defines the reader ! eval <<-"end_eval" ! class #{klass} ! attr_reader :_#{name} ! end ! end_eval ! end ! ! # No attr_writer for key fields ! next if field.key? ! if !respond_to?('_'+name+'=') ! # Defines the writer eval <<-"end_eval" class #{klass} ! attr_writer :_#{name} end end_eval ! end ! } end def update_from_db table = Db.get_table(self.class) ! req = 'select ' + fields(self.class).keys.map{|name| "`#{name}`" }.join(',') req += " from #{table} where " + ids_constraint *************** *** 157,163 **** sth = Db.dbh.execute req hash = sth.fetch_hash ! attrs(self.class).each_key { |attr| ! if hash.has_key?(attr) && hash[attr] ! m = method('_'+attr+'=').call(hash[attr]) end } --- 218,226 ---- sth = Db.dbh.execute req hash = sth.fetch_hash ! fields(self.class).each { |name,field| ! next if field.key? ! if hash.has_key?(name) && hash[name] ! value = field.fromdb(hash[name]) ! m = method('_'+name+'=').call(value) end } *************** *** 166,176 **** def ids_constraint ! ids(self.class).map{ |id| "`#{id}` = '#{method('_'+id).call}' " }.join 'and ' end # This method checks that each name in names corresponds to a method def check_missing_values ! attrs(self.class).each { |name,mandatory| ! next if !mandatory begin m = method('_'+name) --- 229,243 ---- def ids_constraint ! ids(self.class).each{ |id| ! f = fields(self.class)[id] ! value = f.todb(method('_'+id)).call ! "`#{id}` = '#{value}' " ! }.join 'and ' end # This method checks that each name in names corresponds to a method def check_missing_values ! fields(self.class).each { |name,field| ! next if !field.mandatory? begin m = method('_'+name) *************** *** 184,192 **** end ! def attr_list_to_s(only_mandatory = false, only_setted = false) ! attrs(self.class).map{ |attr, mandatory| ! next if only_mandatory and not mandatory ! next if only_setted and not method('_'+attr).call ! "`#{attr}`" }.compact.join ', ' end --- 251,259 ---- end ! def fields_list_to_s(only_mandatory = false, only_setted = false) ! fields(self.class).map{ |name, field| ! next if only_mandatory and not field.mandatory? ! next if only_setted and not method('_'+name).call ! "`#{name}`" }.compact.join ', ' end *************** *** 201,231 **** req = "insert into `#{table}` (" ! req += attr_list_to_s(only_mandatory, true) req += ') values (' ! req += attrs(self.class).map{ |attr, mandatory| ! next if only_mandatory and not mandatory ! value = method('_'+attr).call ! "'#{value}'" if value }.compact.join ', ' req += ')' exec_request req end def Db.autotable(klass, table) ! attrs = Hash.new ids = Array.new @@tables[klass] = table sth = Db.dbh.execute 'show fields from ' + table ! sth.fetch { |row| ! if row[3] == 'PRI' ! ids << row[0] ! end ! if row[5] != 'auto_increment' ! attrs[row[0]] = ((row[2]=='') and (row[4]=='')) end } Db.ids(klass, ids) ! Db.attrs(klass, attrs) end --- 268,302 ---- req = "insert into `#{table}` (" ! req += fields_list_to_s(only_mandatory, true) req += ') values (' ! req += fields(self.class).map{ |name, field| ! next if only_mandatory and not field.mandatory? ! value = method('_'+name).call ! next if not value ! "'#{field.todb(value)}'" }.compact.join ', ' req += ')' + + puts req exec_request req end def Db.autotable(klass, table) ! fields = Hash.new ids = Array.new @@tables[klass] = table sth = Db.dbh.execute 'show fields from ' + table ! sth.fetch_hash { |row| ! name, type, null, key, default, extra = ! row['Field'], row['Type'], row['Null'], row['Key'], row['Default'], row['Extra'] ! field = DbField.new(name, type, null, key, default, extra) ! if field.key? ! ids << name end + fields[name] = field } Db.ids(klass, ids) ! Db.fields(klass, fields) end *************** *** 235,241 **** req = "update #{table} set " ! req += attrs(self.class).keys.map{ |attr| ! value = method('_'+attr).call ! "`#{attr}`='#{value}'" if value }.compact.join ', ' req += ' where ' + ids_constraint --- 306,312 ---- req = "update #{table} set " ! req += fields(self.class).map{ |name,field| ! value = field.todb(method('_'+name).call) ! "`#{name}`='#{value}'" if value }.compact.join ', ' req += ' where ' + ids_constraint Index: downloader.rb =================================================================== RCS file: /cvsroot/ngetsuite/ngetsuite/ngetsuite/downloader.rb,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** downloader.rb 3 Nov 2003 14:58:06 -0000 1.13 --- downloader.rb 27 Dec 2003 18:13:36 -0000 1.14 *************** *** 39,43 **** def update_status(line) ! debug (Utils.red "begin update_status") if line =~ /^already have .*\n$/ @nbfiles += 1 --- 39,43 ---- def update_status(line) ! debug(Utils.red("begin update_status")) if line =~ /^already have .*\n$/ @nbfiles += 1 *************** *** 80,87 **** def start ! time = `date`.chomp ! `mkdir -p #{dest}` ! Dir.chdir dest ! @start_time = `date`.chomp @status = 'PROCESSING' $dbh.do 'lock tables queue write' --- 80,86 ---- def start ! File.makedirs(@dest) ! Dir.chdir(@dest) ! @start_time = Time.new @status = 'PROCESSING' $dbh.do 'lock tables queue write' *************** *** 92,100 **** begin io.each { |line| ! debug (Utils.blue line) update_status line } rescue Exception => e puts "Exception : " + e print e.backtrace.join("\n") rescue Error => e --- 91,100 ---- begin io.each { |line| ! debug(Utils.blue(line)) update_status line } rescue Exception => e puts "Exception : " + e + puts " => " + e.message print e.backtrace.join("\n") rescue Error => e Index: group.rb =================================================================== RCS file: /cvsroot/ngetsuite/ngetsuite/ngetsuite/group.rb,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** group.rb 3 Nov 2003 19:01:11 -0000 1.19 --- group.rb 27 Dec 2003 18:13:36 -0000 1.20 *************** *** 98,109 **** end - def _date_added - format_date(@_date_added) - end - - def _date_updated - format_date(@_date_updated) - end - def _active @_active ? 'yes' : 'no' --- 98,101 ---- Index: queue.rb =================================================================== RCS file: /cvsroot/ngetsuite/ngetsuite/ngetsuite/queue.rb,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** queue.rb 3 Nov 2003 19:01:12 -0000 1.17 --- queue.rb 27 Dec 2003 18:13:36 -0000 1.18 *************** *** 146,162 **** <td class='prio'>#{@priority}</td><td class='status'>#{@status}</td></tr>" end - - def _date_added=(date) - @_date_added = format_date(date) - end - - def _date_started=(date) - @_date_started = format_date(date) - end - - def _date_finished=(date) - @_date_finished = format_date(date) - end - end --- 146,149 ---- Index: queue_file.rb =================================================================== RCS file: /cvsroot/ngetsuite/ngetsuite/ngetsuite/queue_file.rb,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** queue_file.rb 2 Nov 2003 19:14:29 -0000 1.11 --- queue_file.rb 27 Dec 2003 18:13:36 -0000 1.12 *************** *** 28,32 **** end ! def initialize(queueid, mid, fetch_from_db = false, parts = 0, nblines = 0, filenumber = 0, size = 0) @_queue_id = queueid @dlparts = Integer(parts) --- 28,32 ---- end ! def initialize(queueid, mid, fetch_from_db = false, parts = 0, nblines = 0, filenumber = 0, size = 0, filename = 'unknown') @_queue_id = queueid @dlparts = Integer(parts) *************** *** 35,48 **** @_filenumber = filenumber @_size = size ! self._date_started = Time.now update_from_db if fetch_from_db - end - - def _date_started=(date) - @_date_started = format_date(date) - end - - def _date_finished=(date) - @_date_finished = format_date(date) end --- 35,41 ---- @_filenumber = filenumber @_size = size ! @_filename = filename ! @_date_started = Time.now update_from_db if fetch_from_db end |