chore: establish project baseline
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
"""Read-only Firebird schema/context discovery (no DML/DDL). Writes JSON to stdout."""
|
||||
import json, os, re, sys
|
||||
from pathlib import Path
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "agent" / "src"))
|
||||
from gti_fiscal_agent.firebird_reader import _connect # noqa: E402
|
||||
for l in (ROOT / ".env").read_text(encoding="utf-8").splitlines():
|
||||
if "=" in l and not l.startswith("#"):
|
||||
k, _, v = l.partition("="); os.environ.setdefault(k.strip(), v.strip())
|
||||
KW = re.compile(r"CFOP|CST|CSOSN|ORIGEM|PIS|COFINS|CEST|IPI|MVA|FCP|CLASSTRIB|IBS|CBS|NCM|ICMS|IVA|MARGEM|ALIQ|NATUREZA|CRT|REGIME|TRIB|PERC|BASE_", re.I)
|
||||
conn = _connect(os.environ); cur = conn.cursor()
|
||||
cur.execute("select trim(RDB$RELATION_NAME), case when RDB$VIEW_SOURCE is null then 0 else 1 end from RDB$RELATIONS where coalesce(RDB$SYSTEM_FLAG,0)=0")
|
||||
rels = cur.fetchall()
|
||||
cur.execute("select trim(rf.RDB$RELATION_NAME), trim(rf.RDB$FIELD_NAME), f.RDB$FIELD_TYPE, coalesce(f.RDB$CHARACTER_LENGTH,f.RDB$FIELD_LENGTH), f.RDB$FIELD_SCALE from RDB$RELATION_FIELDS rf join RDB$FIELDS f on f.RDB$FIELD_NAME=rf.RDB$FIELD_SOURCE where coalesce(rf.RDB$SYSTEM_FLAG,0)=0")
|
||||
cols = {}
|
||||
for t, c, ty, ln, sc in cur.fetchall():
|
||||
cols.setdefault(t, []).append((c, ty, ln, sc))
|
||||
out = {"tables": {}}
|
||||
for t, isview in rels:
|
||||
try:
|
||||
cur.execute(f'select count(*) from "{t}"'); n = cur.fetchone()[0]
|
||||
except Exception as e:
|
||||
n = None
|
||||
fc = [c for c in cols.get(t, []) if KW.search(c[0])]
|
||||
out["tables"][t] = {"rows": n, "view": bool(isview), "ncols": len(cols.get(t, [])), "fiscal_cols": [c[0] for c in fc]}
|
||||
cur.execute("select trim(RDB$PROCEDURE_NAME) from RDB$PROCEDURES where coalesce(RDB$SYSTEM_FLAG,0)=0"); out["procedures"] = [r[0] for r in cur.fetchall()]
|
||||
cur.execute("select trim(RDB$TRIGGER_NAME), trim(RDB$RELATION_NAME) from RDB$TRIGGERS where coalesce(RDB$SYSTEM_FLAG,0)=0"); out["triggers"] = [list(r) for r in cur.fetchall()]
|
||||
cur.execute("""select trim(rc.RDB$RELATION_NAME), trim(s.RDB$FIELD_NAME), trim(rc2.RDB$RELATION_NAME) from RDB$RELATION_CONSTRAINTS rc
|
||||
join RDB$REF_CONSTRAINTS r on r.RDB$CONSTRAINT_NAME=rc.RDB$CONSTRAINT_NAME join RDB$RELATION_CONSTRAINTS rc2 on rc2.RDB$CONSTRAINT_NAME=r.RDB$CONST_NAME_UQ
|
||||
join RDB$INDEX_SEGMENTS s on s.RDB$INDEX_NAME=rc.RDB$INDEX_NAME where rc.RDB$CONSTRAINT_TYPE='FOREIGN KEY'""")
|
||||
out["fks"] = [list(r) for r in cur.fetchall()]
|
||||
conn.close()
|
||||
print(json.dumps(out, ensure_ascii=False))
|
||||
Reference in New Issue
Block a user