(#2623) - compaction improvements
diff --git a/lib/adapter.js b/lib/adapter.js
index 4218451..49c2de3 100644
--- a/lib/adapter.js
+++ b/lib/adapter.js
@@ -442,27 +442,61 @@
opts = {};
}
var self = this;
- this.changes({complete: function (err, res) {
- if (err) {
- callback(); // TODO: silently fail
- return;
- }
- var count = res.results.length;
- if (!count) {
- callback();
- return;
- }
- res.results.forEach(function (row) {
- self.compactDocument(row.id, 0, function () {
- count--;
- if (!count) {
- callback();
- }
- });
- });
- }});
-});
+ opts = utils.clone(opts || {});
+
+ self.get('_local/compaction').catch(function () {
+ return false;
+ }).then(function (doc) {
+ if (typeof self._compact === 'function') {
+ if (doc && doc.last_seq) {
+ opts.last_seq = doc.last_seq;
+ }
+ return self._compact(opts, callback);
+ }
+
+ });
+});
+AbstractPouchDB.prototype._compact = function (opts, callback) {
+ var done = false;
+ var started = 0;
+ var copts = {
+ returnDocs: false
+ };
+ var self = this;
+ var lastSeq;
+ function finish() {
+ self.get('_local/compaction').catch(function () {
+ return false;
+ }).then(function (doc) {
+ doc = doc || {_id: '_local/compaction'};
+ doc.last_seq = lastSeq;
+ return self.put(doc);
+ }).then(function () {
+ callback();
+ }, callback);
+ }
+ if (opts.last_seq) {
+ copts.since = opts.last_seq;
+ }
+ function afterCompact() {
+ started--;
+ if (!started && done) {
+ finish();
+ }
+ }
+ function onChange(row) {
+ started++;
+ self.compactDocument(row.id, 0).then(afterCompact, callback);
+ }
+ self.changes(copts).on('change', onChange).on('complete', function (resp) {
+ done = true;
+ lastSeq = resp.last_seq;
+ if (!started) {
+ finish();
+ }
+ }).on('error', callback);
+};
/* Begin api wrappers. Specific functionality to storage belongs in the
_[method] */
AbstractPouchDB.prototype.get =
diff --git a/lib/adapters/leveldb.js b/lib/adapters/leveldb.js
index 163e615..7027f32 100644
--- a/lib/adapters/leveldb.js
+++ b/lib/adapters/leveldb.js
@@ -662,7 +662,6 @@
processDocs();
};
-
api._allDocs = function (opts, callback) {
opts = utils.clone(opts);
countDocs(function (err, docCount) {