Skip to content

Instantly share code, notes, and snippets.

@asci
Created January 10, 2013 21:02
Show Gist options
  • Save asci/4505764 to your computer and use it in GitHub Desktop.
Save asci/4505764 to your computer and use it in GitHub Desktop.
/**
* Created with JetBrains WebStorm.
* User: artem
* Date: 10.01.13
* Time: 21:34
* To change this template use File | Settings | File Templates.
*/
var mysql = require('mysql'),
Promise = require("promise").Promise;
var Server = function (user, pass, host) {
this._conn = mysql.createConnection({
host: host,
user: user,
password: pass
});
this.queue = [];
};
Server.prototype.query = function (query, params, callback) {
var qid = Math.random(),
queue = this.queue;
queue.push(qid);
this._conn.query(query, params, function (err, rows, fields) {
queue.splice(queue.indexOf(qid), 1);
callback(err, rows, fields);
})
};
//Test data
var master = new Server('root', '', 'localhost'),
slaves = [
new Server('root', '', 'localhost'),
new Server('root', '', 'localhost'),
new Server('root', '', 'localhost'),
new Server('root', '', 'localhost')
];
/**
* Select less loaded server
* @return {Server}
*/
var getFreeServer = function () {
var minInd = 0;
for (var i = 0; i < slaves.length; i++) {
if (slaves[i].queue.length === 0) {
return slaves[i];
}
if (slaves[i].queue.length < slaves[minInd].queue.length) {
minInd = i;
}
}
return slaves[minInd];
};
module.exports = {
select: function (query, params) {
var promise = new Promise(),
server = getFreeServer();
server.query(query, params, function (err, result) {
if (err) promise.errback(err);
promise.resolve(result);
});
return promise;
},
del: function (query, params) {
var promise = new Promise();
master.query(query, params, function (err, result) {
if (err) promise.errback(err);
promise.resolve(result);
});
return promise;
},
update: function (query, params) {
var promise = new Promise();
master.query(query, params, function (err, result) {
if (err) promise.errback(err);
promise.resolve(result);
});
return promise;
},
create: function (query, params) {
var promise = new Promise();
master.query(query, params, function (err, result) {
if (err) promise.errback(err);
promise.resolve(result);
});
return promise;
},
masterQuery: function (query, params) {
var promise = new Promise();
master.query(query, params, function (err, result) {
if (err) promise.errback(err);
promise.resolve(result);
});
return promise;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment