| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (function(module) { | 
					
						
							|  |  |  | 	'use strict'; | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 	var mongoClient = require('mongodb').MongoClient, | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 		winston = require('winston'), | 
					
						
							|  |  |  | 		nconf = require('nconf'), | 
					
						
							| 
									
										
										
										
											2013-12-02 22:48:32 -05:00
										 |  |  | 		express = require('express'), | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		mongoStore = require('connect-mongo')(express), | 
					
						
							|  |  |  | 		mongoHost = nconf.get('mongo:host'), | 
					
						
							|  |  |  | 		db; | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 	module.init = function(callback) { | 
					
						
							|  |  |  | 		mongoClient.connect('mongodb://'+ mongoHost + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'), function(err, _db) { | 
					
						
							|  |  |  | 			db = _db; | 
					
						
							|  |  |  | 			console.log('WE ARE CONNECTED'); | 
					
						
							| 
									
										
										
										
											2013-12-02 22:48:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				winston.error("NodeBB could not connect to your Mongo database. Mongo returned the following error: " + err.message); | 
					
						
							|  |  |  | 				process.exit(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			// TODO: fill out settings.db
 | 
					
						
							|  |  |  | 			module.sessionStore = new mongoStore({ | 
					
						
							|  |  |  | 				db: db | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 			db.createCollection('objects', function(err, _collection) { | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			callback(err); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 		// look up how its done in mongo
 | 
					
						
							|  |  |  | 		/*if (nconf.get('mongo:password')) { | 
					
						
							|  |  |  | 			redisClient.auth(nconf.get('mongo:password')); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		*/ | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-12-02 22:48:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Exported functions
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	module.getFileName = function(callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.info = function(callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// key
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.exists = function(key, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.delete = function(key, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.get = function(key, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 	module.set = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		throw new Error('not-implemented'); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 16:50:06 -05:00
										 |  |  | 	module.keys = function(key, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	//hashes
 | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	module.setObject = function(key, data, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		data['_key'] = key; | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 		db.collection('objects').update({_key:key}, {$set:data}, {upsert:true, w: 1}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	module.setObjectField = function(key, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 		var data = {}; | 
					
						
							|  |  |  | 		data[field] = value; | 
					
						
							|  |  |  | 		db.collection('objects').update({_key:key}, {$set:data}, {upsert:true, w: 1}, function(err, result) { | 
					
						
							|  |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getObject = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key}, function(err, item) { | 
					
						
							| 
									
										
										
										
											2013-12-03 16:50:06 -05:00
										 |  |  | 			if(item && item._id) { | 
					
						
							|  |  |  | 				delete item._id; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 			callback(err, item); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getObjectField = function(key, field, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 		module.getObjectFields(key, [field], function(err, data) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, data[field]); | 
					
						
							| 
									
										
										
										
											2013-12-03 17:43:12 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getObjectFields = function(key, fields, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var _fields = {}; | 
					
						
							|  |  |  | 		for(var i=0; i<fields.length; ++i) { | 
					
						
							| 
									
										
										
										
											2013-12-03 17:13:59 -05:00
										 |  |  | 			_fields[fields[i]] = 1; | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.collection('objects').findOne({_key:key}, {fields:_fields}, function(err, item) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(item === null) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 				item = {}; | 
					
						
							|  |  |  | 				for(var i=0; i<fields.length; ++i) { | 
					
						
							|  |  |  | 					item[fields[i]] = null; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 				for(var i=0; i<fields.length; ++i) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 					if(item[fields[i]] === null || item[fields[i]] === undefined) { | 
					
						
							|  |  |  | 						item[fields[i]] = null; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 			if(item && item._id) { | 
					
						
							| 
									
										
										
										
											2013-12-03 16:50:06 -05:00
										 |  |  | 				delete item._id; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			callback(err, item); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getObjectValues = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 16:50:06 -05:00
										 |  |  | 		module.getObject(key, function(err, data) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var values = []; | 
					
						
							|  |  |  | 			for(var key in data) { | 
					
						
							|  |  |  | 				values.push(data[key]); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			callback(null, values); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.isObjectField = function(key, field, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 18:03:50 -05:00
										 |  |  | 		var data = {}; | 
					
						
							|  |  |  | 		data[field] = ''; | 
					
						
							|  |  |  | 		db.collection('objects').findOne({_key:key}, {fields:data}, function(err, item) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(err, item && item[field]!== undefined && item[field] !== null); | 
					
						
							| 
									
										
										
										
											2013-12-03 17:13:59 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.deleteObjectField = function(key, field, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 17:13:59 -05:00
										 |  |  | 		var data = {}; | 
					
						
							|  |  |  | 		data[field] = ""; | 
					
						
							|  |  |  | 		db.collection('objects').update({_key:key}, {$unset : data}, function(err, result) { | 
					
						
							|  |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.incrObjectField = function(key, field, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 17:29:10 -05:00
										 |  |  | 		module.incrObjectFieldBy(key, field, 1, callback); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.decrObjectField = function(key, field, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 17:29:10 -05:00
										 |  |  | 		module.incrObjectFieldBy(key, field, -1, callback); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	module.incrObjectFieldBy = function(key, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 17:29:10 -05:00
										 |  |  | 		var data = {}; | 
					
						
							|  |  |  | 		data[field] = value; | 
					
						
							| 
									
										
										
										
											2013-12-03 18:19:27 -05:00
										 |  |  | 		db.collection('objects').update({_key:key}, {$inc : data}, {upsert:true}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-03 17:29:10 -05:00
										 |  |  | 			module.getObjectField(key, field, function(err, value) { | 
					
						
							|  |  |  | 				callback(err, value); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	// sets
 | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	module.setAdd = function(key, value, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.setRemove = function(key, value, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.isSetMember = function(key, value, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.isMemberOfSets = function(sets, value, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getSetMembers = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 		console.log('GETTING SET MEMBERS', key); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		db.collection('sets').findOne({_key:key}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(!data) { | 
					
						
							|  |  |  | 				console.log('GOT SET MEMBERS', []); | 
					
						
							|  |  |  | 				callback(null, []); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				console.log('GOT SET MEMBERS', data); | 
					
						
							|  |  |  | 				callback(null, data); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.setCount = function(key, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.setRemoveRandom = function(key, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// sorted sets
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.sortedSetAdd = function(key, score, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var data = { | 
					
						
							|  |  |  | 			score:score, | 
					
						
							|  |  |  | 			value:value | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:30:36 -05:00
										 |  |  | 		data.setName = key; | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 		module.setObject(key+':'+value, data, callback); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.sortedSetRemove = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:30:36 -05:00
										 |  |  | 		db.collection('objects').remove({setName:key, value:value}, function(err, result) { | 
					
						
							|  |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 	function getSortedSetRange(key, start, stop, sort, callback) { | 
					
						
							|  |  |  | 		db.collection('objects').find({setName:key}, {fields:{value:1}}) | 
					
						
							|  |  |  | 			.limit(stop - start + 1) | 
					
						
							|  |  |  | 			.skip(start) | 
					
						
							|  |  |  | 			.sort({score: sort}) | 
					
						
							|  |  |  | 			.toArray(function(err, data) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// maybe this can be done with mongo?
 | 
					
						
							|  |  |  | 				data = data.map(function(item) { | 
					
						
							|  |  |  | 					return item.value; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				callback(err, data); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	module.getSortedSetRange = function(key, start, stop, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 		getSortedSetRange(key, start, stop, 1, callback); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getSortedSetRevRange = function(key, start, stop, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 		getSortedSetRange(key, start, stop, -1, callback); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getSortedSetRevRangeByScore = function(args, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//var args = ['topics:recent', '+inf', timestamp - since, 'LIMIT', start, end - start + 1];
 | 
					
						
							|  |  |  | 		var key = args[0], | 
					
						
							|  |  |  | 			max = (args[1] === '+inf')?Number.MAX_VALUE:args[1], | 
					
						
							|  |  |  | 			min = args[2], | 
					
						
							|  |  |  | 			start = args[4], | 
					
						
							|  |  |  | 			stop = args[5]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.collection('objects').find({setName:key, score: {$gt:min, $lt:max}}, {fields:{value:1}}) | 
					
						
							|  |  |  | 			.limit(stop - start + 1) | 
					
						
							|  |  |  | 			.skip(start) | 
					
						
							|  |  |  | 			.sort({score: -1}) | 
					
						
							|  |  |  | 			.toArray(function(err, data) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// maybe this can be done with mongo?
 | 
					
						
							|  |  |  | 				data = data.map(function(item) { | 
					
						
							|  |  |  | 					return item.value; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				callback(err, data); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.sortedSetCount = function(key, min, max, callback) { | 
					
						
							|  |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// lists
 | 
					
						
							|  |  |  | 	module.listPrepend = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 		module.isObjectField(key, 'array', function(err, exists) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(exists) { | 
					
						
							|  |  |  |  				db.collection('objects').update({_key:key}, {'$set': {'array.-1': value}}, {upsert:true, w:1 }, function(err, result) { | 
					
						
							|  |  |  | 					callback(err, result); | 
					
						
							|  |  |  | 	 			}); | 
					
						
							|  |  |  |  			} else { | 
					
						
							|  |  |  |  				module.listAppend(key, value, callback); | 
					
						
							|  |  |  |  			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  		}) | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.listAppend = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 		db.collection('objects').update({ _key: key }, { $push: { array: value } }, {upsert:true, w:1}, function(err, result) { | 
					
						
							|  |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getListRange = function(key, start, stop, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(stop === -1) { | 
					
						
							|  |  |  | 			// mongo doesnt allow -1 as the count argument in slice
 | 
					
						
							|  |  |  | 			// pass in a large value to retrieve the whole array
 | 
					
						
							|  |  |  | 			stop = Math.pow(2, 31) - 2; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.collection('objects').findOne({_key:key}, { array: { $slice: [start, stop - start + 1] }}, function(err, data) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if(data && data.array) { | 
					
						
							|  |  |  | 					callback(err, data.array); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					callback(err, []); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }(exports)); | 
					
						
							|  |  |  | 
 |