"""db_bridge_vm.py – VM strana souborového mostu k Medicusu. Použití z Linuxu: from db_bridge_vm import query rows, columns = query("SELECT COUNT(*) FROM KAR") print(columns, rows) """ import json, time, os, uuid BRIDGE_DIR = os.path.dirname(os.path.abspath(__file__)) REQUEST = os.path.join(BRIDGE_DIR, 'query_request.json') RESPONSE = os.path.join(BRIDGE_DIR, 'query_response.json') TIMEOUT_SEC = 30 POLL_SEC = 0.3 def query(sql, params=None, timeout=TIMEOUT_SEC): """Pošle SQL dotaz přes souborový most a vrátí (rows, columns). Raises: TimeoutError – watchdog neodpověděl do timeout sekund RuntimeError – Firebird vrátil chybu """ # Smaž případnou starou response if os.path.exists(RESPONSE): os.remove(RESPONSE) req_id = uuid.uuid4().hex req = {'id': req_id, 'sql': sql, 'params': params or []} with open(REQUEST, 'w', encoding='utf-8') as f: json.dump(req, f, ensure_ascii=False) # Čekej na odpověď waited = 0.0 while waited < timeout: time.sleep(POLL_SEC) waited += POLL_SEC if os.path.exists(RESPONSE): with open(RESPONSE, 'r', encoding='utf-8') as f: resp = json.load(f) os.remove(RESPONSE) if resp.get('status') == 'error': raise RuntimeError(f"DB chyba: {resp.get('error')}") return resp.get('rows', []), resp.get('columns', []) # Timeout – smaž request aby watchdog nezpracoval zastaralý dotaz if os.path.exists(REQUEST): os.remove(REQUEST) raise TimeoutError(f'Watchdog neodpověděl do {timeout}s – běží db_bridge_windows.py?') def query_print(sql, params=None): """Spustí dotaz a vypíše výsledek přehledně.""" rows, cols = query(sql, params) if not cols: print('(žádné sloupce)') return rows, cols col_w = [max(len(str(c)), max((len(str(r[i])) for r in rows), default=0)) for i, c in enumerate(cols)] sep = '+' + '+'.join('-' * (w + 2) for w in col_w) + '+' fmt = '|' + '|'.join(f' {{:<{w}}} ' for w in col_w) + '|' print(sep) print(fmt.format(*cols)) print(sep) for row in rows: print(fmt.format(*[str(v) if v is not None else 'NULL' for v in row])) print(sep) print(f'{len(rows)} řádků') return rows, cols if __name__ == '__main__': # Rychlý test print('Testuji spojení...') rows, cols = query('SELECT COUNT(*) AS POCET FROM KAR') print(f'OK – pacientů v KAR: {rows[0][0]}')