Skip to content

Instantly share code, notes, and snippets.

@tokejepsen
Created September 7, 2016 11:46
Show Gist options
  • Save tokejepsen/1eb8cac0b2ed513ba7b31315ab512419 to your computer and use it in GitHub Desktop.
Save tokejepsen/1eb8cac0b2ed513ba7b31315ab512419 to your computer and use it in GitHub Desktop.
PyFileMaker fix
# 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
print 'Product information:'
for key in self.product.keys():
print ' ', key.encode('UTF-8'),
print '->', self.product[key].encode('UTF-8')
print
print 'Database information:'
for key in self.database.keys():
print ' ', key.encode('UTF-8'),
print'->', self.database[key].encode('UTF-8')
print
print 'Metadata:'
for field in self.metadata.keys():
print
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
print 'Records:'
for record in self.resultset:
print
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