diff options
author | Jan Lehnardt <jan@apache.org> | 2019-07-20 12:52:51 +0200 |
---|---|---|
committer | Jan Lehnardt <jan@apache.org> | 2019-07-20 12:52:51 +0200 |
commit | 8e251081fdbd4b0f0bcf8fa043dc12899fc754bc (patch) | |
tree | 31d1a751439a020d4b2d719182a7b17a57e414bc | |
parent | a10b81b8da68f43e61fd9cec34ddd8ad69448ce4 (diff) | |
download | couchdb-8e251081fdbd4b0f0bcf8fa043dc12899fc754bc.tar.gz |
fix revids
-rw-r--r-- | src/couch/src/couch_db.erl | 12 | ||||
-rw-r--r-- | src/couch/src/couch_doc.erl | 2 | ||||
-rwxr-xr-x | t.sh | 14 |
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), @@ -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 |