| 
									
										
										
										
											2017-02-18 01:56:23 -07:00
										 |  |  | 'use strict'; | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | module.exports = function (db, module) { | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 	var helpers = module.helpers.mongo; | 
					
						
							| 
									
										
										
										
											2014-04-14 13:51:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.flushdb = function (callback) { | 
					
						
							| 
									
										
										
										
											2014-09-03 01:13:28 -04:00
										 |  |  | 		callback = callback || helpers.noop; | 
					
						
							| 
									
										
										
										
											2016-10-16 06:03:02 +03:00
										 |  |  | 		db.dropDatabase(function (err) { | 
					
						
							|  |  |  | 			callback(err); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 23:34:09 +03:00
										 |  |  | 	module.emptydb = function (callback) { | 
					
						
							|  |  |  | 		callback = callback || helpers.noop; | 
					
						
							| 
									
										
										
										
											2018-09-26 15:02:57 -04:00
										 |  |  | 		db.collection('objects').deleteMany({}, function (err) { | 
					
						
							| 
									
										
										
										
											2017-10-23 18:31:16 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			module.resetObjectCache(); | 
					
						
							|  |  |  | 			callback(); | 
					
						
							| 
									
										
										
										
											2016-10-17 23:34:09 +03:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.exists = function (key, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-21 13:30:20 -04:00
										 |  |  | 		if (!key) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-02-18 12:30:49 -07:00
										 |  |  | 		db.collection('objects').findOne({ _key: key }, function (err, item) { | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 			callback(err, item !== undefined && item !== null); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.delete = function (key, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-03 01:13:28 -04:00
										 |  |  | 		callback = callback || helpers.noop; | 
					
						
							| 
									
										
										
										
											2014-09-21 13:30:20 -04:00
										 |  |  | 		if (!key) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-26 15:02:57 -04:00
										 |  |  | 		db.collection('objects').deleteMany({ _key: key }, function (err) { | 
					
						
							| 
									
										
										
										
											2017-10-23 18:31:16 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			module.delObjectCache(key); | 
					
						
							|  |  |  | 			callback(); | 
					
						
							| 
									
										
										
										
											2014-11-15 22:41:45 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.deleteAll = function (keys, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-07 03:17:51 -04:00
										 |  |  | 		callback = callback || helpers.noop; | 
					
						
							| 
									
										
										
										
											2014-09-21 13:30:20 -04:00
										 |  |  | 		if (!Array.isArray(keys) || !keys.length) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-26 15:02:57 -04:00
										 |  |  | 		db.collection('objects').deleteMany({ _key: { $in: keys } }, function (err) { | 
					
						
							| 
									
										
										
										
											2017-10-23 18:31:16 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			keys.forEach(function (key) { | 
					
						
							|  |  |  | 				module.delObjectCache(key); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null); | 
					
						
							| 
									
										
										
										
											2014-12-25 03:00:05 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-09-07 03:17:51 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.get = function (key, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-21 13:30:20 -04:00
										 |  |  | 		if (!key) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-03-03 12:31:20 -05:00
										 |  |  | 		module.getObject(key, function (err, objectData) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// fallback to old field name 'value' for backwards compatibility #6340
 | 
					
						
							|  |  |  | 			var value = null; | 
					
						
							|  |  |  | 			if (objectData) { | 
					
						
							|  |  |  | 				if (objectData.hasOwnProperty('data')) { | 
					
						
							|  |  |  | 					value = objectData.data; | 
					
						
							|  |  |  | 				} else if (objectData.hasOwnProperty('value')) { | 
					
						
							|  |  |  | 					value = objectData.value; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			callback(null, value); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.set = function (key, value, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-21 13:30:20 -04:00
										 |  |  | 		callback = callback || helpers.noop; | 
					
						
							|  |  |  | 		if (!key) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-12-18 20:21:38 -05:00
										 |  |  | 		var data = { data: value }; | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 		module.setObject(key, data, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.increment = function (key, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-03 01:13:28 -04:00
										 |  |  | 		callback = callback || helpers.noop; | 
					
						
							| 
									
										
										
										
											2014-09-21 13:30:20 -04:00
										 |  |  | 		if (!key) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-26 15:02:57 -04:00
										 |  |  | 		db.collection('objects').findOneAndUpdate({ _key: key }, { $inc: { data: 1 } }, { returnOriginal: false, upsert: true }, function (err, result) { | 
					
						
							| 
									
										
										
										
											2018-01-03 14:24:07 -05:00
										 |  |  | 			callback(err, result && result.value ? result.value.data : null); | 
					
						
							| 
									
										
										
										
											2014-12-25 03:08:49 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-05-11 11:45:20 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.rename = function (oldKey, newKey, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-03 01:13:28 -04:00
										 |  |  | 		callback = callback || helpers.noop; | 
					
						
							| 
									
										
										
										
											2018-09-26 15:02:57 -04:00
										 |  |  | 		db.collection('objects').updateMany({ _key: oldKey }, { $set: { _key: newKey } }, function (err) { | 
					
						
							| 
									
										
										
										
											2017-10-23 18:31:16 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			module.delObjectCache(oldKey); | 
					
						
							|  |  |  | 			module.delObjectCache(newKey); | 
					
						
							|  |  |  | 			callback(); | 
					
						
							| 
									
										
										
										
											2014-12-25 03:08:49 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-20 13:51:02 -04:00
										 |  |  | 	module.type = function (key, callback) { | 
					
						
							|  |  |  | 		db.collection('objects').findOne({ _key: key }, function (err, data) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (!data) { | 
					
						
							|  |  |  | 				return callback(null, null); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-12-30 11:41:31 -05:00
										 |  |  | 			delete data.expireAt; | 
					
						
							| 
									
										
										
										
											2017-10-20 13:51:02 -04:00
										 |  |  | 			var keys = Object.keys(data); | 
					
						
							|  |  |  | 			if (keys.length === 4 && data.hasOwnProperty('_key') && data.hasOwnProperty('score') && data.hasOwnProperty('value')) { | 
					
						
							|  |  |  | 				return callback(null, 'zset'); | 
					
						
							|  |  |  | 			} else if (keys.length === 3 && data.hasOwnProperty('_key') && data.hasOwnProperty('members')) { | 
					
						
							|  |  |  | 				return callback(null, 'set'); | 
					
						
							|  |  |  | 			} else if (keys.length === 3 && data.hasOwnProperty('_key') && data.hasOwnProperty('array')) { | 
					
						
							|  |  |  | 				return callback(null, 'list'); | 
					
						
							| 
									
										
										
										
											2017-12-18 20:21:38 -05:00
										 |  |  | 			} else if (keys.length === 3 && data.hasOwnProperty('_key') && data.hasOwnProperty('data')) { | 
					
						
							| 
									
										
										
										
											2017-10-20 13:51:02 -04:00
										 |  |  | 				return callback(null, 'string'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			callback(null, 'hash'); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.expire = function (key, seconds, callback) { | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 		module.expireAt(key, Math.round(Date.now() / 1000) + seconds, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.expireAt = function (key, timestamp, callback) { | 
					
						
							| 
									
										
										
										
											2014-04-11 15:44:53 -04:00
										 |  |  | 		module.setObjectField(key, 'expireAt', new Date(timestamp * 1000), callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-05-11 10:31:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.pexpire = function (key, ms, callback) { | 
					
						
							| 
									
										
										
										
											2015-02-24 11:58:09 -05:00
										 |  |  | 		module.pexpireAt(key, Date.now() + parseInt(ms, 10), callback); | 
					
						
							| 
									
										
										
										
											2014-05-11 10:31:32 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	module.pexpireAt = function (key, timestamp, callback) { | 
					
						
							| 
									
										
										
										
											2017-05-09 15:07:59 -04:00
										 |  |  | 		timestamp = Math.min(timestamp, 8640000000000000); | 
					
						
							| 
									
										
										
										
											2014-05-11 10:31:32 -04:00
										 |  |  | 		module.setObjectField(key, 'expireAt', new Date(timestamp), callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2017-02-18 02:30:48 -07:00
										 |  |  | }; |