C-6: ConnectorRuntime enforces capability_mask per operation.
READ-only ACs cannot invoke MUTATE operations (wipe, lock, retire).
C-7: AC validated against database (exists, active, not expired)
before connector invocation.
C-9: Delegated AC capability bounded by delegator's capability.
C-10: Command counter uses atomic SQL increment with limit check.
M-23: expire_stale() uses same atomic SQL pattern.
H-1: Sensitive credential fields hidden from repr/logs via repr=False.
H-2: Stub backend requires ALLOW_STUB_CREDENTIALS=true to activate.
H-3: Kerberos backend raises CredentialResolutionError instead of
returning stub ticket.
H-4: Chronicle INTENT emitted before execution, RESULT after.
H-5: device_id validated as UUID before Graph API URL interpolation.
H-8: ConnectorRuntime enforces governance for all connector invocations.
Signed-off-by: Tyler King <tking@guildhouse.dev>
168 lines
5.5 KiB
Python
168 lines
5.5 KiB
Python
from collections.abc import Mapping, Sequence
|
|
from typing import (
|
|
Any,
|
|
TypeVar,
|
|
overload,
|
|
)
|
|
|
|
from sqlalchemy import util
|
|
from sqlalchemy.engine.cursor import CursorResult
|
|
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
|
|
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
|
|
from sqlalchemy.orm import Query as _Query
|
|
from sqlalchemy.orm import Session as _Session
|
|
from sqlalchemy.orm._typing import OrmExecuteOptionsParameter
|
|
from sqlalchemy.sql._typing import _ColumnsClauseArgument
|
|
from sqlalchemy.sql.base import Executable as _Executable
|
|
from sqlalchemy.sql.dml import UpdateBase
|
|
from sqlmodel.sql.base import Executable
|
|
from sqlmodel.sql.expression import Select, SelectOfScalar
|
|
from typing_extensions import deprecated
|
|
|
|
_TSelectParam = TypeVar("_TSelectParam", bound=Any)
|
|
|
|
|
|
class Session(_Session):
|
|
@overload
|
|
def exec(
|
|
self,
|
|
statement: Select[_TSelectParam],
|
|
*,
|
|
params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None,
|
|
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
|
|
bind_arguments: dict[str, Any] | None = None,
|
|
_parent_execute_state: Any | None = None,
|
|
_add_event: Any | None = None,
|
|
) -> TupleResult[_TSelectParam]: ...
|
|
|
|
@overload
|
|
def exec(
|
|
self,
|
|
statement: SelectOfScalar[_TSelectParam],
|
|
*,
|
|
params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None,
|
|
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
|
|
bind_arguments: dict[str, Any] | None = None,
|
|
_parent_execute_state: Any | None = None,
|
|
_add_event: Any | None = None,
|
|
) -> ScalarResult[_TSelectParam]: ...
|
|
|
|
@overload
|
|
def exec(
|
|
self,
|
|
statement: UpdateBase,
|
|
*,
|
|
params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None,
|
|
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
|
|
bind_arguments: dict[str, Any] | None = None,
|
|
_parent_execute_state: Any | None = None,
|
|
_add_event: Any | None = None,
|
|
) -> CursorResult[Any]: ...
|
|
|
|
def exec(
|
|
self,
|
|
statement: Select[_TSelectParam]
|
|
| SelectOfScalar[_TSelectParam]
|
|
| Executable[_TSelectParam]
|
|
| UpdateBase,
|
|
*,
|
|
params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None,
|
|
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
|
|
bind_arguments: dict[str, Any] | None = None,
|
|
_parent_execute_state: Any | None = None,
|
|
_add_event: Any | None = None,
|
|
) -> TupleResult[_TSelectParam] | ScalarResult[_TSelectParam] | CursorResult[Any]:
|
|
results = super().execute(
|
|
statement,
|
|
params=params,
|
|
execution_options=execution_options,
|
|
bind_arguments=bind_arguments,
|
|
_parent_execute_state=_parent_execute_state,
|
|
_add_event=_add_event,
|
|
)
|
|
if isinstance(statement, SelectOfScalar):
|
|
return results.scalars()
|
|
return results # type: ignore
|
|
|
|
@deprecated(
|
|
"""
|
|
🚨 You probably want to use `session.exec()` instead of `session.execute()`.
|
|
|
|
This is the original SQLAlchemy `session.execute()` method that returns objects
|
|
of type `Row`, and that you have to call `scalars()` to get the model objects.
|
|
|
|
For example:
|
|
|
|
```Python
|
|
heroes = session.execute(select(Hero)).scalars().all()
|
|
```
|
|
|
|
instead you could use `exec()`:
|
|
|
|
```Python
|
|
heroes = session.exec(select(Hero)).all()
|
|
```
|
|
""",
|
|
category=None,
|
|
)
|
|
def execute(
|
|
self,
|
|
statement: _Executable,
|
|
params: _CoreAnyExecuteParams | None = None,
|
|
*,
|
|
execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT,
|
|
bind_arguments: dict[str, Any] | None = None,
|
|
_parent_execute_state: Any | None = None,
|
|
_add_event: Any | None = None,
|
|
) -> Result[Any]:
|
|
"""
|
|
🚨 You probably want to use `session.exec()` instead of `session.execute()`.
|
|
|
|
This is the original SQLAlchemy `session.execute()` method that returns objects
|
|
of type `Row`, and that you have to call `scalars()` to get the model objects.
|
|
|
|
For example:
|
|
|
|
```Python
|
|
heroes = session.execute(select(Hero)).scalars().all()
|
|
```
|
|
|
|
instead you could use `exec()`:
|
|
|
|
```Python
|
|
heroes = session.exec(select(Hero)).all()
|
|
```
|
|
"""
|
|
return super().execute(
|
|
statement,
|
|
params=params,
|
|
execution_options=execution_options,
|
|
bind_arguments=bind_arguments,
|
|
_parent_execute_state=_parent_execute_state,
|
|
_add_event=_add_event,
|
|
)
|
|
|
|
@deprecated(
|
|
"""
|
|
🚨 You probably want to use `session.exec()` instead of `session.query()`.
|
|
|
|
`session.exec()` is SQLModel's own short version with increased type
|
|
annotations.
|
|
|
|
Or otherwise you might want to use `session.execute()` instead of
|
|
`session.query()`.
|
|
"""
|
|
)
|
|
def query( # type: ignore
|
|
self, *entities: _ColumnsClauseArgument[Any], **kwargs: Any
|
|
) -> _Query[Any]:
|
|
"""
|
|
🚨 You probably want to use `session.exec()` instead of `session.query()`.
|
|
|
|
`session.exec()` is SQLModel's own short version with increased type
|
|
annotations.
|
|
|
|
Or otherwise you might want to use `session.execute()` instead of
|
|
`session.query()`.
|
|
"""
|
|
return super().query(*entities, **kwargs)
|