Files
2026-06-08 07:20:37 +02:00

91 lines
2.9 KiB
Python

"""
check_msg_files.py
Zkontroluje, zda má každý záznam v jnjemails SQLite odpovídající .msg soubor
fyzicky uložený na \\\\tower\\JNJEMAILS\\.
DB: \\\\tower\\JNJEMAILS\\db\\jnjemails_*.db (nejnovější)
Soubory: \\\\tower\\JNJEMAILS\\*.msg
Název souboru = entry_id[-20:] + ".msg"
Záznamy bez entry_id mají fallback message_id "entryid:..." — ty se přeskočí
zvlášť (server je nemohl uložit standardním názvem).
"""
import sqlite3
import sys
from pathlib import Path
sys.stdout.reconfigure(encoding="utf-8")
DB_DIR = Path(r"\\tower\JNJEMAILS\db")
MSGS_DIR = Path(r"\\tower\JNJEMAILS")
def get_latest_db() -> Path:
files = sorted(DB_DIR.glob("jnjemails_*.db"), key=lambda f: f.name)
if not files:
raise FileNotFoundError(f"Žádný jnjemails_*.db v {DB_DIR}")
return files[-1]
def main():
db_path = get_latest_db()
print(f"DB: {db_path.name}")
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
rows = conn.execute(
"SELECT id, message_id, subject, sender, received_at, entry_id, source FROM messages"
).fetchall()
conn.close()
print(f"Celkem záznamů: {len(rows)}\n")
missing = []
no_entry_id = []
for row in rows:
entry_id = row["entry_id"]
if not entry_id:
no_entry_id.append(dict(row))
continue
expected_file = MSGS_DIR / (entry_id[-20:] + ".msg")
if not expected_file.exists():
missing.append({**dict(row), "expected_file": expected_file.name})
msg_files = sum(1 for _ in MSGS_DIR.glob("*.msg"))
print(f"Záznamy bez entry_id (nelze zkontrolovat): {len(no_entry_id)}")
print(f"Záznamy s entry_id: {len(rows) - len(no_entry_id)}")
print(f"Chybějící .msg soubory: {len(missing)}")
print(f"\n--- POROVNÁNÍ POČTŮ ---")
print(f"Záznamy v DB celkem: {len(rows)}")
print(f"Soubory .msg na serveru: {msg_files}")
diff = msg_files - len(rows)
if diff >= 0:
print(f"Rozdíl: +{diff} souborů navíc (OK — všechny záznamy mají soubor)")
else:
print(f"Rozdíl: {diff} — CHYBÍ {abs(diff)} souborů!")
if missing:
print("\n--- CHYBĚJÍCÍ SOUBORY ---")
for r in missing:
print(f" id={r['id']} | {r['received_at']} | {r['subject'][:60]!r}")
print(f" sender={r['sender']} | source={r['source']}")
print(f" entry_id={r['entry_id']}")
print(f" očekávaný soubor: {r['expected_file']}")
if no_entry_id:
print(f"\n--- ZÁZNAMY BEZ ENTRY_ID ({len(no_entry_id)}) ---")
for r in no_entry_id[:20]:
print(f" id={r['id']} | {r['received_at']} | {r['subject'][:60]!r} | source={r['source']}")
if len(no_entry_id) > 20:
print(f" ... a dalších {len(no_entry_id) - 20}")
print("\nHotovo.")
if __name__ == "__main__":
main()