omlish 0.0.0.dev296__py3-none-any.whl → 0.0.0.dev298__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omlish/__about__.py +2 -2
- omlish/secrets/all.py +1 -0
- omlish/sql/alchemy/apiadapter.py +2 -2
- omlish/sql/api/__init__.py +22 -3
- omlish/sql/api/_queries.py +28 -0
- omlish/sql/api/base.py +1 -17
- omlish/sql/api/dbapi.py +11 -3
- omlish/sql/api/funcs.py +16 -43
- omlish/sql/api/queries.py +50 -38
- omlish/sql/api/resources.py +98 -0
- omlish/sql/api/rows.py +4 -1
- omlish/sql/queries/__init__.py +8 -0
- omlish/sql/queries/marshal.py +3 -0
- omlish/sql/queries/ops.py +3 -0
- omlish/sql/queries/rendering.py +3 -0
- omlish/sql/queries/std.py +3 -0
- {omlish-0.0.0.dev296.dist-info → omlish-0.0.0.dev298.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev296.dist-info → omlish-0.0.0.dev298.dist-info}/RECORD +22 -20
- {omlish-0.0.0.dev296.dist-info → omlish-0.0.0.dev298.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev296.dist-info → omlish-0.0.0.dev298.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev296.dist-info → omlish-0.0.0.dev298.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev296.dist-info → omlish-0.0.0.dev298.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
omlish/secrets/all.py
CHANGED
omlish/sql/alchemy/apiadapter.py
CHANGED
@@ -25,10 +25,10 @@ class SqlalchemyApiWrapper(api.ContextCloser, ta.Generic[T]):
|
|
25
25
|
self._u = u
|
26
26
|
self._auto_close = auto_close
|
27
27
|
|
28
|
-
def
|
28
|
+
def _close(self) -> None:
|
29
29
|
if self._auto_close and hasattr(self._u, 'close'):
|
30
30
|
self._u.close()
|
31
|
-
super().
|
31
|
+
super()._close()
|
32
32
|
|
33
33
|
|
34
34
|
##
|
omlish/sql/api/__init__.py
CHANGED
@@ -1,7 +1,4 @@
|
|
1
1
|
from .base import ( # noqa
|
2
|
-
Closer,
|
3
|
-
ContextCloser,
|
4
|
-
|
5
2
|
Querier,
|
6
3
|
Rows,
|
7
4
|
Conn,
|
@@ -33,14 +30,36 @@ from .errors import ( # noqa
|
|
33
30
|
|
34
31
|
from .funcs import ( # noqa
|
35
32
|
query,
|
33
|
+
query_all,
|
36
34
|
exec, # noqa
|
37
35
|
)
|
38
36
|
|
39
37
|
from .queries import ( # noqa
|
40
38
|
QueryMode,
|
41
39
|
Query,
|
40
|
+
|
41
|
+
as_query,
|
42
|
+
)
|
43
|
+
|
44
|
+
from .resources import ( # noqa
|
45
|
+
get_resource_debug,
|
46
|
+
set_resource_debug,
|
47
|
+
|
48
|
+
UnclosedResourceWarning,
|
49
|
+
Closer,
|
50
|
+
|
51
|
+
ResourceNotEnteredError,
|
52
|
+
ContextCloser,
|
42
53
|
)
|
43
54
|
|
44
55
|
from .rows import ( # noqa
|
45
56
|
Row,
|
46
57
|
)
|
58
|
+
|
59
|
+
|
60
|
+
##
|
61
|
+
|
62
|
+
|
63
|
+
from ...lang.imports import _register_conditional_import # noqa
|
64
|
+
|
65
|
+
_register_conditional_import('..queries', '._queries', __package__)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- dialect lol
|
4
|
+
"""
|
5
|
+
from ..queries import Stmt
|
6
|
+
from ..queries.rendering import render
|
7
|
+
from .funcs import as_query
|
8
|
+
from .queries import Query
|
9
|
+
from .queries import QueryMode
|
10
|
+
|
11
|
+
|
12
|
+
##
|
13
|
+
|
14
|
+
|
15
|
+
@as_query.register
|
16
|
+
def _(
|
17
|
+
stmt: Stmt,
|
18
|
+
*,
|
19
|
+
mode: QueryMode | str | None = None,
|
20
|
+
) -> Query:
|
21
|
+
rq = render(stmt)
|
22
|
+
|
23
|
+
# FIXME: rq.args
|
24
|
+
return Query(
|
25
|
+
mode=QueryMode.of(mode, QueryMode.QUERY),
|
26
|
+
text=rq.s,
|
27
|
+
args=[],
|
28
|
+
)
|
omlish/sql/api/base.py
CHANGED
@@ -9,29 +9,13 @@ from ... import lang
|
|
9
9
|
from .columns import Column
|
10
10
|
from .columns import Columns
|
11
11
|
from .queries import Query
|
12
|
+
from .resources import ContextCloser
|
12
13
|
from .rows import Row
|
13
14
|
|
14
15
|
|
15
16
|
##
|
16
17
|
|
17
18
|
|
18
|
-
class Closer(lang.Abstract):
|
19
|
-
def close(self) -> None:
|
20
|
-
pass
|
21
|
-
|
22
|
-
|
23
|
-
class ContextCloser(Closer):
|
24
|
-
def __enter__(self) -> ta.Self:
|
25
|
-
return self
|
26
|
-
|
27
|
-
@ta.final
|
28
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
29
|
-
self.close()
|
30
|
-
|
31
|
-
|
32
|
-
##
|
33
|
-
|
34
|
-
|
35
19
|
class Querier(ContextCloser, lang.Abstract):
|
36
20
|
@property
|
37
21
|
@abc.abstractmethod
|
omlish/sql/api/dbapi.py
CHANGED
@@ -41,11 +41,16 @@ class DbapiRows(Rows):
|
|
41
41
|
self._cursor = cursor
|
42
42
|
self._columns = columns
|
43
43
|
|
44
|
+
def _close(self) -> None:
|
45
|
+
self._cursor.close()
|
46
|
+
super()._close()
|
47
|
+
|
44
48
|
@property
|
45
49
|
def columns(self) -> Columns:
|
46
50
|
return self._columns
|
47
51
|
|
48
52
|
def __next__(self) -> Row:
|
53
|
+
self._check_entered()
|
49
54
|
values = self._cursor.fetchone()
|
50
55
|
if values is None:
|
51
56
|
raise StopIteration
|
@@ -58,11 +63,16 @@ class DbapiConn(Conn):
|
|
58
63
|
|
59
64
|
self._conn = conn
|
60
65
|
|
66
|
+
def _close(self) -> None:
|
67
|
+
self._conn.close()
|
68
|
+
super()._close()
|
69
|
+
|
61
70
|
@property
|
62
71
|
def adapter(self) -> Adapter:
|
63
72
|
raise NotImplementedError
|
64
73
|
|
65
74
|
def query(self, query: Query) -> Rows:
|
75
|
+
self._check_entered()
|
66
76
|
cursor = self._conn.cursor()
|
67
77
|
try:
|
68
78
|
cursor.execute(query.text)
|
@@ -73,9 +83,6 @@ class DbapiConn(Conn):
|
|
73
83
|
cursor.close()
|
74
84
|
raise
|
75
85
|
|
76
|
-
def close(self) -> None:
|
77
|
-
self._conn.close()
|
78
|
-
|
79
86
|
|
80
87
|
class DbapiDb(Db):
|
81
88
|
def __init__(
|
@@ -92,6 +99,7 @@ class DbapiDb(Db):
|
|
92
99
|
self._adapter = adapter
|
93
100
|
|
94
101
|
def connect(self) -> Conn:
|
102
|
+
self._check_entered()
|
95
103
|
dbapi_conn = self._conn_fac()
|
96
104
|
return DbapiConn(dbapi_conn)
|
97
105
|
|
omlish/sql/api/funcs.py
CHANGED
@@ -2,72 +2,45 @@ import typing as ta
|
|
2
2
|
|
3
3
|
from .base import Querier
|
4
4
|
from .base import Rows
|
5
|
-
from .queries import Query
|
6
5
|
from .queries import QueryMode
|
6
|
+
from .queries import as_query
|
7
|
+
from .rows import Row
|
7
8
|
|
8
9
|
|
9
10
|
##
|
10
11
|
|
11
12
|
|
12
|
-
@ta.overload
|
13
13
|
def query(
|
14
14
|
querier: Querier,
|
15
|
-
|
16
|
-
) -> Rows:
|
17
|
-
...
|
18
|
-
|
19
|
-
|
20
|
-
@ta.overload
|
21
|
-
def query(
|
22
|
-
querier: Querier,
|
23
|
-
text: str,
|
15
|
+
obj: ta.Any,
|
24
16
|
*args: ta.Any,
|
25
17
|
) -> Rows:
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def query(
|
30
|
-
querier,
|
31
|
-
obj,
|
32
|
-
*args,
|
33
|
-
):
|
34
|
-
if isinstance(obj, Query):
|
35
|
-
q = obj
|
36
|
-
else:
|
37
|
-
q = Query.of(obj, *args, mode=QueryMode.QUERY)
|
18
|
+
q = as_query(obj, *args, mode=QueryMode.QUERY)
|
38
19
|
|
39
20
|
return querier.query(q)
|
40
21
|
|
41
22
|
|
42
|
-
|
23
|
+
#
|
43
24
|
|
44
25
|
|
45
|
-
|
46
|
-
def exec( # noqa
|
26
|
+
def query_all(
|
47
27
|
querier: Querier,
|
48
|
-
|
49
|
-
|
50
|
-
|
28
|
+
obj: ta.Any,
|
29
|
+
*args: ta.Any,
|
30
|
+
) -> list[Row]:
|
31
|
+
with query(querier, obj, *args) as rows:
|
32
|
+
return list(rows)
|
33
|
+
|
34
|
+
|
35
|
+
##
|
51
36
|
|
52
37
|
|
53
|
-
@ta.overload
|
54
38
|
def exec( # noqa
|
55
39
|
querier: Querier,
|
56
|
-
|
40
|
+
obj: ta.Any,
|
57
41
|
*args: ta.Any,
|
58
42
|
) -> None:
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def exec( # noqa
|
63
|
-
querier,
|
64
|
-
obj,
|
65
|
-
*args,
|
66
|
-
):
|
67
|
-
if isinstance(obj, Query):
|
68
|
-
q = obj
|
69
|
-
else:
|
70
|
-
q = Query.of(obj, *args, mode=QueryMode.EXEC)
|
43
|
+
q = as_query(obj, *args, mode=QueryMode.EXEC)
|
71
44
|
|
72
45
|
with querier.query(q):
|
73
46
|
pass
|
omlish/sql/api/queries.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import dataclasses as dc
|
2
2
|
import enum
|
3
|
+
import functools
|
3
4
|
import typing as ta
|
4
5
|
|
5
6
|
from ... import check
|
@@ -13,6 +14,21 @@ class QueryMode(enum.Enum):
|
|
13
14
|
QUERY = enum.auto()
|
14
15
|
EXEC = enum.auto()
|
15
16
|
|
17
|
+
@classmethod
|
18
|
+
def of(
|
19
|
+
cls,
|
20
|
+
o: ta.Union[str, 'QueryMode', None],
|
21
|
+
default: ta.Optional['QueryMode'] = None,
|
22
|
+
) -> 'QueryMode':
|
23
|
+
if o is None:
|
24
|
+
return check.not_none(check.isinstance(default, cls))
|
25
|
+
elif isinstance(o, str):
|
26
|
+
return cls[o.upper()] # noqa
|
27
|
+
elif isinstance(o, cls):
|
28
|
+
return o
|
29
|
+
else:
|
30
|
+
raise TypeError(o)
|
31
|
+
|
16
32
|
|
17
33
|
@dc.dataclass(frozen=True)
|
18
34
|
class Query(lang.Final):
|
@@ -20,44 +36,40 @@ class Query(lang.Final):
|
|
20
36
|
text: str
|
21
37
|
args: ta.Sequence[ta.Any]
|
22
38
|
|
23
|
-
#
|
24
39
|
|
25
|
-
|
26
|
-
@ta.overload
|
27
|
-
def of(
|
28
|
-
cls,
|
29
|
-
query: 'Query',
|
30
|
-
) -> 'Query':
|
31
|
-
...
|
40
|
+
##
|
32
41
|
|
33
|
-
@classmethod
|
34
|
-
@ta.overload
|
35
|
-
def of(
|
36
|
-
cls,
|
37
|
-
text: str,
|
38
|
-
*args: ta.Any,
|
39
|
-
mode: str | QueryMode = QueryMode.QUERY,
|
40
|
-
) -> 'Query':
|
41
|
-
...
|
42
|
-
|
43
|
-
@classmethod # type: ignore[misc]
|
44
|
-
def of(cls, obj, *args, **kwargs):
|
45
|
-
if isinstance(obj, Query):
|
46
|
-
check.arg(not args)
|
47
|
-
check.arg(not kwargs)
|
48
|
-
return obj
|
49
|
-
|
50
|
-
elif isinstance(obj, str):
|
51
|
-
mode = kwargs.pop('mode', QueryMode.QUERY)
|
52
|
-
if isinstance(mode, str):
|
53
|
-
mode = QueryMode[mode.upper()]
|
54
|
-
check.arg(not kwargs)
|
55
|
-
|
56
|
-
return cls(
|
57
|
-
mode=mode,
|
58
|
-
text=obj,
|
59
|
-
args=args,
|
60
|
-
)
|
61
42
|
|
62
|
-
|
63
|
-
|
43
|
+
@functools.singledispatch
|
44
|
+
def as_query(
|
45
|
+
obj: ta.Any,
|
46
|
+
*args: ta.Any,
|
47
|
+
mode: QueryMode | str | None = None,
|
48
|
+
**kwargs: ta.Any,
|
49
|
+
) -> Query:
|
50
|
+
raise TypeError(obj)
|
51
|
+
|
52
|
+
|
53
|
+
@as_query.register
|
54
|
+
def _(
|
55
|
+
q: Query,
|
56
|
+
*,
|
57
|
+
mode: QueryMode | str | None = None,
|
58
|
+
) -> Query:
|
59
|
+
if mode is not None:
|
60
|
+
check.arg(q.mode is QueryMode.of(mode))
|
61
|
+
|
62
|
+
return q
|
63
|
+
|
64
|
+
|
65
|
+
@as_query.register
|
66
|
+
def _(
|
67
|
+
s: str,
|
68
|
+
*args: ta.Any,
|
69
|
+
mode: QueryMode | str | None = None,
|
70
|
+
) -> Query:
|
71
|
+
return Query(
|
72
|
+
mode=QueryMode.of(mode, QueryMode.QUERY),
|
73
|
+
text=s,
|
74
|
+
args=args,
|
75
|
+
)
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import traceback
|
2
|
+
import typing as ta
|
3
|
+
import warnings
|
4
|
+
|
5
|
+
from ... import lang
|
6
|
+
|
7
|
+
|
8
|
+
##
|
9
|
+
|
10
|
+
|
11
|
+
DEBUG = __debug__
|
12
|
+
|
13
|
+
|
14
|
+
def get_resource_debug() -> bool:
|
15
|
+
return DEBUG
|
16
|
+
|
17
|
+
|
18
|
+
def set_resource_debug(debug: bool) -> None:
|
19
|
+
global DEBUG
|
20
|
+
DEBUG = debug
|
21
|
+
|
22
|
+
|
23
|
+
##
|
24
|
+
|
25
|
+
|
26
|
+
class UnclosedResourceWarning(Warning):
|
27
|
+
pass
|
28
|
+
|
29
|
+
|
30
|
+
class Closer(lang.Abstract):
|
31
|
+
def __init__(self, *args: ta.Any, **kwargs: ta.Any) -> None:
|
32
|
+
super().__init__(*args, **kwargs)
|
33
|
+
|
34
|
+
self.__closed = False
|
35
|
+
|
36
|
+
self.__debug = DEBUG
|
37
|
+
if self.__debug:
|
38
|
+
self.__repr = repr(self)
|
39
|
+
self.__traceback = traceback.format_stack()[:-1]
|
40
|
+
|
41
|
+
@ta.final
|
42
|
+
def close(self) -> None:
|
43
|
+
self.__closed = True
|
44
|
+
self._close()
|
45
|
+
|
46
|
+
def _close(self) -> None:
|
47
|
+
pass
|
48
|
+
|
49
|
+
def __del__(self) -> None:
|
50
|
+
if self.__debug and not self.__closed:
|
51
|
+
warnings.warn(
|
52
|
+
f'\n\n{(sep := ("=" * 40))}\n'
|
53
|
+
f'{self.__class__.__name__} object {self.__repr} '
|
54
|
+
f'was not properly closed before deletion. Please ensure that `close()` is called before the object is '
|
55
|
+
f'deleted.'
|
56
|
+
f'\n\n'
|
57
|
+
f'{"".join(self.__traceback).rstrip()}'
|
58
|
+
f'\n{sep}\n',
|
59
|
+
UnclosedResourceWarning,
|
60
|
+
)
|
61
|
+
|
62
|
+
|
63
|
+
##
|
64
|
+
|
65
|
+
|
66
|
+
class ResourceNotEnteredError(Exception):
|
67
|
+
pass
|
68
|
+
|
69
|
+
|
70
|
+
class ContextCloser(Closer):
|
71
|
+
def __init__(self, *args: ta.Any, **kwargs: ta.Any) -> None:
|
72
|
+
super().__init__(*args, **kwargs)
|
73
|
+
|
74
|
+
self.__entered = False
|
75
|
+
|
76
|
+
@ta.final
|
77
|
+
def __enter__(self) -> ta.Self:
|
78
|
+
self.__entered = True
|
79
|
+
self._enter()
|
80
|
+
return self
|
81
|
+
|
82
|
+
def _enter(self) -> None:
|
83
|
+
pass
|
84
|
+
|
85
|
+
def _is_entered(self) -> bool:
|
86
|
+
return self.__entered
|
87
|
+
|
88
|
+
def _check_entered(self) -> None:
|
89
|
+
if not self.__entered:
|
90
|
+
try:
|
91
|
+
raise ResourceNotEnteredError(self) # noqa
|
92
|
+
except Exception:
|
93
|
+
self.close()
|
94
|
+
raise
|
95
|
+
|
96
|
+
@ta.final
|
97
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
98
|
+
self.close()
|
omlish/sql/api/rows.py
CHANGED
@@ -33,7 +33,7 @@ class Row(lang.Final, ta.Generic[T]):
|
|
33
33
|
def __contains__(self, item: str | int) -> bool:
|
34
34
|
raise TypeError('Row.__contains__ is ambiguous - use .columns.__contains__ or .values.__contains__')
|
35
35
|
|
36
|
-
def __getitem__(self, item) -> T:
|
36
|
+
def __getitem__(self, item: str | int) -> T:
|
37
37
|
if isinstance(item, str):
|
38
38
|
return self.values[self.columns.index(item)]
|
39
39
|
elif isinstance(item, int):
|
@@ -46,3 +46,6 @@ class Row(lang.Final, ta.Generic[T]):
|
|
46
46
|
return self.values[idx]
|
47
47
|
else:
|
48
48
|
return None
|
49
|
+
|
50
|
+
def to_dict(self) -> dict[str, ta.Any]:
|
51
|
+
return {c.name: v for c, v in self}
|
omlish/sql/queries/__init__.py
CHANGED
@@ -107,3 +107,11 @@ Q = StdBuilder()
|
|
107
107
|
from ...lang.imports import _register_conditional_import # noqa
|
108
108
|
|
109
109
|
_register_conditional_import('...marshal', '.marshal', __package__)
|
110
|
+
|
111
|
+
|
112
|
+
##
|
113
|
+
|
114
|
+
|
115
|
+
from ...lang.imports import _trigger_conditional_imports # noqa
|
116
|
+
|
117
|
+
_trigger_conditional_imports(__package__)
|
omlish/sql/queries/marshal.py
CHANGED
omlish/sql/queries/ops.py
CHANGED
omlish/sql/queries/rendering.py
CHANGED
omlish/sql/queries/std.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=vK2SteFsTmtDVM8ABHvsQ7GEMFh1KSe1ufItMzu4J98,3478
|
3
3
|
omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
|
4
4
|
omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
|
5
5
|
omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
|
@@ -626,7 +626,7 @@ omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
|
|
626
626
|
omlish/reflect/subst.py,sha256=g3q7NmNWsmc67mcchmCE3WFPCMDSBq-FXn4ah-DWL_U,3622
|
627
627
|
omlish/reflect/types.py,sha256=Cn9FYGoiCNt0FS0YLiTTAR12WKcesWMapCrVYcb8IDo,9225
|
628
628
|
omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
629
|
-
omlish/secrets/all.py,sha256=
|
629
|
+
omlish/secrets/all.py,sha256=gv_d9SfyMxso30HsrSz9XmIrSZOdl3rLA5MSH0ZXfgM,486
|
630
630
|
omlish/secrets/crypto.py,sha256=9D21lnvPhStwu8arD4ssT0ih0bDG-nlqIRdVgYL40xA,3708
|
631
631
|
omlish/secrets/marshal.py,sha256=u90n1OfRfdpH1T2F0xK_pAPH1ENYL6acFt6XdVd3KvI,1986
|
632
632
|
omlish/secrets/openssl.py,sha256=UT_dXJ4zA1s9e-UHoW_NLGHQO7iouUNPnJNkkpuw3JI,6213
|
@@ -727,20 +727,22 @@ omlish/sql/dbs.py,sha256=65e388987upJpsFX8bNL7uhiYv2sCsmk9Y04V0MXdsI,1873
|
|
727
727
|
omlish/sql/params.py,sha256=Z4VPet6GhNqD1T_MXSWSHkdy3cpUEhST-OplC4B_fYI,4433
|
728
728
|
omlish/sql/qualifiedname.py,sha256=c3GQzxh9sNyE_TP32PnlCun_F2bKXvX1ohtt6esTsjo,2269
|
729
729
|
omlish/sql/alchemy/__init__.py,sha256=mZiu0F4Y_5qQpl-xz4xnb0feVGZTDp3I4R6k7SVY_7M,760
|
730
|
-
omlish/sql/alchemy/apiadapter.py,sha256=
|
730
|
+
omlish/sql/alchemy/apiadapter.py,sha256=NjgOE8UMPlgENf7KKEsK8ZG8ECe6Ey4Hm8yXt5t-wLs,2588
|
731
731
|
omlish/sql/alchemy/asyncs.py,sha256=MwZwWIaZsUCQLcTA8mdHUPZmR-pXEVSAsvd15FCm3W4,3692
|
732
732
|
omlish/sql/alchemy/duckdb.py,sha256=kr7pIhiBLNAuZrcigHDtFg9zHkVcrRW3LfryO9VJ4mk,3749
|
733
733
|
omlish/sql/alchemy/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
|
734
734
|
omlish/sql/alchemy/secrets.py,sha256=WEeaec1ejQcE3Yaa7p5BSP9AMGEzy1lwr7QMSRL0VBw,180
|
735
735
|
omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
|
736
|
-
omlish/sql/api/__init__.py,sha256=
|
737
|
-
omlish/sql/api/
|
736
|
+
omlish/sql/api/__init__.py,sha256=YbObVEd09r_vVkcPLrx9qXCeV4Xdh23KmjYnCziOqQc,884
|
737
|
+
omlish/sql/api/_queries.py,sha256=9BXQIGocBntbQ3B4raDg9G7UEr5qOYDdrB6netG1CRU,456
|
738
|
+
omlish/sql/api/base.py,sha256=E_t54OFr0BX604vOfQZGxh_n6EdOBF2Tvnrg25dMKXo,1314
|
738
739
|
omlish/sql/api/columns.py,sha256=UBol4bfwZ1nhcjv2gE1JhUMzRFeqtiCDo2T9CUGYb64,1943
|
739
|
-
omlish/sql/api/dbapi.py,sha256=
|
740
|
+
omlish/sql/api/dbapi.py,sha256=bDVqmljmLMdurMhIy3vx-dJvK1KiZ7XBhZ2Zx6W9aBs,2627
|
740
741
|
omlish/sql/api/errors.py,sha256=YtC2gz5DqRTT3uCJniUOufVH1GEnFIc5ElkYLK3BHwM,230
|
741
|
-
omlish/sql/api/funcs.py,sha256
|
742
|
-
omlish/sql/api/queries.py,sha256=
|
743
|
-
omlish/sql/api/
|
742
|
+
omlish/sql/api/funcs.py,sha256=RRkDmlr3vCAO38nY15LMYvEF8jwQ4kTVCc0J4PkstSE,707
|
743
|
+
omlish/sql/api/queries.py,sha256=xybadpIULwFSmDinFVi1qlAJEliQa4jn7ARcEtyp19Y,1385
|
744
|
+
omlish/sql/api/resources.py,sha256=tO5RqH_G6AuqulGoy08jdgpksIv6TRdOHNWhZTxwarc,2062
|
745
|
+
omlish/sql/api/rows.py,sha256=Jo3AA_6Wt7tlwLO6-rp0arzYFqZXSxPudGPkW2xCYgQ,1346
|
744
746
|
omlish/sql/parsing/Minisql.g4,sha256=Jw8xT-8UI6ySHAgStyCg5QX9NTCinvTenLJReWiZIJU,4578
|
745
747
|
omlish/sql/parsing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
746
748
|
omlish/sql/parsing/parsing.py,sha256=SIbrAkWCgx_ekBOzBGc0eC_HfW--ciAtU_-Vqmyy6vw,3347
|
@@ -749,21 +751,21 @@ omlish/sql/parsing/_antlr/MinisqlListener.py,sha256=2py_bfDQeEtJaJh9rtpKghbSrQlE
|
|
749
751
|
omlish/sql/parsing/_antlr/MinisqlParser.py,sha256=y9SFjXdQlWYJa2PbPm30d5SfcYM_8M8ts46IHhENbNc,132457
|
750
752
|
omlish/sql/parsing/_antlr/MinisqlVisitor.py,sha256=NCPorucLLOZ-Q99BtNbDOAfHytQl8wyroR8pI1uVovg,10030
|
751
753
|
omlish/sql/parsing/_antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
752
|
-
omlish/sql/queries/__init__.py,sha256=
|
754
|
+
omlish/sql/queries/__init__.py,sha256=LpBnJOGoT5Dw2C043yo1XXIg0C_eHda-u6DR2ZAKT7c,1530
|
753
755
|
omlish/sql/queries/base.py,sha256=pQ6p8dSsHwsWa-lmK2h8RY2UJ1mwJRhByOgrCIW3dBs,3229
|
754
756
|
omlish/sql/queries/binary.py,sha256=dcEzeEn104AMPuQ7QrJU2O-YCN3SUdxB5S4jaWKOUqY,2253
|
755
757
|
omlish/sql/queries/exprs.py,sha256=dG9L218QtJM1HtDYIMWqHimK03N6AL1WONk3FvVRcXY,1480
|
756
758
|
omlish/sql/queries/idents.py,sha256=w2RxO6SR3K-u30S259OtnAZaPv7YA70PzY9R7RtuCQ8,891
|
757
759
|
omlish/sql/queries/inserts.py,sha256=pSQXDSR1oDUmxjeIYuSbxpAZXvYQ-EJF6a62ON5Un-k,1299
|
758
|
-
omlish/sql/queries/marshal.py,sha256=
|
760
|
+
omlish/sql/queries/marshal.py,sha256=yVfN5VgYMYDaYTE6FZ8Sea7GrRobn40Hc8kogrfKmjE,3016
|
759
761
|
omlish/sql/queries/multi.py,sha256=7x6x-4jnPzxA6ZasBjnjFuhHFpWt5rGCua3UvuTMIJ0,837
|
760
762
|
omlish/sql/queries/names.py,sha256=4sDvgRobMEt_6mDeuYVbCqHzLCOwpXUdEyyB4-QjxKo,1996
|
761
|
-
omlish/sql/queries/ops.py,sha256=
|
763
|
+
omlish/sql/queries/ops.py,sha256=pDZ_2Jo_Fa8DDbtYkc6-9eehkWsZPI-jh-KFlubcY6Y,134
|
762
764
|
omlish/sql/queries/params.py,sha256=FXgZO6F_fmRQb9CVo4PkRoypm_fSB_AB_JoM3PxRkKM,1206
|
763
765
|
omlish/sql/queries/relations.py,sha256=7YrEC9IjoVpRGLAFKRSRsHHnTmx-g7hBNXsOgP2HOuI,2998
|
764
|
-
omlish/sql/queries/rendering.py,sha256=
|
766
|
+
omlish/sql/queries/rendering.py,sha256=iEQGVP1nOhaZy9FYNwKkOUgqFH0pxfvsCsJpHX8E9Vw,7662
|
765
767
|
omlish/sql/queries/selects.py,sha256=5CD4qmlv5hysQKmoZuF1bbikA-VcC9opN94Ea1QE3mU,1577
|
766
|
-
omlish/sql/queries/std.py,sha256=
|
768
|
+
omlish/sql/queries/std.py,sha256=7kF76kq_b6Qaki-lYiBlZiZmtpWYqRqAcLU8x-bBZn0,648
|
767
769
|
omlish/sql/queries/stmts.py,sha256=pBqwD7dRlqMu6uh6vR3xaWOEgbZCcFWbOQ9ryYd17T4,441
|
768
770
|
omlish/sql/queries/unary.py,sha256=MEYBDZn_H0bexmUrJeONOv5-gIpYowUaXOsEHeQM4ks,1144
|
769
771
|
omlish/sql/tabledefs/__init__.py,sha256=TvtQsp-jJu6_ZahyCOFAaElSSBcRftNyJpdiDPGYCDk,190
|
@@ -840,9 +842,9 @@ omlish/typedvalues/holder.py,sha256=ZTnHiw-K38ciOBLEdwgrltr7Xp8jjEs_0Lp69DH-G-o,
|
|
840
842
|
omlish/typedvalues/marshal.py,sha256=hWHRLcrGav7lvXJDtb9bNI0ickl4SKPQ6F4BbTpqw3A,4219
|
841
843
|
omlish/typedvalues/reflect.py,sha256=Ih1YgU-srUjsvBn_P7C66f73_VCvcwqE3ffeBnZBgt4,674
|
842
844
|
omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
|
843
|
-
omlish-0.0.0.
|
844
|
-
omlish-0.0.0.
|
845
|
-
omlish-0.0.0.
|
846
|
-
omlish-0.0.0.
|
847
|
-
omlish-0.0.0.
|
848
|
-
omlish-0.0.0.
|
845
|
+
omlish-0.0.0.dev298.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
846
|
+
omlish-0.0.0.dev298.dist-info/METADATA,sha256=SO0WnQXYeBKoFzXETXZ0osCsvkqYtx2KSJj0nSHWq4g,4416
|
847
|
+
omlish-0.0.0.dev298.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
848
|
+
omlish-0.0.0.dev298.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
849
|
+
omlish-0.0.0.dev298.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
850
|
+
omlish-0.0.0.dev298.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|