""" Mapping tipi DuckDB → Access (pyodbc). DuckDB restituisce tipi Python nativi — Access li accetta via pyodbc senza conversione esplicita nella maggior parte dei casi. Questo modulo gestisce i casi edge. """ import datetime # Mapping stringa tipo DuckDB → tipo Access SQL (per CREATE TABLE) DUCKDB_TO_ACCESS = { 'VARCHAR': 'TEXT', 'HUGEINT': 'LONG', 'BIGINT': 'LONG', 'INTEGER': 'LONG', 'INT': 'LONG', 'SMALLINT': 'INTEGER', 'TINYINT': 'BYTE', 'DOUBLE': 'DOUBLE', 'FLOAT': 'SINGLE', 'BOOLEAN': 'YESNO', 'DATE': 'DATETIME', 'TIMESTAMP': 'DATETIME', 'BLOB': 'LONGBINARY', } def access_type(duckdb_type: str) -> str: """Restituisce il tipo Access corrispondente a un tipo DuckDB.""" base = duckdb_type.upper().split('(')[0].strip() return DUCKDB_TO_ACCESS.get(base, 'TEXT') def coerce_value(value): """ Converte un valore Python restituito da DuckDB in un tipo compatibile con pyodbc/Access. """ if value is None: return None # DuckDB DATE → datetime.date → Access vuole datetime.datetime if isinstance(value, datetime.date) and not isinstance(value, datetime.datetime): return datetime.datetime(value.year, value.month, value.day) # bool → int (Access non ha bool nativo via ODBC) if isinstance(value, bool): return int(value) return value