kussssh/IPO-Analyzer
0
1"""2One-time utility to wipe cached analysis artifacts while preserving catalog data.3"""4from __future__ import annotations5 6import sqlite37import shutil8from pathlib import Path9 10from backend.config import CACHE_DB_PATH, CHROMA_BASE_DIR, OUTPUT_DIR, UPLOAD_DIR11from backend.database import reset_analysis_state12 13 14def _clear_directory(path: Path) -> int:15 if not path.exists():16 return 017 removed = 018 for child in path.iterdir():19 if child.is_dir():20 shutil.rmtree(child, ignore_errors=True)21 removed += 122 else:23 child.unlink(missing_ok=True)24 removed += 125 return removed26 27 28def _reset_sqlite_direct() -> dict[str, int]:29 conn = sqlite3.connect(CACHE_DB_PATH, timeout=60, check_same_thread=False)30 try:31 analyses_deleted = conn.execute("DELETE FROM analyses").rowcount32 diffs_deleted = conn.execute("DELETE FROM diffs").rowcount33 chunks_deleted = conn.execute("DELETE FROM document_chunks").rowcount34 documents_reset = conn.execute(35 """36 UPDATE documents37 SET38 pdf_url = NULL,39 local_path = NULL,40 pdf_sha256 = NULL,41 downloaded_at = NULL,42 processed_at = NULL,43 page_count = NULL,44 status = CASE45 WHEN detail_url IS NOT NULL AND available = 1 THEN 'cataloged'46 WHEN detail_url IS NULL OR available = 0 THEN 'missing'47 ELSE 'pending'48 END,49 metadata_json = '{}'50 """51 ).rowcount52 conn.commit()53 return {54 "analyses_deleted": analyses_deleted,55 "diffs_deleted": diffs_deleted,56 "chunks_deleted": chunks_deleted,57 "documents_reset": documents_reset,58 }59 finally:60 conn.close()61 62 63def main() -> None:64 try:65 db_counts = reset_analysis_state()66 except Exception:67 db_counts = _reset_sqlite_direct()68 outputs_removed = _clear_directory(OUTPUT_DIR)69 chroma_removed = _clear_directory(CHROMA_BASE_DIR)70 uploads_removed = _clear_directory(UPLOAD_DIR)71 print(72 {73 **db_counts,74 "outputs_removed": outputs_removed,75 "chroma_entries_removed": chroma_removed,76 "uploads_removed": uploads_removed,77 }78 )79 80 81if __name__ == "__main__":82 main()83 