--- ZSQLExtend/importFMPXML.py 2008/07/16 12:54:10 1.26 +++ ZSQLExtend/importFMPXML.py 2010/05/10 15:50:32 1.31 @@ -22,7 +22,7 @@ except: fm_ns = 'http://www.filemaker.com/fmpxmlresult' -version_string = "V0.6.1 ROC 2.7.2008" +version_string = "V0.6.5 ROC 10.5.2010" def unicodify(text, withNone=False): """decode str (utf-8 or latin-1 representation) into unicode object""" @@ -160,6 +160,7 @@ class xml_handler: self.replace_table = getattr(options,"replace_table",None) self.backup_table = getattr(options,"backup_table",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("table: "+repr(self.table)) @@ -172,6 +173,7 @@ class xml_handler: self.logger.debug("replace_table: "+repr(self.replace_table)) self.logger.debug("backup_table: "+repr(self.backup_table)) self.logger.debug("read_before_update: "+repr(self.read_before_update)) + self.logger.debug("debug_data: "+repr(self.debug_data)) self.dbIDs = {} self.rowcnt = 0 @@ -203,7 +205,8 @@ class xml_handler: #First round through the generator corresponds to the #start element event self.logger.info("reading metadata...") - self.logger.debug("START METADATA") + if self.debug_data: + self.logger.debug("START METADATA") yield None #delegate is a generator that handles all the events "within" @@ -215,7 +218,8 @@ class xml_handler: yield None #Element closed. Wrap up - self.logger.debug("END METADATA") + if self.debug_data: + self.logger.debug("END METADATA") # rename table for backup if self.backup_table: @@ -365,7 +369,8 @@ class xml_handler: #First round through the generator corresponds to the #start element event self.logger.info("reading data...") - self.logger.debug("START RESULTSET") + if self.debug_data: + self.logger.debug("START RESULTSET") self.rowcnt = 0 yield None @@ -378,7 +383,8 @@ class xml_handler: yield None #Element closed. Wrap up - self.logger.debug("END RESULTSET") + if self.debug_data: + self.logger.debug("END RESULTSET") self.dbCon.commit() if self.sync_mode: @@ -388,7 +394,7 @@ class xml_handler: for id in self.dbIDs.keys(): # find all not-updated fields 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) elif self.dbIDs[id] > 1: @@ -407,6 +413,7 @@ class xml_handler: self.db.execute(qstr) self.dbCon.commit() + self.logger.info("Done (%s rows)"%self.rowcnt) return def handle_row(self, end_condition): @@ -414,7 +421,8 @@ class xml_handler: (saxtools.START_ELEMENT, fm_ns, u'COL'): self.handle_col, } - self.logger.debug("START ROW") + if self.debug_data: + self.logger.debug("START ROW") self.xml_data = {} self.colIdx = 0 yield None @@ -428,7 +436,8 @@ class xml_handler: yield None #Element closed. Wrap up - self.logger.debug("END ROW") + if self.debug_data: + self.logger.debug("END ROW") self.rowcnt += 1 # process collected row data update=False @@ -436,9 +445,17 @@ class xml_handler: # synchronize by id_field if self.id_field: if self.id_type == 'integer': - id_val = int(self.xml_data[self.xml_id]) + try: + id_val = int(self.xml_data[self.xml_id]) + except: + pass else: 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: self.dbIDs[id_val] += 1 @@ -454,7 +471,7 @@ class xml_handler: f = self.xml_field_map[fn] val = self.xml_data[fn] type = self.sql_fields[f.getName()].getType() - if type == "date" and len(val) == 0: + if type == "date" and len(val.strip()) == 0: # empty date field val = None @@ -468,7 +485,8 @@ class xml_handler: # update existing row (by id_field) if self.read_before_update: # read data - self.logger.debug("update check: %s = %s"%(id_val, args)) + if self.debug_data: + self.logger.debug("update check: %s = %s"%(id_val, args)) oldrow = SimpleSearch(self.db, self.selQuery, [id_val], ascii=self.ascii_db) #i = 0 #for v in oldrow[0]: @@ -476,19 +494,22 @@ class xml_handler: # i += 1 if tuple(oldrow[0]) != tuple(args): # data has changed -- update - self.logger.debug("really update: %s = %s"%(id_val, args)) + if self.debug_data: + self.logger.debug("really update: %s = %s"%(id_val, args)) args.append(id_val) # last arg is id SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db) else: # always update - self.logger.debug("update: %s = %s"%(id_val, args)) + if self.debug_data: + self.logger.debug("update: %s = %s"%(id_val, args)) args.append(id_val) # last arg is id SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db) else: # create new row - self.logger.debug("insert: %s"%args) + if self.debug_data: + self.logger.debug("insert: %s"%args) SimpleSearch(self.db, self.addQuery, args, ascii=self.ascii_db) #self.logger.info(" row:"+"%d (%s)"%(self.rowcnt,id_val)) @@ -618,6 +639,9 @@ if __name__ == "__main__": opars.add_option("-d", "--debug", default=False, action="store_true", dest="debug", 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()