From b7773ec02aa26c01530723dc146e0c9f4dae41d3 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Sun, 23 Mar 2025 11:00:15 -0500 Subject: [PATCH] fix(sqlserver): if we already have a connection just return we dont want to try a second time --- server/services/sqlServer/prodSqlServer.ts | 265 ++++++++++++++------- 1 file changed, 176 insertions(+), 89 deletions(-) diff --git a/server/services/sqlServer/prodSqlServer.ts b/server/services/sqlServer/prodSqlServer.ts index b69470a..9c2aad2 100644 --- a/server/services/sqlServer/prodSqlServer.ts +++ b/server/services/sqlServer/prodSqlServer.ts @@ -1,111 +1,198 @@ import sql from "mssql"; -import {prodSqlConfig} from "./utils/prodServerConfig.js"; -import {createLog} from "../logger/logger.js"; -import {db} from "../../../database/dbclient.js"; -import {settings} from "../../../database/schema/settings.js"; -import {eq} from "drizzle-orm"; -import {installed} from "../../index.js"; -import {checkHostnamePort} from "../../globalUtils/pingServer.js"; +import { prodSqlConfig } from "./utils/prodServerConfig.js"; +import { createLog } from "../logger/logger.js"; +import { db } from "../../../database/dbclient.js"; +import { settings } from "../../../database/schema/settings.js"; +import { eq } from "drizzle-orm"; +import { installed } from "../../index.js"; +import { checkHostnamePort } from "../../globalUtils/pingServer.js"; let pool: any; let connected: boolean = false; export const initializeProdPool = async () => { - if (!installed) { - createLog("info", "lst", "sqlProd", "The server was not installed will reconnect in 5 seconds"); - setTimeout(() => { - initializeProdPool(); - }, 5 * 1000); + if (!installed) { + createLog( + "info", + "lst", + "sqlProd", + "The server was not installed will reconnect in 5 seconds" + ); + setTimeout(() => { + initializeProdPool(); + }, 5 * 1000); - return {success: false, message: "The server is not installed."}; - } - const dbServer = await db.select().from(settings).where(eq(settings.name, "dbServer")); - const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`); + return { success: false, message: "The server is not installed." }; + } + const dbServer = await db + .select() + .from(settings) + .where(eq(settings.name, "dbServer")); + const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`); - if (!serverUp) { - createLog("error", "lst", "server", `The sql ${dbServer[0].value} is not reachable`); - return {success: false, message: `The sql ${dbServer[0].value} is not reachable`}; - } + if (!serverUp) { + createLog( + "error", + "lst", + "server", + `The sql ${dbServer[0].value} is not reachable` + ); + return { + success: false, + message: `The sql ${dbServer[0].value} is not reachable`, + }; + } - // make sure the server is not set to localhost this will prevent some weird issues later but can be localhost on the dev - const serverLoc = await db.select().from(settings).where(eq(settings.name, "dbServer")); - if (serverLoc[0].value === "localhost" && process.env.NODE_ENV !== "development") { - createLog("error", "lst", "sqlProd", "The server is set to localhost, and you are not in development mode."); - return {success: false, message: "The server is set to localhost, and you are not in development mode."}; - } + // make sure the server is not set to localhost this will prevent some weird issues later but can be localhost on the dev + const serverLoc = await db + .select() + .from(settings) + .where(eq(settings.name, "dbServer")); + if ( + serverLoc[0].value === "localhost" && + process.env.NODE_ENV !== "development" + ) { + createLog( + "error", + "lst", + "sqlProd", + "The server is set to localhost, and you are not in development mode." + ); + return { + success: false, + message: + "The server is set to localhost, and you are not in development mode.", + }; + } - // if you were restarting from the endpoint you get this lovely error - if (connected) { - createLog("error", "lst", "sqlProd", "There is already a connection."); - return {success: false, message: "There is already a connection."}; - } - try { - const config = await prodSqlConfig(); - pool = await sql.connect(config!); + // if you were restarting from the endpoint you get this lovely error + if (connected) { + createLog("error", "lst", "sqlProd", "There is already a connection."); + return { success: false, message: "There is already a connection." }; + } + try { + const config = await prodSqlConfig(); + pool = await sql.connect(config!); - createLog("info", "lst", "sqlProd", `Connected to ${config?.server}, and looking at ${config?.database}`); - connected = true; - return {success: true, message: "The sql server connection has been closed"}; - } catch (error) { - createLog("error", "lst", "sqlProd", `${JSON.stringify(error)}, "There was an error connecting to the pool."`); - throw new Error("There was an error closing the sql connection"); - } + createLog( + "info", + "lst", + "sqlProd", + `Connected to ${config?.server}, and looking at ${config?.database}` + ); + connected = true; + return { + success: true, + message: "The sql server connection has been closed", + }; + } catch (error) { + createLog( + "error", + "lst", + "sqlProd", + `${JSON.stringify(error)}, "There was an error connecting to the pool."` + ); + throw new Error("There was an error closing the sql connection"); + } }; export const closePool = async () => { - try { - await pool.close(); - createLog("info", "lst", "sqlProd", "Connection pool closed"); - connected = false; - return {success: true, message: "The sql server connection has been closed"}; - } catch (error) { - createLog( - "error", - "lst", - "sqlProd", - `${JSON.stringify(error)}, "There was an error closing the sql connection"` - ); - throw new Error("There was an error closing the sql connection"); - } + if (!connected) { + createLog( + "error", + "lst", + "sqlProd", + "There is no connection a connection." + ); + return { success: false, message: "There is already a connection." }; + } + try { + await pool.close(); + createLog("info", "lst", "sqlProd", "Connection pool closed"); + connected = false; + return { + success: true, + message: "The sql server connection has been closed", + }; + } catch (error) { + createLog( + "error", + "lst", + "sqlProd", + `${JSON.stringify( + error + )}, "There was an error closing the sql connection"` + ); + throw new Error("There was an error closing the sql connection"); + } }; export async function query(queryToRun: string, name: string) { - /** - * Just an extra catch incase someone tried to run a query while we were not connected to the server or sql server - */ - const dbServer = await db.select().from(settings).where(eq(settings.name, "dbServer")); - const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`); + /** + * Just an extra catch incase someone tried to run a query while we were not connected to the server or sql server + */ + const dbServer = await db + .select() + .from(settings) + .where(eq(settings.name, "dbServer")); + const serverUp = await checkHostnamePort(`${dbServer[0].value}:1433`); - if (!serverUp) { - createLog("error", "lst", "server", `The sql ${dbServer[0].value} is not reachable`); - return {success: false, message: `The sql ${dbServer[0].value} is not reachable`}; + if (!serverUp) { + createLog( + "error", + "lst", + "server", + `The sql ${dbServer[0].value} is not reachable` + ); + return { + success: false, + message: `The sql ${dbServer[0].value} is not reachable`, + }; + } + + if (!connected) { + createLog( + "error", + "lst", + "server", + `The sql ${dbServer[0].value} is not connected` + ); + return { + success: false, + message: `The sql ${dbServer[0].value} is not not connected`, + }; + } + /** + * We no longer need to send over the plant token change as we do it inside the query function. + */ + const plantToken = await db + .select() + .from(settings) + .where(eq(settings.name, "plantToken")); + const query = queryToRun.replaceAll("test1", plantToken[0].value); + + try { + const result = await pool.request().query(query); + + return result.recordset; + } catch (error: any) { + if (error.code === "ETIMEOUT") { + createLog( + "error", + "lst", + "sqlProd", + `${JSON.stringify(error)}, ${name} did not run due to a timeout.` + ); + throw new Error(`${name} query did not run due to a timeout.`); } - if (!connected) { - createLog("error", "lst", "server", `The sql ${dbServer[0].value} is not connected`); - return {success: false, message: `The sql ${dbServer[0].value} is not not connected`}; + if (error.code === "EREQUEST") { + throw new Error( + `${name} encoutnered an error ${error.originalError.info.message}` + ); } - /** - * We no longer need to send over the plant token change as we do it inside the query function. - */ - const plantToken = await db.select().from(settings).where(eq(settings.name, "plantToken")); - const query = queryToRun.replaceAll("test1", plantToken[0].value); - try { - const result = await pool.request().query(query); - - return result.recordset; - } catch (error: any) { - if (error.code === "ETIMEOUT") { - createLog("error", "lst", "sqlProd", `${JSON.stringify(error)}, ${name} did not run due to a timeout.`); - throw new Error(`${name} query did not run due to a timeout.`); - } - - if (error.code === "EREQUEST") { - throw new Error(`${name} encoutnered an error ${error.originalError.info.message}`); - } - - //console.log(error.originalError.info.message); - //EREQUEST - //throw new Error(`${name} encoutnered an error ${error.code}`); - } + //console.log(error.originalError.info.message); + //EREQUEST + //throw new Error(`${name} encoutnered an error ${error.code}`); + } }