示例#1
0
 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);
 });
示例#2
0
 tr._flush = function (next) {
     ended = true;
     if (!params.follow && pending === 0) {
         tr.push(null);
         next();
     }
 };
示例#3
0
 self.db.get(key, function (err, value) {
     if (err) return next();
     
     var ref = { key: key, value: value };
     decode.push(JSON.stringify(ref) + '\n');
     next();
 });
示例#4
0
 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 });
         }
     }
 }
示例#5
0
 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();
 });
示例#6
0
 tf.close = function () {
     if (closed) return;
     closed = true;
     
     self.removeListener('_index', onindex);
     self.removeListener('_put', onput);
     
     tf.push(null);
     tf.emit('close');
 };
示例#7
0
 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();
 });
示例#8
0
 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)
     });
 };
示例#9
0
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;
    }
};
示例#10
0
 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;
 };
示例#11
0
tr.pipe(through(function (buf) { tf.push(buf) }));
示例#12
0
 tf.on('finish', function () {
     tf.push(Buffer.concat(buffering[k]));
     delete buffering[k];
 });
示例#13
0
 nextTick(function () {
     tf.push(null);
     next();
 });
示例#14
0
 function onindex (key) {
     if (closed) return;
     if (key >= opts.start && key <= opts.end) {
         tf.push({ key: key, value: 0, live: true });
     }
 }
示例#15
0
 rs.on('readable', function () {
     var buf = rs.read();
     if (buf === null) next()
     else stream.push(buf)
 });
示例#16
0
 tf._transform = function (row, enc, next) {
     if (opts.old === false) row._old = true;
     tf.push(row);
     next();
 };
示例#17
0
 stream._flush = function (next) {
     stream.push(']');
     stream.push(null);
     next();
 };
示例#18
0
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);
};