version 1.22, 2008/02/04 19:06:34
|
version 1.23, 2008/02/13 19:48:50
|
Line 12 from amara import saxtools
|
Line 12 from amara import saxtools
|
|
|
try: |
try: |
import psycopg2 as psycopg |
import psycopg2 as psycopg |
|
import psycopg2.extensions |
|
# switch to unicode |
|
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) |
psyco = 2 |
psyco = 2 |
except: |
except: |
import psycopg |
import psycopg |
Line 19 except:
|
Line 22 except:
|
|
|
fm_ns = 'http://www.filemaker.com/fmpxmlresult' |
fm_ns = 'http://www.filemaker.com/fmpxmlresult' |
|
|
version_string = "V0.5.2 ROC 4.2.2008" |
version_string = "V0.6 ROC 13.2.2008" |
|
|
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 143 class xml_handler:
|
Line 146 class xml_handler:
|
|
|
# connect database |
# connect database |
self.dbCon = psycopg.connect(options.dsn) |
self.dbCon = psycopg.connect(options.dsn) |
|
logging.debug("DB encoding: %s"%self.dbCon.encoding) |
self.db = self.dbCon.cursor() |
self.db = self.dbCon.cursor() |
assert self.db, "AIIEE no db cursor for %s!!"%options.dsn |
assert self.db, "AIIEE no db cursor for %s!!"%options.dsn |
|
|
Line 155 class xml_handler:
|
Line 159 class xml_handler:
|
self.ascii_db = getattr(options,"ascii_db",None) |
self.ascii_db = getattr(options,"ascii_db",None) |
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.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 166 class xml_handler:
|
Line 171 class xml_handler:
|
self.logger.debug("ascii_db: "+repr(self.ascii_db)) |
self.logger.debug("ascii_db: "+repr(self.ascii_db)) |
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.dbIDs = {} |
self.dbIDs = {} |
self.rowcnt = 0 |
self.rowcnt = 0 |
Line 319 class xml_handler:
|
Line 325 class xml_handler:
|
# prepare sql statements for update (do not update id_field) |
# 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], ', ') |
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) |
self.updQuery="UPDATE %s SET %s WHERE %s = %%s"%(self.table,setStr,self.id_field) |
|
# and select (for update check) |
|
selStr=string.join([self.xml_field_map[f].getName() for f in self.xml_update_list if f != self.xml_id], ', ') |
|
self.selQuery="SELECT %s FROM %s WHERE %s = %%s"%(selStr,self.table,self.id_field) |
# and insert |
# and insert |
fields=string.join([self.xml_field_map[x].getName() for x in self.xml_update_list], ',') |
fields=string.join([self.xml_field_map[x].getName() for x in self.xml_update_list], ',') |
values=string.join(['%s' for f in self.xml_update_list], ',') |
values=string.join(['%s' for f in self.xml_update_list], ',') |
self.addQuery="INSERT INTO %s (%s) VALUES (%s)"%(self.table,fields,values) |
self.addQuery="INSERT INTO %s (%s) VALUES (%s)"%(self.table,fields,values) |
self.logger.debug("update-query: "+self.updQuery) |
self.logger.debug("update-query: "+self.updQuery) |
|
self.logger.debug("sel-query: "+self.selQuery) |
self.logger.debug("add-query: "+self.addQuery) |
self.logger.debug("add-query: "+self.addQuery) |
return |
return |
|
|
Line 376 class xml_handler:
|
Line 386 class xml_handler:
|
if self.dbIDs[id] == 0: |
if self.dbIDs[id] == 0: |
self.logger.info(" delete:"+id) |
self.logger.info(" delete:"+id) |
SimpleSearch(self.db, delQuery, [id], ascii=self.ascii_db) |
SimpleSearch(self.db, delQuery, [id], ascii=self.ascii_db) |
sys.exit(1) |
|
|
|
elif self.dbIDs[id] > 1: |
elif self.dbIDs[id] > 1: |
self.logger.info(" sync: ID %s used more than once?"%id) |
self.logger.info(" sync: ID %s used more than once?"%id) |
Line 453 class xml_handler:
|
Line 462 class xml_handler:
|
|
|
if update: |
if update: |
# update existing row (by id_field) |
# update existing row (by id_field) |
# last argument is ID match |
if self.read_before_update: |
args.append(id_val) |
# read 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]: |
|
# logging.debug("v: %s = %s (%s)"%(v,args[i],v==args[i])) |
|
# i += 1 |
|
if tuple(oldrow[0]) != tuple(args): |
|
# data has changed -- update |
|
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)) |
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) |
SimpleSearch(self.db, self.updQuery, args, ascii=self.ascii_db) |
|
|
else: |
else: |
Line 584 if __name__ == "__main__":
|
Line 608 if __name__ == "__main__":
|
opars.add_option("--backup", default=False, action="store_true", |
opars.add_option("--backup", default=False, action="store_true", |
dest="backup_table", |
dest="backup_table", |
help="create backup of old table") |
help="create backup of old table") |
|
opars.add_option("--read-before-update", default=False, action="store_true", |
|
dest="read_before_update", |
|
help="read all data to check if it really changed") |
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)") |