diff --git a/engine/query/get.js b/engine/query/get.js index 80c8370..d3dd4bc 100644 --- a/engine/query/get.js +++ b/engine/query/get.js @@ -51,7 +51,7 @@ async function localGet({ options, dbSchema }) { (query.match( /^alter|^delete|information_schema|databases|^create/i ) || - !query.match(/^select/i)) + !query.match(/^select|^\( ?select/i)) ) { return { success: false, msg: "Wrong Input" }; } diff --git a/package-lock.json b/package-lock.json index 3584eb3..90b880a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@moduletrace/datasquirel", - "version": "2.6.5", + "version": "2.6.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@moduletrace/datasquirel", - "version": "2.6.5", + "version": "2.6.7", "license": "ISC", "dependencies": { "@types/ace": "^0.0.52", @@ -15,7 +15,6 @@ "dotenv": "^16.3.1", "generate-password": "^1.7.1", "lodash": "^4.17.21", - "mariadb": "^3.4.0", "mysql": "^2.18.1", "nodemailer": "^6.9.14", "sanitize-html": "^2.13.1", @@ -37,12 +36,6 @@ "integrity": "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ==", "license": "MIT" }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "license": "MIT" - }, "node_modules/@types/jquery": { "version": "3.5.32", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.32.tgz", @@ -72,6 +65,7 @@ "version": "22.7.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -136,15 +130,6 @@ "node": ">=0.10.0" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -260,18 +245,6 @@ "entities": "^4.4.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -297,28 +270,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/mariadb": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.0.tgz", - "integrity": "sha512-hdRPcAzs+MTxK5VG1thBW18gGTlw6yWBe9YnLB65GLo7q0fO5DWsgomIevV/pXSaWRmD3qi6ka4oSFRTExRiEQ==", - "license": "LGPL-2.1-or-later", - "dependencies": { - "@types/geojson": "^7946.0.14", - "@types/node": "^22.5.4", - "denque": "^2.1.0", - "iconv-lite": "^0.6.3", - "lru-cache": "^10.3.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/mysql": { "version": "2.18.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", @@ -424,12 +375,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, "node_modules/sanitize-html": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.1.tgz", @@ -485,6 +430,7 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "devOptional": true, "license": "MIT" }, "node_modules/util-deprecate": { diff --git a/package-shared/utils/backend/global-db/LOCAL_DB_HANDLER.js b/package-shared/utils/backend/global-db/LOCAL_DB_HANDLER.js index cb2b596..36d50e0 100644 --- a/package-shared/utils/backend/global-db/LOCAL_DB_HANDLER.js +++ b/package-shared/utils/backend/global-db/LOCAL_DB_HANDLER.js @@ -3,35 +3,6 @@ const mysql = require("serverless-mysql"); const grabDbSSL = require("../grabDbSSL"); -// const mariadb = require("mariadb"); -// const pool = mariadb.createPool({ -// host: process.env.DSQL_DB_HOST, -// user: process.env.DSQL_DB_USERNAME, -// password: process.env.DSQL_DB_PASSWORD, -// database: process.env.DSQL_DB_NAME, -// port: process.env.DSQL_DB_PORT -// ? Number(process.env.DSQL_DB_PORT) -// : undefined, -// charset: "utf8mb4", -// ssl: true, -// }); - -const MASTER = mysql({ - config: { - host: process.env.DSQL_DB_HOST, - user: process.env.DSQL_DB_USERNAME, - password: process.env.DSQL_DB_PASSWORD, - database: process.env.DSQL_DB_NAME, - port: process.env.DSQL_DB_PORT - ? Number(process.env.DSQL_DB_PORT) - : undefined, - charset: "utf8mb4", - ssl: grabDbSSL(), - timeout: 1000, - connectTimeout: 1000, - }, -}); - /** * DSQL user read-only DB handler * @param {object} params @@ -41,27 +12,40 @@ const MASTER = mysql({ * @param {string[]} [params.queryValues] */ async function LOCAL_DB_HANDLER(/** @type {any[]} */ ...args) { - MASTER.config({ - host: process.env.DSQL_DB_HOST, - user: process.env.DSQL_DB_USERNAME, - password: process.env.DSQL_DB_PASSWORD, - database: process.env.DSQL_DB_NAME, - port: process.env.DSQL_DB_PORT - ? Number(process.env.DSQL_DB_PORT) - : undefined, - charset: "utf8mb4", - ssl: grabDbSSL(), - timeout: 1000, - connectTimeout: 1000, + const MASTER = mysql({ + config: { + host: process.env.DSQL_DB_HOST, + user: process.env.DSQL_DB_USERNAME, + password: process.env.DSQL_DB_PASSWORD, + database: process.env.DSQL_DB_NAME, + port: process.env.DSQL_DB_PORT + ? Number(process.env.DSQL_DB_PORT) + : undefined, + charset: "utf8mb4", + ssl: grabDbSSL(), + timeout: 1000, + connectTimeout: 1000, + }, + onConnect: () => { + console.log("Connection Successful!"); + }, + onConnectError: (/** @type {any} */ err) => { + console.log("Connection Error", err.message); + }, + onError: (/** @type {any} */ err) => { + console.log("Client Error", err.message); + }, }); + console.log("Querying ..."); + try { const results = await MASTER.query(...args); await MASTER.end(); return JSON.parse(JSON.stringify(results)); } catch (/** @type {any} */ error) { - console.log("DB Error =>", error); + console.log("DB Error =>", error.message); return { success: false, error: error.message, diff --git a/package-shared/utils/backend/grabDbSSL.js b/package-shared/utils/backend/grabDbSSL.js index b4b5b2f..8356e65 100644 --- a/package-shared/utils/backend/grabDbSSL.js +++ b/package-shared/utils/backend/grabDbSSL.js @@ -8,9 +8,6 @@ const fs = require("fs"); module.exports = function grabDbSSL() { const SSL_DIR = process.env.DSQL_SSL_DIR; if (!SSL_DIR?.match(/./)) { - // console.log( - // "No SSL certificate provided. Query will run in normal mode. To add SSL add an env path dir `DSQL_SSL_DIR` with a file named `ca-cert.pem`" - // ); return undefined; } diff --git a/package.json b/package.json index b22a6fd..e5bb017 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/datasquirel", - "version": "2.6.6", + "version": "2.6.7", "description": "Cloud-based SQL data management tool", "main": "index.js", "bin": { @@ -36,7 +36,6 @@ "dotenv": "^16.3.1", "generate-password": "^1.7.1", "lodash": "^4.17.21", - "mariadb": "^3.4.0", "mysql": "^2.18.1", "nodemailer": "^6.9.14", "sanitize-html": "^2.13.1", diff --git a/utils/get.js b/utils/get.js index 6fd2512..d00aac2 100644 --- a/utils/get.js +++ b/utils/get.js @@ -19,10 +19,11 @@ const grabHostNames = require("../package-shared/utils/grab-host-names"); * @param {string} params.query - SQL Query * @param {string[]} [params.queryValues] - An array of query values if using "?" placeholders * @param {string} [params.tableName] - Name of the table to query + * @param {boolean} [params.useLocal] - Whether to use a remote database instead of API * * @returns { Promise } - Return Object */ -async function get({ key, db, query, queryValues, tableName }) { +async function get({ key, db, query, queryValues, tableName, useLocal }) { const { host, port, scheme } = grabHostNames(); /** @@ -37,7 +38,8 @@ async function get({ key, db, query, queryValues, tableName }) { DSQL_DB_HOST?.match(/./) && DSQL_DB_USERNAME?.match(/./) && DSQL_DB_PASSWORD?.match(/./) && - DSQL_DB_NAME?.match(/./) + DSQL_DB_NAME?.match(/./) && + useLocal ) { /** @type {import("../package-shared/types").DSQL_DatabaseSchemaType | undefined} */ let dbSchema; diff --git a/utils/post.js b/utils/post.js index 2918060..f3794e7 100644 --- a/utils/post.js +++ b/utils/post.js @@ -1,7 +1,5 @@ // @ts-check -const http = require("http"); -const https = require("https"); const path = require("path"); const fs = require("fs"); const localPost = require("../engine/query/post"); @@ -17,10 +15,18 @@ const grabHostNames = require("../package-shared/utils/grab-host-names"); * @param {import("../package-shared/types").PostDataPayload | string} params.query - SQL query String or Request Object * @param {any[]} [params.queryValues] - Query Values if using "?" placeholders * @param {string} [params.tableName] - Name of the table to query + * @param {boolean} [params.useLocal] - Whether to use a remote database instead of API * * @returns { Promise } - Return Object */ -async function post({ key, query, queryValues, database, tableName }) { +async function post({ + key, + query, + queryValues, + database, + tableName, + useLocal, +}) { const { host, port, scheme } = grabHostNames(); /** @@ -35,7 +41,8 @@ async function post({ key, query, queryValues, database, tableName }) { DSQL_DB_HOST?.match(/./) && DSQL_DB_USERNAME?.match(/./) && DSQL_DB_PASSWORD?.match(/./) && - DSQL_DB_NAME?.match(/./) + DSQL_DB_NAME?.match(/./) && + useLocal ) { /** @type {import("../package-shared/types").DSQL_DatabaseSchemaType | undefined} */ let dbSchema;