From 2f908cd15bfd5d78a2b42712e668c52405b67d16 Mon Sep 17 00:00:00 2001 From: "Damien F. Katz" Date: Mon, 23 Nov 2009 20:41:06 +0000 Subject: Fix and tests for COUCHDB-292 git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@883494 13f79535-47bb-0310-9956-ffa450edef68 --- src/couchdb/couch_db.erl | 5 ++++- src/couchdb/couch_db_updater.erl | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src/couchdb') diff --git a/src/couchdb/couch_db.erl b/src/couchdb/couch_db.erl index a729f215..f0827334 100644 --- a/src/couchdb/couch_db.erl +++ b/src/couchdb/couch_db.erl @@ -331,6 +331,8 @@ prep_and_validate_update(Db, #doc{id=Id,revs={RevStart, Revs}}=Doc, {validate_doc_update(Db, Doc, LoadDiskDoc), Doc} end; error when AllowConflict -> + couch_doc:merge_stubs(Doc, #doc{}), % will generate error if + % there are stubs {validate_doc_update(Db, Doc, fun() -> nil end), Doc}; error -> {conflict, Doc} @@ -396,7 +398,8 @@ prep_and_validate_updates(Db, [DocBucket|RestBuckets], end end, {[], AccErrors}, DocBucket), - prep_and_validate_updates(Db, RestBuckets, RestLookups, AllowConflict, [PreppedBucket | AccPrepped], AccErrors3). + prep_and_validate_updates(Db, RestBuckets, RestLookups, AllowConflict, + [PreppedBucket | AccPrepped], AccErrors3). update_docs(#db{update_pid=UpdatePid}=Db, Docs, Options) -> diff --git a/src/couchdb/couch_db_updater.erl b/src/couchdb/couch_db_updater.erl index d9951cf6..94414f2e 100644 --- a/src/couchdb/couch_db_updater.erl +++ b/src/couchdb/couch_db_updater.erl @@ -465,6 +465,19 @@ merge_rev_trees(MergeConflicts, [NewDocs|RestDocsList], {_NewTree, conflicts} when (not OldDeleted) -> send_result(Client, Id, {Pos-1,PrevRevs}, conflict), AccTree; + {NewTree, conflicts} when PrevRevs /= [] -> + % Check to be sure if prev revision was specified, it's + % a leaf node in the tree + Leafs = couch_key_tree:get_all_leafs(AccTree), + IsPrevLeaf = lists:any(fun({_, {LeafPos, [LeafRevId|_]}}) -> + {LeafPos, LeafRevId} == {Pos-1, hd(PrevRevs)} + end, Leafs), + if IsPrevLeaf -> + NewTree; + true -> + send_result(Client, Id, {Pos-1,PrevRevs}, conflict), + AccTree + end; {NewTree, no_conflicts} when AccTree == NewTree -> % the tree didn't change at all % meaning we are saving a rev that's already -- cgit v1.2.3