notebook
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user