From a1bbd0cf0f8844f6a70dadb2c98049be2fb42d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 12 Aug 2026 21:05:54 +0300 Subject: [PATCH] Add session stats and VACUUM on deletion database.py: count_sessions(), db_size() (db+WAL+SHM), vacuum() (VACUUM + wal_checkpoint(TRUNCATE) to actually reclaim space in WAL mode) server.py: /api/sessions now returns total_sessions + db_size; DELETE /api/sessions/ runs vacuum() after deletion --- simtrace2_pysniff/server/database.py | 19 +++++++++++++++++++ simtrace2_pysniff/server/server.py | 7 ++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/simtrace2_pysniff/server/database.py b/simtrace2_pysniff/server/database.py index af9a330..db233ca 100644 --- a/simtrace2_pysniff/server/database.py +++ b/simtrace2_pysniff/server/database.py @@ -41,6 +41,7 @@ class Database: def __init__(self, db_path=None): if db_path is None: db_path = DEFAULT_DB_PATH + self._db_path = db_path os.makedirs(os.path.dirname(db_path), exist_ok=True) self._conn = sqlite3.connect(db_path, check_same_thread=False) self._conn.execute('PRAGMA journal_mode=WAL') @@ -74,6 +75,24 @@ class Database: self._conn.execute('DELETE FROM sessions WHERE id=?', (session_id,)) self._conn.commit() + def count_sessions(self): + row = self._conn.execute('SELECT COUNT(*) FROM sessions').fetchone() + return row[0] + + def db_size(self): + """Total on-disk size of the SQLite database (db + WAL + SHM).""" + total = 0 + for suffix in ('', '-wal', '-shm'): + p = self._db_path + suffix + if os.path.exists(p): + total += os.path.getsize(p) + return total + + def vacuum(self): + self._conn.execute('VACUUM') + self._conn.execute('PRAGMA wal_checkpoint(TRUNCATE)') + self._conn.commit() + def get_session(self, session_id): row = self._conn.execute( 'SELECT id, name, started, ended, mode FROM sessions WHERE id=?', diff --git a/simtrace2_pysniff/server/server.py b/simtrace2_pysniff/server/server.py index c34ab07..5f282b3 100644 --- a/simtrace2_pysniff/server/server.py +++ b/simtrace2_pysniff/server/server.py @@ -126,7 +126,11 @@ class RequestHandler(BaseHTTPRequestHandler): def _handle_list_sessions(self): sessions = self.db.list_sessions() - self._send_json({'sessions': sessions}) + self._send_json({ + 'sessions': sessions, + 'total_sessions': self.db.count_sessions(), + 'db_size': self.db.db_size(), + }) def _handle_get_session(self, session_id, params): session = self.db.get_session(session_id) @@ -192,6 +196,7 @@ class RequestHandler(BaseHTTPRequestHandler): if self.capture.session_id == session_id: self.capture.stop_session() self.db.delete_session(session_id) + self.db.vacuum() self._send_json({'ok': True}) def _handle_search(self, session_id, query):