Server : Apache System : Linux dedi-14684855.grupobig.com 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64 User : grupo692 ( 1004) PHP Version : 8.2.31 Disable Function : NONE Directory : /opt/dash_backend_new/app/ |
# app/tenant_oracle_db.py
from dataclasses import dataclass
from typing import List
from typing import Optional, Dict
import cx_Oracle
from fastapi import Request
from .tenancy import get_tenant_settings
from .oracle_client import init_oracle_client_once
@dataclass(frozen=True)
class TenantContext:
empresa: str
unidades: List[int]
oracle_user: str
oracle_pass: str
oracle_dsn: str
sandbox: bool = False
unidade_nomes: Optional[Dict[int, str]] = None
def get_tenant_context(request: Request) -> TenantContext:
"""
Monta o contexto do tenant a partir do MySQL central (conexoes_proton),
baseado no header X-Empresa.
"""
s = get_tenant_settings(request)
return TenantContext(
empresa=s["empresa"],
unidades=s["unidades"],
oracle_user=s["oracle_user"],
oracle_pass=s["oracle_pass"],
oracle_dsn=s["oracle_dsn"],
sandbox=bool(s.get("sandbox", False)),
unidade_nomes=s.get("unidade_nomes"),
)
def open_tenant_oracle_conn(ctx: TenantContext) -> cx_Oracle.Connection:
if getattr(ctx, "sandbox", False):
raise ValueError("Sandbox não permite conexão Oracle")
"""
Abre conexão Oracle do tenant (empresa).
✅ Aqui garantimos que o Oracle Client foi inicializado antes (evita DPI-1047 no macOS).
"""
init_oracle_client_once()
return cx_Oracle.connect(
user=ctx.oracle_user,
password=ctx.oracle_pass,
dsn=ctx.oracle_dsn,
encoding="UTF-8",
nencoding="UTF-8",
)