viewmodel
Advanced tools
Comparing version 1.8.1 to 1.9.0
@@ -103,2 +103,52 @@ var util = require('util'), | ||
bulkCommit: function(vms, callback) { | ||
this.checkConnection(); | ||
var col = store[this.collectionName]; | ||
if (!col) { | ||
col = {}; | ||
store[this.collectionName] = col; | ||
} | ||
if (!vms) return callback(new Error()); | ||
var bulkOperation = []; | ||
var err = null; | ||
_.each(vms, function(vm) { | ||
if (!vm.actionOnCommit) return; | ||
switch(vm.actionOnCommit) { | ||
case 'delete': | ||
if (col[vm.id] && vm.has('_hash') && col[vm.id]._hash && vm.get('_hash') !== col[vm.id]._hash) { | ||
err = new ConcurrencyError(); | ||
return; | ||
} | ||
delete col[vm.id]; | ||
return; | ||
case 'create': | ||
if (col[vm.id]) { | ||
err = new ConcurrencyError(); | ||
return; | ||
} | ||
// Intended Fall-through | ||
case 'update': | ||
if (col[vm.id] && vm.has('_hash') && col[vm.id]._hash && vm.get('_hash') !== col[vm.id]._hash) { | ||
err = new ConcurrencyError(); | ||
return; | ||
} | ||
vm.actionOnCommit = 'update'; | ||
vm.set('_hash', uuid().toString()); | ||
// var obj = vm.toJSON(); | ||
var obj = vm.attributes; | ||
col[obj.id] = obj; | ||
return; | ||
default: | ||
return; | ||
} | ||
}); | ||
callback(err, vms); | ||
}, | ||
commit: function(vm, callback) { | ||
@@ -113,3 +163,3 @@ this.checkConnection(); | ||
if(!vm.actionOnCommit) return callback(new Error()); | ||
if (!vm.actionOnCommit) return callback(new Error()); | ||
@@ -116,0 +166,0 @@ switch(vm.actionOnCommit) { |
@@ -108,2 +108,18 @@ var util = require('util'), | ||
self.db.admin().serverStatus(function(err, info) { | ||
if (err) { | ||
delete self.bulkCommit; | ||
return; | ||
} | ||
var splittedVersion = info.version.split('.'); | ||
var major = parseInt(splittedVersion[0], 10); | ||
var minor = parseInt(splittedVersion[1], 10); | ||
if (major < 3 || (major === 3 && minor < 2)) { | ||
delete self.bulkCommit; | ||
return; | ||
} | ||
}); | ||
var finish = function (err) { | ||
@@ -243,2 +259,64 @@ self.isConnected = true; | ||
bulkCommit: function (vms, callback) { | ||
this.checkConnection(); | ||
if (!vms) return callback(new Error()); | ||
var bulkOperation = []; | ||
var deletedCount = 0; | ||
var insertedCount = 0; | ||
var modifiedCount = 0; | ||
_.each(vms, function(vm) { | ||
if (!vm.actionOnCommit) return; | ||
switch(vm.actionOnCommit) { | ||
case 'delete': | ||
if (!vm.has('_hash')) return; | ||
bulkOperation.push({ deleteOne: { filter: { _id: vm.id, _hash: vm.get('_hash') } } }); | ||
deletedCount++; | ||
break; | ||
case 'create': | ||
vm.set('_hash', new ObjectID().toString()); | ||
// obj = vm.toJSON(); | ||
obj = vm.attributes; | ||
obj._id = obj.id; | ||
bulkOperation.push({ insertOne: obj }); | ||
vm.actionOnCommit = 'update'; | ||
insertedCount++; | ||
break; | ||
case 'update': | ||
var currentHash = vm.get('_hash'); | ||
vm.set('_hash', new ObjectID().toString()); | ||
// obj = vm.toJSON(); | ||
obj = vm.attributes; | ||
obj._id = obj.id; | ||
var query = { _id: obj._id }; | ||
if (currentHash) { | ||
query._hash = currentHash; | ||
} | ||
bulkOperation.push({ updateOne: { filter: query, update: obj, upsert: !currentHash } }); | ||
vm.actionOnCommit = 'update'; | ||
modifiedCount++; | ||
break; | ||
default: | ||
return; | ||
} | ||
}); | ||
this.collection.bulkWrite(bulkOperation, { ordered: false }, function(err, result) { | ||
if (err && err.message && err.message.indexOf('duplicate key') >= 0) { | ||
return callback(new ConcurrencyError()); | ||
} | ||
if (err) return callback(err); | ||
if (result.deletedCount < deletedCount) return callback(new ConcurrencyError()); | ||
if (result.insertedCount < insertedCount) return callback(new ConcurrencyError()); | ||
if (result.modifiedCount < modifiedCount) return callback(new ConcurrencyError()); | ||
callback(null, vms); | ||
}); | ||
}, | ||
commit: function(vm, callback) { | ||
@@ -248,3 +326,3 @@ | ||
if(!vm.actionOnCommit) return callback(new Error()); | ||
if (!vm.actionOnCommit) return callback(new Error('actionOnCommit is not defined!')); | ||
@@ -251,0 +329,0 @@ var obj; |
{ | ||
"author": "adrai", | ||
"name": "viewmodel", | ||
"version": "1.8.1", | ||
"version": "1.9.0", | ||
"private": false, | ||
@@ -6,0 +6,0 @@ "main": "index.js", |
@@ -197,2 +197,16 @@ # Introduction | ||
## Some implementations support bulkCommit | ||
dummyRepo.bulkCommit([vm1, vm2, vm3], function(err) { | ||
if(err) { | ||
console.log('ohhh :-('); | ||
return; | ||
} | ||
}); | ||
currently supported by: | ||
- inmemory | ||
- mongodb | ||
## mongodb | ||
@@ -199,0 +213,0 @@ For mongodb you can define indexes for performance boosts in find function. |
@@ -0,1 +1,4 @@ | ||
## [v1.9.0](https://github.com/adrai/node-viewmodel/compare/v1.8.1...v1.9.0) | ||
- introduce optional bulkCommit | ||
## [v1.8.1](https://github.com/adrai/node-viewmodel/compare/v1.8.0...v1.8.1) | ||
@@ -2,0 +5,0 @@ - remove deprecated option max_attempts from redis options |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
139829
3779
356