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 +++++++++++++++++++++++--------- src/couchdb/couch_httpd_view.erl | 4 ++-- 2 files changed, 25 insertions(+), 11 deletions(-) (limited to 'src') 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) -> -- cgit v1.2.3