"""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()