2016-04-04 12:36:30 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
let config = require('config');
|
|
|
|
let mysql = require('mysql');
|
2016-12-10 22:38:54 +00:00
|
|
|
let redis = require('redis');
|
|
|
|
let Lock = require('redfour');
|
2016-04-04 12:36:30 +00:00
|
|
|
|
|
|
|
module.exports = mysql.createPool(config.mysql);
|
2017-04-27 20:35:53 +00:00
|
|
|
if (config.redis && config.redis.enabled) {
|
2016-12-10 22:38:54 +00:00
|
|
|
|
|
|
|
module.exports.redis = redis.createClient(config.redis);
|
|
|
|
|
|
|
|
let queueLock = new Lock({
|
|
|
|
redis: config.redis,
|
|
|
|
namespace: 'mailtrain:lock'
|
|
|
|
});
|
|
|
|
|
|
|
|
module.exports.getLock = (id, callback) => {
|
|
|
|
queueLock.waitAcquireLock(id, 60 * 1000 /* Lock expires after 60sec */ , 10 * 1000 /* Wait for lock for up to 10sec */ , (err, lock) => {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
if (!lock) {
|
|
|
|
return callback(null, false);
|
|
|
|
}
|
|
|
|
return callback(null, {
|
|
|
|
lock,
|
|
|
|
release(done) {
|
|
|
|
queueLock.releaseLock(lock, done);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.clearCache = (key, callback) => {
|
|
|
|
module.exports.redis.del(key, err => callback(err));
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.addToCache = (key, value, callback) => {
|
|
|
|
if (!value) {
|
|
|
|
return setImmediate(() => callback());
|
|
|
|
}
|
|
|
|
module.exports.redis.multi().
|
|
|
|
lpush('mailtrain:cache:' + key, JSON.stringify(value)).
|
|
|
|
expire('mailtrain:cache:' + key, 24 * 3600).
|
|
|
|
exec(err => callback(err));
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.getFromCache = (key, callback) => {
|
|
|
|
module.exports.redis.rpop('mailtrain:cache:' + key, (err, value) => {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
value = JSON.parse(value);
|
|
|
|
} catch (E) {
|
|
|
|
return callback(E);
|
|
|
|
}
|
|
|
|
|
|
|
|
return callback(null, value);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// fakelock. does not lock anything
|
|
|
|
module.exports.getLock = (id, callback) => {
|
|
|
|
setImmediate(() => callback(null, {
|
|
|
|
lock: false,
|
|
|
|
release(done) {
|
|
|
|
setImmediate(done);
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
};
|
|
|
|
|
|
|
|
let caches = new Map();
|
|
|
|
|
|
|
|
module.exports.clearCache = (key, callback) => {
|
|
|
|
caches.delete(key);
|
|
|
|
setImmediate(() => callback());
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.addToCache = (key, value, callback) => {
|
|
|
|
if (!caches.has(key)) {
|
|
|
|
caches.set(key, []);
|
|
|
|
}
|
|
|
|
caches.get(key).push(value);
|
|
|
|
setImmediate(() => callback());
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.getFromCache = (key, callback) => {
|
|
|
|
let value;
|
|
|
|
if (caches.has(key)) {
|
|
|
|
value = caches.get(key).shift();
|
|
|
|
if (!caches.get(key).length) {
|
|
|
|
caches.delete(key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setImmediate(() => callback(null, value));
|
|
|
|
};
|
|
|
|
}
|