1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 |
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
4×
1×
8531×
32×
32×
8499×
8499×
8499×
8499×
8499×
287×
287×
287×
287×
8499×
8499×
8499×
329×
329×
329×
8170×
8170×
8170×
8170×
8170×
8170×
8170×
8170×
8170×
6500×
1670×
8170×
1×
1× | 'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _errors = require('../errors');
var _isDeleted = require('./isDeleted');
var _isDeleted2 = _interopRequireDefault(_isDeleted);
var _parseDoc = require('./parseDoc');
var _winningRev = require('../../deps/merge/winningRev');
var _winningRev2 = _interopRequireDefault(_winningRev);
var _index = require('../../deps/merge/index');
var _index2 = _interopRequireDefault(_index);
var _revExists = require('../../deps/merge/revExists');
var _revExists2 = _interopRequireDefault(_revExists);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function updateDoc(revLimit, prev, docInfo, results, i, cb, writeDoc, newEdits) {
if ((0, _revExists2.default)(prev.rev_tree, docInfo.metadata.rev)) {
results[i] = docInfo;
return cb();
}
// sometimes this is pre-calculated. historically not always
var previousWinningRev = prev.winningRev || (0, _winningRev2.default)(prev);
var previouslyDeleted = 'deleted' in prev ? prev.deleted : (0, _isDeleted2.default)(prev, previousWinningRev);
var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted : (0, _isDeleted2.default)(docInfo.metadata);
var isRoot = /^1-/.test(docInfo.metadata.rev);
if (previouslyDeleted && !deleted && newEdits && isRoot) {
var newDoc = docInfo.data;
newDoc._rev = previousWinningRev;
newDoc._id = docInfo.metadata.id;
docInfo = (0, _parseDoc.parseDoc)(newDoc, newEdits);
}
var merged = (0, _index2.default)(prev.rev_tree, docInfo.metadata.rev_tree[0], revLimit);
var inConflict = newEdits && (previouslyDeleted && deleted || !previouslyDeleted && merged.conflicts !== 'new_leaf' || previouslyDeleted && !deleted && merged.conflicts === 'new_branch');
if (inConflict) {
var err = (0, _errors.createError)(_errors.REV_CONFLICT);
results[i] = err;
return cb();
}
var newRev = docInfo.metadata.rev;
docInfo.metadata.rev_tree = merged.tree;
/* istanbul ignore else */
Eif (prev.rev_map) {
docInfo.metadata.rev_map = prev.rev_map; // used only by leveldb
}
// recalculate
var winningRev = (0, _winningRev2.default)(docInfo.metadata);
var winningRevIsDeleted = (0, _isDeleted2.default)(docInfo.metadata, winningRev);
// calculate the total number of documents that were added/removed,
// from the perspective of total_rows/doc_count
var delta = previouslyDeleted === winningRevIsDeleted ? 0 : previouslyDeleted < winningRevIsDeleted ? -1 : 1;
var newRevIsDeleted;
if (newRev === winningRev) {
// if the new rev is the same as the winning rev, we can reuse that value
newRevIsDeleted = winningRevIsDeleted;
} else {
// if they're not the same, then we need to recalculate
newRevIsDeleted = (0, _isDeleted2.default)(docInfo.metadata, newRev);
}
writeDoc(docInfo, winningRev, winningRevIsDeleted, newRevIsDeleted, true, delta, i, cb);
}
exports.default = updateDoc;
module.exports = exports['default']; |