"""Access value serialization helpers. Converts pyodbc/Access cell values into JSON-serializable Python types so a captured row dict can be ``json.dumps``-ed before being enqueued on SQL Server. Order matters: ``bool`` MUST be checked before ``int`` because ``bool`` is a subclass of ``int`` in Python (``isinstance(True, int) is True``). If the order were reversed, ``True`` would be returned as ``1`` and lose its type. """ import datetime import decimal def to_jsonable(v): """Coerce a single Access/pyodbc value to a JSON-serializable form. - ``None`` -> ``None`` - ``bool`` -> ``bool`` (must precede the ``int`` branch) - ``datetime``/``date`` -> ISO-8601 string (``"2026-07-14T08:41:18"``) - ``Decimal`` -> string (preserves exact scale, e.g. ``"12.50"``) - ``int``/``float``/``str`` -> unchanged - anything else (e.g. ``bytes`` for OLE) -> ``str(v)`` fallback """ if v is None: return None if isinstance(v, bool): # MUST be before int return v if isinstance(v, (datetime.datetime, datetime.date)): return v.isoformat() if isinstance(v, decimal.Decimal): return str(v) if isinstance(v, (int, float, str)): return v return str(v)