mailtrain/obsolete/lib/db-old.js

118 lines
3.4 KiB
JavaScript
Raw Normal View History

2016-04-04 12:36:30 +00:00
'use strict';
let config = require('config');
let mysql = require('mysql2');
let redis = require('redis');
let Lock = require('redfour');
let stringifyDate = require('json-stringify-date');
2017-07-08 16:57:41 +00:00
let senders = require('./senders');
2016-04-04 12:36:30 +00:00
2018-04-29 16:13:40 +00:00
const bluebird = require('bluebird');
2016-04-04 12:36:30 +00:00
module.exports = mysql.createPool(config.mysql);
if (config.redis && config.redis.enabled) {
module.exports.redis = redis.createClient(config.redis);
let queueLock = new Lock({
redis: config.redis,
namespace: 'mailtrain:lock'
});
2018-04-29 16:13:40 +00:00
module.exports.getLock = bluebird.promisify((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);
}
});
});
2018-04-29 16:13:40 +00:00
});
2018-04-29 16:13:40 +00:00
module.exports.clearCache = bluebird.promisify((key, callback) => {
2017-06-01 11:08:45 +00:00
module.exports.redis.del('mailtrain:cache:' + key, err => callback(err));
2018-04-29 16:13:40 +00:00
});
2018-04-29 16:13:40 +00:00
module.exports.addToCache = bluebird.promisify((key, value, callback) => {
if (!value) {
return setImmediate(() => callback());
}
module.exports.redis.multi().
2017-06-15 19:26:35 +00:00
lpush('mailtrain:cache:' + key, stringifyDate.stringify(value)).
expire('mailtrain:cache:' + key, 24 * 3600).
exec(err => callback(err));
2018-04-29 16:13:40 +00:00
});
2018-04-29 16:13:40 +00:00
module.exports.getFromCache = bluebird.promisify((key, callback) => {
module.exports.redis.rpop('mailtrain:cache:' + key, (err, value) => {
if (err) {
return callback(err);
}
try {
value = stringifyDate.parse(value);
} catch (E) {
return callback(E);
}
return callback(null, value);
});
2018-04-29 16:13:40 +00:00
});
} else {
// fakelock. does not lock anything
2018-04-29 16:13:40 +00:00
module.exports.getLock = bluebird.promisify((id, callback) => {
setImmediate(() => callback(null, {
lock: false,
release(done) {
setImmediate(done);
}
}));
2018-04-29 16:13:40 +00:00
});
let caches = new Map();
2018-04-29 16:13:40 +00:00
module.exports.clearCache = bluebird.promisify((key, callback) => {
caches.delete(key);
2018-04-29 16:13:40 +00:00
// This notifies the callback below - i.e. process.on(...) - which is installed in the sender process.
2017-07-08 16:57:41 +00:00
senders.workers.forEach(child => {
2017-06-01 11:08:45 +00:00
child.send({
cmd: 'db.clearCache',
key
});
});
setImmediate(() => callback());
2018-04-29 16:13:40 +00:00
});
2017-06-01 11:08:45 +00:00
process.on('message', m => {
if (m && m.cmd === 'db.clearCache' && m.key) {
caches.delete(m.key);
}
});
2018-04-29 16:13:40 +00:00
module.exports.addToCache = bluebird.promisify((key, value, callback) => {
if (!caches.has(key)) {
caches.set(key, []);
}
caches.get(key).push(value);
setImmediate(() => callback());
2018-04-29 16:13:40 +00:00
});
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));
};
}