diff --git a/skills/paradiz/scripts/maintain_sync_sqlite.py b/skills/paradiz/scripts/maintain_sync_sqlite.py new file mode 100755 index 0000000..fad868b --- /dev/null +++ b/skills/paradiz/scripts/maintain_sync_sqlite.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +import argparse +import json +import sqlite3 +from pathlib import Path + +DB_PATH = Path('/home/openclaw/.openclaw/workspace/skills/paradiz/data/db/sync.sqlite') + + +def main(): + p = argparse.ArgumentParser(description='Cleanup and health-check for sync.sqlite') + p.add_argument('--days', type=int, default=90, help='Keep logs for last N days') + p.add_argument('--warn-mb', type=float, default=50.0, help='Warn if DB exceeds this size in MB') + args = p.parse_args() + + if not DB_PATH.exists(): + print(json.dumps({'ok': False, 'error': 'sync.sqlite not found', 'path': str(DB_PATH)}, ensure_ascii=False)) + return + + conn = sqlite3.connect(str(DB_PATH)) + cur = conn.cursor() + + before_rows = cur.execute('SELECT COUNT(*) FROM log').fetchone()[0] + cutoff = cur.execute("SELECT julianday('now', ?)", (f'-{args.days} days',)).fetchone()[0] + + cur.execute('DELETE FROM log WHERE creation < ?', (cutoff,)) + deleted = cur.rowcount if cur.rowcount is not None else 0 + conn.commit() + + cur.execute('VACUUM') + conn.close() + + size_mb = DB_PATH.stat().st_size / (1024 * 1024) + warn = size_mb > args.warn_mb + + # reopen only to read count after vacuum + conn = sqlite3.connect(str(DB_PATH)) + cur = conn.cursor() + after_rows = cur.execute('SELECT COUNT(*) FROM log').fetchone()[0] + conn.close() + + print(json.dumps({ + 'ok': True, + 'db': str(DB_PATH), + 'kept_days': args.days, + 'rows_before': before_rows, + 'rows_deleted': deleted, + 'rows_after': after_rows, + 'size_mb': round(size_mb, 3), + 'warn_threshold_mb': args.warn_mb, + 'size_warn': warn + }, ensure_ascii=False)) + + +if __name__ == '__main__': + main()