You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ji...@apache.org on 2018/12/13 06:35:43 UTC

[couchdb] branch before_doc_update updated: Update before_doc_update/2 to before_doc_update/3

This is an automated email from the ASF dual-hosted git repository.

jiangphcn pushed a commit to branch before_doc_update
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/before_doc_update by this push:
     new 01e0403  Update before_doc_update/2 to before_doc_update/3
01e0403 is described below

commit 01e0403bdacdee660fea357d1fcbe2ff83cd2fa4
Author: jiangph <ji...@cn.ibm.com>
AuthorDate: Thu Dec 13 14:34:47 2018 +0800

    Update before_doc_update/2 to before_doc_update/3
    
      - Pass UpdateType to before_doc_update/3
---
 src/couch/src/couch_db.erl                            |  8 ++++----
 src/couch/src/couch_db_plugin.erl                     | 12 +++++++-----
 src/couch/src/couch_server.erl                        |  4 ++--
 src/couch/src/couch_users_db.erl                      |  4 ++--
 src/couch/test/couch_db_plugin_tests.erl              | 17 ++++++++++-------
 src/couch_replicator/src/couch_replicator_manager.erl |  4 ++--
 src/fabric/src/fabric_doc_update.erl                  |  4 ++--
 7 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index 0ae164d..bc0a344 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -1148,7 +1148,7 @@ update_docs(Db, Docs0, Options, replicated_changes) ->
     end,
 
     {ok, DocBuckets, NonRepDocs, DocErrors}
-        = before_docs_update(Db, Docs, PrepValidateFun),
+        = before_docs_update(Db, Docs, PrepValidateFun, replicated_changes),
 
     DocBuckets2 = [[doc_flush_atts(Db, check_dup_atts(Doc))
             || Doc <- Bucket] || Bucket <- DocBuckets],
@@ -1166,7 +1166,7 @@ update_docs(Db, Docs0, Options, interactive_edit) ->
     end,
 
     {ok, DocBuckets, NonRepDocs, DocErrors}
-        = before_docs_update(Db, Docs, PrepValidateFun),
+        = before_docs_update(Db, Docs, PrepValidateFun, interactive_edit),
 
     if (AllOrNothing) and (DocErrors /= []) ->
         RefErrorDict = dict:from_list([{doc_tag(Doc), Doc} || Doc <- Docs]),
@@ -1309,7 +1309,7 @@ prepare_doc_summaries(Db, BucketList) ->
         Bucket) || Bucket <- BucketList].
 
 
