summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lehnardt <jan@apache.org>2019-07-20 12:52:51 +0200
committerJan Lehnardt <jan@apache.org>2019-07-20 12:52:51 +0200
commit8e251081fdbd4b0f0bcf8fa043dc12899fc754bc (patch)
tree31d1a751439a020d4b2d719182a7b17a57e414bc
parenta10b81b8da68f43e61fd9cec34ddd8ad69448ce4 (diff)
downloadcouchdb-8e251081fdbd4b0f0bcf8fa043dc12899fc754bc.tar.gz
fix revids
-rw-r--r--src/couch/src/couch_db.erl12
-rw-r--r--src/couch/src/couch_doc.erl2
-rwxr-xr-xt.sh14
3 files changed, 13 insertions, 15 deletions
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index 52975fdd7..fb11ee2e3 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -1143,7 +1143,7 @@ prep_and_validate_replicated_updates(Db, [Bucket|RestBuckets], [OldInfo|RestOldI
-new_revid(#doc{body=Body, revs={OldStart,OldRevs}, atts=Atts, deleted=Deleted}) ->
+new_revid(#doc{body=Body, revs={OldStart,OldRevs}, atts=Atts, deleted=Deleted}=Doc) ->
DigestedAtts = lists:foldl(fun(Att, Acc) ->
[N, T, M] = couch_att:fetch([name, type, md5], Att),
case M == <<>> of
@@ -1157,7 +1157,8 @@ new_revid(#doc{body=Body, revs={OldStart,OldRevs}, atts=Atts, deleted=Deleted})
?l2b(integer_to_list(couch_util:rand32()));
Atts2 ->
OldRev = case OldRevs of [] -> 0; [OldRev0|_] -> OldRev0 end,
- couch_hash:md5_hash(term_to_binary([Deleted, OldStart, OldRev, Body, Atts2], [{minor_version, 1}]))
+ H = couch_hash:md5_hash(term_to_binary([Deleted, OldStart, OldRev, Body, Atts2], [{minor_version, 1}])),
+ H
end.
new_revs([], OutBuckets, IdRevsAcc) ->
@@ -1420,7 +1421,7 @@ before_docs_update(#db{validate_doc_funs = VDFuns} = Db, Docs, PVFun, UpdateType
(#doc{atts = Atts}) -> Atts /= []
end,
- case lists:any(ValidatePred, Docs2) of
+ case (VDFuns /= []) orelse lists:any(ValidatePred, Docs2) of
true ->
% lookup the doc by id and get the most recent
Ids = [Id || [#doc{id = Id} | _] <- DocBuckets],
@@ -1732,7 +1733,6 @@ open_doc_revs_int(Db, IdRevs, Options) ->
IdRevs, LookupResults).
open_doc_int(Db, <<?LOCAL_DOC_PREFIX, _/binary>> = Id, Options) ->
-% couch_log:info(">>> open_doc_int 1", []),
case couch_db_engine:open_local_docs(Db, [Id]) of
[#doc{} = Doc] ->
apply_open_options(Db, {ok, Doc}, Options);
@@ -1740,22 +1740,18 @@ open_doc_int(Db, <<?LOCAL_DOC_PREFIX, _/binary>> = Id, Options) ->
{not_found, missing}
end;
open_doc_int(Db, #doc_info{id=Id,revs=[RevInfo|_],access=Access}=DocInfo, Options) ->
-% couch_log:info(">>> open_doc_int 2, DocInfo: ~p", [DocInfo]),
#rev_info{deleted=IsDeleted,rev={Pos,RevId},body_sp=Bp} = RevInfo,
Doc = make_doc(Db, Id, IsDeleted, Bp, {Pos,[RevId]}, Access),
apply_open_options(Db,
{ok, Doc#doc{meta=doc_meta_info(DocInfo, [], Options)}}, Options);
open_doc_int(Db, #full_doc_info{id=Id,rev_tree=RevTree,access=Access}=FullDocInfo, Options) ->
-% couch_log:info(">>> open_doc_int 3, FDI: ~p, Access: ~p", [FullDocInfo, Access]),
#doc_info{revs=[#rev_info{deleted=IsDeleted,rev=Rev,body_sp=Bp}|_]} =
DocInfo = couch_doc:to_doc_info(FullDocInfo),
{[{_, RevPath}], []} = couch_key_tree:get(RevTree, [Rev]),
Doc = make_doc(Db, Id, IsDeleted, Bp, RevPath, Access),
-% couch_log:info(">>> ***** open_doc_int 3 made that doc: ~p", [Doc]),
apply_open_options(Db,
{ok, Doc#doc{meta=doc_meta_info(DocInfo, RevTree, Options)}}, Options);
open_doc_int(Db, Id, Options) ->
-% couch_log:info(">>> open_doc_int 4", []),
case get_full_doc_info(Db, Id) of
#full_doc_info{} = FullDocInfo ->
open_doc_int(Db, FullDocInfo, Options);
diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl
index e7d709583..76692d3ab 100644
--- a/src/couch/src/couch_doc.erl
+++ b/src/couch/src/couch_doc.erl
@@ -262,7 +262,7 @@ transfer_fields([{<<"_id">>, Id} | Rest], Doc, DbName) ->
transfer_fields([{<<"_access">>, Access} = Field | Rest], Doc, DbName) ->
% TODO: validate access as array strings, and optional arrays of strings
- transfer_fields(Rest, Doc#doc{body=Rest,access=Access}, DbName);
+ transfer_fields(Rest, Doc#doc{access=Access}, DbName);
transfer_fields([{<<"_rev">>, Rev} | Rest], #doc{revs={0, []}}=Doc, DbName) ->
{Pos, RevId} = parse_rev(Rev),
diff --git a/t.sh b/t.sh
index 741a10a17..d2c4d677b 100755
--- a/t.sh
+++ b/t.sh
@@ -3,10 +3,12 @@ DB=http://a:a@127.0.0.1:15984 #
XDB=http://x:x@127.0.0.1:15984
YDB=http://y:y@127.0.0.1:15984
+curl -sX DELETE $DB/_users
+curl -sX PUT $DB/_users?q=1
curl -sX PUT $DB/_users/org.couchdb.user:x -d @user.json > /dev/null #
curl -sX PUT $DB/_users/org.couchdb.user:y -d @user2.json > /dev/null #
-# curl -sX DELETE $DB/_global_changes
+curl -sX DELETE $DB/_global_changes # reduce log noise
curl -sX DELETE $DB/db
curl -sX PUT $DB/db?q=1'&access=true'
@@ -14,11 +16,11 @@ curl -sX DELETE $DB/db2
curl -sX PUT $DB/db2
# ##############
-curl -sX PUT $DB/db/a -d '{"a":1,"_access":["x"]}'
-curl -s $DB/db/a
+curl -vX PUT $DB/db/a -d '{"a":1,"_access":["x"]}' -Hcontent-type:application/json
+# curl -s $DB/db/a
-curl -sX PUT $DB/db2/a -d '{"a":1,"_access":["x"]}'
-curl -s $DB/db2/a
+curl -vX PUT $DB/db2/a -d '{"b":1,"_access":["x"]}' -Hcontent-type:application/json
+# curl -s $DB/db2/a
curl -s $XDB/db/a
@@ -29,7 +31,7 @@ curl -sX PUT $DB/db/c -d '{"c":3,"_access":["y"]}'
curl -X PUT $XDB/db/c?rev="1-0865d643568aa9be6bcdc15d88b25912" -d '{"c":6,"_access":["y"]}'
#
curl -sX PUT $DB/db/d -d '{"d":4,"_access":["y"]}'
-#
+
curl -sX DELETE $DB/db/a?rev="1-967a00dff5e02add41819138abb3284d"
# echo