summaryrefslogtreecommitdiff
path: root/pypaste/server/s3/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'pypaste/server/s3/__init__.py')
-rw-r--r--pypaste/server/s3/__init__.py20
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(