Skip to content

Commit 5b3f869

Browse files
committed
pg8000 fix for Windows/Postgresql 13.6 not seen elsewhere.
1 parent f771e17 commit 5b3f869

File tree

1 file changed

+15
-6
lines changed
  • src/relstorage/adapters/postgresql/drivers

1 file changed

+15
-6
lines changed

src/relstorage/adapters/postgresql/drivers/pg8000.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,19 @@
1515
"""
1616
pg8000 IDBDriver implementations.
1717
"""
18-
19-
from __future__ import absolute_import
20-
from __future__ import print_function
21-
2218
from collections import deque
2319

2420
from zope.interface import implementer
2521

2622
from relstorage._compat import number_types
2723

24+
from ...._compat import WIN
2825
from ...interfaces import IDBDriver
2926
from ...sql import Compiler
30-
3127
from . import AbstractPostgreSQLDriver
3228
from . import PostgreSQLDialect
3329
from ._lobject import LobConnectionMixin
3430

35-
3631
__all__ = [
3732
'PG8000Driver',
3833
]
@@ -249,3 +244,17 @@ def connection_may_need_commit(self, conn):
249244

250245
def _get_exception_pgcode(self, exc):
251246
return exc.args[0]['C']
247+
248+
if WIN:
249+
def exception_is_deadlock(self, exc):
250+
is_deadlock = super().exception_is_deadlock(exc)
251+
if is_deadlock:
252+
return is_deadlock
253+
# pg8000 raises pg8000.dbapi.ProgrammingError, which is a DatabaseError.
254+
# We've seen both
255+
# 40P01 - deadlock_detected (Transaction Rollback)
256+
# 55P03 - lock_not_available (Object Not In Prerequisite State)
257+
# ERRCODE_DEADLOCK is the first one, checked by super.
258+
if isinstance(exc, self.driver_module.DatabaseError):
259+
return self._get_exception_pgcode(exc) == '55P03'
260+
return None

0 commit comments

Comments
 (0)