UNPKG

wotcs-api-system

Version:

Base system used to build WoTcs clans and players API

124 lines (110 loc) 4.09 kB
var cls = require('../base/class'); var pg = require('pg'); var url = require('url'); var _ = require('underscore'); module.exports = cls.Class.extend({ init: function(url, callback) { this.url = url; this.ready = false; this.connected_callback = callback; this.connect(); this.queues = {}; var self = this; setInterval(function() { self.step(); },5000); }, connect: function() { const params = url.parse(this.url); const auth = params.auth.split(':'); var self = this; const config = { user: auth[0], password: auth[1], host: params.hostname, port: params.port, database: params.pathname.split('/')[1], ssl: true, max: 3, idleTimeoutMillis: 30000, }; this.pool = new pg.Pool(config); this.pool.connect(function(err, client, done) { if(!err) { done(); console.log('PG pool established...') pg.connect(self.url, function(err, client, done) { if(!err) { self.client = client; self.done_callback = done; } if(self.connected_callback){ self.connected_callback(err); } }); } }); }, query: function(query, callback, tableName) { var start = new Date(); this.pool.connect(function(err, client, done) { if(err) { console.error('Error aquiring connection from pool', err, query); done(); return callback(err, null); } client.query(query, function(err, results) { if(err) { console.error('Error running query', err, query); return callback(err, null); } var duration = ((new Date()).getTime() - start.getTime()) + 'ms'; tableName = tableName || ''; var method = query.split(' ')[0]; if(method != 'SELECT' && method != 'WITH'){ console.log(method, results.rowCount, tableName, duration); } done(); callback(err, results); }); }); }, batchQuery: function(query, tableName, callback) { var method = query.split(' ')[0]; this.addQueryToBatch(query, method, tableName, callback); }, addQueryToBatch: function(query, method, tableName, callback) { if(!this.queues[tableName]){ this.queues[tableName] = {}; } if(!this.queues[tableName][method]){ this.queues[tableName][method] = []; } this.queues[tableName][method].push({query: query, callback: callback}); }, step: function() { var self = this; _.each(this.queues, function(table, tableName) { _.each(table, function(methodQueue, method){ if(methodQueue.length > 0){ var start = new Date(); var queue = _.clone(methodQueue); self.queues[tableName][method] = []; var query = _(queue).pluck('query').join(';'); self.client.query(query, function(err) { var duration = ((new Date()).getTime() - start.getTime()) + 'ms'; console.log('Batch', method, queue.length, tableName, duration); if(err) { console.error('Error running query', err, query); } _(_(queue).pluck('callback')).each(function(callback){ if(callback){ callback(err); } }); }); } }); }); } });