Files
medicus/MedicusWithClaude/s04_presun_externi_db.py
2026-03-18 07:13:47 +01:00

109 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""s04_presun_externi_db.py Přesun externích DB souborů z u:\ do u:\externi\
Spustit na Windows s ZAVŘENÝM Medicusem!
Co dělá:
1. Připojí se k hlavní medicus.fdb
2. Načte všechny záznamy z EXTERNI_DB
3. Pro každý záznam zkopíruje FDB soubor z původní lokace do u:\externi\
4. Aktualizuje EXTERNI_DB.PATH na novou lokaci
5. Vytiskne přehled výsledků
Po spuštění zkus v Medicusu otevřít přílohu pacienta mělo by to fungovat.
Pokud ne, zálohuj si databázi a spusť znovu (skript je idempotentní).
"""
import os
import shutil
import fdb
# ── Konfigurace ──────────────────────────────────────────────────────────────
MAIN_DB = r'c:\medicus 3\data\medicus.fdb'
CÍL_SLOŽKA = r'u:\externi'
# ─────────────────────────────────────────────────────────────────────────────
def main():
os.makedirs(CÍL_SLOŽKA, exist_ok=True)
print(f"Cílová složka: {CÍL_SLOŽKA}")
print()
print("Připojuji se k hlavní DB...")
conn = fdb.connect(
dsn=f'localhost:{MAIN_DB}',
user='SYSDBA',
password='masterkey',
charset='WIN1250'
)
cur = conn.cursor()
# Načti všechny záznamy z EXTERNI_DB
cur.execute("SELECT DBNAME, SERVER, PATH, HESLO FROM EXTERNI_DB ORDER BY DBNAME")
zaznamy = cur.fetchall()
print(f"Nalezeno {len(zaznamy)} záznamů v EXTERNI_DB:")
print()
ok = 0
preskoceno = 0
chyba = 0
for dbname, server, path_puvodni, heslo in zaznamy:
print(f" [{dbname}] {path_puvodni}")
# Název souboru (jen basename, bez cesty)
basename = os.path.basename(path_puvodni)
# Normalize: Medicus někdy ukládá s malým .fdb, někdy velkým .FDB
path_cil = os.path.join(CÍL_SLOŽKA, basename)
# Zkontroluj, jestli zdrojový soubor existuje
# (zkus obě varianty přípony)
path_src = None
for kandidat in [path_puvodni,
path_puvodni.replace('.fdb', '.FDB'),
path_puvodni.replace('.FDB', '.fdb')]:
if os.path.isfile(kandidat):
path_src = kandidat
break
if path_src is None:
print(f" ⚠ ZDROJOVÝ SOUBOR NENALEZEN: {path_puvodni} přeskakuji")
chyba += 1
continue
# Pokud je soubor už v cíli, přeskoč kopírování
if os.path.isfile(path_cil):
velikost = os.path.getsize(path_cil)
print(f" → Soubor již existuje v cíli ({velikost:,} B), přeskakuji kopírování")
else:
velikost = os.path.getsize(path_src)
print(f" → Kopíruji ({velikost:,} B)...", end=' ', flush=True)
shutil.copy2(path_src, path_cil)
print("OK")
# Aktualizuj PATH v EXTERNI_DB pokud se liší
if path_puvodni != path_cil:
cur.execute(
"UPDATE EXTERNI_DB SET PATH = ? WHERE DBNAME = ?",
(path_cil, dbname)
)
print(f" → EXTERNI_DB.PATH aktualizováno: {path_cil}")
else:
print(f" → PATH již ukazuje na cíl, není třeba měnit")
preskoceno += 1
ok += 1
conn.commit()
conn.close()
print()
print("=" * 60)
print(f"Hotovo! Zpracováno: {ok}, přeskočeno: {preskoceno}, chyb: {chyba}")
print()
if chyba > 0:
print("⚠ Některé soubory nebyly nalezeny viz výpis výše.")
print(" Pokud jsou to staré DB které již neexistují, nevadí to.")
print("Nyní spusť Medicus a zkus otevřít přílohu pacienta.")
if __name__ == '__main__':
main()