Add incremental delta refresh and fix Decimal/datetime cache binding

This commit is contained in:
Jan Doubravský
2026-06-05 11:09:16 +02:00
parent 530c2618cf
commit 33aa126ff6
13 changed files with 798 additions and 53 deletions
+40
View File
@@ -0,0 +1,40 @@
"""Coerce source-DB values into types ``sqlite3`` can bind.
pyodbc returns ``NUMERIC``/``DECIMAL``/``MONEY`` as :class:`decimal.Decimal` and
date/time columns as :mod:`datetime` objects, none of which ``sqlite3`` binds
natively. Cache columns are ``TEXT``, so stringifying is lossless and consistent
with how the data is stored. This is done **locally** — never via a global
``sqlite3.register_adapter`` — so the host application's ``sqlite3`` behaviour is
left untouched.
"""
import datetime
import decimal
import uuid
from typing import Any
Params = tuple | list | dict | None
def to_sqlite(value: Any) -> Any:
if isinstance(value, decimal.Decimal):
return str(value)
if isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
return value.isoformat()
if isinstance(value, uuid.UUID):
return str(value)
if isinstance(value, bytearray):
return bytes(value)
return value
def coerce_row(row: tuple) -> tuple:
return tuple(to_sqlite(v) for v in row)
def coerce_params(params: Params) -> tuple | dict | None:
if params is None:
return None
if isinstance(params, dict):
return {key: to_sqlite(val) for key, val in params.items()}
return tuple(to_sqlite(val) for val in params)