Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch '312-persist-deletions-fix' of git://github.com/chunmun/…
…pouchdb into chunmun-312-persist-deletions-fix
  • Loading branch information
daleharvey committed Feb 21, 2013
2 parents 17c6b58 + 2ed54d0 commit e4be4d0
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 8 deletions.
4 changes: 3 additions & 1 deletion src/adapters/pouch.idb.js
Expand Up @@ -292,6 +292,8 @@ var IdbPouch = function(opts, callback) {
}

function updateDoc(oldDoc, docInfo) {
docInfo.metadata.deletions = extend(docInfo.metadata.deletions, oldDoc.deletions);

var merged = Pouch.merge(oldDoc.rev_tree, docInfo.metadata.rev_tree[0], 1000);

var inConflict = (isDeleted(oldDoc) && isDeleted(docInfo.metadata)) ||
Expand Down Expand Up @@ -455,7 +457,7 @@ var IdbPouch = function(opts, callback) {
}, []);
}
if (opts.conflicts) {
var conflicts = collectConflicts(metadata.rev_tree);
var conflicts = collectConflicts(metadata.rev_tree, metadata.deletions);
if (conflicts.length) {
doc._conflicts = conflicts;
}
Expand Down
6 changes: 3 additions & 3 deletions src/adapters/pouch.leveldb.js
Expand Up @@ -241,7 +241,7 @@ LevelPouch = module.exports = function(opts, callback) {
}

if (opts.conflicts) {
var conflicts = Pouch.utils.collectConflicts(metadata.rev_tree);
var conflicts = Pouch.utils.collectConflicts(metadata.rev_tree, metadata.deletions);
if (conflicts.length) {
doc._conflicts = conflicts;
}
Expand Down Expand Up @@ -613,7 +613,7 @@ LevelPouch = module.exports = function(opts, callback) {
doc.doc = data;
doc.doc._rev = doc.value.rev;
if (opts.conflicts) {
doc.doc._conflicts = Pouch.utils.collectConflicts(metadata.rev_tree);
doc.doc._conflicts = Pouch.utils.collectConflicts(metadata.rev_tree, metadata.deletions);
}
}
if ('keys' in opts) {
Expand Down Expand Up @@ -722,7 +722,7 @@ LevelPouch = module.exports = function(opts, callback) {
change.deleted = true;
}
if (opts.conflicts) {
change.doc._conflicts = Pouch.utils.collectConflicts(metadata.rev_tree);
change.doc._conflicts = Pouch.utils.collectConflicts(metadata.rev_tree, metadata.deletions);
}

// dedupe changes (TODO: more efficient way to accomplish this?)
Expand Down
6 changes: 3 additions & 3 deletions src/adapters/pouch.websql.js
Expand Up @@ -393,7 +393,7 @@ var webSqlPouch = function(opts, callback) {
}

if (opts.conflicts) {
var conflicts = collectConflicts(metadata.rev_tree);
var conflicts = collectConflicts(metadata.rev_tree, metadata.deletions);
if (conflicts.length) {
doc._conflicts = conflicts;
}
Expand Down Expand Up @@ -511,7 +511,7 @@ var webSqlPouch = function(opts, callback) {
doc.doc = data;
doc.doc._rev = Pouch.merge.winningRev(metadata);
if (opts.conflicts) {
doc.doc._conflicts = collectConflicts(metadata.rev_tree);
doc.doc._conflicts = collectConflicts(metadata.rev_tree, metadata.deletions);
}
}
if ('keys' in opts) {
Expand Down Expand Up @@ -601,7 +601,7 @@ var webSqlPouch = function(opts, callback) {
change.deleted = true;
}
if (opts.conflicts) {
change.doc._conflicts = collectConflicts(metadata.rev_tree);
change.doc._conflicts = collectConflicts(metadata.rev_tree, metadata.deletions);
}
results.push(change);
}
Expand Down
11 changes: 10 additions & 1 deletion src/pouch.utils.js
Expand Up @@ -232,8 +232,17 @@ var collectLeaves = function(revs) {
return leaves;
};

var collectConflicts = function(revs) {
var collectConflicts = function(revs, deletions) {
// Remove all deleted leaves
var leaves = collectLeaves(revs);
for(var i = 0; i < leaves.length; i++){
var leaf = leaves.shift();
var rev = leaf.rev.split("-")[1];
if(deletions && !deletions[rev]){
leaves.push(leaf);
}
}

// First is current rev
leaves.shift();
return leaves.map(function(x) { return x.rev; });
Expand Down
25 changes: 25 additions & 0 deletions tests/test.basics.js
Expand Up @@ -382,4 +382,29 @@ adapters.map(function(adapter) {
});
});
});


asyncTest('deletions persists', 1, function() {
var doc = {_id: 'staticId', contents: 'stuff'};
function writeAndDelete(db, cb) {
db.put(doc, function(err, info) {
db.remove({_id:info.id, _rev:info.rev}, function(doc) {
cb();
});
});
}
initTestDB(this.name, function(err, db) {
writeAndDelete(db, function() {
writeAndDelete(db, function() {
db.put(doc, function() {
db.get(doc._id, {conflicts: true}, function(err, details) {
equal(false, '_conflicts' in details, 'Should not have conflicts');
start();
});
});
});
});
});
});

});

0 comments on commit e4be4d0

Please sign in to comment.