couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fdman...@apache.org
Subject svn commit: r1157428 - in /couchdb/trunk: share/www/script/test/design_docs.js src/couchdb/couch_db.erl
Date Sat, 13 Aug 2011 22:08:47 GMT
Author: fdmanana
Date: Sat Aug 13 22:08:47 2011
New Revision: 1157428

URL: http://svn.apache.org/viewvc?rev=1157428&view=rev
Log:
Doc validation functions from deleted ddocs must be ignored

If a design document is deleted by updating it with a "_deleted"
field set to the boolean value true, its validate_doc_update function
should be ignored for subsequent document insertions/updates.

This closes COUCHDB-1227.



Modified:
    couchdb/trunk/share/www/script/test/design_docs.js
    couchdb/trunk/src/couchdb/couch_db.erl

Modified: couchdb/trunk/share/www/script/test/design_docs.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/design_docs.js?rev=1157428&r1=1157427&r2=1157428&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/test/design_docs.js (original)
+++ couchdb/trunk/share/www/script/test/design_docs.js Sat Aug 13 22:08:47 2011
@@ -421,6 +421,45 @@ couchTests.design_docs = function(debug)
 
   run_on_modified_server(server_config, testFun);
 
+  // COUCHDB-1227 - if a design document is deleted, by adding a "_deleted"
+  // field with the boolean value true, its validate_doc_update functions
+  // should no longer have effect.
+  db.deleteDb();
+  db.createDb();
+  var ddoc = {
+    _id: "_design/test",
+    language: "javascript",
+    validate_doc_update: (function(newDoc, oldDoc, userCtx, secObj) {
+       if (newDoc.value % 2 == 0) {
+          throw({forbidden: "dont like even numbers"});
+       }
+       return true;
+    }).toString()
+  };
+
+  TEquals(true, db.save(ddoc).ok);
+  try {
+    db.save({_id: "doc1", value: 4});
+    T(false, "doc insertion should have failed");
+  } catch (x) {
+    TEquals("forbidden", x.error);
+  }
+
+  var doc = db.open("doc1");
+  TEquals(null, doc);
+  ddoc._deleted = true;
+  TEquals(true, db.save(ddoc).ok);
+
+  try {
+    TEquals(true, db.save({_id: "doc1", value: 4}).ok);
+  } catch (x) {
+    T(false, "doc insertion should have succeeded");
+  }
+
+  doc = db.open("doc1");
+  TEquals(true, doc !== null, "doc was not persisted");
+  TEquals(4, doc.value);
+
   // cleanup
   db.deleteDb();
   db2.deleteDb();

Modified: couchdb/trunk/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_db.erl?rev=1157428&r1=1157427&r2=1157428&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_db.erl (original)
+++ couchdb/trunk/src/couchdb/couch_db.erl Sat Aug 13 22:08:47 2011
@@ -297,7 +297,9 @@ sum_tree_sizes(Acc, [T | Rest]) ->
 get_design_docs(Db) ->
     {ok, _, Docs} = couch_view:fold(
         #view{btree=by_id_btree(Db)},
-        fun(#full_doc_info{id= <<"_design/",_/binary>>}=FullDocInfo, _Reds, AccDocs)
->
+        fun(#full_doc_info{deleted = true}, _Reds, AccDocs) ->
+            {ok, AccDocs};
+        (#full_doc_info{id= <<"_design/",_/binary>>}=FullDocInfo, _Reds, AccDocs)
->
             {ok, Doc} = open_doc_int(Db, FullDocInfo, [ejson_body]),
             {ok, [Doc | AccDocs]};
         (_, _Reds, AccDocs) ->



Mime
View raw message