#!/usr/bin/python3 """ Import SmartSource data. For each survey in configuration.surveys(), check for new or modified final gun header files and (re-)import them into the database. """ import os import sys import pathlib import re import time import configuration import smsrc from datastore import Datastore if __name__ == '__main__': print("Reading configuration") file_min_age = configuration.read().get('imports', {}).get('file_min_age', 10) print("Connecting to database") db = Datastore() surveys = db.surveys() print("Reading surveys") for survey in surveys: print(f'Survey: {survey["id"]} ({survey["schema"]})') db.set_survey(survey["schema"]) try: raw_smsrc = survey["raw"]["smsrc"] except KeyError: print("No SmartSource data configuration") continue flags = 0 if "flags" in raw_smsrc: configuration.rxflags(raw_smsrc["flags"]) pattern = raw_smsrc["pattern"] rx = re.compile(pattern["regex"], flags) for fileprefix in raw_smsrc["paths"]: realprefix = configuration.translate_path(fileprefix) print(f"Path prefix: {fileprefix} → {realprefix}") for globspec in raw_smsrc["globs"]: for physical_filepath in pathlib.Path(realprefix).glob(globspec): physical_filepath = str(physical_filepath) logical_filepath = configuration.untranslate_path(physical_filepath) print(f"Found {logical_filepath}") if not db.file_in_db(logical_filepath): age = time.time() - os.path.getmtime(physical_filepath) if age < file_min_age: print("Skipping file because too new", logical_filepath) continue print("Importing") match = rx.match(os.path.basename(logical_filepath)) if not match: error_message = f"File path not matching the expected format! ({logical_filepath} ~ {pattern['regex']})" print(error_message, file=sys.stderr) print("This file will be ignored!") continue file_info = dict(zip(pattern["captures"], match.groups())) smsrc_records = smsrc.from_file(physical_filepath) print("Saving") db.save_raw_smsrc(smsrc_records, file_info, logical_filepath) else: print("Already in DB") print("Done")