fix(sequence): Setup & use SequenceGeneratorLimitExceeded error
This commit is contained in:
parent
ca0016a996
commit
90c716bce0
4 changed files with 18 additions and 12 deletions
|
|
@ -46,6 +46,10 @@ class MariaDBExceptionUtil:
|
|||
SQLError = mariadb.ProgrammingError
|
||||
DataError = mariadb.DataError
|
||||
|
||||
# match ER_SEQUENCE_RUN_OUT - https://mariadb.com/kb/en/mariadb-error-codes/
|
||||
SequenceGeneratorLimitExceeded = mariadb.ProgrammingError
|
||||
SequenceGeneratorLimitExceeded.errno = 4084
|
||||
|
||||
@staticmethod
|
||||
def is_deadlocked(e: mariadb.Error) -> bool:
|
||||
return getattr(e, "errno", None) == ER.LOCK_DEADLOCK
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ from psycopg2.errorcodes import (
|
|||
UNDEFINED_TABLE,
|
||||
UNIQUE_VIOLATION,
|
||||
)
|
||||
from psycopg2.errors import SyntaxError
|
||||
from psycopg2.errors import SequenceGeneratorLimitExceeded, SyntaxError
|
||||
from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ
|
||||
|
||||
import frappe
|
||||
|
|
@ -44,6 +44,7 @@ class PostgresExceptionUtil:
|
|||
SQLError = psycopg2.ProgrammingError
|
||||
DataError = psycopg2.DataError
|
||||
InterfaceError = psycopg2.InterfaceError
|
||||
SequenceGeneratorLimitExceeded = SequenceGeneratorLimitExceeded
|
||||
|
||||
@staticmethod
|
||||
def is_deadlocked(e):
|
||||
|
|
|
|||
|
|
@ -57,12 +57,17 @@ def create_sequence(
|
|||
|
||||
|
||||
def get_next_val(doctype_name: str, slug: str = "_id_seq") -> int:
|
||||
return db.multisql(
|
||||
{
|
||||
"postgres": f"select nextval('\"{scrub(doctype_name + slug)}\"')",
|
||||
"mariadb": f"select nextval(`{scrub(doctype_name + slug)}`)",
|
||||
}
|
||||
)[0][0]
|
||||
sequence_name = scrub(f"{doctype_name}{slug}")
|
||||
|
||||
if db.db_type == "postgres":
|
||||
sequence_name = f"'\"{sequence_name}\"'"
|
||||
elif db.db_type == "mariadb":
|
||||
sequence_name = f"`{sequence_name}`"
|
||||
|
||||
try:
|
||||
return db.sql(f"SELECT nextval({sequence_name})")[0][0]
|
||||
except IndexError:
|
||||
raise db.SequenceGeneratorLimitExceeded
|
||||
|
||||
|
||||
def set_next_val(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
import psycopg2
|
||||
|
||||
import frappe
|
||||
from frappe.tests.utils import FrappeTestCase
|
||||
|
||||
|
|
@ -34,10 +32,8 @@ class TestSequence(FrappeTestCase):
|
|||
|
||||
try:
|
||||
frappe.db.get_next_sequence_val(seq_name)
|
||||
except psycopg2.errors.SequenceGeneratorLimitExceeded:
|
||||
except frappe.db.SequenceGeneratorLimitExceeded:
|
||||
pass
|
||||
except frappe.db.ProgrammingError as e:
|
||||
self.assertEqual(getattr(e, "errno", None), 4084)
|
||||
else:
|
||||
self.fail("NEXTVAL didn't raise any error upon sequence's end")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue