Created
September 7, 2016 11:46
-
-
Save tokejepsen/1eb8cac0b2ed513ba7b31315ab512419 to your computer and use it in GitHub Desktop.
PyFileMaker fix
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# PyFileMaker - Integrating FileMaker and Python | |
# (c) 2014-2016 Marcin Kawa, [email protected] | |
# (c) 2006-2008 Klokan Petr Pridal, [email protected] | |
# (c) 2002-2006 Pieter Claerhout, [email protected] | |
# | |
# http://code.google.com/p/pyfilemaker/ | |
# http://www.yellowduck.be/filemaker/ | |
# Import the main modules | |
import string | |
from types import * | |
import re | |
# Import the FMPro modules | |
import xml2obj | |
import FMXML | |
from FMError import * | |
from FMData import makeFMData | |
class FMResultset(FMXML.FMXML): | |
"""Class defining the information about a resultset.""" | |
def __init__(self, data): | |
"""Class constructor""" | |
self.data = data | |
self.errorcode = -1 | |
self.product = {} | |
self.database = {} | |
self.metadata = {} | |
self.resultset = [] | |
self.fieldNames = [] | |
self.doParseResultset() | |
def doParseResultset(self): | |
data = self.doParseXMLData() | |
self.errorcode = self.doGetXMLElement(data, 'error').getAttribute('code') | |
node = self.doGetXMLElement(data, 'product') | |
self.product = self.doGetXMLAttributes(node) | |
node = self.doGetXMLElement(data, 'datasource') | |
self.database = self.doGetXMLAttributes(node) | |
node = self.doGetXMLElement(data, 'metadata') | |
for subnode in self.doGetXMLElements(node, 'field-definition'): | |
fieldData = self.doGetXMLAttributes(subnode) | |
self.metadata[fieldData['name']] = fieldData | |
self.fieldNames.append(fieldData['name']) | |
node = self.doGetXMLElement(data, 'resultset') | |
for record in self.doGetXMLElements(node, 'record'): | |
recordDict = dict() | |
for column in self.doGetXMLElements(record, 'field'): | |
fieldname = self.doGetXMLAttribute(column, 'name') | |
try: | |
recordDict[fieldname] = self.doGetXMLElement(column, 'data').getData() | |
except: | |
recordDict[fieldname] = ''.encode('UTF-8') | |
# it means there are no data for this column!!! | |
# -> and it's not possible to modify it later | |
#recordDict[fieldname] = None | |
if fieldname.find('::') != -1: | |
subfield = fieldname[:fieldname.find('::')] | |
subname = fieldname[fieldname.find('::')+2:] | |
if not recordDict.has_key(subfield): | |
recordDict[subfield] = dict() | |
recordDict[subfield][subname] = recordDict[fieldname] | |
del(recordDict[fieldname]) | |
recordDict['RECORDID'] = int( | |
re.sub('[^\d+]', '', self.doGetXMLAttribute(record, 'record-id')) | |
) | |
recordDict['MODID'] = int( | |
self.doGetXMLAttribute(record, 'mod-id') | |
) | |
for subnode in self.doGetXMLElements(record, 'relatedset'): | |
subnodename = subnode.getAttribute('table') | |
if (subnode.getAttribute('count')) > 0 and not recordDict.has_key(subnodename): | |
recordDict[subnodename] = [] | |
for subrecord in self.doGetXMLElements(subnode, 'record'): | |
subrecordDict = dict() | |
for subcolumn in self.doGetXMLElements(subrecord, 'field'): | |
fieldname = self.doGetXMLAttribute(subcolumn, 'name') | |
if fieldname.startswith(subnodename): | |
fieldname = fieldname[len(subnodename)+2:] | |
try: | |
subrecordDict[fieldname] = self.doGetXMLElement(subcolumn, 'data').getData() | |
except: | |
subrecordDict[fieldname] = ''.encode('UTF-8') | |
if fieldname.find('::') != -1: | |
subfield = fieldname[:fieldname.find('::')] | |
subname = fieldname[fieldname.find('::')+2:] | |
if not subrecordDict.has_key(subfield): | |
subrecordDict[subfield] = dict() | |
subrecordDict[subfield][subname] = subrecordDict[fieldname] | |
del(subrecordDict[fieldname]) | |
subrecordDict['RECORDID'] = int(self.doGetXMLAttribute(subrecord, 'record-id')) | |
subrecordDict['MODID'] = int(self.doGetXMLAttribute(subrecord, 'mod-id')) | |
done = False | |
for rec in recordDict[subnodename]: | |
if isinstance(rec, unicode): | |
done = True | |
continue | |
if rec['RECORDID'] == subrecordDict['RECORDID']: | |
#rec.update(subrecordDict) | |
for sub in subrecordDict: | |
if sub in ['RECORDID','MODID']: | |
pass | |
elif rec.has_key(sub) and type(rec[sub])==dict: | |
rec[sub].update(subrecordDict[sub]) | |
else: | |
rec[sub] = subrecordDict[sub] | |
done = True | |
if not done: | |
recordDict[subnodename].append(subrecordDict) | |
self.resultset.append(makeFMData(recordDict)) | |
def doShow(self, xml=0): | |
"""Shows the contents of our resultset.""" | |
if xml == 0: | |
print 'Errorcode:', self.errorcode | |
print 'Product information:' | |
for key in self.product.keys(): | |
print ' ', key.encode('UTF-8'), | |
print '->', self.product[key].encode('UTF-8') | |
print 'Database information:' | |
for key in self.database.keys(): | |
print ' ', key.encode('UTF-8'), | |
print'->', self.database[key].encode('UTF-8') | |
print 'Metadata:' | |
for field in self.metadata.keys(): | |
print ' ', field.encode('UTF-8') | |
for property in self.metadata[field]: | |
print ' ', property.encode('UTF-8'), | |
print '->', self.metadata[field][property].encode('UTF-8') | |
print 'Records:' | |
for record in self.resultset: | |
for column in record: | |
print ' ', column.encode('UTF-8'), | |
if type(record[column]) == UnicodeType: | |
print '->', record[column].encode('UTF-8') | |
else: | |
print '->', record[column] | |
else: | |
tags = [ | |
'FMPXMLRESULT', | |
'ERRORCODE', | |
'PRODUCT', | |
'DATABASE', | |
'METADATA', | |
'FIELD', | |
'RESULTSET', | |
'ROW', | |
'COL', | |
'DATA' | |
] | |
xml = self.data | |
for tag in tags: | |
xml = string.replace(xml, '></' + tag, '>\n</' + tag) | |
xml = string.replace(xml, '><' + tag, '>\n<' + tag) | |
print xml |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment