import { createConnection, Connection } from "mysql"; import { conf } from "./ConfigHelper"; /** * Database helper * * @author Pierre HUBERT */ export interface QueryInformation { table: string, fields ?: Array, where ?: Object, limit ?: number, } export class DatabaseHelper { private static connection : Connection; /** * Connect to database */ static async connect() { this.connection = createConnection({ host: conf().database.host, user: conf().database.user, password: conf().database.password, database: conf().database.dbName }); await new Promise((resolve, reject) => { this.connection.connect(err => { if(err) { console.error("Could not connect to database !"); console.error(err); reject(err); return; } console.info("Connected to database."); resolve(); }); }) } /** * Query the database (SELECT) * * @param info Information about the query */ static async Query(info: QueryInformation) : Promise> { // Prepare SQL request let request = "SELECT "; // Requested fields request += info.fields ? info.fields.join(",") : "*"; request += " FROM " + info.table; let args = []; // Add where arguments if(info.where) { request += " WHERE "; for(const k in info.where) { if(!info.where.hasOwnProperty(k)) continue; const v = info.where[k].toString(); request += k; request += v.startsWith("%") || v.endsWith("%") ? " LIKE " : " = " request += "? AND " args.push(v); }; // Remove the last (useless) AND request = request.substr(0, request.length - 4) } // Limit (if any) if(info.limit) request += " LIMIT " + info.limit; // Execute request return await new Promise((resolve, reject) => { this.connection.query( request, args, (err, result, fields) => { if(err) { reject(err); return; } resolve(result); }); }); } /** * Query a single row on the database * * @param info Information about the request * @returns First matching row / null if none found */ static async QueryRow(info : QueryInformation) : Promise { info.limit = 1; const result = await this.Query(info); if(result.length == 0) return null; return result[0]; } /** * Insert an new entry into the database * * @param info Information about the entry * @returns The ID of the inserted column (if any) */ static async InsertRow(table : string, values : any) : Promise { return new Promise((resolve, reject) => { this.connection.query("INSERT INTO " + table + " SET ?", values, (err, results, f) => { if(err) reject(err); else resolve(results.insertId); }); }); } /** * Delete entries from a table * * @param table Target table * @param where Where arguments */ static async DeleteRows(table: string, where: any) { let whereArgs = ""; let args = []; // Process conditions for (const key in where) { if (where.hasOwnProperty(key)) { const value = where[key]; whereArgs += (whereArgs == "" ? "" : " AND ") + key + " = ?"; args.push(value); } } if(whereArgs == "") throw Error("Error : table could accidentally get purged!"); return new Promise((resolve, reject) => { this.connection.query("DELETE FROM " + table + " WHERE " + whereArgs, args, (err, r, f) => { if(err) reject(err) else resolve(); }); }) } }