diff --git a/tools/python/jwutils/db/DataBase.py b/tools/python/jwutils/db/DataBase.py index 3171a60..ffd9f9e 100644 --- a/tools/python/jwutils/db/DataBase.py +++ b/tools/python/jwutils/db/DataBase.py @@ -3,21 +3,27 @@ from typing import Any import abc +from contextlib import contextmanager from jwutils.Config import Config from jwutils.db.schema.Schema import Schema from jwutils import Cmds +from .Session import Session +from ..log import * class DataBase(abc.ABC): - def __init__(self, schema: Schema, conf: Config, app: Any) -> None: + def __init__(self, schema: Schema, conf: Config) -> None: self.__conf = conf - self.__app = app self.__schema = schema + conf.dump(NOTICE, "Initializing database with configuration") - @property - def app(self) -> Cmds: - return self.__app + @abc.abstractmethod + def _create_session(self): + pass + + def _delete_session(self, session: Session): + del session @property def schema(self): @@ -26,3 +32,11 @@ class DataBase(abc.ABC): @property def conf(self): return self.__conf + + @contextmanager + def session(self): + ret = self._create_session() + try: + yield ret + finally: + self._delete_session(ret) diff --git a/tools/python/jwutils/db/Session.py b/tools/python/jwutils/db/Session.py new file mode 100644 index 0000000..4e653ad --- /dev/null +++ b/tools/python/jwutils/db/Session.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +import abc + +class Session(abc.ABC): # export + + def __init__(self, db): + self.__db = db + + @property + def db(self): + return self.__db diff --git a/tools/python/jwutils/db/query/Queries.py b/tools/python/jwutils/db/query/Queries.py index bf8badb..f35daf5 100644 --- a/tools/python/jwutils/db/query/Queries.py +++ b/tools/python/jwutils/db/query/Queries.py @@ -24,8 +24,8 @@ class Queries(abc.ABC): # export # -- implement API - def _run(self, *args, **kwargs) -> QueryResult: - return self.__func(*args, **kwargs) + def _run(self, session, *args, **kwargs) -> QueryResult: + return self.__func(session, *args, **kwargs) def _register(self): raise Exception('Can\'t call register on this object') @@ -57,10 +57,6 @@ class Queries(abc.ABC): # export def db(self) -> DataBase: return self.__db - @property - def app(self) -> Cmds: - return self.__db.app - def load(self, modules: list[str], cls=QueryBase): for path in modules: slog(INFO, f'Loading modules from {path}') diff --git a/tools/python/jwutils/db/query/Query.py b/tools/python/jwutils/db/query/Query.py index 0342400..5e9e10a 100644 --- a/tools/python/jwutils/db/query/Query.py +++ b/tools/python/jwutils/db/query/Query.py @@ -8,6 +8,7 @@ from jwutils.log import * from jwutils.misc import load_classes from jwutils.Cmds import Cmds from jwutils.db.DataBase import DataBase +from jwutils.db.Session import Session from jwutils.db.query.QueryResult import QueryResult #from jwutils.db.query.Queries import Queries @@ -19,7 +20,7 @@ class Query(abc.ABC): # export # -- pure virtuals @abc.abstractmethod - def _run(self, *args, **kwargs) -> QueryResult: + def _run(self, session: Session, *args, **kwargs) -> QueryResult: raise Exception('Called pure virtual _run()') @abc.abstractmethod @@ -40,8 +41,8 @@ class Query(abc.ABC): # export def _add(self, query_name: str, location: str, func: Any): return self.__parent.add(self, query_name, location, func) - def run(self, *args, **kwargs) -> QueryResult: - return self._run(*args, **kwargs) + def run(self, session: Session, *args, **kwargs) -> QueryResult: + return self._run(session, *args, **kwargs) @property def parent(self): @@ -55,10 +56,6 @@ class Query(abc.ABC): # export def schema(self): return self.__parent.db.schema - @property - def app(self) -> Cmds: - return self.__parent.app - @property def column_names(self) -> list[str]: return self._column_names() diff --git a/tools/python/jwutils/db/query/QueryResult.py b/tools/python/jwutils/db/query/QueryResult.py index 8da354b..831d918 100644 --- a/tools/python/jwutils/db/query/QueryResult.py +++ b/tools/python/jwutils/db/query/QueryResult.py @@ -8,27 +8,33 @@ from enum import Enum, auto from jwutils.log import * from jwutils.Cmds import Cmds from jwutils.db.DataBase import DataBase +from jwutils.db.Session import Session class ResType(Enum): # export - Statement = auto() - Scalars = auto() - One = auto() - First = auto() - Pages = auto() + Statement = auto() + Scalars = auto() + One = auto() + First = auto() + Pages = auto() class QueryResult(abc.ABC): # export - def __init__(self, query: Any) -> None: + def __init__(self, session: Session, query: Any) -> None: self.__query = query - - @property - def app(self) -> Cmds: - return self.__query.app + self.__session = session @property def db(self) -> DataBase: return self.__query.db + @property + def query(self) -> DataBase: + return self.__query + + @property + def session(self) -> DataBase: + return self.__session + @property def schema(self): return self.__query.db.schema @@ -36,8 +42,8 @@ class QueryResult(abc.ABC): # export def rows(self) -> list[Any]: return self._cast(ResType.Scalars) - def pages(self, per_page=20) -> Any: - return self._cast(ResType.Pages, per_page=per_page) + def pages(self, per_page=20, page=1) -> Any: + return self._cast(ResType.Pages, per_page=per_page, page=page) def one(self) -> Any: return self._cast(ResType.One) @@ -52,5 +58,5 @@ class QueryResult(abc.ABC): # export # -- pure virtuals @abc.abstractmethod - def _cast(self, res_type: ResType, **kwargs) -> Union[Any|list[Any]]: + def _cast(self, session: Session, res_type: ResType, **kwargs) -> Union[Any|list[Any]]: pass