--- ZSQLExtend/importFMPXML.py 2007/12/11 16:21:24 1.16 +++ ZSQLExtend/importFMPXML.py 2007/12/11 19:35:34 1.17 @@ -49,7 +49,7 @@ def SimpleSearch(curs,query, args=None, if args is not None: encargs = [] for a in args: - if a is not None: + if a is not None and isinstance(a, str): a = a.encode("UTF-8") encargs.append(a) @@ -227,9 +227,6 @@ class xml_handler: # try to match date style with XML self.db.execute("set datestyle to 'german'") - # translate id_field (SQL-name) to XML-name - self.xml_id = self.sql_field_map.get(self.id_field, None) - #self.logger.debug("xml-fieldnames:"+repr(self.xml_field_names)) # get list of fields and types of db table qstr="select attname, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) from pg_attribute, pg_class where attrelid = pg_class.oid and pg_attribute.attnum > 0 and relname = '%s'" @@ -240,6 +237,14 @@ class xml_handler: #print "SQL fields: %s (%s)"%(n,t) self.sql_fields[n] = TableColumn(n,t) + # translate id_field (SQL-name) to XML-name + self.xml_id = self.sql_field_map.get(self.id_field, None) + # get type of id_field + if self.id_field: + self.id_type = self.sql_fields[self.id_field].getType() + else: + self.id_type = None + # check fields to update if self.update_fields is None: if self.keep_fields: @@ -260,13 +265,13 @@ class xml_handler: else: self.update_fields = self.xml_field_map - + # and translate to list of xml fields if self.lc_names: self.xml_update_list = [self.sql_field_map[x] for x in self.update_fields] else: self.xml_update_list = self.update_fields.keys() - + if not self.keep_fields: # adjust db table to fields in XML and update_fields for f in self.xml_field_map.values(): @@ -288,8 +293,8 @@ class xml_handler: self.db.execute(qstr) self.dbCon.commit() - # prepare sql statements for update - setStr=string.join(["%s = %%s"%self.xml_field_map[f] for f in self.xml_update_list], ', ') + # prepare sql statements for update (do not update id_field) + setStr=string.join(["%s = %%s"%self.xml_field_map[f] for f in self.xml_update_list if f != self.xml_id], ', ') self.updQuery="UPDATE %s SET %s WHERE %s = %%s"%(self.table,setStr,self.id_field) # and insert fields=string.join([self.xml_field_map[x].getName() for x in self.xml_update_list], ',') @@ -394,7 +399,11 @@ class xml_handler: id_val='' # synchronize by id_field if self.id_field: - id_val = self.xml_data[self.xml_id] + if self.id_type == 'integer': + id_val = int(self.xml_data[self.xml_id]) + else: + id_val = self.xml_data[self.xml_id] + if id_val in self.dbIDs: self.dbIDs[id_val] += 1 update=True @@ -402,6 +411,10 @@ class xml_handler: # collect all values args = [] for fn in self.xml_update_list: + # do not update id_field + if self.id_field and fn == self.xml_id: + continue + f = self.xml_field_map[fn] val = self.xml_data[fn] type = self.sql_fields[f.getName()].getType() @@ -425,6 +438,7 @@ class xml_handler: else: # create new row self.logger.debug("insert: %s"%args) + sys.exit(1) SimpleSearch(self.db, self.addQuery, args, ascii=self.ascii_db) #self.logger.info(" row:"+"%d (%s)"%(self.rowcnt,id_val))