# -*- coding: utf-8 -*- import sys, io, re sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') TRACE_FILE = r'c:\Program Files\Firebird\Firebird_2_5_CGM\default_trace.log' TIME_FROM = '2026-03-29T13:20:00' TIME_TO = '2026-03-29T13:20:15' # Hledame dotazy ktere pravdepodobne patri k eDavky oknu: # - zminka o tabulkach s davkami/podanim na pojistovnu # - sloupce jako ZP, PODACI, ODESLANO, STAV v kontextu davek KEYWORDS = [ 'EDAVKY', 'EDAVKA', 'DAVKY_POJ', 'REGISTR_POJ', 'PODACI_CISLO', 'PODACI', 'FAKDAV', 'BB_DAVKA', 'BB_FAKTURA', 'STAV_PODANI', 'ID_PODANI', 'DAVKA_ROK', 'DAVKA_DISK', 'DAVKA_CASTKA', ] # Tabulky ktere NECHCEME (HPN = neschopenky, RECEPT = recepty, atd.) EXCLUDE_TABLES = ['FROM HPN', 'FROM NES', 'FROM RECEPT', 'FROM CLICKDOC', 'FROM UZIVATEL', 'FROM ZARIZENI', 'FROM ODDEL', 'FROM PRACOVISTE'] print(f"Čtu trace: {TRACE_FILE}") print(f"Časové okno: {TIME_FROM} .. {TIME_TO}") print(f"Hledám klíčová slova: {KEYWORDS}") print("=" * 70) ts_re = re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}') in_window = False current_ts = '' current_block = [] hits = [] all_selects_tables = {} # tabulka -> pocet vyskytu def get_from_tables(text): """Extrahuj tabulky z FROM klauzule.""" tables = re.findall(r'\bFROM\s+([A-Z_][A-Z0-9_]*)', text, re.IGNORECASE) tables += re.findall(r'\bJOIN\s+([A-Z_][A-Z0-9_]*)', text, re.IGNORECASE) return [t.upper() for t in tables] def process_block(ts, lines): text = '\n'.join(lines) if not re.search(r'\bSELECT\b', text, re.IGNORECASE): return text_up = text.upper() # Spocitej tabulky tables = get_from_tables(text_up) for t in tables: all_selects_tables[t] = all_selects_tables.get(t, 0) + 1 # Filtr - hledej klicova slova for kw in KEYWORDS: if kw in text_up: hits.append((ts, kw, text)) return # Alternativne: dotazy na PORTAL nebo FAK s datumem if ('PORTAL' in text_up or 'FAKDAV' in text_up) and 'SELECT' in text_up: # Vynech jednoduche dotazy if len(text) > 100: hits.append((ts, 'PORTAL/FAKDAV', text)) try: with open(TRACE_FILE, 'r', encoding='utf-8', errors='replace') as f: for line in f: line = line.rstrip('\n') m = ts_re.match(line) if m: if current_block and in_window: process_block(current_ts, current_block) current_ts = line[:19] current_block = [line] in_window = (TIME_FROM <= current_ts <= TIME_TO) else: if in_window: current_block.append(line) if current_block and in_window: process_block(current_ts, current_block) except FileNotFoundError: print(f"CHYBA: soubor nenalezen: {TRACE_FILE}") sys.exit(1) print(f"\nNejčastější tabulky v SELECT dotazech v okně (top 40):") sorted_tables = sorted(all_selects_tables.items(), key=lambda x: -x[1]) for t, cnt in sorted_tables[:40]: print(f" {t:<40} {cnt}x") print() print(f"{'='*70}") print(f"Nalezeno relevantních bloků (klíčová slova): {len(hits)}") print() for i, (ts, kw, text) in enumerate(hits): print(f"{'='*70}") print(f"[{i+1}] {ts} klíčové slovo: {kw}") print(text[:4000]) print() if not hits: print("Žádné přesné shody. Zkusíme PREPARE_STATEMENT bloky s FROM tabulkami:") print("(viz seznam tabulek nahoře - neobvyklé názvy mohou být klíč)")