From ae93c372fffdb371f7a7eacd5d0aebc3b3ce6d12 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Fri, 21 Feb 2014 14:53:31 -0500 Subject: [PATCH] fixed mongo setAdd and setRemove to accept arrays like redis, fixed infinite scroll for mongo --- src/database/mongo.js | 62 ++++++++++++++++++++++++++++++++----------- src/plugins.js | 3 ++- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index e3a5d3529c..6bd0b5037e 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -20,6 +20,7 @@ module.init = function(callback) { + mongoClient.connect('mongodb://'+ nconf.get('mongo:host') + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'), function(err, _db) { if(err) { winston.error("NodeBB could not connect to your Mongo database. Mongo returned the following error: " + err.message); @@ -424,10 +425,23 @@ // sets module.setAdd = function(key, value, callback) { - if(value !== null && value !== undefined) { - value = value.toString(); + if(!Array.isArray(value)) { + value = [value]; } - db.collection('objects').update({_key:key}, {$addToSet: { members: value }}, {upsert:true, w: 1}, function(err, result) { + + value.forEach(function(element, index, array) { + array[index] = element ? element.toString() : element; + }); + + + db.collection('objects').update({_key:key}, + { + $addToSet: { members: { $each: value } } + }, + { + upsert:true, w: 1 + } + , function(err, result) { if(typeof callback === 'function') { callback(err, result); } @@ -435,10 +449,15 @@ } module.setRemove = function(key, value, callback) { - if(value !== null && value !== undefined) { - value = value.toString(); + if(!Array.isArray(value)) { + value = [value]; } - db.collection('objects').update({_key:key, members: value}, {$pull : {members: value}}, function(err, result) { + + value.forEach(function(element, index, array) { + array[index] = element ? element.toString() : element; + }); + + db.collection('objects').update( { _key: key }, { $pullAll: { members: value } }, function(err, result) { if(typeof callback === 'function') { callback(err, result); } @@ -456,17 +475,26 @@ } module.isMemberOfSets = function(sets, value, callback) { - function iterator(set, next) { - module.isSetMember(set, value, function(err, result) { - if(err) { - return next(err); - } - next(null, result?1:0); - }); + if(value !== null && value !== undefined) { + value = value.toString(); } - async.map(sets, iterator, callback); + db.collection('objects').find({_key: {$in : sets}, members: value}).toArray(function(err, result) { + if(err) { + return callback(err); + } + + result = result.map(function(item) { + return item._key; + }); + + result = sets.map(function(set) { + return result.indexOf(set) !== -1 ? 1 : 0; + }); + + callback(err, result); + }); } module.getSetMembers = function(key, callback) { @@ -655,16 +683,18 @@ if(value !== null && value !== undefined) { value = value.toString(); } - module.getSortedSetRange(key, 0, -1, function(err, result) { + module.getSortedSetRevRange(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, result.length - rank - 1); + callback(null, rank); }); } diff --git a/src/plugins.js b/src/plugins.js index 9614777524..1d0d17535b 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -71,6 +71,7 @@ var fs = require('fs'), plugins.push(meta.config['theme:id']); async.each(plugins, function(plugin, next) { + if (!plugin) { return next(); } @@ -377,7 +378,7 @@ var fs = require('fs'), }).filter(function(file) { var stats = fs.statSync(file), isPlugin = file.substr(npmPluginPath.length + 1, 14) === 'nodebb-plugin-' || file.substr(npmPluginPath.length + 1, 14) === 'nodebb-widget-'; - + if (stats.isDirectory() && isPlugin) return true; else return false; });