couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Damien Katz <dam...@apache.org>
Subject Re: struggling with couchdb in production
Date Wed, 27 May 2009 20:39:17 GMT

On May 27, 2009, at 4:05 PM, Brian Candler wrote:

> On Wed, May 27, 2009 at 07:41:54PM +0200, Jan Lehnardt wrote:
>> `GET /db/doc?conflicts=true` gives you a new `_conflicts` member  
>> with an
>> array value of all conflicting revisions (that you then have to fetch
>> separately).
>
> I know that - but not only do you have to ask explicitly to be told  
> that
> there are conflicts, you have to fetch each one individually.
>
>> Do you mean that something like `include_docs` would be handy here?
>
> Yes. I think the default if you ask for a doc shoule be to get all  
> versions
> of it, not just one arbitrary version.
>
> Here is an example of what I mean, in code.
>
> ----- 8< -----
> require 'rubygems'
> require 'restclient'
> require 'json'
> require 'pp'
>
> DB="http://127.0.0.1:5984/test"
> RestClient.delete DB rescue nil
> RestClient.put DB, {}.to_json
>
> doc = {"_id"=>"test","hello"=>"world","_attachments"=>{
>  "foo"=>{"content_type"=>"text/plain","data"=>["This is a  
> test"].pack("m").chomp},
>  "bar"=>{"content_type"=>"text/plain","data"=>["This is  
> unchanged"].pack("m").chomp},
> }}
> RestClient.post("#{DB}/_bulk_docs",  
> {'docs'=>[doc],'all_or_nothing'=>true}.to_json)
> doc["_attachments"]["foo"]["data"] = ["This is  
> change"].pack("m").chomp
> RestClient.post("#{DB}/_bulk_docs",  
> {'docs'=>[doc],'all_or_nothing'=>true}.to_json)
>
> # Problem 1: how to retrieve all conflicting versions of a document  
> quickly?
> # Best I can do is this:
> docs = []
> res = RestClient.get("#{DB}/test?conflicts=true")
> doc = JSON.parse(res)
> more_revs = doc.delete('_conflicts')
> docs << doc
>
> more_revs.each do |rev|
>  docs << JSON.parse(RestClient.get("#{DB}/test?rev=#{rev}"))
> end
>
> pp docs
>
> # (Note: if you misspell 'conflicts' then it is silently ignored)
>
> # Problem 2: now you have the conflicting versions, how do you tell  
> which
> # of the attachments is different, without downloading them all?
> ----- 8< -----
>

You can add an url option attachments=true to get the attachments  
inline. We've been wanting to add document and attachment hashes for a  
while now, that would be helpful. Also, eventually we'll have  
attachment level replication, so we'll know also which revision an  
attachment was edited.

You can use revs=all to open all the conflicts (deleted conflicts  
too), or just the conflicts revs you want:
http://127.0.0.1:5984/test_suite_db_b/foo?open_revs=all
http://127.0.0.1:5984/test_suite_db_b/foo?open_revs=["2-3945190883",  
"3-4948835190"]

The open_revs options might not be documented on the wiki, it would be  
nice if someone fixed that.

Also, bulk document retrieval via POST where the post body specifies  
the docs and revisions is something we'd like to see added to the  
front end too. That could be used by the replicator as well.

Patches welcome, I and others in community will be glad to help you.

-Damien

Mime
View raw message