--- ZSQLExtend/importFMPXML.py 2007/12/11 16:21:24 1.16 +++ ZSQLExtend/importFMPXML.py 2008/02/04 19:06:34 1.22 @@ -19,7 +19,32 @@ except: fm_ns = 'http://www.filemaker.com/fmpxmlresult' -version_string = "V0.5 ROC 11.12.2007" +version_string = "V0.5.2 ROC 4.2.2008" + +def unicodify(text, withNone=False): + """decode str (utf-8 or latin-1 representation) into unicode object""" + if withNone and text is None: + return None + if not text: + return u"" + if isinstance(text, str): + try: + return text.decode('utf-8') + except: + return text.decode('latin-1') + else: + return text + +def utf8ify(text, withNone=False): + """encode unicode object or string into byte string in utf-8 representation""" + if withNone and text is None: + return None + if not text: + return "" + if isinstance(text, unicode): + return text.encode('utf-8') + else: + return text def getTextFromNode(nodename): """get the cdata content of a node""" @@ -45,13 +70,11 @@ def SimpleSearch(curs,query, args=None, #logger.debug("executing: "+query) if ascii: # encode all in UTF-8 - query = query.encode("UTF-8") + query = utf8ify(query) if args is not None: encargs = [] for a in args: - if a is not None: - a = a.encode("UTF-8") - encargs.append(a) + encargs.append(utf8ify(a, withNone=True)) args = encargs @@ -227,9 +250,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 +260,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 +288,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 +316,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 +422,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 +434,10 @@ class xml_handler: # collect all values args = [] for fn in self.xml_update_list: + # do not update id_field + if update and fn == self.xml_id: + continue + f = self.xml_field_map[fn] val = self.xml_data[fn] type = self.sql_fields[f.getName()].getType()