91 lines
2.9 KiB
Python
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()
|