Return-Path: Delivered-To: apmail-couchdb-commits-archive@www.apache.org Received: (qmail 40874 invoked from network); 14 Sep 2009 19:17:50 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 14 Sep 2009 19:17:50 -0000 Received: (qmail 9629 invoked by uid 500); 14 Sep 2009 19:17:50 -0000 Delivered-To: apmail-couchdb-commits-archive@couchdb.apache.org Received: (qmail 9590 invoked by uid 500); 14 Sep 2009 19:17:50 -0000 Mailing-List: contact commits-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@couchdb.apache.org Delivered-To: mailing list commits@couchdb.apache.org Received: (qmail 9581 invoked by uid 99); 14 Sep 2009 19:17:50 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 14 Sep 2009 19:17:50 +0000 X-ASF-Spam-Status: No, hits=-1998.8 required=10.0 tests=ALL_TRUSTED,FS_REPLICA X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 14 Sep 2009 19:17:48 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 8688F23889B3; Mon, 14 Sep 2009 19:17:28 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r814787 - in /couchdb/trunk: share/www/script/test/all_docs.js share/www/script/test/replication.js src/couchdb/couch_httpd_db.erl Date: Mon, 14 Sep 2009 19:17:28 -0000 To: commits@couchdb.apache.org From: jchris@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090914191728.8688F23889B3@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jchris Date: Mon Sep 14 19:17:28 2009 New Revision: 814787 URL: http://svn.apache.org/viewvc?rev=814787&view=rev Log: support for deletions in changes feed Modified: couchdb/trunk/share/www/script/test/all_docs.js couchdb/trunk/share/www/script/test/replication.js couchdb/trunk/src/couchdb/couch_httpd_db.erl Modified: couchdb/trunk/share/www/script/test/all_docs.js URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/all_docs.js?rev=814787&r1=814786&r2=814787&view=diff ============================================================================== --- couchdb/trunk/share/www/script/test/all_docs.js (original) +++ couchdb/trunk/share/www/script/test/all_docs.js Mon Sep 14 19:17:28 2009 @@ -65,8 +65,7 @@ // the deletion should make doc id 1 have the last seq num T(changes.results.length == 4); T(changes.results[3].id == "1"); - // we've removed deletions from the changes feed as they are on the doc record not the doc_info - T(!changes.results[3].deleted); + T(changes.results[3].deleted); // do an update var doc2 = db.open("3"); Modified: couchdb/trunk/share/www/script/test/replication.js URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/replication.js?rev=814787&r1=814786&r2=814787&view=diff ============================================================================== --- couchdb/trunk/share/www/script/test/replication.js (original) +++ couchdb/trunk/share/www/script/test/replication.js Mon Sep 14 19:17:28 2009 @@ -100,12 +100,12 @@ }; this.afterAB1 = function(dbA, dbB) { - var rows = dbB.changes({include_docs:true}).results; + var rows = dbB.changes().results; var rowCnt = 0; for (var i=0; i < rows.length; i++) { if (rows[i].id == "del1") { rowCnt += 1; - T(rows[i].doc._deleted == true); + T(rows[i].deleted == true); } }; T(rowCnt == 1); Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=814787&r1=814786&r2=814787&view=diff ============================================================================== --- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original) +++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Mon Sep 14 19:17:28 2009 @@ -74,11 +74,13 @@ handle_changes_req(#httpd{method='GET',path_parts=[DbName|_]}=Req, Db) -> {FilterFun, EndFilterFun} = make_filter_funs(Req, Db), + {ok, Info} = couch_db:get_db_info(Db), + Seq = proplists:get_value(update_seq, Info), {Dir, StartSeq} = case couch_httpd:qs_value(Req, "descending", "false") of "false" -> {fwd, list_to_integer(couch_httpd:qs_value(Req, "since", "0"))}; "true" -> - {rev, 1000000000000000}; % super big value, should use current db seq + {rev, Seq}; % super big value, should use current db seq _Bad -> throw({bad_request, "descending must be true or false"}) end, ResponseType = couch_httpd:qs_value(Req, "feed", "normal"), @@ -104,7 +106,6 @@ get_rest_db_updated() % clean out any remaining update messages end; true -> - {ok, Info} = couch_db:get_db_info(Db), CurrentEtag = couch_httpd:make_etag(Info), couch_httpd:etag_respond(Req, CurrentEtag, fun() -> % send the etag @@ -162,19 +163,19 @@ end. changes_enumerator(DocInfos, {Db, _, _, FilterFun, Resp, "continuous", IncludeDocs}) -> - [#doc_info{id=Id, high_seq=Seq, revs=[#rev_info{rev=Rev}|_]}|_] = DocInfos, + [#doc_info{id=Id, high_seq=Seq, revs=[#rev_info{rev=#rev_info{deleted=Del}=Rev}|_]}|_] = DocInfos, Results0 = [FilterFun(DocInfo) || DocInfo <- DocInfos], Results = [Result || Result <- Results0, Result /= null], case Results of [] -> {ok, {Db, Seq, nil, FilterFun, Resp, "continuous", IncludeDocs}}; _ -> - send_chunk(Resp, [?JSON_ENCODE(changes_row(Db, Seq, Id, Results, Rev, IncludeDocs)) + send_chunk(Resp, [?JSON_ENCODE(changes_row(Db, Seq, Id, Del, Results, Rev, IncludeDocs)) |"\n"]), {ok, {Db, Seq, nil, FilterFun, Resp, "continuous", IncludeDocs}} end; changes_enumerator(DocInfos, {Db, _, Prepend, FilterFun, Resp, _, IncludeDocs}) -> - [#doc_info{id=Id, high_seq=Seq, revs=[#rev_info{rev=Rev}|_]}|_] = DocInfos, + [#doc_info{id=Id, high_seq=Seq, revs=[#rev_info{rev=#rev_info{deleted=Del}=Rev}|_]}|_] = DocInfos, Results0 = [FilterFun(DocInfo) || DocInfo <- DocInfos], Results = [Result || Result <- Results0, Result /= null], case Results of @@ -182,18 +183,22 @@ {ok, {Db, Seq, Prepend, FilterFun, Resp, nil, IncludeDocs}}; _ -> send_chunk(Resp, [Prepend, ?JSON_ENCODE( - changes_row(Db, Seq, Id, Results, Rev, IncludeDocs))]), + changes_row(Db, Seq, Id, Del, Results, Rev, IncludeDocs))]), {ok, {Db, Seq, <<",\n">>, FilterFun, Resp, nil, IncludeDocs}} end. changes_row(Db, Seq, Id, Results, Rev, true) -> {[{seq,Seq},{id,Id}, {changes,Results}] ++ + deleted_item(Del) ++ couch_httpd_view:doc_member(Db, Id, Rev)}; changes_row(_, Seq, Id, Results, _, false) -> {[{seq,Seq},{id,Id}, {changes,Results}]}. +deleted_item(true) -> [{deleted,true}]; +deleted_item(_) -> []. + send_changes(Req, Resp, Db, Dir, StartSeq, Prepend, ResponseType, FilterFun, End) -> Style = list_to_existing_atom( couch_httpd:qs_value(Req, "style", "main_only")),