From 0161108e8733ed5735548ec55c9b021147c62e52 Mon Sep 17 00:00:00 2001 From: sairajzero Date: Mon, 30 Aug 2021 22:02:11 +0530 Subject: [PATCH] Create database.js --- src/database.js | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/database.js diff --git a/src/database.js b/src/database.js new file mode 100644 index 0000000..b237267 --- /dev/null +++ b/src/database.js @@ -0,0 +1,86 @@ +'use strict'; +var mysql = require('mysql'); + +function Database(user, password, dbname, host = 'localhost') { + const db = {}; + + Object.defineProperty(db, "connect", { + get: () => new Promise((resolve, reject) => { + db.pool.getConnection((error, conn) => { + if (error) + reject(error); + else + resolve(conn); + }); + }) + }); + + Object.defineProperty(db, "query", { + value: (sql, values) => new Promise((resolve, reject) => { + db.connect.then(conn => { + const fn = (err, res) => { + conn.release(); + (err ? reject(err) : resolve(res)); + }; + if (values) + conn.query(sql, values, fn); + else + conn.query(sql, fn); + }).catch(error => reject(error)); + }) + }); + + Object.defineProperty(db, "TxQuery", { + value: (queries) => new Promise((resolve, reject) => { + db.connect.then(conn => { + conn.beginTransaction((err) => { + if (err) + conn.rollback(() => { + conn.release(); + reject(err); + }); + else { + (function queryFn(result) { + if (!queries.length) { + conn.release(); + resolve(result); + } else { + let q_i = queries.shift(); + const callback = function(err, res) { + if (err) + conn.rollback(() => { + conn.release(); + reject(err); + }); + else { + result.push(res); + queryFn(result); + } + }; + if (q_i[1]) + conn.query(q_i[0], q_i[1], callback); + else + conn.query(q_i[0], callback); + } + })([]); + } + }); + }).catch(error => reject(error)); + }) + }); + + return new Promise((resolve, reject) => { + db.pool = mysql.createPool({ + host: host, + user: user, + password: password, + database: dbname + }); + db.connect.then(conn => { + conn.release(); + resolve(db); + }).catch(error => reject(error)); + }); +} + +module.exports = Database; \ No newline at end of file