summaryrefslogtreecommitdiff
path: root/src/couchdb/couch_httpd_db.erl
diff options
context:
space:
mode:
authorDamien F. Katz <damien@apache.org>2009-11-15 04:11:11 +0000
committerDamien F. Katz <damien@apache.org>2009-11-15 04:11:11 +0000
commit1b0146dd004c1b9cd6769c11969cc13f8a37fcd9 (patch)
tree286cb8b36c63057474fda4fff1245a56e32a05d6 /src/couchdb/couch_httpd_db.erl
parent29862925728ff98c077107183e75e23184b0e51d (diff)
Testing of incremental attachments and more testing of multipart/handling.
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@836324 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb/couch_httpd_db.erl')
-rw-r--r--src/couchdb/couch_httpd_db.erl19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/couchdb/couch_httpd_db.erl b/src/couchdb/couch_httpd_db.erl
index 4138db7d..71fc3f48 100644
--- a/src/couchdb/couch_httpd_db.erl
+++ b/src/couchdb/couch_httpd_db.erl
@@ -30,6 +30,7 @@
rev = nil,
open_revs = [],
show = nil,
+ update_type = interactive_edit,
atts_since = nil
}).
@@ -780,6 +781,9 @@ db_doc_req(#httpd{method='POST'}=Req, Db, DocId) ->
]});
db_doc_req(#httpd{method='PUT'}=Req, Db, DocId) ->
+ #doc_query_args{
+ update_type = UpdateType
+ } = parse_doc_query(Req),
couch_doc:validate_docid(DocId),
Loc = absolute_uri(Req, "/" ++ ?b2l(Db#db.name) ++ "/" ++ ?b2l(DocId)),
@@ -789,7 +793,7 @@ db_doc_req(#httpd{method='PUT'}=Req, Db, DocId) ->
Doc0 = couch_doc:doc_from_multi_part_stream(ContentType,
fun() -> receive_request_data(Req) end),
Doc = couch_doc_from_req(Req, DocId, Doc0),
- update_doc(Req, Db, DocId, Doc, RespHeaders);
+ update_doc(Req, Db, DocId, Doc, RespHeaders, UpdateType);
_ ->
case couch_httpd:qs_value(Req, "batch") of
"ok" ->
@@ -810,7 +814,7 @@ db_doc_req(#httpd{method='PUT'}=Req, Db, DocId) ->
_Normal ->
% normal
Doc = couch_doc_from_req(Req, DocId, couch_httpd:json_body(Req)),
- update_doc(Req, Db, DocId, Doc, RespHeaders)
+ update_doc(Req, Db, DocId, Doc, RespHeaders, UpdateType)
end
end;
@@ -911,7 +915,10 @@ update_doc_result_to_json(DocId, Error) ->
update_doc(Req, Db, DocId, Doc) ->
update_doc(Req, Db, DocId, Doc, []).
-update_doc(Req, Db, DocId, #doc{deleted=Deleted}=Doc, Headers) ->
+update_doc(Req, Db, DocId, Doc, Headers) ->
+ update_doc(Req, Db, DocId, Doc, Headers, interactive_edit).
+
+update_doc(Req, Db, DocId, #doc{deleted=Deleted}=Doc, Headers, UpdateType) ->
case couch_httpd:header_value(Req, "X-Couch-Full-Commit") of
"true" ->
Options = [full_commit];
@@ -920,7 +927,7 @@ update_doc(Req, Db, DocId, #doc{deleted=Deleted}=Doc, Headers) ->
_ ->
Options = []
end,
- {ok, NewRev} = couch_db:update_doc(Db, Doc, Options),
+ {ok, NewRev} = couch_db:update_doc(Db, Doc, Options, UpdateType),
NewRevStr = couch_doc:rev_to_str(NewRev),
ResponseHeaders = [{"Etag", <<"\"", NewRevStr/binary, "\"">>}] ++ Headers,
send_json(Req, if Deleted -> 200; true -> 201 end,
@@ -1133,6 +1140,10 @@ parse_doc_query(Req) ->
Args#doc_query_args{atts_since = couch_doc:parse_revs(JsonArray)};
{"show", FormatStr} ->
Args#doc_query_args{show=parse_doc_format(FormatStr)};
+ {"new_edits", "false"} ->
+ Args#doc_query_args{update_type=replicated_changes};
+ {"new_edits", "true"} ->
+ Args#doc_query_args{update_type=interactive_edit};
_Else -> % unknown key value pair, ignore.
Args
end