Diff for /ZSQLExtend/importFMPXML.py between versions 1.25 and 1.30

version 1.25, 2008/07/02 11:58:45 version 1.30, 2009/11/17 18:21:28
Line 22  except: Line 22  except:
   
 fm_ns = 'http://www.filemaker.com/fmpxmlresult'  fm_ns = 'http://www.filemaker.com/fmpxmlresult'
   
 version_string = "V0.6.1 ROC .2008"  version_string = "V0.6.4 ROC 17.11.2009"
   
 def unicodify(text, withNone=False):  def unicodify(text, withNone=False):
     """decode str (utf-8 or latin-1 representation) into unicode object"""      """decode str (utf-8 or latin-1 representation) into unicode object"""
Line 160  class xml_handler: Line 160  class xml_handler:
         self.replace_table = getattr(options,"replace_table",None)          self.replace_table = getattr(options,"replace_table",None)
         self.backup_table = getattr(options,"backup_table",None)          self.backup_table = getattr(options,"backup_table",None)
         self.read_before_update = getattr(options,"read_before_update",None)          self.read_before_update = getattr(options,"read_before_update",None)
           self.debug_data = getattr(options,"debug_data",None)
   
         self.logger.debug("dsn: "+repr(getattr(options,"dsn",None)))          self.logger.debug("dsn: "+repr(getattr(options,"dsn",None)))
         self.logger.debug("table: "+repr(self.table))          self.logger.debug("table: "+repr(self.table))
Line 172  class xml_handler: Line 173  class xml_handler:
         self.logger.debug("replace_table: "+repr(self.replace_table))          self.logger.debug("replace_table: "+repr(self.replace_table))
         self.logger.debug("backup_table: "+repr(self.backup_table))          self.logger.debug("backup_table: "+repr(self.backup_table))
         self.logger.debug("read_before_update: "+repr(self.read_before_update))          self.logger.debug("read_before_update: "+repr(self.read_before_update))
           self.logger.debug("debug_data: "+repr(self.debug_data))
                   
         self.dbIDs = {}          self.dbIDs = {}
         self.rowcnt = 0          self.rowcnt = 0
Line 203  class xml_handler: Line 205  class xml_handler:
         #First round through the generator corresponds to the          #First round through the generator corresponds to the
         #start element event          #start element event
         self.logger.info("reading metadata...")          self.logger.info("reading metadata...")
           if self.debug_data:
         self.logger.debug("START METADATA")          self.logger.debug("START METADATA")
         yield None          yield None
           
Line 215  class xml_handler: Line 218  class xml_handler:
             yield None              yield None
                   
         #Element closed. Wrap up          #Element closed. Wrap up
           if self.debug_data:
         self.logger.debug("END METADATA")          self.logger.debug("END METADATA")
                   
         # rename table for backup          # rename table for backup
Line 365  class xml_handler: Line 369  class xml_handler:
         #First round through the generator corresponds to the          #First round through the generator corresponds to the
         #start element event          #start element event
         self.logger.info("reading data...")          self.logger.info("reading data...")
           if self.debug_data:
         self.logger.debug("START RESULTSET")          self.logger.debug("START RESULTSET")
         self.rowcnt = 0          self.rowcnt = 0
         yield None          yield None
Line 378  class xml_handler: Line 383  class xml_handler:
             yield None              yield None
                   
         #Element closed.  Wrap up          #Element closed.  Wrap up
           if self.debug_data:
         self.logger.debug("END RESULTSET")          self.logger.debug("END RESULTSET")
         self.dbCon.commit()          self.dbCon.commit()
                   
Line 388  class xml_handler: Line 394  class xml_handler:
             for id in self.dbIDs.keys():              for id in self.dbIDs.keys():
                 # find all not-updated fields                  # find all not-updated fields
                 if self.dbIDs[id] == 0:                  if self.dbIDs[id] == 0:
                     self.logger.info(" delete:"+id)                      self.logger.info(" delete: %s"%id)
                     SimpleSearch(self.db, delQuery, [id], ascii=self.ascii_db)                      SimpleSearch(self.db, delQuery, [id], ascii=self.ascii_db)
                                           
                 elif self.dbIDs[id] > 1:                  elif self.dbIDs[id] > 1:
