def export_records(context, database, table, xml_dirpath): """Export metadata records from database to directory of files""" repo = repository.Repository(database, context, table=table) LOGGER.info('Querying database %s, table %s ....', database, table) records = repo.session.query(repo.dataset) LOGGER.info('Found %d records\n', records.count()) LOGGER.info('Exporting records\n') dirpath = os.path.abspath(xml_dirpath) exported_files = set() if not os.path.exists(dirpath): LOGGER.info('Directory %s does not exist. Creating...', dirpath) try: os.makedirs(dirpath) except OSError as err: LOGGER.exception('Could not create directory') raise RuntimeError('Could not create %s %s' % (dirpath, err)) from err for record in records.all(): identifier = \ getattr(record, context.md_core_model['mappings']['pycsw:Identifier']) LOGGER.info('Processing %s', identifier) # sanitize identifier identifier = util.secure_filename(identifier) # write to XML document filename = os.path.join(dirpath, '%s.xml' % identifier) try: LOGGER.info('Writing to file %s', filename) if hasattr(record.xml, 'decode'): str_xml = record.xml.decode('utf-8') else: str_xml = record.xml with open(filename, 'w') as xml: xml.write('<?xml version="1.0" encoding="UTF-8"?>\n') xml.write(str_xml) except Exception as err: # Something went wrong so skip over this file but log an error LOGGER.exception('Error writing %s to disk', filename) # If we wrote a partial file or created an empty file make sure it is removed if os.path.exists(filename): os.remove(filename) continue else: exported_files.add(filename) return tuple(exported_files)
def export_records(context, database, table, xml_dirpath): """Export metadata records from database to directory of files""" repo = repository.Repository(database, context, table=table) LOGGER.info('Querying database %s, table %s ....', database, table) records = repo.session.query(repo.dataset) LOGGER.info('Found %d records\n', records.count()) LOGGER.info('Exporting records\n') dirpath = os.path.abspath(xml_dirpath) exported_files = set() if not os.path.exists(dirpath): LOGGER.info('Directory %s does not exist. Creating...', dirpath) try: os.makedirs(dirpath) except OSError as err: LOGGER.exception('Could not create directory') raise RuntimeError('Could not create %s %s' % (dirpath, err)) for record in records.all(): identifier = \ getattr(record, context.md_core_model['mappings']['pycsw:Identifier']) LOGGER.info('Processing %s', identifier) # sanitize identifier identifier = util.secure_filename(identifier) # write to XML document filename = os.path.join(dirpath, '%s.xml' % identifier) try: LOGGER.info('Writing to file %s', filename) if hasattr(record.xml, 'decode'): str_xml = record.xml.decode('utf-8') else: str_xml = record.xml with open(filename, 'w') as xml: xml.write('<?xml version="1.0" encoding="UTF-8"?>\n') xml.write(str_xml) except Exception as err: # Something went wrong so skip over this file but log an error LOGGER.exception('Error writing %s to disk', filename) # If we wrote a partial file or created an empty file make sure it is removed if os.path.exists(filename): os.remove(filename) continue else: exported_files.add(filename) return tuple(exported_files)