From 46a914267613d60791dc96d6e82bc3db2cfd236c Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Tue, 27 Jun 2023 15:27:56 +0100 Subject: [PATCH] propagate errors coreectly for datasource plus --- .../src/integrations/microsoftSqlServer.ts | 15 ++++++++++++--- packages/server/src/integrations/mysql.ts | 17 +++++++++++++++-- packages/server/src/integrations/postgres.ts | 16 +++++++++++++--- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/server/src/integrations/microsoftSqlServer.ts b/packages/server/src/integrations/microsoftSqlServer.ts index 291aad8631..ee3cbc9970 100644 --- a/packages/server/src/integrations/microsoftSqlServer.ts +++ b/packages/server/src/integrations/microsoftSqlServer.ts @@ -10,6 +10,7 @@ import { DatasourcePlus, DatasourceFeature, ConnectionInfo, + SourceName, } from "@budibase/types" import { getSqlQuery, @@ -20,6 +21,7 @@ import { } from "./utils" import Sql from "./base/sql" import { MSSQLTablesResponse, MSSQLColumn } from "./base/types" +import { getReadableErrorMessage } from "./base/errorMapping" const sqlServer = require("mssql") const DEFAULT_SCHEMA = "dbo" @@ -177,9 +179,16 @@ class SqlServerIntegration extends Sql implements DatasourcePlus { ? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;` : query.sql return await request.query(sql) - } catch (err) { - // @ts-ignore - throw new Error(err) + } catch (err: any) { + let readableMessage = getReadableErrorMessage( + SourceName.SQL_SERVER, + err.errno + ) + if (readableMessage) { + throw new Error(readableMessage) + } else { + throw new Error(err.message as string) + } } } diff --git a/packages/server/src/integrations/mysql.ts b/packages/server/src/integrations/mysql.ts index c3bb5e066f..0dc102a0c4 100644 --- a/packages/server/src/integrations/mysql.ts +++ b/packages/server/src/integrations/mysql.ts @@ -9,6 +9,7 @@ import { DatasourcePlus, DatasourceFeature, ConnectionInfo, + SourceName, } from "@budibase/types" import { getSqlQuery, @@ -21,7 +22,7 @@ import dayjs from "dayjs" import { NUMBER_REGEX } from "../utilities" import Sql from "./base/sql" import { MySQLColumn } from "./base/types" - +import { getReadableErrorMessage } from "./base/errorMapping" import mysql from "mysql2/promise" interface MySQLConfig extends mysql.ConnectionOptions { @@ -174,7 +175,12 @@ class MySQLIntegration extends Sql implements DatasourcePlus { ) response.connected = result?.checkRes == 2 } catch (e: any) { - response.error = e.message as string + let readableMessage = getReadableErrorMessage(SourceName.MYSQL, e.errno) + if (readableMessage) { + response.error = readableMessage + } else { + response.error = e.message as string + } } return response } @@ -213,6 +219,13 @@ class MySQLIntegration extends Sql implements DatasourcePlus { // Node MySQL is callback based, so we must wrap our call in a promise const response = await this.client!.query(query.sql, bindings) return response[0] + } catch (err: any) { + let readableMessage = getReadableErrorMessage(SourceName.MYSQL, err.errno) + if (readableMessage) { + throw new Error(readableMessage) + } else { + throw new Error(err.message as string) + } } finally { if (opts?.connect && this.client) { await this.disconnect() diff --git a/packages/server/src/integrations/postgres.ts b/packages/server/src/integrations/postgres.ts index b1f20f97ec..e45eaa7b63 100644 --- a/packages/server/src/integrations/postgres.ts +++ b/packages/server/src/integrations/postgres.ts @@ -8,6 +8,7 @@ import { DatasourcePlus, DatasourceFeature, ConnectionInfo, + SourceName, } from "@budibase/types" import { getSqlQuery, @@ -21,6 +22,7 @@ import { PostgresColumn } from "./base/types" import { escapeDangerousCharacters } from "../utilities" import { Client, ClientConfig, types } from "pg" +import { getReadableErrorMessage } from "./base/errorMapping" // Return "date" and "timestamp" types as plain strings. // This lets us reference the original stored timezone. @@ -182,6 +184,7 @@ class PostgresIntegration extends Sql implements DatasourcePlus { await this.openConnection() response.connected = true } catch (e: any) { + console.log(e) response.error = e.message as string } finally { await this.closeConnection() @@ -240,10 +243,17 @@ class PostgresIntegration extends Sql implements DatasourcePlus { } try { return await client.query(query.sql, query.bindings || []) - } catch (err) { + } catch (err: any) { await this.closeConnection() - // @ts-ignore - throw new Error(err) + let readableMessage = getReadableErrorMessage( + SourceName.POSTGRES, + err.errno + ) + if (readableMessage) { + throw new Error(readableMessage) + } else { + throw new Error(err.message as string) + } } finally { if (close) { await this.closeConnection()