"""Docstring.""" import csv import os import acr_client import pymysql mysql_host = 'db' mysql_user = os.getenv('MYSQL_USER') mysql_pass = os.getenv('MYSQL_PASSWORD') mysql_database = os.getenv('MYSQL_DATABASE') db_conn = pymysql.connect( host=mysql_host, user=mysql_user, password=mysql_pass, database=mysql_database, cursorclass=pymysql.cursors.DictCursor, autocommit=True ) def main(cursor): """Entrypoint.""" # verify db connection cursor.execute('SELECT 1') # verify input file exists data_dir = 'data' filename = os.getenv('INPUT_FILENAME') if filename not in os.listdir(data_dir): raise Exception(f'Unable to locate {filename} in ./{data_dir}') # read in file_ids from csv file_ids = [] with open(os.path.join(data_dir, filename)) as f: reader = csv.DictReader(f) file_ids = [x['file_id'] for x in reader] # setup database _setup(cursor) # initialize acr cloud client client = acr_client.ACRCloud( os.getenv('ACR_ENV'), os.getenv('ACR_TOKEN') ) # process data in batches def chunks(lst, n): for i in range(0, len(lst), n): yield lst[i:i + n] # stats num_api_calls = 0 num_api_errors = 0 num_file_ids = len(file_ids) # check if batch exists in DB chunk_size = os.getenv('CHUNK_SIZE', 100) for chunk in chunks(file_ids, chunk_size): missing = _filter_batch(cursor, chunk) num_api_calls += len(missing) # api query for data not in DB and insert it for file_id in missing: (code, body) = client.single(file_id) if code == 200: acr_id = body['data'][0]['acr_id'] _insert_mapping(cursor, file_id, acr_id) elif code == 404: _insert_mapping(cursor, file_id, None) else: num_api_errors += 1 print(code, body) print(f""" FINISHED: API_CALLS => {num_api_calls} API_ERRORS => {num_api_errors} FILE_IDS => {num_file_ids} """) def _insert_mapping(cursor, file_id, acr_id): cursor.execute(""" INSERT INTO mappings (file_id, acr_id) VALUES (%(file_id)s, %(acr_id)s) """, { 'file_id': file_id, 'acr_id': acr_id }) def _filter_batch(cursor, file_ids): cursor.execute(""" SELECT file_id FROM mappings WHERE file_id IN %(ids)s """, { 'ids': file_ids }) matched_ids = set([x['file_id'] for x in cursor.fetchall()]) return list(set(file_ids) - matched_ids) def _setup(cursor): cursor.execute(""" CREATE TABLE IF NOT EXISTS mappings ( file_id VARCHAR(64) NOT NULL, acr_id VARCHAR(32) DEFAULT NULL, PRIMARY KEY (file_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 """) if __name__ == '__main__': with db_conn: with db_conn.cursor() as cursor: main(cursor)