summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2019-08-29 11:03:26 -0400
committerNick Vatamaniuc <nickva@users.noreply.github.com>2019-08-29 11:57:17 -0400
commit9919496f821d2c062fe8029a139f39b0768876a3 (patch)
tree57a0d06a87f72218542664abafc9cfc4ad5607de
parentfddc7eec2debf5f3195095d73f86543bf88e6312 (diff)
downloadcouchdb-9919496f821d2c062fe8029a139f39b0768876a3.tar.gz
Skip before_doc_update processing for local docs
This matches behavior on master: https://github.com/apache/couchdb/blob/master/src/couch/src/couch_db.erl#L1373-L1387
-rw-r--r--src/fabric/src/fabric2_db_plugin.erl7
-rw-r--r--src/fabric/test/fabric2_doc_crud_tests.erl24
2 files changed, 30 insertions, 1 deletions
diff --git a/src/fabric/src/fabric2_db_plugin.erl b/src/fabric/src/fabric2_db_plugin.erl
index 41f9e9db6..cb824d7ab 100644
--- a/src/fabric/src/fabric2_db_plugin.erl
+++ b/src/fabric/src/fabric2_db_plugin.erl
@@ -21,6 +21,10 @@
is_valid_purge_client/2
]).
+
+-include_lib("couch/include/couch_db.hrl").
+
+
-define(SERVICE_ID, fabric2_db).
@@ -32,6 +36,9 @@ validate_dbname(DbName, Normalized, Default) ->
maybe_handle(validate_dbname, [DbName, Normalized], Default).
+before_doc_update(_, #doc{id = <<?LOCAL_DOC_PREFIX, _/binary>>} = Doc, _) ->
+ Doc;
+
before_doc_update(Db, Doc0, UpdateType) ->
Fun = fabric2_db:get_before_doc_update_fun(Db),
case with_pipe(before_doc_update, [Doc0, Db, UpdateType]) of
diff --git a/src/fabric/test/fabric2_doc_crud_tests.erl b/src/fabric/test/fabric2_doc_crud_tests.erl
index c19c47421..3cb380827 100644
--- a/src/fabric/test/fabric2_doc_crud_tests.erl
+++ b/src/fabric/test/fabric2_doc_crud_tests.erl
@@ -60,7 +60,8 @@ doc_crud_test_() ->
fun delete_local_doc_basic/1,
fun recreate_local_doc/1,
fun create_local_doc_bad_rev/1,
- fun create_local_doc_random_rev/1
+ fun create_local_doc_random_rev/1,
+ fun before_doc_update_skips_local_docs/1
]}
}
}.
@@ -762,3 +763,24 @@ create_local_doc_random_rev({Db, _}) ->
?assertEqual({ok, {0, <<"2">>}}, fabric2_db:update_doc(Db, Doc5)),
{ok, Doc6} = fabric2_db:open_doc(Db, LDocId, []),
?assertEqual(Doc5#doc{revs = {0, [<<"2">>]}}, Doc6).
+
+
+before_doc_update_skips_local_docs({Db0, _}) ->
+
+ BduFun = fun(Doc, _, _) ->
+ Doc#doc{body = {[<<"bdu_was_here">>, true]}}
+ end,
+
+ Db = Db0#{before_doc_update := BduFun},
+
+ LDoc1 = #doc{id = <<"_local/ldoc1">>},
+ Doc1 = #doc{id = <<"doc1">>},
+
+ ?assertMatch({ok, {_, _}}, fabric2_db:update_doc(Db, LDoc1)),
+ ?assertMatch({ok, {_, _}}, fabric2_db:update_doc(Db, Doc1)),
+
+ {ok, LDoc2} = fabric2_db:open_doc(Db, LDoc1#doc.id),
+ {ok, Doc2} = fabric2_db:open_doc(Db, Doc1#doc.id),
+
+ ?assertEqual({[]}, LDoc2#doc.body),
+ ?assertEqual({[<<"bdu_was_here">>, true]}, Doc2#doc.body).