From f723cb99008f2462abec46ab9b614fb8dd2f31d1 Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Mon, 17 Aug 2009 23:04:28 +0000 Subject: 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 --- src/couchdb/couch_httpd_show.erl | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'src/couchdb/couch_httpd_show.erl') 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) -> -- cgit v1.2.3