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"; 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); return {success: false, message: "The server is not installed."}; } return; // 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!); 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 () => { return; 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) { /** * 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}`); } }