|
8 | 8 | from collections import defaultdict |
9 | 9 | from datetime import timedelta |
10 | 10 |
|
| 11 | +from asyncpg import UniqueViolationError |
| 12 | + |
11 | 13 | from mautrix.client.state_store import SyncStore |
12 | 14 | from mautrix.client.state_store.asyncpg import PgStateStore |
13 | 15 | from mautrix.types import ( |
|
33 | 35 | from .upgrade import upgrade_table |
34 | 36 |
|
35 | 37 | try: |
36 | | - from sqlite3 import sqlite_version_info as sqlite_version |
| 38 | + from sqlite3 import IntegrityError, sqlite_version_info as sqlite_version |
37 | 39 |
|
38 | 40 | from aiosqlite import Cursor |
39 | 41 | except ImportError: |
40 | 42 | Cursor = None |
41 | 43 | sqlite_version = (0, 0, 0) |
42 | 44 |
|
| 45 | + class IntegrityError(Exception): |
| 46 | + pass |
| 47 | + |
43 | 48 |
|
44 | 49 | class PgCryptoStateStore(PgStateStore, StateStore): |
45 | 50 | """ |
@@ -231,16 +236,19 @@ async def put_group_session( |
231 | 236 | session_id, sender_key, signing_key, room_id, session, forwarding_chains, account_id |
232 | 237 | ) VALUES ($1, $2, $3, $4, $5, $6, $7) |
233 | 238 | """ |
234 | | - await self.db.execute( |
235 | | - q, |
236 | | - session_id, |
237 | | - sender_key, |
238 | | - session.signing_key, |
239 | | - room_id, |
240 | | - pickle, |
241 | | - forwarding_chains, |
242 | | - self.account_id, |
243 | | - ) |
| 239 | + try: |
| 240 | + await self.db.execute( |
| 241 | + q, |
| 242 | + session_id, |
| 243 | + sender_key, |
| 244 | + session.signing_key, |
| 245 | + room_id, |
| 246 | + pickle, |
| 247 | + forwarding_chains, |
| 248 | + self.account_id, |
| 249 | + ) |
| 250 | + except (IntegrityError, UniqueViolationError): |
| 251 | + self.log.exception(f"Failed to insert megolm session {session_id}") |
244 | 252 |
|
245 | 253 | async def get_group_session( |
246 | 254 | self, room_id: RoomID, session_id: SessionID |
|
0 commit comments