(revLimit, prev, docInfo, results,
i, cb, writeDoc, newEdits)
| 4506 | } |
| 4507 | |
| 4508 | function updateDoc(revLimit, prev, docInfo, results, |
| 4509 | i, cb, writeDoc, newEdits) { |
| 4510 | |
| 4511 | if (revExists(prev.rev_tree, docInfo.metadata.rev) && !newEdits) { |
| 4512 | results[i] = docInfo; |
| 4513 | return cb(); |
| 4514 | } |
| 4515 | |
| 4516 | // sometimes this is pre-calculated. historically not always |
| 4517 | var previousWinningRev = prev.winningRev || winningRev(prev); |
| 4518 | var previouslyDeleted = 'deleted' in prev ? prev.deleted : |
| 4519 | isDeleted(prev, previousWinningRev); |
| 4520 | var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted : |
| 4521 | isDeleted(docInfo.metadata); |
| 4522 | var isRoot = /^1-/.test(docInfo.metadata.rev); |
| 4523 | |
| 4524 | if (previouslyDeleted && !deleted && newEdits && isRoot) { |
| 4525 | var newDoc = docInfo.data; |
| 4526 | newDoc._rev = previousWinningRev; |
| 4527 | newDoc._id = docInfo.metadata.id; |
| 4528 | docInfo = parseDoc(newDoc, newEdits); |
| 4529 | } |
| 4530 | |
| 4531 | var merged = merge(prev.rev_tree, docInfo.metadata.rev_tree[0], revLimit); |
| 4532 | |
| 4533 | var inConflict = newEdits && (( |
| 4534 | (previouslyDeleted && deleted && merged.conflicts !== 'new_leaf') || |
| 4535 | (!previouslyDeleted && merged.conflicts !== 'new_leaf') || |
| 4536 | (previouslyDeleted && !deleted && merged.conflicts === 'new_branch'))); |
| 4537 | |
| 4538 | if (inConflict) { |
| 4539 | var err = createError(REV_CONFLICT); |
| 4540 | results[i] = err; |
| 4541 | return cb(); |
| 4542 | } |
| 4543 | |
| 4544 | var newRev = docInfo.metadata.rev; |
| 4545 | docInfo.metadata.rev_tree = merged.tree; |
| 4546 | docInfo.stemmedRevs = merged.stemmedRevs || []; |
| 4547 | /* istanbul ignore else */ |
| 4548 | if (prev.rev_map) { |
| 4549 | docInfo.metadata.rev_map = prev.rev_map; // used only by leveldb |
| 4550 | } |
| 4551 | |
| 4552 | // recalculate |
| 4553 | var winningRev$$1 = winningRev(docInfo.metadata); |
| 4554 | var winningRevIsDeleted = isDeleted(docInfo.metadata, winningRev$$1); |
| 4555 | |
| 4556 | // calculate the total number of documents that were added/removed, |
| 4557 | // from the perspective of total_rows/doc_count |
| 4558 | var delta = (previouslyDeleted === winningRevIsDeleted) ? 0 : |
| 4559 | previouslyDeleted < winningRevIsDeleted ? -1 : 1; |
| 4560 | |
| 4561 | var newRevIsDeleted; |
| 4562 | if (newRev === winningRev$$1) { |
| 4563 | // if the new rev is the same as the winning rev, we can reuse that value |
| 4564 | newRevIsDeleted = winningRevIsDeleted; |
| 4565 | } else { |
no test coverage detected
searching dependent graphs…