Line 407  class xml_handler: Line 413  class xml_handler:
             self.db.execute(qstr)              self.db.execute(qstr)
             self.dbCon.commit()              self.dbCon.commit()
                   
           self.logger.info("Done (%s rows)"%self.rowcnt)
         return          return
   
     def handle_row(self, end_condition):      def handle_row(self, end_condition):
Line 414  class xml_handler: Line 421  class xml_handler:
             (saxtools.START_ELEMENT, fm_ns, u'COL'):              (saxtools.START_ELEMENT, fm_ns, u'COL'):
             self.handle_col,              self.handle_col,
             }              }
           if self.debug_data:
         self.logger.debug("START ROW")          self.logger.debug("START ROW")
         self.xml_data = {}          self.xml_data = {}
         self.colIdx = 0          self.colIdx = 0
Line 428  class xml_handler: Line 436  class xml_handler:
             yield None              yield None
                   
         #Element closed.  Wrap up          #Element closed.  Wrap up
           if self.debug_data:
         self.logger.debug("END ROW")          self.logger.debug("END ROW")
         self.rowcnt += 1          self.rowcnt += 1
         # process collected row data          # process collected row data
Line 436  class xml_handler: Line 445  class xml_handler:
         # synchronize by id_field          # synchronize by id_field
         if self.id_field:          if self.id_field:
             if self.id_type == 'integer':              if self.id_type == 'integer':
                   try:
                 id_val = int(self.xml_data[self.xml_id])                  id_val = int(self.xml_data[self.xml_id])
                   except:
                       pass
             else:              else:
                 id_val = self.xml_data[self.xml_id]                  id_val = self.xml_data[self.xml_id]
                                   
               if not id_val:
                   # abort update
                   self.logger.error("ERROR: unable to sync! emtpy id in row %s"%self.rowcnt)
                   return
                   
             if id_val in self.dbIDs:              if id_val in self.dbIDs:
                 self.dbIDs[id_val] += 1                  self.dbIDs[id_val] += 1
                 update=True                  update=True
Line 468  class xml_handler: Line 485  class xml_handler:
             # update existing row (by id_field)              # update existing row (by id_field)
             if self.read_before_update:              if self.read_before_update:
                 # read data                  # read data
                   if self.debug_data:
                 self.logger.debug("update check: %s = %s"%(id_val, args))                  self.logger.debug("update check: %s = %s"%(id_val, args))
                 oldrow = SimpleSearch(self.db, self.selQuery, [id_val], ascii=self.ascii_db)                  oldrow = SimpleSearch(self.db, self.selQuery, [id_val], ascii=self.ascii_db)
                 #i = 0                  #i = 0
Line 476  class xml_handler: Line 494  class xml_handler:
                 #    i += 1                  #    i += 1
                 if tuple(oldrow[0]) != tuple(args):                  if tuple(oldrow[0]) != tuple(args):
                     # data has changed -- update                      # data has changed -- update
                       if self.debug_data:
                     self.logger.debug("really update: %s = %s"%(id_val, args))                      self.logger.debug("really update: %s = %s"%(id_val, args))
                     args.append(id_val) # last arg is id                      args.append(id_val) # last arg is id
                     SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db)                      SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db)
                                           
             else:              else:
                 # always update                  # always update
                   if self.debug_data:
                 self.logger.debug("update: %s = %s"%(id_val, args))                  self.logger.debug("update: %s = %s"%(id_val, args))
                 args.append(id_val) # last arg is id                  args.append(id_val) # last arg is id
                 SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db)                  SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db)
   
         else:          else:
             # create new row              # create new row
               if self.debug_data:
             self.logger.debug("insert: %s"%args)              self.logger.debug("insert: %s"%args)
             SimpleSearch(self.db, self.addQuery, args, ascii=self.ascii_db)              SimpleSearch(self.db, self.addQuery, args, ascii=self.ascii_db)
   
Line 618  if __name__ == "__main__": Line 639  if __name__ == "__main__":
     opars.add_option("-d", "--debug", default=False, action="store_true",       opars.add_option("-d", "--debug", default=False, action="store_true", 
                      dest="debug",                        dest="debug", 
                      help="debug mode (more output)")                       help="debug mode (more output)")
       opars.add_option("--debug-data", default=False, action="store_true", 
                        dest="debug_data", 
                        help="debug mode for data (even more output)")
           
     (options, args) = opars.parse_args()      (options, args) = opars.parse_args()
           

Removed from v.1.25  
changed lines
  Added in v.1.30


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>