diff options
Diffstat (limited to 'pypaste/server/s3/__init__.py')
| -rw-r--r-- | pypaste/server/s3/__init__.py | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/pypaste/server/s3/__init__.py b/pypaste/server/s3/__init__.py index eeded21..09e8194 100644 --- a/pypaste/server/s3/__init__.py +++ b/pypaste/server/s3/__init__.py @@ -16,8 +16,9 @@ import asyncio import zstandard import aiosqlite -from pypaste.server import Storage, Paste, Key -from pypaste.server.s3.bucket import Bucket +from aiosqlite import DatabaseError +from pypaste.server import Storage, Paste, Key, StorageError +from pypaste.server.s3.bucket import Bucket, BucketError from dataclasses import dataclass from typing import Optional @@ -58,9 +59,12 @@ class S3(Storage): try: await self.bucket.put(key.data.hex(), compressed) await self.connection.commit() - except Exception as e: + except BucketError as e: await self.connection.rollback() - raise e + raise StorageError(str(e)) + except DatabaseError as e: + await self.connection.rollback() + raise StorageError(str(e)) async def retrieve(self, key: Key) -> Optional[Paste]: if not await self.exists(key): @@ -82,15 +86,19 @@ class S3(Storage): return Paste(info.dt, info.syntax, text) async def delete(self, key: Key) -> None: + await self.connection.execute("begin") await self.connection.execute("delete from pastes where key=?", (key.data,)) await self.connection.execute("delete from s3 where key=?", (key.data,)) try: await self.bucket.delete(key.data.hex()) await self.connection.commit() - except Exception as e: + except BucketError as e: + await self.connection.rollback() + raise StorageError(str(e)) + except DatabaseError as e: await self.connection.rollback() - raise e + raise StorageError(str(e)) async def exists(self, key: Key) -> bool: async with self.connection.execute( |
