From 2e632b8f61b7ad032845186874498d2c8bc356ef Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Mon, 28 Mar 2011 14:00:53 +0000 Subject: Fix function signature mismatch. Allow purging of single revisions in a conflicted document. Closes COUCHDB-1065 Patch by Randall Leeds, verified by Robert Dionne. git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1086240 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/test/purge.js | 32 ++++++++++++++++++++++++++++++++ src/couchdb/couch_db_updater.erl | 5 +++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/share/www/script/test/purge.js b/share/www/script/test/purge.js index f8f45138..29689137 100644 --- a/share/www/script/test/purge.js +++ b/share/www/script/test/purge.js @@ -110,4 +110,36 @@ couchTests.purge = function(debug) { T(rows[(2*(i-4))+1].key == i+1); } T(db.view("test/single_doc").total_rows == 0); + + // COUCHDB-1065 + var dbA = new CouchDB("test_suite_db_a"); + var dbB = new CouchDB("test_suite_db_b"); + dbA.deleteDb(); + dbA.createDb(); + dbB.deleteDb(); + dbB.createDb(); + var docA = {_id:"test", a:1}; + var docB = {_id:"test", a:2}; + dbA.save(docA); + dbB.save(docB); + CouchDB.replicate(dbA.name, dbB.name); + var xhr = CouchDB.request("POST", "/" + dbB.name + "/_purge", { + body: JSON.stringify({"test":[docA._rev]}) + }); + TEquals(200, xhr.status, "single rev purge after replication succeeds"); + + var xhr = CouchDB.request("GET", "/" + dbB.name + "/test?rev=" + docA._rev); + TEquals(404, xhr.status, "single rev purge removes revision"); + + var xhr = CouchDB.request("POST", "/" + dbB.name + "/_purge", { + body: JSON.stringify({"test":[docB._rev]}) + }); + TEquals(200, xhr.status, "single rev purge after replication succeeds"); + var xhr = CouchDB.request("GET", "/" + dbB.name + "/test?rev=" + docB._rev); + TEquals(404, xhr.status, "single rev purge removes revision"); + + var xhr = CouchDB.request("POST", "/" + dbB.name + "/_purge", { + body: JSON.stringify({"test":[docA._rev, docB._rev]}) + }); + TEquals(200, xhr.status, "all rev purge after replication succeeds"); }; diff --git a/src/couchdb/couch_db_updater.erl b/src/couchdb/couch_db_updater.erl index c14d6bf9..2b317d95 100644 --- a/src/couchdb/couch_db_updater.erl +++ b/src/couchdb/couch_db_updater.erl @@ -118,8 +118,9 @@ handle_call({purge_docs, IdRevs}, _From, Db) -> {DocInfoToUpdate, NewSeq} = lists:mapfoldl( fun(#full_doc_info{rev_tree=Tree}=FullInfo, SeqAcc) -> - Tree2 = couch_key_tree:map_leafs( fun(RevInfo) -> - RevInfo#rev_info{seq=SeqAcc + 1} + Tree2 = couch_key_tree:map_leafs( + fun(_RevId, {IsDeleted, BodyPointer, _UpdateSeq}) -> + {IsDeleted, BodyPointer, SeqAcc + 1} end, Tree), {couch_doc:to_doc_info(FullInfo#full_doc_info{rev_tree=Tree2}), SeqAcc + 1} -- cgit v1.2.3