s.on('readable', function () { var r = s.read(); if (r === null) { if (--pending === 0 && ended && !params.follow) { tr.push(null); } } else if (r._old === true) {} else if (params.keys === false) { tr.push(r.value) } else tr.push(r); });
tr._flush = function (next) { ended = true; if (!params.follow && pending === 0) { tr.push(null); next(); } };
self.db.get(key, function (err, value) { if (err) return next(); var ref = { key: key, value: value }; decode.push(JSON.stringify(ref) + '\n'); next(); });
function onput (key, value) { if (value && value.type && value.type === start[0]) { var k = bytewise.encode([ value.type, key ]).toString('hex'); if (k >= opts.start && k <= opts.end) { tf.push({ key: k, value: value, live: true }); } } }
self.db.get(key[1], function (err, value) { if ((err && err.name === 'NotFoundError') || (value && value.type !== type)) { self.sublevel.del(row.key); return next(); } else if (err) return next(err); if (params.augment !== false && !params.flat) { self._augment(key[1], value, { keys: params.keys !== false }); } if (row._old !== true) { if (params.keys === false) tr.push(value) else tr.push({ key: key[1], value: value }) } if (params.flat) { var many = self._hasKeys[value.type]; var keys = many && Object.keys(many); if (!keys || !keys.length) return next(); pending += keys.length; keys.forEach(function (k) { var type = many[k]; var s = self._rowStream(value.type, key[1], k, { follow: params.follow, old: params.old }); s.on('readable', function () { var r = s.read(); if (r === null) { if (--pending === 0 && ended && !params.follow) { tr.push(null); } } else if (r._old === true) {} else if (params.keys === false) { tr.push(r.value) } else tr.push(r); }); }); } next(); });
tf.close = function () { if (closed) return; closed = true; self.removeListener('_index', onindex); self.removeListener('_put', onput); tf.push(null); tf.emit('close'); };
self.db.get(parts[4], function (err, value) { if ((err && err.name === 'NotFoundError') || (value && value[topType] !== topKey)) { // lazily remove deleted or stale indexes self.sublevel.del(row.key); return next(); } else if (err) return next(err); self._augment(parts[4], value); if (params.keys === false) tr.push(value) else if (params.old === false && row.live !== true) { tr.push({ key: parts[4], value: value, _old: true }); } else tr.push({ key: parts[4], value: value }); next(); });
stream._transform = function (row, enc, next) { opts.keys = true; var rs = createRowStream(row, opts); if (!first) stream.push(','); first = false; rs.on('readable', function () { var buf = rs.read(); if (buf === null) next() else stream.push(buf) }); };
Assoc.prototype.track = function (opts) { if (!opts) opts = {}; var self = this; if (!self._tracker) { self._tracker = tracker(self.sublevel); } var decode = new Transform({ objectMode: true }); decode._transform = function (row, enc, next) { if (!row || !/^[A-Fa-f0-9]+$/.test(row.key)) { return next(); } var parts = bytewise.decode(Buffer(row.key, 'hex')); if (!Array.isArray(parts)) return next(); var key = parts.length === 2 ? parts[1] : parts[4]; if (!key) return next(); self.db.get(key, function (err, value) { if (err) return next(); var ref = { key: key, value: value }; decode.push(JSON.stringify(ref) + '\n'); next(); }); }; if (opts.meta !== false) { var meta = { type: 'meta', value: self._hasKeys }; decode.push(JSON.stringify(meta) + '\n'); } decode.on('readable', function () { dup.push(decode.read()); }); var track = self._tracker({ objectMode: true, keyMap: keyMap }); track.pipe(decode); var dup = new Transform({ objectMode: true }); dup._transform = function (row, enc, next) { track.write(row); next(); }; return dup; function keyMap (key) { if (Array.isArray(key)) { return bytewise.encode(key).toString('hex'); } else return key; } };
tr.createStream = function (opts) { if (!opts) opts = {}; var stream = new Transform({ objectMode: true }); if (params.follow && params.autoclose !== false) { whenFinished(stream, function () { liveStream.close() }); } if (params.flat) { stream._transform = function (row, enc, next) { this.push(JSON.stringify(row) + '\n'); next(); }; return tr.pipe(stream); } var first = true; stream._transform = function (row, enc, next) { opts.keys = true; var rs = createRowStream(row, opts); if (!first) stream.push(','); first = false; rs.on('readable', function () { var buf = rs.read(); if (buf === null) next() else stream.push(buf) }); }; stream._flush = function (next) { stream.push(']'); stream.push(null); next(); }; stream.push('['); tr.pipe(stream); return stream; };
tr.pipe(through(function (buf) { tf.push(buf) }));
tf.on('finish', function () { tf.push(Buffer.concat(buffering[k])); delete buffering[k]; });
nextTick(function () { tf.push(null); next(); });
function onindex (key) { if (closed) return; if (key >= opts.start && key <= opts.end) { tf.push({ key: key, value: 0, live: true }); } }
rs.on('readable', function () { var buf = rs.read(); if (buf === null) next() else stream.push(buf) });
tf._transform = function (row, enc, next) { if (opts.old === false) row._old = true; tf.push(row); next(); };
stream._flush = function (next) { stream.push(']'); stream.push(null); next(); };
Assoc.prototype.list = function (type, params, cb) { var self = this; if (typeof params === 'function') { cb = params; params = {}; } if (!params) params = {}; if (params.live !== undefined) params.follow = params.live; var start = [ type, null ]; if (params.start !== undefined) { start = [ type, params.start ]; } else if (params.gte !== undefined) { start = [ type, params.gte ]; } else if (params.gt !== undefined) { start = [ type, params.gt, null ]; } var end = [ type, params.end ]; if (params.lte !== undefined) { end = [ type, params.lte ]; } else if (params.lt !== undefined) { end = [ type, params.lt.replace(/.$/, function (c) { return String.fromCharCode(c.charCodeAt(0) - 1) + '\xff'; }) ]; } var opts = { start: bytewise.encode(start).toString('hex'), end: bytewise.encode(end).toString('hex'), old: params.old, reverse: params.reverse }; var tr = new Transform({ objectMode: true }); tr.startKey = opts.start; tr.startKeys = start; tr.endKey = opts.end; tr.endKeys = end; var pending = 0, ended = false; tr._transform = function (row, enc, next) { var key = bytewise.decode(Buffer(row.key, 'hex')); if (!key) return; self.db.get(key[1], function (err, value) { if ((err && err.name === 'NotFoundError') || (value && value.type !== type)) { self.sublevel.del(row.key); return next(); } else if (err) return next(err); if (params.augment !== false && !params.flat) { self._augment(key[1], value, { keys: params.keys !== false }); } if (row._old !== true) { if (params.keys === false) tr.push(value) else tr.push({ key: key[1], value: value }) } if (params.flat) { var many = self._hasKeys[value.type]; var keys = many && Object.keys(many); if (!keys || !keys.length) return next(); pending += keys.length; keys.forEach(function (k) { var type = many[k]; var s = self._rowStream(value.type, key[1], k, { follow: params.follow, old: params.old }); s.on('readable', function () { var r = s.read(); if (r === null) { if (--pending === 0 && ended && !params.follow) { tr.push(null); } } else if (r._old === true) {} else if (params.keys === false) { tr.push(r.value) } else tr.push(r); }); }); } next(); }); }; tr._flush = function (next) { ended = true; if (!params.follow && pending === 0) { tr.push(null); next(); } }; tr.createStream = function (opts) { if (!opts) opts = {}; var stream = new Transform({ objectMode: true }); if (params.follow && params.autoclose !== false) { whenFinished(stream, function () { liveStream.close() }); } if (params.flat) { stream._transform = function (row, enc, next) { this.push(JSON.stringify(row) + '\n'); next(); }; return tr.pipe(stream); } var first = true; stream._transform = function (row, enc, next) { opts.keys = true; var rs = createRowStream(row, opts); if (!first) stream.push(','); first = false; rs.on('readable', function () { var buf = rs.read(); if (buf === null) next() else stream.push(buf) }); }; stream._flush = function (next) { stream.push(']'); stream.push(null); next(); }; stream.push('['); tr.pipe(stream); return stream; }; if (cb) { var results = []; tr.on('error', cb); tr.on('data', function (row) { results.push(row) }); tr.on('end', function () { cb(null, results) }); } if (params.meta) { tr.push({ type: 'meta', value: self._hasKeys }); } var liveStream; if (params.follow) { liveStream = self._createLiveStream(opts); if (params.autoclose === false) { return liveStream.pipe(tr); } else return whenFinished( liveStream.pipe(tr), function () { liveStream.close() } ); } else return self.sublevel.createReadStream(opts).pipe(tr); };