From 598a376000d7d963ce466b0b49566613f9f79766 Mon Sep 17 00:00:00 2001 From: "michaela.buzalkova" Date: Sat, 25 Apr 2026 08:27:31 +0200 Subject: [PATCH] lenovo --- MedicusWithClaude/CLAUDE_NOTES.md | 34 ++++++++++++++++++++++++ MedicusWithClaudeDekurz/dekurz_report.py | 15 +++++++---- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/MedicusWithClaude/CLAUDE_NOTES.md b/MedicusWithClaude/CLAUDE_NOTES.md index 7d86faa..3eff545 100644 --- a/MedicusWithClaude/CLAUDE_NOTES.md +++ b/MedicusWithClaude/CLAUDE_NOTES.md @@ -7,6 +7,7 @@ - **2026-03-17**: Obnovena session – Claude si přečetl poznámky, připraven pokračovat - **2026-03-18**: Obnovena session – Claude si přečetl poznámky, připraven pokračovat. Průběžně zapisuje do tohoto souboru. - **2026-03-20**: Obnovena session – merge logika z `test_import_single.py` integrována do `s03soubory.py`. Import pipeline kompletní. +- **2026-04-01**: Opravena chyba `BlobReader invalid BLOB handle` v `dekurz_report.py` – viz níže. ## Bezpečnost - Pracujeme na **místní kopii** – poškození DB nevadí, obnova = 5 minut @@ -356,6 +357,39 @@ Správný RTF formát klikacího odkazu: - `test_import_merge.py` ✅ otestováno – merge 3 souborů (jen 2 případy, bez detekce sekce) - `test_import_single.py` ✅ otestováno – všechny 3 případy, základ pro s03soubory.py +## Oprava BlobReader v dekurz_report.py (2026-04-01) + +### Chyba +``` +Exception ignored while calling deallocator : +fdb.fbcore.DatabaseError: BlobReader.close/isc_close_blob: invalid BLOB handle (-901) +``` +Skript fungoval správně (exit code 0, Excel uložen), ale garbage collector házel warningy. + +### Příčina +`fdb` vrací BLOB sloupce jako `BlobReader` objekty. Po `conn.close()` se při GC pokoušely +zavřít handle, který již neexistoval. + +### Oprava +Explicitně zavřít `BlobReader` hned po `.read()`, ještě za živa spojení: + +```python +# PŘED (špatně): +rtf = dekurs_blob.read() if hasattr(dekurs_blob, 'read') else (dekurs_blob or '') + +# PO (správně): +if hasattr(dekurs_blob, 'read'): + rtf = dekurs_blob.read() + dekurs_blob.close() +else: + rtf = dekurs_blob or '' +``` + +### Obecné pravidlo +Kdykoli čteme BLOB z fdb, vždy `.close()` po `.read()` – jinak GC po `conn.close()` hlásí chybu. + +--- + ## Další postup (nápady) - Otestovat `s03soubory.py` na Windows se skutečnými soubory (všechny 3 případy) - Napsat `rtf_to_text()` pro extrakci čistého textu z dekurzů diff --git a/MedicusWithClaudeDekurz/dekurz_report.py b/MedicusWithClaudeDekurz/dekurz_report.py index a526c7b..64696e1 100644 --- a/MedicusWithClaudeDekurz/dekurz_report.py +++ b/MedicusWithClaudeDekurz/dekurz_report.py @@ -5,15 +5,16 @@ import fdb import openpyxl from openpyxl.styles import Font, PatternFill, Alignment, Border, Side -VYSTUPNI_ADRESAR = r'u:\Dropbox\Ordinace\Reporty' +VYSTUPNI_ADRESAR = r'z:\Dropbox\Ordinace\Reporty' NAZEV_REPORTU = 'Dekurzy' DATUM_OD = '2025-01-01' DATUM_DO = date.today().strftime('%Y-%m-%d') + conn = fdb.connect( - dsn=r'localhost:c:\medicus 3\data\medicus.fdb', - user='SYSDBA', password='masterkey', charset='win1250' -) + host='192.168.1.10', database=r'm:\MEDICUS\data\medicus.FDB', + user='sysdba', password='masterkey',charset='WIN1250') + cur = conn.cursor() cur.execute(f""" @@ -56,7 +57,11 @@ def rtf_na_text(rtf): # Parse dekurzů rows = [] for datum, cas, zkratka, prijmeni, jmeno, rodcis, poj, dekurs_blob in raw_rows: - rtf = dekurs_blob.read() if hasattr(dekurs_blob, 'read') else (dekurs_blob or '') + if hasattr(dekurs_blob, 'read'): + rtf = dekurs_blob.read() + dekurs_blob.close() + else: + rtf = dekurs_blob or '' pocty = {} ids_by_typ = {t: [] for t in TOP_TYPY} ids_ostatni = []