summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Lehnardt <jan@apache.org>2009-08-17 23:04:28 +0000
committerJan Lehnardt <jan@apache.org>2009-08-17 23:04:28 +0000
commitf723cb99008f2462abec46ab9b614fb8dd2f31d1 (patch)
tree86d34e7c0283b4548b29daf88113700b61f569e7 /src
parent8cd75f5e84f7ec182ab5f4e91c3bc4cc5c3a95f6 (diff)
allow list function and view function to be in different design docs, patch by Mark Hammond, closes COUCHDB-446
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@805201 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r--src/couchdb/couch_httpd_show.erl32
-rw-r--r--src/couchdb/couch_httpd_view.erl4
2 files changed, 25 insertions, 11 deletions
diff --git a/src/couchdb/couch_httpd_show.erl b/src/couchdb/couch_httpd_show.erl
index ed0b9ede..86eba4c2 100644
--- a/src/couchdb/couch_httpd_show.erl
+++ b/src/couchdb/couch_httpd_show.erl
@@ -13,7 +13,7 @@
-module(couch_httpd_show).
-export([handle_doc_show_req/2, handle_doc_update_req/2, handle_view_list_req/2,
- handle_doc_show/5, handle_view_list/6]).
+ handle_doc_show/5, handle_view_list/7]).
-include("couch_db.hrl").
@@ -96,9 +96,15 @@ handle_doc_show(Req, DesignName, ShowName, DocId, Db) ->
end,
send_doc_show_response(Lang, ShowSrc, DocId, Doc, Req, Db).
+% view-list request with view and list from same design doc.
handle_view_list_req(#httpd{method='GET',
path_parts=[_DbName, _Design, DesignName, _List, ListName, ViewName]}=Req, Db) ->
- handle_view_list(Req, DesignName, ListName, ViewName, Db, nil);
+ handle_view_list(Req, DesignName, ListName, DesignName, ViewName, Db, nil);
+
+% view-list request with view and list from different design docs.
+handle_view_list_req(#httpd{method='GET',
+ path_parts=[_DbName, _Design, DesignName, _List, ListName, ViewDesignName, ViewName]}=Req, Db) ->
+ handle_view_list(Req, DesignName, ListName, ViewDesignName, ViewName, Db, nil);
handle_view_list_req(#httpd{method='GET'}=Req, _Db) ->
send_error(Req, 404, <<"list_error">>, <<"Invalid path.">>);
@@ -108,18 +114,26 @@ handle_view_list_req(#httpd{method='POST',
ReqBody = couch_httpd:body(Req),
{Props2} = ?JSON_DECODE(ReqBody),
Keys = proplists:get_value(<<"keys">>, Props2, nil),
- handle_view_list(Req#httpd{req_body=ReqBody}, DesignName, ListName, ViewName, Db, Keys);
+ handle_view_list(Req#httpd{req_body=ReqBody}, DesignName, ListName, DesignName, ViewName, Db, Keys);
handle_view_list_req(Req, _Db) ->
send_method_not_allowed(Req, "GET,POST,HEAD").
-handle_view_list(Req, DesignName, ListName, ViewName, Db, Keys) ->
- DesignId = <<"_design/", DesignName/binary>>,
- #doc{body={Props}} = couch_httpd_db:couch_doc_open(Db, DesignId, nil, []),
- Lang = proplists:get_value(<<"language">>, Props, <<"javascript">>),
- ListSrc = couch_util:get_nested_json_value({Props}, [<<"lists">>, ListName]),
- send_view_list_response(Lang, ListSrc, ViewName, DesignId, Req, Db, Keys).
+handle_view_list(Req, ListDesignName, ListName, ViewDesignName, ViewName, Db, Keys) ->
+ ListDesignId = <<"_design/", ListDesignName/binary>>,
+ #doc{body={ListProps}} = couch_httpd_db:couch_doc_open(Db, ListDesignId, nil, []),
+ if
+ ViewDesignName == ListDesignName ->
+ ViewProps = ListProps,
+ ViewDesignId = ListDesignId;
+ true ->
+ ViewDesignId = <<"_design/", ViewDesignName/binary>>,
+ #doc{body={ViewProps}} = couch_httpd_db:couch_doc_open(Db, ViewDesignId, nil, [])
+ end,
+ ViewLang = proplists:get_value(<<"language">>, ViewProps, <<"javascript">>),
+ ListSrc = couch_util:get_nested_json_value({ListProps}, [<<"lists">>, ListName]),
+ send_view_list_response(ViewLang, ListSrc, ViewName, ViewDesignId, Req, Db, Keys).
send_view_list_response(Lang, ListSrc, ViewName, DesignId, Req, Db, Keys) ->
diff --git a/src/couchdb/couch_httpd_view.erl b/src/couchdb/couch_httpd_view.erl
index d2f22c77..884402da 100644
--- a/src/couchdb/couch_httpd_view.erl
+++ b/src/couchdb/couch_httpd_view.erl
@@ -83,7 +83,7 @@ handle_db_view_req(#httpd{method='GET',
case ListName of
nil -> couch_httpd_view:design_doc_view(Req, Db, DName, ViewName, nil);
_ ->
- couch_httpd_show:handle_view_list(Req, DName, ListName, ViewName, Db, nil)
+ couch_httpd_show:handle_view_list(Req, DName, ListName, DName, ViewName, Db, nil)
end;
handle_db_view_req(#httpd{method='POST',
@@ -110,7 +110,7 @@ handle_db_view_req(#httpd{method='POST',
{Props2} = ?JSON_DECODE(ReqBody),
Keys = proplists:get_value(<<"keys">>, Props2, nil),
couch_httpd_show:handle_view_list(Req#httpd{req_body=ReqBody},
- DName, ListName, ViewName, Db, Keys)
+ DName, ListName, DName, ViewName, Db, Keys)
end;
handle_db_view_req(Req, _Db) ->