# `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

            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

            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.