From c41c2168f0bf0c561448962dd7573b272ce3e447 Mon Sep 17 00:00:00 2001 From: John Christopher Anderson Date: Sat, 23 May 2009 01:14:13 +0000 Subject: added an design doc option so that doc._local_seq can be available in the map view. Closes COUCHDB-346 git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@777757 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/test/basics.js | 6 ++++++ share/www/script/test/design_options.js | 16 ++++++++++++++-- src/couchdb/couch_db.erl | 6 +++++- src/couchdb/couch_doc.erl | 2 ++ src/couchdb/couch_httpd.erl | 2 +- src/couchdb/couch_httpd_db.erl | 3 +++ src/couchdb/couch_view_updater.erl | 13 +++++++++++-- 7 files changed, 42 insertions(+), 6 deletions(-) diff --git a/share/www/script/test/basics.js b/share/www/script/test/basics.js index 00785dc8..39500629 100644 --- a/share/www/script/test/basics.js +++ b/share/www/script/test/basics.js @@ -63,6 +63,12 @@ couchTests.basics = function(debug) { var doc = db.open(id, {revs_info:true}); T(doc._revs_info[0].status == "available"); + // make sure you can do a seq=true option + var doc = db.open(id, {local_seq:true}); + console.log(doc._local_seq) + T(doc._local_seq == 1); + + // Create some more documents. // Notice the use of the ok member on the return result. T(db.save({_id:"1",a:2,b:4}).ok); diff --git a/share/www/script/test/design_options.js b/share/www/script/test/design_options.js index c2764b91..7bd7901a 100644 --- a/share/www/script/test/design_options.js +++ b/share/www/script/test/design_options.js @@ -18,16 +18,19 @@ couchTests.design_options = function(debug) { //// test the includes_design option var map = "function (doc) {emit(null, doc._id);}"; + var withseq = "function(doc) {emit(doc._local_seq, null)}" // we need a design doc even to test temp views with it var designDoc = { _id:"_design/fu", language: "javascript", options: { - include_design: true + include_design: true, + local_seq: true }, views: { - data: {"map": map} + data: {"map": map}, + with_seq : {"map" : withseq} } }; T(db.save(designDoc).ok); @@ -60,4 +63,13 @@ couchTests.design_options = function(debug) { T(db.save(designDoc).ok); rows = db.view("bango/data").rows; T(rows.length == 0); + + // should also have local_seq in the view + var resp = db.save({}); + rows = db.view("fu/with_seq").rows; + T(rows[0].key == 1) + T(rows[1].key == 2) + var doc = db.open(resp.id); + db.deleteDoc(doc); + console.log(resp) }; diff --git a/src/couchdb/couch_db.erl b/src/couchdb/couch_db.erl index 82231924..29dbbd38 100644 --- a/src/couchdb/couch_db.erl +++ b/src/couchdb/couch_db.erl @@ -820,7 +820,7 @@ open_doc_int(Db, Id, Options) -> {not_found, missing} end. -doc_meta_info(#doc_info{revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) -> +doc_meta_info(#doc_info{high_seq=Seq,revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) -> case lists:member(revs_info, Options) of false -> []; true -> @@ -851,6 +851,10 @@ doc_meta_info(#doc_info{revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) - [] -> []; DelConflictRevs -> [{deleted_conflicts, DelConflictRevs}] end + end ++ + case lists:member(local_seq, Options) of + false -> []; + true -> [{local_seq, Seq}] end. diff --git a/src/couchdb/couch_doc.erl b/src/couchdb/couch_doc.erl index 906a5725..f3a003e1 100644 --- a/src/couchdb/couch_doc.erl +++ b/src/couchdb/couch_doc.erl @@ -56,6 +56,8 @@ to_json_meta(Meta) -> {JsonObj, PosAcc - 1} end, Start, RevsInfo), {<<"_revs_info">>, JsonRevsInfo}; + ({local_seq, Seq}) -> + {<<"_local_seq">>, Seq}; ({conflicts, Conflicts}) -> {<<"_conflicts">>, rev_to_strs(Conflicts)}; ({deleted_conflicts, DConflicts}) -> diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl index 34a13c88..457ab519 100644 --- a/src/couchdb/couch_httpd.erl +++ b/src/couchdb/couch_httpd.erl @@ -179,7 +179,7 @@ handle_request(MochiReq, DefaultFun, send_error(HttpReq, Error); Tag:Error -> ?LOG_ERROR("Uncaught error in HTTP request: ~p",[{Tag, Error}]), - ?LOG_DEBUG("Stacktrace: ~p",[erlang:get_stacktrace()]), + ?LOG_INFO("Stacktrace: ~p",[erlang:get_stacktrace()]), send_error(HttpReq, Error) end, diff --git a/src/couchdb/couch_httpd_db.erl b/src/couchdb/couch_httpd_db.erl index 666f1bef..04f178d5 100644 --- a/src/couchdb/couch_httpd_db.erl +++ b/src/couchdb/couch_httpd_db.erl @@ -801,6 +801,9 @@ parse_doc_query(Req) -> {"revs", "true"} -> Options = [revs | Args#doc_query_args.options], Args#doc_query_args{options=Options}; + {"local_seq", "true"} -> + Options = [local_seq | Args#doc_query_args.options], + Args#doc_query_args{options=Options}; {"revs_info", "true"} -> Options = [revs_info | Args#doc_query_args.options], Args#doc_query_args{options=Options}; diff --git a/src/couchdb/couch_view_updater.erl b/src/couchdb/couch_view_updater.erl index c06e733e..f5b17b37 100644 --- a/src/couchdb/couch_view_updater.erl +++ b/src/couchdb/couch_view_updater.erl @@ -97,11 +97,20 @@ process_doc(Db, DocInfo, {Docs, #group{sig=Sig,name=GroupId,design_options=Desig #doc_info{id=DocId, revs=[#rev_info{deleted=Deleted}|_]} = DocInfo, IncludeDesign = proplists:get_value(<<"include_design">>, DesignOptions, false), + LocalSeq = proplists:get_value(<<"local_seq">>, + DesignOptions, false), + DocOpts = case LocalSeq of + true -> + [conflicts, deleted_conflicts, local_seq]; + _ -> + [conflicts, deleted_conflicts] + end, + ?LOG_ERROR("DocOpts ~p LocalSeq ~p",[DocOpts, LocalSeq]), case {IncludeDesign, DocId} of {_, GroupId} -> % uh oh. this is the design doc with our definitions. See if % anything in the definition changed. - case couch_db:open_doc_int(Db, DocInfo, [conflicts, deleted_conflicts]) of + case couch_db:open_doc_int(Db, DocInfo, DocOpts) of {ok, Doc} -> case couch_view_group:design_doc_to_view_group(Doc) of #group{sig=Sig} -> @@ -126,7 +135,7 @@ process_doc(Db, DocInfo, {Docs, #group{sig=Sig,name=GroupId,design_options=Desig {Docs, [{DocId, []} | DocIdViewIdKeys]}; true -> {ok, Doc} = couch_db:open_doc_int(Db, DocInfo, - [conflicts, deleted_conflicts]), + DocOpts), {[Doc | Docs], DocIdViewIdKeys} end, -- cgit v1.2.3