Skip to content

Instantly share code, notes, and snippets.

@rjp
Created November 30, 2010 22:00
Show Gist options
  • Save rjp/722505 to your computer and use it in GitHub Desktop.
Save rjp/722505 to your computer and use it in GitHub Desktop.
var sys = require('sys');
var connect = require('connect');
var redisFactory = require('redis-node');
var redis = redisFactory.createClient();
var server = connect.createServer();
// test with: ab -n 5000 -c 40 http://127.0.0.1:3000/folders
function buffer_to_strings(x) {
for(var i in x) {
if (typeof x[i] === "object" || typeof x[i] === "buffer") {
var temp = x[i].toString('utf8');
x[i] = temp;
}
}
return x;
}
// perform asynchronous callbacks for each item in a list and then
// pass the new list off to a final callback
function map(list, each_callback, final_callback) {
// shortcut any processing if we've got an empty list
if (list === undefined || list === null || list.length === 0) {
final_callback(undefined, []);
return;
}
var ilist = new Array;
var lsize = list.length;
var mid_callback = function(err, val){
if (err) final_callback(err, undefined);
ilist.push(val);
if (ilist.length == lsize) {
final_callback(undefined, ilist);
}
};
for(var i in list) {
each_callback(list[i], i, mid_callback);
}
}
// work out unread count for a folder for a user
function get_folder_unread(folder, user_read, callback) {
var c;
redis.scard('folder:'+folder, function(e, c){
if (e) throw(e);
redis.sdiff('folder:'+folder, user_read, function(e,v){
if (e) throw(e);
callback(undefined, {folder:folder, unread:v.length, count: c});
})
});
}
function json_folders(req, res, auth) {
redis.smembers('user:test:subs', function(err, subs) {
var r = [];
if(err) { throw(err); }
var q = subs;
buffer_to_strings(subs);
map(subs, function(f, i, c) {
if (f != "test" && f != "mine") {
console.log(sys.inspect(q));
console.log("incorrect response from smembers:"+f);
process.exit(1);
}
get_folder_unread(f, 'user:test:read', c);
}, function(e, newlist) {
res.writeHead(200, {'Content-Type':'application/json'});
res.end(JSON.stringify(newlist));
}
);
});
}
function folders(app) {
app.get('/', function(req, res, next){
json_folders(req, res, 'test');
});
}
server.use('/folders', connect.router(folders));
// make sure we have the right data
redis.select(2);
redis.del('folder:test');
redis.del('folder:mine');
redis.del('user:test:subs');
redis.del('user:test:read');
redis.sadd('folder:test', 1);
redis.sadd('folder:test', 2);
redis.sadd('folder:test', 4);
redis.sadd('folder:mine', 3);
redis.sadd('folder:mine', 5);
redis.sadd('user:test:subs', 'test');
redis.sadd('user:test:subs', 'mine');
redis.sadd('user:test:read', 2);
server.listen(3000);
console.log('Connect server listening');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment