[ 
https://issues.apache.org/jira/browse/COUCHDB-2774?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14695294#comment-14695294
 ] 

Alexander Shorin commented on COUCHDB-2774:
-------------------------------------------

I found this new behavior is a fix, but a bug. Bug was that COPY could be used 
to replicate exact one document, not to copy it content over some else doc.

> COPY request create a target document with a different revision hash
> --------------------------------------------------------------------
>
>                 Key: COUCHDB-2774
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-2774
>             Project: CouchDB
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>          Components: Database Core
>            Reporter: Mike Wallace
>
> HTTP COPY requests create an identical copy of the source document. As the 
> body of the target is unchanged the revision hash should also be unchanged, 
> however that is not currently the case:
> $ URL=http://localhost:15984
> $ curl -X PUT $URL/doge
> {"ok":true}
> $ curl -X PUT $URL/doge/shibe1 -d '{"such doge":"very doc"}'
> {"ok":true,"id":"shibe1","rev":"1-6429670183877c94fed5cc7996cd880a"}
> $ curl -X COPY $URL/doge/shibe1 -H 'Destination: shibe2'
> {"ok":true,"ok":true,"id":"shibe2","rev":"1-c73d863c32ec87653923959eae56920b"}
> $ curl -X GET $URL/doge/shibe2
> {"_id":"shibe2","_rev":"1-c73d863c32ec87653923959eae56920b","such doge":"very 
> doc"}
> The reason for the difference is because the document opened in the copy 
> handler has a binary body [1]. When the revision hash is generated on update 
> the binary is passed into couch_db:new_revid/1 and hence the hash is 
> different. If we change the binary body to an ejson body and save the doc 
> then the revision hash is the same [2].
> There are two possible solutions. One is to add a clause to 
> couch_db:new_revid/1 which converts any binary doc bodies to ejson [3], the 
> alternative is to open the doc with the ejson_body option in the chttpd_db 
> handler fun.
> I prefer the second approach, using ejson_body to open the doc in chttpd_db, 
> since it is simpler and further up the stack, so less likely to have any 
> unfortunate side-effects.
> Unless anyone comments to the contrary I'll PR the second option.
> [1] 
> https://github.com/apache/couchdb-chttpd/blob/master/src/chttpd_db.erl#L774
> [2] https://gist.github.com/mikewallace1979/592b65b2e51ca5f9a1a7
> [3] 
> https://github.com/apache/couchdb-couch/commit/2b44b8d6eb865e24e05866e7aa8dd57d076a01d6



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to