From 411f88c7331af0dd119becd48e084301b056e8be Mon Sep 17 00:00:00 2001 From: Louis Chatriot Date: Tue, 28 May 2013 15:21:27 +0200 Subject: [PATCH] cant change an _id --- lib/indexes.js | 24 ++++++++++++++++++++++++ lib/model.js | 1 + test/db.test.js | 15 +++++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 lib/indexes.js diff --git a/lib/indexes.js b/lib/indexes.js new file mode 100644 index 0000000..d39ece0 --- /dev/null +++ b/lib/indexes.js @@ -0,0 +1,24 @@ +var BinarySearchTree = require('binary-search-tree').BinarySearchTree; + + +/** + * Create a new index + * @param {String} options.fieldName On which field should the index apply + * @param {Datastore} options.datastore Datastore on which the index is created + * @param {Boolean} options.unique Optional, enforce a unique constraint (default: false) + * @param {Boolean} options.sparse Optional, allow a sparse index (we can have documents for which fieldName is undefined) (default: false) + */ +function Index (options) { + this.fieldName = options.fieldName; + this.datastore = options.datastore; + this.unique = options.unique || false; + this.sparse = options.unique || false; + + if (this.sparse) { this.fieldUndefined = []; } // Will store all elements for which the indexed field is not defined +} + + + + +// Interface +module.exports = Index; diff --git a/lib/model.js b/lib/model.js index e8819c7..d46df86 100644 --- a/lib/model.js +++ b/lib/model.js @@ -226,6 +226,7 @@ function modify (obj, updateQuery) { // Check result is valid and return it checkObject(newDoc); + if (obj._id !== newDoc._id) { throw "You can't change a document's _id"; } return newDoc; }; diff --git a/test/db.test.js b/test/db.test.js index a978b37..95bff89 100644 --- a/test/db.test.js +++ b/test/db.test.js @@ -817,7 +817,7 @@ describe('Database', function () { it('Cant change the _id of a document', function (done) { d.insert({ a: 2 }, function (err, newDoc) { - d.update({ a: 2 }, { _id: 'nope' }, {}, function (err) { + d.update({ a: 2 }, { a: 2, _id: 'nope' }, {}, function (err) { assert.isDefined(err); d.find({}, function (err, docs) { @@ -826,7 +826,18 @@ describe('Database', function () { docs[0].a.should.equal(2); docs[0]._id.should.equal(newDoc._id); - done(); + d.update({ a: 2 }, { $set: { _id: 'nope' } }, {}, function (err) { + assert.isDefined(err); + + d.find({}, function (err, docs) { + docs.length.should.equal(1); + Object.keys(docs[0]).length.should.equal(2); + docs[0].a.should.equal(2); + docs[0]._id.should.equal(newDoc._id); + + done(); + }); + }); }); }); });