aboutsummaryrefslogtreecommitdiff
path: root/src/lib/db.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/db.js')
-rw-r--r--src/lib/db.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/lib/db.js b/src/lib/db.js
new file mode 100644
index 0000000..7874a92
--- /dev/null
+++ b/src/lib/db.js
@@ -0,0 +1,49 @@
+const config = require('./config')
+const {getLogger} = require('./logger')
+const mysql = require('promise-mysql')
+
+let link
+const logger = getLogger('db')
+
+async function init() {
+ link = await mysql.createConnection({
+ host: config.get('mysql_host'),
+ user: config.get('mysql_user'),
+ password: config.get('mysql_password'),
+ database: config.get('mysql_database')
+ })
+}
+
+function wrap(method, isAsync = true, log = true) {
+ return isAsync ? async function(...args) {
+ if (log)
+ logger.trace(`${method}: `, args)
+
+ try {
+ return await link[method](...args)
+ } catch (error) {
+ logger.error(`db.${method}:`, error, link)
+
+ if ( error.code === 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR'
+ || error.code === 'PROTOCOL_CONNECTION_LOST'
+ || error.fatal === true) {
+ // try to reconnect and call it again, once
+ await init()
+ return await link[method](...args)
+ }
+ }
+ } : function(...args) {
+ if (log)
+ logger.trace(`${method}: `, args)
+
+ return link[method](...args)
+ }
+}
+
+module.exports = {
+ init,
+ query: wrap('query'),
+ beginTransaction: wrap('beginTransaction'),
+ commit: wrap('commit'),
+ escape: wrap('escape', false, false)
+} \ No newline at end of file