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 CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev296'
2
- __revision__ = '8bdb4cc593092b4303a7f5633b09f5c428ba9bc1'
1
+ __version__ = '0.0.0.dev298'
2
+ __revision__ = '9e881abfe892f0f87226c902329ce0b913e28eed'
3
3
 
4
4
 
5
5
  #
omlish/secrets/all.py CHANGED
@@ -23,4 +23,5 @@ ref = SecretRef
23
23
 
24
24
  from ..lang.imports import _register_conditional_import # noqa
25
25
 
26
+ # FIXME: only happens when 'all' is imported lol
26
27
  _register_conditional_import('..marshal', '.marshal', __package__)
@@ -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 close(self) -> None:
28
+ def _close(self) -> None:
29
29
  if self._auto_close and hasattr(self._u, 'close'):
30
30
  self._u.close()
31
- super().close()
31
+ super()._close()
32
32
 
33
33
 
34
34
  ##
@@ -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
- query: Query, # noqa
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
- @ta.overload
46
- def exec( # noqa
26
+ def query_all(
47
27
  querier: Querier,
48
- query: Query, # noqa
49
- ) -> None:
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
- text: str,
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
- @classmethod
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
- else:
63
- raise TypeError(obj)
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}
@@ -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__)
@@ -26,6 +26,9 @@ from .unary import UnaryOp
26
26
  from .unary import UnaryOps
27
27
 
28
28
 
29
+ ##
30
+
31
+
29
32
  @dc.dataclass(frozen=True)
30
33
  class OpMarshalerUnmarshaler(msh.Marshaler, msh.Unmarshaler):
31
34
  ty: type
omlish/sql/queries/ops.py CHANGED
@@ -1,6 +1,9 @@
1
1
  import enum
2
2
 
3
3
 
4
+ ##
5
+
6
+
4
7
  class OpKind(enum.Enum):
5
8
  CMP = enum.auto()
6
9
  ARITH = enum.auto()
@@ -48,6 +48,9 @@ from .unary import UnaryOp
48
48
  from .unary import UnaryOps
49
49
 
50
50
 
51
+ ##
52
+
53
+
51
54
  @dc.dataclass(frozen=True)
52
55
  class RenderedQueryParts(lang.Final):
53
56
  p: tp.Part
omlish/sql/queries/std.py CHANGED
@@ -12,6 +12,9 @@ from .stmts import StmtBuilder
12
12
  from .unary import UnaryBuilder
13
13
 
14
14
 
15
+ ##
16
+
17
+
15
18
  class StdBuilder(
16
19
  InsertBuilder,
17
20
  SelectBuilder,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev296
3
+ Version: 0.0.0.dev298
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
2
- omlish/__about__.py,sha256=jTgxySKrGVTPE4uqRZMqrQi6EEy4LVIalO39VBQclwQ,3478
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=kUTuS4pZVskJe1kFN6m1F1br09BNSjX7MUC2RZRndwc,437
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=DnyCDl2mWbiZPwQ6RAxxFgfMCoVJqQ3Nzut-INhz9x8,2586
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=QmNO4EpT0_xiemhA5u55GHoH17j0k7ezyO_lEyjs34M,570
737
- omlish/sql/api/base.py,sha256=-AePkKy4uxYuob2J4GEwsSvtbFyvNIunNyE3u7p1Uas,1529
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=H3bFoWI-ox81APX3xBbjylNWyMUXh78ICMQjRrlDNxw,2426
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=-H6V-o9JPSHFXsxdHtutB4mP2LwJfCzlLbRrPHunmB4,990
742
- omlish/sql/api/queries.py,sha256=IgB8_sDe40-mKE-ByTmZ4GVOCdLLJDzJGJCevMd8R5s,1207
743
- omlish/sql/api/rows.py,sha256=MEK9LNYEe8vLEJXQJD63MpnSOiE22cawJL-dUWQD6sU,1246
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=2Wb05RFCKYZR3wO5YM60txNgjiDLJMYXC4gKAIUSsmc,1415
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=TA-wFmLqiK6fhIYwew-9oKa_dfFaIXwNMIE05WVwDd0,3011
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=B7IDfjr2DW5LJhWoNaY1WW90BJhe5ZtmxIELhWXbW-0,129
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=XaNpZY0itHBxT-rWeUtGb0Rg1T4dKaUdCdFC2I-LRq4,7657
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=J2ZDfDyLzRm8q5-TLAN6I_qjhs-7RpfW23yuCYYLf5k,643
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.dev296.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
844
- omlish-0.0.0.dev296.dist-info/METADATA,sha256=ab1hautqVw1AqWHUX53JxwiOist4T03rq46W2FzILPg,4416
845
- omlish-0.0.0.dev296.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
846
- omlish-0.0.0.dev296.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
847
- omlish-0.0.0.dev296.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
848
- omlish-0.0.0.dev296.dist-info/RECORD,,
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,,