diff options
Diffstat (limited to 'src/db.js')
-rw-r--r-- | src/db.js | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/db.js b/src/db.js new file mode 100644 index 0000000..0ffba84 --- /dev/null +++ b/src/db.js @@ -0,0 +1,49 @@ +const {workerConfig} = 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: workerConfig.mysql_host, + user: workerConfig.mysql_user, + password: workerConfig.mysql_password, + database: workerConfig.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 |