2014-04-11 15:44:53 -04:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
module.exports = function(db, module) {
|
|
|
|
|
var helpers = module.helpers.mongo;
|
|
|
|
|
|
|
|
|
|
module.listPrepend = function(key, value, callback) {
|
2014-09-21 13:30:20 -04:00
|
|
|
callback = callback || helpers.noop;
|
|
|
|
|
|
|
|
|
|
if (!key) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-11 15:44:53 -04:00
|
|
|
value = helpers.valueToString(value);
|
|
|
|
|
|
|
|
|
|
module.isObjectField(key, 'array', function(err, exists) {
|
2014-07-29 17:12:02 -04:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
2014-04-11 15:44:53 -04:00
|
|
|
}
|
|
|
|
|
|
2014-07-29 17:12:02 -04:00
|
|
|
if (exists) {
|
|
|
|
|
db.collection('objects').update({_key:key}, {$push: {array: {$each: [value], $position: 0}}}, {upsert:true, w:1 }, callback);
|
2014-04-11 15:44:53 -04:00
|
|
|
} else {
|
|
|
|
|
module.listAppend(key, value, callback);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
module.listAppend = function(key, value, 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();
|
|
|
|
|
}
|
2014-04-11 15:44:53 -04:00
|
|
|
value = helpers.valueToString(value);
|
2014-09-03 01:13:28 -04:00
|
|
|
db.collection('objects').update({ _key: key }, { $push: { array: value } }, {upsert:true, w:1}, callback);
|
2014-04-11 15:44:53 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
module.listRemoveLast = function(key, callback) {
|
2014-09-21 13:30:20 -04:00
|
|
|
callback = callback || helpers.noop;
|
|
|
|
|
if (!key) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
2014-04-11 15:44:53 -04:00
|
|
|
module.getListRange(key, -1, 0, function(err, value) {
|
2014-07-29 02:37:33 -04:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
2014-04-11 15:44:53 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
db.collection('objects').update({_key: key }, { $pop: { array: 1 } }, function(err, result) {
|
2014-07-29 02:37:33 -04:00
|
|
|
callback(err, (value && value.length) ? value[0] : null);
|
2014-04-11 15:44:53 -04:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2014-07-28 14:20:29 -04:00
|
|
|
module.listTrim = function(key, start, stop, callback) {
|
2014-09-21 13:30:20 -04:00
|
|
|
callback = callback || helpers.noop;
|
|
|
|
|
if (!key) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
2014-07-28 14:20:29 -04:00
|
|
|
module.getListRange(key, start, stop, function(err, value) {
|
2014-07-29 02:37:33 -04:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
2014-07-28 14:20:29 -04:00
|
|
|
}
|
|
|
|
|
|
2014-07-29 02:37:33 -04:00
|
|
|
db.collection('objects').update({_key: key}, {$set: {array: value}}, callback);
|
2014-07-28 14:20:29 -04:00
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2014-04-11 15:44:53 -04:00
|
|
|
module.listRemoveAll = function(key, value, 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();
|
|
|
|
|
}
|
2014-04-11 15:44:53 -04:00
|
|
|
value = helpers.valueToString(value);
|
|
|
|
|
|
2014-09-03 01:13:28 -04:00
|
|
|
db.collection('objects').update({_key: key }, { $pull: { array: value } }, callback);
|
2014-04-11 15:44:53 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
module.getListRange = function(key, start, stop, callback) {
|
2014-09-21 13:30:20 -04:00
|
|
|
if (!key) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
2014-04-11 15:44:53 -04:00
|
|
|
var skip = start,
|
|
|
|
|
limit = stop - start + 1,
|
|
|
|
|
splice = false;
|
|
|
|
|
|
|
|
|
|
if((start < 0 && stop >= 0) || (start >= 0 && stop < 0)) {
|
|
|
|
|
skip = 0;
|
|
|
|
|
limit = Math.pow(2, 31) - 2;
|
|
|
|
|
splice = true;
|
|
|
|
|
} else if (start > stop) {
|
|
|
|
|
return callback(null, []);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
db.collection('objects').findOne({_key:key}, { array: { $slice: [skip, limit] }}, function(err, data) {
|
|
|
|
|
if(err || !(data && data.array)) {
|
|
|
|
|
return callback(err, []);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(splice) {
|
|
|
|
|
|
|
|
|
|
if(start < 0) {
|
|
|
|
|
start = data.array.length - Math.abs(start);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(stop < 0) {
|
|
|
|
|
stop = data.array.length - Math.abs(stop);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(start > stop) {
|
|
|
|
|
return callback(null, []);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var howMany = stop - start + 1;
|
|
|
|
|
if(start !== 0 || howMany !== data.array.length) {
|
|
|
|
|
data.array = data.array.splice(start, howMany);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
callback(null, data.array);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|