"""Sequential file/SQLite recovery model. This is not an SQS or S3 emulator.""" import hashlib import json import os from pathlib import Path import sqlite3 import sys def initialize(folder): folder.mkdir() (folder / 'objects').mkdir() with sqlite3.connect(folder / 'state.sqlite') as db: db.executescript(''' CREATE TABLE exports (id TEXT PRIMARY KEY, fingerprint TEXT, status TEXT); CREATE TABLE publications (export_id TEXT PRIMARY KEY); CREATE TABLE acknowledgements (receipt TEXT PRIMARY KEY); ''') def handle(folder, payload, receipt, stop): export_id = 'export-cedar-17' # Fixed synthetic identity, not arbitrary path input. fingerprint = hashlib.sha256(payload).hexdigest() path = folder / 'objects' / (export_id + '.csv') with sqlite3.connect(folder / 'state.sqlite') as db: stored = db.execute('SELECT fingerprint, status FROM exports WHERE id=?', (export_id,)).fetchone() if stored and stored[0] != fingerprint: raise ValueError('export ID reused with different payload') db.execute('INSERT OR IGNORE INTO exports VALUES (?, ?, ?)', (export_id, fingerprint, 'pending')) db.commit() if stored and stored[1] == 'complete' and path.is_file() and path.read_bytes() == payload: db.execute('INSERT INTO acknowledgements VALUES (?)', (receipt,)) db.commit() return 'reused' if path.exists() and path.read_bytes() != payload: raise ValueError('stored object differs from expected bytes') if not path.exists(): path.write_bytes(payload) if stop == 'after-object': os._exit(23) # Real process exit; no claim about power loss or fsync. with db: db.execute('INSERT OR IGNORE INTO publications VALUES (?)', (export_id,)) db.execute('UPDATE exports SET status=? WHERE id=?', ('complete', export_id)) if stop == 'after-complete': os._exit(24) db.execute('INSERT INTO acknowledgements VALUES (?)', (receipt,)) db.commit() return 'published' if __name__ == '__main__': try: result = handle(Path(sys.argv[1]), bytes.fromhex(sys.argv[2]), sys.argv[3], sys.argv[4]) print(json.dumps({'result': result})) except ValueError as error: print(json.dumps({'error': str(error)})) raise SystemExit(2)