diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/couchdb/couch_httpd_show.erl | 32 | ||||
| -rw-r--r-- | src/couchdb/couch_httpd_view.erl | 4 | 
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) -> | 
