Skip to content

Commit 81177e1

Browse files
committed
Continue implementing PSQLPy engine for piccolo
Signed-off-by: chandr-andr (Kiselev Aleksandr) <chandr@chandr.net>
1 parent ccd3b46 commit 81177e1

1 file changed

Lines changed: 34 additions & 3 deletions

File tree

psqlpy_piccolo/engine.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import contextvars
22
from dataclasses import dataclass
3-
from typing import Any, Dict, List, Mapping, Optional, Sequence
3+
from typing import Any, Dict, List, Mapping, Optional, Sequence, Union
44
from piccolo.engine.base import Engine, validate_savepoint_name
55
from psqlpy import ConnectionPool, Connection, Transaction, Cursor
66
from psqlpy.exceptions import RustPSQLDriverPyBaseError
@@ -63,6 +63,37 @@ async def __aexit__(self, exception_type, exception, traceback):
6363
return exception is not None
6464

6565

66+
class Atomic:
67+
__slots__ = ("engine", "queries")
68+
69+
def __init__(self, engine: "PSQLPyEngine") -> None:
70+
self.engine = engine
71+
self.queries: List[Union[Query, DDL]] = []
72+
73+
def add(self, *query: Union[Query, DDL]):
74+
self.queries += list(query)
75+
76+
async def run(self):
77+
from piccolo.query.methods.objects import Create, GetOrCreate
78+
79+
try:
80+
async with self.engine.transaction():
81+
for query in self.queries:
82+
if isinstance(query, (Query, DDL, Create, GetOrCreate)):
83+
await query.run()
84+
else:
85+
raise ValueError("Unrecognised query")
86+
self.queries = []
87+
except Exception as exception:
88+
self.queries = []
89+
raise exception from exception
90+
91+
def run_sync(self):
92+
return run_sync(self.run())
93+
94+
def __await__(self):
95+
return self.run().__await__()
96+
6697
class Savepoint:
6798
def __init__(self, name: str, transaction: "PostgresTransaction"):
6899
self.name = name
@@ -370,8 +401,8 @@ async def run_ddl(self, ddl: str, in_pool: bool = True):
370401

371402
return response
372403

373-
def atomic(self) -> str:
374-
return "123"
404+
def atomic(self) -> Atomic:
405+
return Atomic(engine=self)
375406

376407
def transaction(self, allow_nested: bool = True) -> PostgresTransaction:
377408
return PostgresTransaction(engine=self, allow_nested=allow_nested)

0 commit comments

Comments
 (0)