| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (function(module) { | 
					
						
							|  |  |  | 	'use strict'; | 
					
						
							| 
									
										
										
										
											2013-12-09 14:16:04 -05:00
										 |  |  | 	var winston = require('winston'), | 
					
						
							| 
									
										
										
										
											2013-12-04 15:11:17 -05:00
										 |  |  | 		async = require('async'), | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 		nconf = require('nconf'), | 
					
						
							| 
									
										
										
										
											2013-12-02 22:48:32 -05:00
										 |  |  | 		express = require('express'), | 
					
						
							| 
									
										
										
										
											2013-12-09 14:16:04 -05:00
										 |  |  | 		db, | 
					
						
							|  |  |  | 		mongoClient, | 
					
						
							|  |  |  | 		mongoStore; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	try { | 
					
						
							|  |  |  | 		mongoClient = require('mongodb').MongoClient; | 
					
						
							|  |  |  | 		mongoStore = require('connect-mongo')(express); | 
					
						
							|  |  |  | 	} catch (err) { | 
					
						
							| 
									
										
										
										
											2013-12-09 14:37:13 -05:00
										 |  |  | 		winston.error('Unable to initialize MongoDB! Is MongoDB installed? Error :' + err.message); | 
					
						
							| 
									
										
										
										
											2013-12-09 14:16:04 -05:00
										 |  |  | 		process.exit(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 	module.init = function(callback) { | 
					
						
							| 
									
										
										
										
											2013-12-09 14:16:04 -05:00
										 |  |  | 		mongoClient.connect('mongodb://'+ nconf.get('mongo:host') + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'), function(err, _db) { | 
					
						
							| 
									
										
										
										
											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-06 14:34:25 -05:00
										 |  |  | 			db = _db; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 14:22:31 -05:00
										 |  |  | 			module.client = db; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			module.sessionStore = new mongoStore({ | 
					
						
							|  |  |  | 				db: db | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 14:31:11 -05:00
										 |  |  | 			if(nconf.get('mongo:password') && nconf.get('mongo:username')) { | 
					
						
							|  |  |  | 				db.authenticate(nconf.get('mongo:username'), nconf.get('mongo:password'), function (err) { | 
					
						
							|  |  |  | 					if(err) { | 
					
						
							|  |  |  | 						winston.error(err.message); | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 						process.exit(); | 
					
						
							| 
									
										
										
										
											2013-12-06 14:31:11 -05:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 					createCollections(); | 
					
						
							| 
									
										
										
										
											2013-12-05 21:07:35 -05:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				createCollections(); | 
					
						
							| 
									
										
										
										
											2013-12-06 14:31:11 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-05 21:07:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 			function createCollections() { | 
					
						
							|  |  |  | 				db.createCollection('objects', function(err, collection) { | 
					
						
							|  |  |  | 					if(err) { | 
					
						
							|  |  |  | 						winston.error("Error creating collection " + err.message); | 
					
						
							|  |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if(collection) { | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 						collection.ensureIndex({_key :1}, {background:true}, function(err, name){ | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 							if(err) { | 
					
						
							|  |  |  | 								winston.error("Error creating index " + err.message); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-12-05 21:07:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 				db.createCollection('search', function(err, collection) { | 
					
						
							|  |  |  | 					if(err) { | 
					
						
							|  |  |  | 						winston.error("Error creating collection " + err.message); | 
					
						
							|  |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if(collection) { | 
					
						
							|  |  |  | 						collection.ensureIndex({content:'text'}, {background:true}, function(err, name){ | 
					
						
							|  |  |  | 							if(err) { | 
					
						
							|  |  |  | 								winston.error("Error creating index " + err.message); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 14:34:25 -05:00
										 |  |  | 				callback(null); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-12-02 22:48:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 	//
 | 
					
						
							|  |  |  | 	// helper functions
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	function removeHiddenFields(item) { | 
					
						
							|  |  |  | 		if(item) { | 
					
						
							|  |  |  | 			if(item._id) { | 
					
						
							|  |  |  | 				delete item._id; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(item._key) { | 
					
						
							|  |  |  | 				delete item._key; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return item; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function findItem(data, key) { | 
					
						
							|  |  |  | 		if(!data) { | 
					
						
							|  |  |  | 			return null; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for(var i=0; i<data.length; ++i) { | 
					
						
							|  |  |  | 			if(data[i]._key === key) { | 
					
						
							|  |  |  | 				var item = data.splice(i, 1); | 
					
						
							|  |  |  | 				if(item && item.length) { | 
					
						
							|  |  |  | 					return item[0]; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return null; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Exported functions
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 	module.searchIndex = function(key, content, id) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 21:07:35 -05:00
										 |  |  | 		var data = { | 
					
						
							|  |  |  | 			id:id, | 
					
						
							|  |  |  | 			key:key, | 
					
						
							|  |  |  | 			content:content | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.collection('search').update({id:id, key:key}, {$set:data}, {upsert:true, w: 1}, function(err, result) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				winston.error('Error indexing ' + err.message); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.search = function(key, term, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-05 21:07:35 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		db.command({text:"search" , search: term, filter: {key:key} }, function(err, result) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(!result) { | 
					
						
							|  |  |  | 				return callback(null, []); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(result.results && result.results.length) { | 
					
						
							|  |  |  | 				var data = result.results.map(function(item) { | 
					
						
							|  |  |  | 					return item.obj.id; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				callback(null, data); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				callback(null, []); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.searchRemove = function(key, id) { | 
					
						
							| 
									
										
										
										
											2013-12-05 21:07:35 -05:00
										 |  |  | 		db.collection('search').remove({id:id, key:key}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-05 21:51:05 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				winston.error('Error removing search ' + err.message); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 	module.flushdb = function(callback) { | 
					
						
							|  |  |  | 		db.dropDatabase(function(err, result) { | 
					
						
							|  |  |  | 			if(err){ | 
					
						
							|  |  |  | 				winston.error(error); | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 				if(callback) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(null); | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	module.getFileName = function(callback) { | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		throw new Error('not-implemented'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.info = function(callback) { | 
					
						
							| 
									
										
										
										
											2013-12-05 14:24:18 -05:00
										 |  |  | 		db.stats({scale:1024}, function(err, stats) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 21:45:21 -05:00
										 |  |  | 			// TODO : if this it not deleted the templates break,
 | 
					
						
							|  |  |  | 			// it is a nested object inside stats
 | 
					
						
							|  |  |  | 			delete stats.dataFileVersion; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 			stats.avgObjSize = (stats.avgObjSize / 1024).toFixed(2); | 
					
						
							| 
									
										
										
										
											2013-12-05 14:30:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 			stats.raw = JSON.stringify(stats, null, 4); | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 			stats.mongo = true; | 
					
						
							| 
									
										
										
										
											2013-12-07 15:48:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 			callback(err, stats); | 
					
						
							| 
									
										
										
										
											2013-12-05 20:06:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 14:24:18 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// key
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.exists = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key}, function(err, item) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			callback(err, item !== undefined && item !== null); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.delete = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 		db.collection('objects').remove({_key:key}, function(err, result) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 				if(callback) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return winston.error(err.message); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(null, result); | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.get = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 		module.getObjectField(key, 'value', callback); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 	module.set = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 		var data = {value:value}; | 
					
						
							|  |  |  | 		module.setObject(key, data, callback); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 16:50:06 -05:00
										 |  |  | 	module.keys = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 		db.collection('objects').find( { _key: { $regex: key /*, $options: 'i'*/ } }, function(err, result) { | 
					
						
							|  |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 16:50:06 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-04 14:51:50 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											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 = {}; | 
					
						
							| 
									
										
										
										
											2013-12-05 13:33:01 -05:00
										 |  |  | 		// if there is a '.' in the field name it inserts subdocument in mongo, replace '.'s with \uff0E
 | 
					
						
							|  |  |  | 		field = field.replace(/\./g, '\uff0E'); | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 		data[field] = value; | 
					
						
							|  |  |  | 		db.collection('objects').update({_key:key}, {$set:data}, {upsert:true, w: 1}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											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-04 14:51:50 -05:00
										 |  |  | 			removeHiddenFields(item); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 			callback(err, item); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 16:58:06 -05:00
										 |  |  | 	module.getObjects = function(keys, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 		db.collection('objects').find({_key:{$in:keys}}, {_id:0}).toArray(function(err, data) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 			var returnData = []; | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			for(var i=0; i<keys.length; ++i) { | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 				returnData.push(findItem(data, keys[i])); | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 16:58:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			callback(err, returnData); | 
					
						
							| 
									
										
										
										
											2013-12-04 16:58:06 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-31 13:45:37 -05:00
										 |  |  | 			if(typeof fields[i] !== string) { | 
					
						
							|  |  |  | 				_fields[fields[i].toString().replace(/\./g, '\uff0E')] = 1; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				_fields[fields[i].replace(/\./g, '\uff0E')] = 1; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key}, _fields, function(err, item) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(item === null) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 				item = {}; | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for(var i=0; i<fields.length; ++i) { | 
					
						
							|  |  |  | 				if(item[fields[i]] === null || item[fields[i]] === undefined) { | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 					item[fields[i]] = null; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:08 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			removeHiddenFields(item); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 = {}; | 
					
						
							| 
									
										
										
										
											2013-12-05 13:33:01 -05:00
										 |  |  | 		field = field.replace(/\./g, '\uff0E'); | 
					
						
							| 
									
										
										
										
											2013-12-03 18:03:50 -05:00
										 |  |  | 		data[field] = ''; | 
					
						
							|  |  |  | 		db.collection('objects').findOne({_key:key}, {fields:data}, function(err, item) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			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 = {}; | 
					
						
							| 
									
										
										
										
											2013-12-05 13:33:01 -05:00
										 |  |  | 		field = field.replace(/\./g, '\uff0E'); | 
					
						
							| 
									
										
										
										
											2013-12-03 17:13:59 -05:00
										 |  |  | 		data[field] = ""; | 
					
						
							|  |  |  | 		db.collection('objects').update({_key:key}, {$unset : data}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 17:13:59 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											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 = {}; | 
					
						
							| 
									
										
										
										
											2013-12-05 13:33:01 -05:00
										 |  |  | 		field = field.replace(/\./g, '\uff0E'); | 
					
						
							| 
									
										
										
										
											2013-12-03 17:29:10 -05:00
										 |  |  | 		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) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 				if(callback) { | 
					
						
							|  |  |  | 					callback(err, value); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-03 17:29:10 -05:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		db.collection('objects').update({_key:key}, {$addToSet: { members: value }}, {upsert:true, w: 1},  function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.setRemove = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		db.collection('objects').update({_key:key, members: value}, {$pull : {members: value}}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.isSetMember = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		db.collection('objects').findOne({_key:key, members: value}, function(err, item) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			callback(err, item !== null && item !== undefined); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.isMemberOfSets = function(sets, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 15:11:17 -05:00
										 |  |  | 		function iterator(set, next) { | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			module.isSetMember(set, value, function(err, result) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return next(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				next(null, result?1:0); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-04 15:11:17 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		async.map(sets, iterator, function(err, result) { | 
					
						
							|  |  |  | 			callback(err, result); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.getSetMembers = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key}, {members:1}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(!data) { | 
					
						
							|  |  |  | 				callback(null, []); | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 				callback(null, data.members); | 
					
						
							| 
									
										
										
										
											2013-12-03 15:17:42 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.setCount = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 			if(!data) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 				return callback(null, 0); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, data.members.length); | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.setRemoveRandom = function(key, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			if(err) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 				if(callback) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return winston.error(err.message); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(!data) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 				if(callback) { | 
					
						
							|  |  |  | 					callback(null, 0); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 				var randomIndex = Math.floor(Math.random() * data.members.length); | 
					
						
							|  |  |  | 				var value = data.members[randomIndex]; | 
					
						
							|  |  |  | 				module.setRemove(data._key, value, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 					if(callback) { | 
					
						
							| 
									
										
										
										
											2013-12-04 22:19:11 -05:00
										 |  |  | 						callback(err, value); | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 12:25:53 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	// sorted sets
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.sortedSetAdd = function(key, score, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 		var data = { | 
					
						
							|  |  |  | 			score:score, | 
					
						
							|  |  |  | 			value:value | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').update({_key:key, value:value}, {$set:data}, {upsert:true, w: 1}, function(err, result) { | 
					
						
							|  |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.sortedSetRemove = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').remove({_key:key, value:value}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-03 22:30:36 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 	function getSortedSetRange(key, start, stop, sort, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').find({_key:key}, {fields:{value:1}}) | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 			.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]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').find({_key:key, score: {$gte:min, $lte:max}}, {fields:{value:1}}) | 
					
						
							| 
									
										
										
										
											2013-12-03 22:16:44 -05:00
										 |  |  | 			.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) { | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').count({_key:key, score: {$gte:min, $lte:max}}, function(err, count) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:25:14 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(!count) { | 
					
						
							|  |  |  | 				return callback(null, 0); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			callback(null,count); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 16:31:05 -05:00
										 |  |  | 	module.sortedSetRank = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-04 16:31:05 -05:00
										 |  |  | 		module.getSortedSetRange(key, 0, -1, function(err, result) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			var rank = result.indexOf(value); | 
					
						
							|  |  |  | 			if(rank === -1) { | 
					
						
							|  |  |  | 				return callback(null, null); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, rank); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 15:25:58 -05:00
										 |  |  | 	module.sortedSetScore = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').findOne({_key:key, value: value}, {fields:{score:1}}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(result) { | 
					
						
							|  |  |  | 				return callback(null, result.score); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(err, null); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-05 15:25:58 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.sortedSetsScore = function(keys, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 		db.collection('objects').find({_key:{$in:keys}, value: value}).toArray(function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var returnData = [], | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 				item; | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			for(var i=0; i<keys.length; ++i) { | 
					
						
							| 
									
										
										
										
											2013-12-06 18:58:22 -05:00
										 |  |  | 				item = findItem(result, keys[i]); | 
					
						
							|  |  |  | 				returnData.push(item ? item.score : null); | 
					
						
							| 
									
										
										
										
											2013-12-05 18:26:26 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, returnData); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-05 15:25:58 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	// lists
 | 
					
						
							|  |  |  | 	module.listPrepend = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 		module.isObjectField(key, 'array', function(err, exists) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 				if(callback) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return winston.error(err.message); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 			if(exists) { | 
					
						
							|  |  |  |  				db.collection('objects').update({_key:key}, {'$set': {'array.-1': value}}, {upsert:true, w:1 }, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 					if(callback) { | 
					
						
							|  |  |  | 						callback(err, result); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 	 			}); | 
					
						
							|  |  |  |  			} else { | 
					
						
							|  |  |  |  				module.listAppend(key, value, callback); | 
					
						
							|  |  |  |  			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  		}) | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	module.listAppend = function(key, value, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-06 14:53:03 -05:00
										 |  |  | 		if(value !== null && value !== undefined) { | 
					
						
							|  |  |  | 			value = value.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 		db.collection('objects').update({ _key: key }, { $push: { array: value } }, {upsert:true, w:1}, function(err, result) { | 
					
						
							| 
									
										
										
										
											2013-12-04 14:51:50 -05:00
										 |  |  | 			if(callback) { | 
					
						
							|  |  |  | 				callback(err, result); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-04 12:10:53 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 16:31:05 -05:00
										 |  |  | 	module.listRemoveLast = function(key, callback) { | 
					
						
							|  |  |  | 		module.getListRange(key, -1, 0, function(err, value) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			db.collection('objects').update({_key: key }, { $pop: { array: 1 } }, function(err, result) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 					if(callback) { | 
					
						
							|  |  |  | 						return callback(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					return; | 
					
						
							| 
									
										
										
										
											2013-12-04 16:31:05 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if(value && value.length) { | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 					if(callback) { | 
					
						
							|  |  |  | 						callback(err, value[0]); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-12-04 16:31:05 -05:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2013-12-06 13:21:21 -05:00
										 |  |  | 					if(callback) { | 
					
						
							|  |  |  | 						callback(err, null); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-12-04 16:31:05 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2013-12-04 15:11:17 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(data && data.array) { | 
					
						
							|  |  |  | 				callback(null, data.array); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				callback(null, []); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-03 13:36:44 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-12-02 16:19:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }(exports)); | 
					
						
							|  |  |  | 
 |