You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ko...@apache.org on 2011/08/25 21:14:35 UTC

svn commit: r1161706 - in /couchdb/branches/1.0.x: share/www/script/test/changes.js src/couchdb/couch_db.erl

Author: kocolosk
Date: Thu Aug 25 19:14:35 2011
New Revision: 1161706

URL: http://svn.apache.org/viewvc?rev=1161706&view=rev
Log:
Do not suppress old revisions from _changes

Requests to '_changes?style=all_docs' with a 'since' parameter would
suppress revisions of a document generated before the start of the
feed.  The assumption may have been that those revisions were seen by
the client in a previous request to _changes, but this is not
necessarily true if the client is resuming the feed after a partial
download.

The safe thing to do is to include all leaf revisions for each document
in the feed.

Thanks Bob Dionne for the test code.

Closes COUCHDB-1256

Modified:
    couchdb/branches/1.0.x/share/www/script/test/changes.js
    couchdb/branches/1.0.x/src/couchdb/couch_db.erl

Modified: couchdb/branches/1.0.x/share/www/script/test/changes.js
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/share/www/script/test/changes.js?rev=1161706&r1=1161705&r2=1161706&view=diff
==============================================================================
--- couchdb/branches/1.0.x/share/www/script/test/changes.js (original)
+++ couchdb/branches/1.0.x/share/www/script/test/changes.js Thu Aug 25 19:14:35 2011
@@ -444,6 +444,32 @@ couchTests.changes = function(debug) {
   CouchDB.request("GET", "/" + db.name + "/_changes");
   TEquals(0, CouchDB.requestStats('httpd', 'clients_requesting_changes').current);
 
+  // COUCHDB-1256
+  T(db.deleteDb());
+  T(db.createDb());
+
+  T(db.save({"_id":"foo", "a" : 123}).ok);
+  T(db.save({"_id":"bar", "a" : 456}).ok);
+
+  options = {
+      headers: {"Content-Type": "application/json"},
+      body: JSON.stringify({"_rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a", "a":456})
+  };
+  req = CouchDB.request("PUT", "/" + db.name + "/foo?new_edits=false", options);
+
+  req = CouchDB.request("GET", "/" + db.name + "/_changes?style=all_docs");
+  resp = JSON.parse(req.responseText);
+
+  TEquals(3, resp.last_seq);
+  TEquals(2, resp.results.length);
+
+  req = CouchDB.request("GET", "/" + db.name + "/_changes?style=all_docs&since=2");
+  resp = JSON.parse(req.responseText);
+
+  TEquals(3, resp.last_seq);
+  TEquals(1, resp.results.length);
+  TEquals(2, resp.results[0].changes.length);
+
   // cleanup
   db.deleteDb();
 };

Modified: couchdb/branches/1.0.x/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_db.erl?rev=1161706&r1=1161705&r2=1161706&view=diff
==============================================================================
--- couchdb/branches/1.0.x/src/couchdb/couch_db.erl (original)
+++ couchdb/branches/1.0.x/src/couchdb/couch_db.erl Thu Aug 25 19:14:35 2011
@@ -944,20 +944,8 @@ enum_docs_reduce_to_count(Reds) ->
 changes_since(Db, Style, StartSeq, Fun, Acc) ->
     changes_since(Db, Style, StartSeq, Fun, [], Acc).
     
-changes_since(Db, Style, StartSeq, Fun, Options, Acc) ->
-    Wrapper = fun(DocInfo, _Offset, Acc2) ->
-            #doc_info{revs=Revs} = DocInfo,
-            DocInfo2 =
-            case Style of
-            main_only ->
-                DocInfo;
-            all_docs ->
-                % remove revs before the seq
-                DocInfo#doc_info{revs=[RevInfo ||
-                    #rev_info{seq=RevSeq}=RevInfo <- Revs, StartSeq < RevSeq]}
-            end,
-            Fun(DocInfo2, Acc2)
-        end,
+changes_since(Db, _Style, StartSeq, Fun, Options, Acc) ->
+    Wrapper = fun(DocInfo, _Offset, Acc2) -> Fun(DocInfo, Acc2) end,
     {ok, _LastReduction, AccOut} = couch_btree:fold(Db#db.docinfo_by_seq_btree,
         Wrapper, Acc, [{start_key, StartSeq + 1}] ++ Options),
     {ok, AccOut}.