From 8327bfa25921bc2de0f179fc289da8ab53d3d7d3 Mon Sep 17 00:00:00 2001 From: XANTRONIX Industrial Date: Fri, 31 Oct 2025 13:02:11 -0400 Subject: [PATCH] Fix issue with early default value evaluation --- lib/xmet/db.py | 31 +++++++++++++++++++++++-------- lib/xmet/util.py | 3 +++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lib/xmet/db.py b/lib/xmet/db.py index a17a6f6..a63ae82 100644 --- a/lib/xmet/db.py +++ b/lib/xmet/db.py @@ -4,6 +4,7 @@ import sqlite3 from typing import Self, Optional, Union, Iterable, Callable from xmet.config import Config +from xmet.util import default class DatabaseOrder(enum.Enum): DEFAULT = 0 @@ -227,12 +228,15 @@ class Database(): def query(self, table: DatabaseTable, - clauses: Iterable=list(), + clauses: Optional[Iterable]=None, values: Optional[Union[dict, Iterable]]=None, - order_by: Iterable=list(), + order_by: Optional[Iterable]=None, limit: Optional[int]=None): selectors = getattr(table, '__columns_read__', None) + clauses = default(clauses, list()) + order_by = default(order_by, list()) + if selectors is None: columns = table.__columns__ else: @@ -272,21 +276,26 @@ class Database(): def get_many(self, table: DatabaseTable, - values: Union[dict, Iterable]=dict()): + values: Optional[Union[dict, Iterable]]=None): + values = default(values, dict()) clauses = [f"{k} = :{k}" for k in values] return self.query(table, clauses, values=values) def get(self, table: DatabaseTable, - values: Union[dict, Iterable]=dict()): + values: Optional[Union[dict, Iterable]]=None): + values = default(values, dict()) + return self.get_many(table, values).fetchone() def _call(self, table: DatabaseTable, fn: str, column: str, - values: Union[dict, Iterable]=dict()) -> int: + values: Optional[Union[dict, Iterable]]=None) -> int: + values = default(values, dict()) + sql = f"select {fn}({column}) as ret from {table.__table__}" if len(values) > 0: @@ -300,16 +309,22 @@ class Database(): def min(self, table: DatabaseTable, column: str, - values: Union[dict, Iterable]=dict()) -> int: + values: Optional[Union[dict, Iterable]]=None) -> int: + values = default(values, dict()) + return self._call(table, 'min', column, values) def max(self, table: DatabaseTable, column: str, - values: Union[dict, Iterable]=dict()) -> int: + values: Optional[Union[dict, Iterable]]=None) -> int: + values = default(values, dict()) + return self._call(table, 'max', column, values) def count(self, table: DatabaseTable, - values: Union[dict, Iterable]=dict()) -> int: + values: Optional[Union[dict, Iterable]]=None) -> int: + values = default(values, dict()) + return self._call(table, 'count', table.__key__, values) diff --git a/lib/xmet/util.py b/lib/xmet/util.py index f6ccf12..c2104fa 100644 --- a/lib/xmet/util.py +++ b/lib/xmet/util.py @@ -3,6 +3,9 @@ import io CHUNK_SIZE = 4096 CHUNK_STRIP = "\x01\x03\x0a\x20" +def default(a, b): + return b if a is None else a + def each_chunk(fh: io.TextIOBase, sep: str, strip=None): buf = ''