diff options
author | benoitc <benoitc@apache.org> | 2012-06-22 22:33:25 +0200 |
---|---|---|
committer | benoitc <benoitc@apache.org> | 2012-06-22 22:33:25 +0200 |
commit | 3bbb26127787f2acb88e6602c2fd1d1aa8733956 (patch) | |
tree | d0d6dc3b6d25d5dcacf2c43d498198ab989d7ffa | |
parent | e6706b63c44afce0c7862c7ae7a2d1431089fe35 (diff) | |
download | couchdb-3bbb26127787f2acb88e6602c2fd1d1aa8733956.tar.gz |
since=now. Get changes from now. close #COUCHDB-1501
-rw-r--r-- | share/www/script/test/changes.js | 40 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_db.erl | 9 |
2 files changed, 43 insertions, 6 deletions
diff --git a/share/www/script/test/changes.js b/share/www/script/test/changes.js index 91fde7e98..33b3af993 100644 --- a/share/www/script/test/changes.js +++ b/share/www/script/test/changes.js @@ -210,6 +210,38 @@ couchTests.changes = function(debug) { T(lines[3]=='"last_seq":4}'); + // test since=now + xhr = CouchDB.newXhr(); + + xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&since=now", true); + xhr.send(""); + + var docBarz = {_id:"barzzzz", bar:1}; + db.save(docBarz); + + var parse_changes_line = function(line) { + if (line.charAt(line.length-1) == ",") { + var linetrimmed = line.substring(0, line.length-1); + } else { + var linetrimmed = line; + } + return JSON.parse(linetrimmed); + }; + + waitForSuccess(function() { + lines = xhr.responseText.split("\n"); + if (lines[3] != '"last_seq":5}') { + throw("still waiting"); + } + }, "change_lines"); + + var change = parse_changes_line(lines[1]); + T(change.seq == 5); + T(change.id == "barzzzz"); + T(change.changes[0].rev == docBarz._rev); + T(lines[3]=='"last_seq":5}'); + + } // test the filtered changes @@ -271,10 +303,10 @@ couchTests.changes = function(debug) { xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&filter=changes_filter/bop", false); xhr.send(""); var resp = JSON.parse(xhr.responseText); - T(resp.last_seq == 7); + T(resp.last_seq == 8); // longpoll waits until a matching change before returning xhr = CouchDB.newXhr(); - xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&since=7&filter=changes_filter/bop", true); + xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&since=8&filter=changes_filter/bop", true); xhr.send(""); db.save({"_id":"falsy", "bop" : ""}); // empty string is falsy db.save({"_id":"bingo","bop" : "bingo"}); @@ -283,12 +315,12 @@ couchTests.changes = function(debug) { resp = JSON.parse(xhr.responseText); }, "longpoll-since"); - T(resp.last_seq == 9); + T(resp.last_seq == 10); T(resp.results && resp.results.length > 0 && resp.results[0]["id"] == "bingo", "filter the correct update"); xhr.abort(); var timeout = 500; - var last_seq = 10; + var last_seq = 11; while (true) { // filter with continuous diff --git a/src/couchdb/couch_httpd_db.erl b/src/couchdb/couch_httpd_db.erl index e9e410905..4b345da6c 100644 --- a/src/couchdb/couch_httpd_db.erl +++ b/src/couchdb/couch_httpd_db.erl @@ -109,7 +109,7 @@ handle_changes_req2(Req, Db) -> send_chunk(Resp, "\n") end end, - ChangesArgs = parse_changes_query(Req), + ChangesArgs = parse_changes_query(Req, Db), ChangesFun = couch_changes:handle_changes(ChangesArgs, Req, Db), WrapperFun = case ChangesArgs#changes_args.feed of "normal" -> @@ -1113,13 +1113,18 @@ parse_doc_query(Req) -> end end, #doc_query_args{}, couch_httpd:qs(Req)). -parse_changes_query(Req) -> +parse_changes_query(Req, Db) -> lists:foldl(fun({Key, Value}, Args) -> case {string:to_lower(Key), Value} of {"feed", _} -> Args#changes_args{feed=Value}; {"descending", "true"} -> Args#changes_args{dir=rev}; + {"since", "now"} -> + UpdateSeq = couch_util:with_db(Db#db.name, fun(WDb) -> + couch_db:get_update_seq(WDb) + end), + Args#changes_args{since=UpdateSeq}; {"since", _} -> Args#changes_args{since=list_to_integer(Value)}; {"last-event-id", _} -> |