You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2010/09/30 14:22:29 UTC
svn commit: r1003035 - in /couchdb/trunk: share/www/script/couch.js
share/www/script/test/copy_doc.js src/couchdb/couch_httpd_db.erl
Author: rnewson
Date: Thu Sep 30 12:22:29 2010
New Revision: 1003035
URL: http://svn.apache.org/viewvc?rev=1003035&view=rev
Log:
COUCHDB-903 - add {ok, true} to COPY result.
Thanks to Bob Dionne for original patch. I've modified it to fix the badmatch error if you do COPY without a Destination header. It now yields a 400 (Bad Request) error without spewing a stack trace.
Modified:
couchdb/trunk/share/www/script/couch.js
couchdb/trunk/share/www/script/test/copy_doc.js
couchdb/trunk/src/couchdb/couch_httpd_db.erl
Modified: couchdb/trunk/share/www/script/couch.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/couch.js?rev=1003035&r1=1003034&r2=1003035&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/couch.js [utf-8] (original)
+++ couchdb/trunk/share/www/script/couch.js [utf-8] Thu Sep 30 12:22:29 2010
@@ -121,7 +121,7 @@ function CouchDB(name, httpHeaders) {
CouchDB.maybeThrowError(this.last_req);
var results = JSON.parse(this.last_req.responseText);
for (var i = 0; i < docs.length; i++) {
- if(results[i] && results[i].rev) {
+ if(results[i] && results[i].rev && results[i].ok) {
docs[i]._rev = results[i].rev;
}
}
Modified: couchdb/trunk/share/www/script/test/copy_doc.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/copy_doc.js?rev=1003035&r1=1003034&r2=1003035&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/test/copy_doc.js (original)
+++ couchdb/trunk/share/www/script/test/copy_doc.js Thu Sep 30 12:22:29 2010
@@ -23,6 +23,7 @@ couchTests.copy_doc = function(debug) {
});
T(xhr.status == 201);
+ T(JSON.parse(xhr.responseText).ok);
T(db.open("doc_that_was_copied").v == 1);
// COPY with existing target
@@ -36,6 +37,10 @@ couchTests.copy_doc = function(debug) {
});
T(xhr.status == 409); // conflict
+ // missing Destination header
+ var xhr = CouchDB.request("COPY", "/test_suite_db/doc_to_be_copied2");
+ T(xhr.status == 400); // bad request
+
var rev = db.open("doc_to_be_overwritten")._rev;
var xhr = CouchDB.request("COPY", "/test_suite_db/doc_to_be_copied2", {
headers: {"Destination":"doc_to_be_overwritten?rev=" + rev}
Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=1003035&r1=1003034&r2=1003035&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Thu Sep 30 12:22:29 2010
@@ -809,7 +809,7 @@ update_doc_result_to_json({{Id, Rev}, Er
update_doc_result_to_json(#doc{id=DocId}, Result) ->
update_doc_result_to_json(DocId, Result);
update_doc_result_to_json(DocId, {ok, NewRev}) ->
- {[{id, DocId}, {rev, couch_doc:rev_to_str(NewRev)}]};
+ {[{ok, true}, {id, DocId}, {rev, couch_doc:rev_to_str(NewRev)}]};
update_doc_result_to_json(DocId, Error) ->
{_Code, ErrorStr, Reason} = couch_httpd:error_info(Error),
{[{id, DocId}, {error, ErrorStr}, {reason, Reason}]}.
@@ -1216,15 +1216,19 @@ extract_header_rev(Req, ExplicitRev) ->
parse_copy_destination_header(Req) ->
- Destination = couch_httpd:header_value(Req, "Destination"),
- case re:run(Destination, "\\?", [{capture, none}]) of
- nomatch ->
- {list_to_binary(Destination), {0, []}};
- match ->
- [DocId, RevQs] = re:split(Destination, "\\?", [{return, list}]),
- [_RevQueryKey, Rev] = re:split(RevQs, "=", [{return, list}]),
- {Pos, RevId} = couch_doc:parse_rev(Rev),
- {list_to_binary(DocId), {Pos, [RevId]}}
+ case couch_httpd:header_value(Req, "Destination") of
+ undefined ->
+ throw({bad_request, "Destination header is mandatory for COPY"});
+ Destination ->
+ case re:run(Destination, "\\?", [{capture, none}]) of
+ nomatch ->
+ {list_to_binary(Destination), {0, []}};
+ match ->
+ [DocId, RevQs] = re:split(Destination, "\\?", [{return, list}]),
+ [_RevQueryKey, Rev] = re:split(RevQs, "=", [{return, list}]),
+ {Pos, RevId} = couch_doc:parse_rev(Rev),
+ {list_to_binary(DocId), {Pos, [RevId]}}
+ end
end.
validate_attachment_names(Doc) ->
Re: svn commit: r1003035 - in /couchdb/trunk: share/www/script/couch.js
share/www/script/test/copy_doc.js src/couchdb/couch_httpd_db.erl
Posted by Filipe David Manana <fd...@apache.org>.
By changing the return value of update_doc_result_to_json(DocId, {ok,
NewRev}) (adding {ok, true}) don't forget you're changing as well
the results of _bulk_docs API.
On Thu, Sep 30, 2010 at 1:22 PM, <rn...@apache.org> wrote:
> Author: rnewson
> Date: Thu Sep 30 12:22:29 2010
> New Revision: 1003035
>
> URL: http://svn.apache.org/viewvc?rev=1003035&view=rev
> Log:
> COUCHDB-903 - add {ok, true} to COPY result.
>
> Thanks to Bob Dionne for original patch. I've modified it to fix the badmatch error if you do COPY without a Destination header. It now yields a 400 (Bad Request) error without spewing a stack trace.
>
> Modified:
> couchdb/trunk/share/www/script/couch.js
> couchdb/trunk/share/www/script/test/copy_doc.js
> couchdb/trunk/src/couchdb/couch_httpd_db.erl
>
> Modified: couchdb/trunk/share/www/script/couch.js
> URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/couch.js?rev=1003035&r1=1003034&r2=1003035&view=diff
> ==============================================================================
> --- couchdb/trunk/share/www/script/couch.js [utf-8] (original)
> +++ couchdb/trunk/share/www/script/couch.js [utf-8] Thu Sep 30 12:22:29 2010
> @@ -121,7 +121,7 @@ function CouchDB(name, httpHeaders) {
> CouchDB.maybeThrowError(this.last_req);
> var results = JSON.parse(this.last_req.responseText);
> for (var i = 0; i < docs.length; i++) {
> - if(results[i] && results[i].rev) {
> + if(results[i] && results[i].rev && results[i].ok) {
> docs[i]._rev = results[i].rev;
> }
> }
>
> Modified: couchdb/trunk/share/www/script/test/copy_doc.js
> URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/copy_doc.js?rev=1003035&r1=1003034&r2=1003035&view=diff
> ==============================================================================
> --- couchdb/trunk/share/www/script/test/copy_doc.js (original)
> +++ couchdb/trunk/share/www/script/test/copy_doc.js Thu Sep 30 12:22:29 2010
> @@ -23,6 +23,7 @@ couchTests.copy_doc = function(debug) {
> });
>
> T(xhr.status == 201);
> + T(JSON.parse(xhr.responseText).ok);
> T(db.open("doc_that_was_copied").v == 1);
>
> // COPY with existing target
> @@ -36,6 +37,10 @@ couchTests.copy_doc = function(debug) {
> });
> T(xhr.status == 409); // conflict
>
> + // missing Destination header
> + var xhr = CouchDB.request("COPY", "/test_suite_db/doc_to_be_copied2");
> + T(xhr.status == 400); // bad request
> +
> var rev = db.open("doc_to_be_overwritten")._rev;
> var xhr = CouchDB.request("COPY", "/test_suite_db/doc_to_be_copied2", {
> headers: {"Destination":"doc_to_be_overwritten?rev=" + rev}
>
> Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl
> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=1003035&r1=1003034&r2=1003035&view=diff
> ==============================================================================
> --- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original)
> +++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Thu Sep 30 12:22:29 2010
> @@ -809,7 +809,7 @@ update_doc_result_to_json({{Id, Rev}, Er
> update_doc_result_to_json(#doc{id=DocId}, Result) ->
> update_doc_result_to_json(DocId, Result);
> update_doc_result_to_json(DocId, {ok, NewRev}) ->
> - {[{id, DocId}, {rev, couch_doc:rev_to_str(NewRev)}]};
> + {[{ok, true}, {id, DocId}, {rev, couch_doc:rev_to_str(NewRev)}]};
> update_doc_result_to_json(DocId, Error) ->
> {_Code, ErrorStr, Reason} = couch_httpd:error_info(Error),
> {[{id, DocId}, {error, ErrorStr}, {reason, Reason}]}.
> @@ -1216,15 +1216,19 @@ extract_header_rev(Req, ExplicitRev) ->
>
>
> parse_copy_destination_header(Req) ->
> - Destination = couch_httpd:header_value(Req, "Destination"),
> - case re:run(Destination, "\\?", [{capture, none}]) of
> - nomatch ->
> - {list_to_binary(Destination), {0, []}};
> - match ->
> - [DocId, RevQs] = re:split(Destination, "\\?", [{return, list}]),
> - [_RevQueryKey, Rev] = re:split(RevQs, "=", [{return, list}]),
> - {Pos, RevId} = couch_doc:parse_rev(Rev),
> - {list_to_binary(DocId), {Pos, [RevId]}}
> + case couch_httpd:header_value(Req, "Destination") of
> + undefined ->
> + throw({bad_request, "Destination header is mandatory for COPY"});
> + Destination ->
> + case re:run(Destination, "\\?", [{capture, none}]) of
> + nomatch ->
> + {list_to_binary(Destination), {0, []}};
> + match ->
> + [DocId, RevQs] = re:split(Destination, "\\?", [{return, list}]),
> + [_RevQueryKey, Rev] = re:split(RevQs, "=", [{return, list}]),
> + {Pos, RevId} = couch_doc:parse_rev(Rev),
> + {list_to_binary(DocId), {Pos, [RevId]}}
> + end
> end.
>
> validate_attachment_names(Doc) ->
>
>
>
--
Filipe David Manana,
fdmanana@gmail.com, fdmanana@apache.org
"Reasonable men adapt themselves to the world.
Unreasonable men adapt the world to themselves.
That's why all progress depends on unreasonable men."