109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
"""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()
|