diff --git a/maubot/management/api/instance_database.py b/maubot/management/api/instance_database.py index d271031..dbeb66b 100644 --- a/maubot/management/api/instance_database.py +++ b/maubot/management/api/instance_database.py @@ -18,6 +18,7 @@ from __future__ import annotations from datetime import datetime from aiohttp import web +from asyncpg import PostgresError from sqlalchemy import asc, desc, engine, exc from sqlalchemy.engine.result import ResultProxy, RowProxy import aiosqlite @@ -85,7 +86,10 @@ async def query(request: web.Request) -> web.Response: if isinstance(instance.inst_db, engine.Engine): return _execute_query_sqlalchemy(instance, sql_query, rows_as_dict) elif isinstance(instance.inst_db, Database): - return await _execute_query_asyncpg(instance, sql_query, rows_as_dict) + try: + return await _execute_query_asyncpg(instance, sql_query, rows_as_dict) + except (PostgresError, aiosqlite.Error) as e: + return resp.sql_error(e, sql_query) else: return resp.unsupported_plugin_database diff --git a/maubot/management/api/responses.py b/maubot/management/api/responses.py index b645def..15f6a96 100644 --- a/maubot/management/api/responses.py +++ b/maubot/management/api/responses.py @@ -13,10 +13,14 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from __future__ import annotations + from http import HTTPStatus from aiohttp import web +from asyncpg import PostgresError from sqlalchemy.exc import IntegrityError, OperationalError +import aiosqlite class _Response: @@ -134,6 +138,18 @@ class _Response: status=HTTPStatus.BAD_REQUEST, ) + @staticmethod + def sql_error(error: PostgresError | aiosqlite.Error, query: str) -> web.Response: + return web.json_response( + { + "ok": False, + "query": query, + "error": str(error), + "errcode": "sql_error", + }, + status=HTTPStatus.BAD_REQUEST, + ) + @staticmethod def sql_operational_error(error: OperationalError, query: str) -> web.Response: return web.json_response(