Created
November 30, 2010 22:00
-
-
Save rjp/722505 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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