You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by jc...@apache.org on 2009/09/14 21:17:28 UTC
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
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")),