import csv from io import StringIO import logging logger = logging.getLogger(__name__) async def get_data_as_csv(cfg: dict, id_recv: int, unit: str, tool: str, matlab_timestamp: float, pool: object) -> str: """ Retrieves elaborated data from the database and formats it as a CSV string. The query selects data from the `ElabDataView` based on `UnitName`, `ToolNameID`, and a `updated_at` timestamp, then orders it. The first row of the CSV will be the column headers. Args: cfg (dict): Configuration dictionary (not directly used in the query but passed for consistency). id (int): The ID of the record being processed (used for logging). pool (object): The database connection pool. unit (str): The name of the unit to filter the data. tool (str): The ID of the tool to filter the data. matlab_timestamp (float): A timestamp used to filter data updated after this time. Returns: str: A string containing the elaborated data in CSV format. """ query = """ select * from ( select 'ToolNameID', 'EventDate', 'EventTime', 'NodeNum', 'NodeType', 'NodeDepth', 'XShift', 'YShift', 'ZShift' , 'X', 'Y', 'Z', 'HShift', 'HShiftDir', 'HShift_local', 'speed', 'speed_local', 'acceleration', 'acceleration_local', 'T_node', 'water_level', 'pressure', 'load_value', 'AlfaX', 'AlfaY', 'CalcErr' union all select ToolNameID, EventDate, EventTime, NodeNum, NodeType, NodeDepth, XShift, YShift, ZShift , X, Y, Z, HShift, HShiftDir, HShift_local, speed, speed_local, acceleration, acceleration_local, T_node, water_level, pressure, load_value, AlfaX, AlfaY, calcerr from ElabDataView where UnitName = %s and ToolNameID = %s and updated_at > %s order by ToolNameID DESC, concat(EventDate, EventTime), convert(`NodeNum`, UNSIGNED INTEGER) DESC ) resulting_set """ async with pool.acquire() as conn: async with conn.cursor() as cur: try: await cur.execute(query, (unit, tool, matlab_timestamp)) results = await cur.fetchall() logger.info(f"id {id_recv} - {unit} - {tool}: estratti i dati per invio CSV") logger.info(f"Numero di righe estratte: {len(results)}") # Creare CSV in memoria output = StringIO() writer = csv.writer(output, delimiter=",", lineterminator="\n", quoting=csv.QUOTE_MINIMAL) for row in results: writer.writerow(row) csv_data = output.getvalue() output.close() return csv_data except Exception as e: logger.error(f"id {id_recv} - {unit} - {tool} - errore nel query creazione csv: {e}") return None