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) ->