-before_docs_update(#db{validate_doc_funs = VDFuns} = Db, Docs, PVFun) ->
+before_docs_update(#db{validate_doc_funs = VDFuns} = Db, Docs, PVFun, UpdateType) ->
     increment_stat(Db, [couchdb, database_writes]),
 
     % Separate _local docs from normal docs
@@ -1324,7 +1324,7 @@ before_docs_update(#db{validate_doc_funs = VDFuns} = Db, Docs, PVFun) ->
     DocBuckets = lists:map(fun(Bucket) ->
         lists:map(fun(Doc) ->
             DocWithBody = couch_doc:with_ejson_body(Doc),
-            couch_db_plugin:before_doc_update(Db, DocWithBody)
+            couch_db_plugin:before_doc_update(Db, DocWithBody, UpdateType)
         end, Bucket)
     end, BucketList),
 
diff --git a/src/couch/src/couch_db_plugin.erl b/src/couch/src/couch_db_plugin.erl
index e25866e..53640cc 100644
--- a/src/couch/src/couch_db_plugin.erl
+++ b/src/couch/src/couch_db_plugin.erl
@@ -14,7 +14,7 @@
 
 -export([
     validate_dbname/3,
-    before_doc_update/2,
+    before_doc_update/3,
     after_doc_read/2,
     validate_docid/1,
     check_is_admin/1,
@@ -34,11 +34,13 @@
 validate_dbname(DbName, Normalized, Default) ->
     maybe_handle(validate_dbname, [DbName, Normalized], Default).
 
-before_doc_update(Db, Doc0) ->
+before_doc_update(Db, Doc0, UpdateType) ->
     Fun = couch_db:get_before_doc_update_fun(Db),
-    case with_pipe(before_doc_update, [Doc0, Db]) of
-        [Doc1, _Db] when is_function(Fun) -> Fun(Doc1, Db);
-        [Doc1, _Db] -> Doc1
+    case with_pipe(before_doc_update, [Doc0, Db, UpdateType]) of
+        [Doc1, _Db, UpdateType] when is_function(Fun) ->
+            Fun(Doc1, Db, UpdateType);
+        [Doc1, _Db, _UpdateType] ->
+            Doc1
     end.
 
 after_doc_read(Db, Doc0) ->
diff --git a/src/couch/src/couch_server.erl b/src/couch/src/couch_server.erl
index c4b7bf1..d72c2a0 100644
--- a/src/couch/src/couch_server.erl
+++ b/src/couch/src/couch_server.erl
@@ -165,11 +165,11 @@ maybe_add_sys_db_callbacks(DbName, Options) ->
 	DbName == NodesDbName ->
 	    [sys_db | Options];
 	IsReplicatorDb ->
-	    [{before_doc_update, fun couch_replicator_manager:before_doc_update/2},
+	    [{before_doc_update, fun couch_replicator_manager:before_doc_update/3},
 	     {after_doc_read, fun couch_replicator_manager:after_doc_read/2},
 	     sys_db | Options];
 	IsUsersDb ->
-	    [{before_doc_update, fun couch_users_db:before_doc_update/2},
+	    [{before_doc_update, fun couch_users_db:before_doc_update/3},
 	     {after_doc_read, fun couch_users_db:after_doc_read/2},
 	     sys_db | Options];
 	true ->
diff --git a/src/couch/src/couch_users_db.erl b/src/couch/src/couch_users_db.erl
index c7b41f1..e6e1c48 100644
--- a/src/couch/src/couch_users_db.erl
+++ b/src/couch/src/couch_users_db.erl
@@ -12,7 +12,7 @@
 
 -module(couch_users_db).
 
--export([before_doc_update/2, after_doc_read/2, strip_non_public_fields/1]).
+-export([before_doc_update/3, after_doc_read/2, strip_non_public_fields/1]).
 
 -include_lib("couch/include/couch_db.hrl").
 
@@ -39,7 +39,7 @@
 %   -> 404 // Not Found
 % Else
 %   -> save_doc
-before_doc_update(Doc, Db) ->
+before_doc_update(Doc, Db, _UpdateType) ->
     #user_ctx{name=Name} = couch_db:get_user_ctx(Db),
     DocName = get_doc_name(Doc),
     case (catch couch_db:check_is_admin(Db)) of
diff --git a/src/couch/test/couch_db_plugin_tests.erl b/src/couch/test/couch_db_plugin_tests.erl
index 52533fe..52bcf94 100644
--- a/src/couch/test/couch_db_plugin_tests.erl
+++ b/src/couch/test/couch_db_plugin_tests.erl
@@ -14,7 +14,7 @@
 
 -export([
     validate_dbname/2,
-    before_doc_update/2,
+    before_doc_update/3,
     after_doc_read/2,
     validate_docid/1,
     check_is_admin/1,
@@ -58,9 +58,9 @@ validate_dbname({false, _Db}, _) -> {decided, false};
 validate_dbname({fail, _Db}, _) -> throw(validate_dbname);
 validate_dbname({pass, _Db}, _) -> no_decision.
 
-before_doc_update({fail, _Doc}, _Db) -> throw(before_doc_update);
-before_doc_update({true, Doc}, Db) -> [{true, [before_doc_update|Doc]}, Db];
-before_doc_update({false, Doc}, Db) -> [{false, Doc}, Db].
+before_doc_update({fail, _Doc}, _Db, interactive_edit) -> throw(before_doc_update);
+before_doc_update({true, Doc}, Db, interactive_edit) -> [{true, [before_doc_update|Doc]}, Db];
+before_doc_update({false, Doc}, Db, interactive_edit) -> [{false, Doc}, Db].
 
 after_doc_read({fail, _Doc}, _Db) -> throw(after_doc_read);
 after_doc_read({true, Doc}, Db) -> [{true, [after_doc_read|Doc]}, Db];
@@ -134,17 +134,20 @@ validate_dbname_pass() ->
 before_doc_update_match() ->
     ?assertMatch(
         {true, [before_doc_update, doc]},
-        couch_db_plugin:before_doc_update(fake_db(), {true, [doc]})).
+        couch_db_plugin:before_doc_update(
+            fake_db(), {true, [doc]}, interactive_edit)).
 
 before_doc_update_no_match() ->
     ?assertMatch(
         {false, [doc]},
-        couch_db_plugin:before_doc_update(fake_db(), {false, [doc]})).
+        couch_db_plugin:before_doc_update(
+            fake_db(), {false, [doc]}, interactive_edit)).
 
 before_doc_update_throw() ->
     ?assertThrow(
         before_doc_update,
-        couch_db_plugin:before_doc_update(fake_db(), {fail, [doc]})).
+        couch_db_plugin:before_doc_update(
+            fake_db(), {fail, [doc]}, interactive_edit)).
 
 
 after_doc_read_match() ->
diff --git a/src/couch_replicator/src/couch_replicator_manager.erl b/src/couch_replicator/src/couch_replicator_manager.erl
index afccc0b..edd68d6 100644
--- a/src/couch_replicator/src/couch_replicator_manager.erl
+++ b/src/couch_replicator/src/couch_replicator_manager.erl
@@ -19,10 +19,10 @@
 % NV: TODO: These functions were moved to couch_replicator_docs
 % but it is still called from fabric_doc_update. Keep it here for now
 % later, update fabric to call couch_replicator_docs instead
--export([before_doc_update/2, after_doc_read/2]).
+-export([before_doc_update/3, after_doc_read/2]).
 
 
-before_doc_update(Doc, Db) ->
+before_doc_update(Doc, Db, _UpdateType) ->
     couch_replicator_docs:before_doc_update(Doc, Db).
 
 after_doc_read(Doc, Db) ->
diff --git a/src/fabric/src/fabric_doc_update.erl b/src/fabric/src/fabric_doc_update.erl
index a4867f3..8833cde 100644
--- a/src/fabric/src/fabric_doc_update.erl
+++ b/src/fabric/src/fabric_doc_update.erl
@@ -106,11 +106,11 @@ before_doc_update(DbName, Docs, Opts) ->
         {true, _} ->
             %% fake db is expensive to create so we only do it if we have to
             Db = fabric_util:fake_db(DbName, Opts),
-            [couch_replicator_manager:before_doc_update(Doc, Db) || Doc <- Docs];
+            [couch_replicator_manager:before_doc_update(Doc, Db, []) || Doc <- Docs];
         {_, true} ->
             %% fake db is expensive to create so we only do it if we have to
             Db = fabric_util:fake_db(DbName, Opts),
-            [couch_users_db:before_doc_update(Doc, Db) || Doc <- Docs];
+            [couch_users_db:before_doc_update(Doc, Db, []) || Doc <- Docs];
         _ ->
             Docs
     end.