# `async_msssql_query.py`

## Scopo

Questo modulo centralizza la costruzione del DSN SQL Server e l'accesso
asincrono al database tramite `AsyncMSSQLClient`.

## Flusso di utilizzo

```{mermaid}
flowchart TD
    A["main.py o modulo chiamante"] --> B["make_mssql_dsn(...)"]
    B --> C["Crea stringa mssql+aioodbc"]
    C --> D["AsyncMSSQLClient(dsn)"]
    D --> E["query_json(...) o exec(...)"]
    E --> F["_ensure_engine()"]
    F --> G{"Engine gia creato?"}
    G -- No --> H["create_async_engine(..., NullPool, loop corrente)"]
    G -- Si --> I["Riusa engine esistente"]
    H --> J["execute(text(sql), params)"]
    I --> J
    J --> K["Normalizza rows/columns"]
    K --> L["Ritorna payload JSON-friendly"]
```

## Schema di chiamata

```{mermaid}
flowchart LR
    DSN["make_mssql_dsn"] --> Client["AsyncMSSQLClient.__init__"]
    Client --> Ensure["_ensure_engine"]
    Ensure --> Query["query_json"]
    Ensure --> Exec["exec"]
    Client --> Dispose["dispose"]
```

## Note

- `NullPool` evita problemi di riuso connessioni tra loop diversi.
- L'engine viene creato solo al primo utilizzo reale.
- `query_json()` restituisce un formato gia pronto per le callback GUI.
