blob: 71b5192b27a84d9afc67e267f2e9735f2645e0f1 [file] [log] [blame]
import ltgt from 'ltgt';
function isFunction(f) {
return 'function' === typeof f;
}
function getPrefix(db) {
if (isFunction(db.prefix)) {
return db.prefix();
}
return db;
}
function clone(_obj) {
var obj = {};
for (var k in _obj) {
obj[k] = _obj[k];
}
return obj;
}
function nut(db, precodec, codec) {
function encodePrefix(prefix, key, opts1, opts2) {
return precodec.encode([ prefix, codec.encodeKey(key, opts1, opts2 ) ]);
}
function addEncodings(op, prefix) {
if (prefix && prefix.options) {
op.keyEncoding =
op.keyEncoding || prefix.options.keyEncoding;
op.valueEncoding =
op.valueEncoding || prefix.options.valueEncoding;
}
return op;
}
db.open(function () { /* no-op */});
return {
apply: function (ops, opts, cb) {
opts = opts || {};
var batch = [];
var i = -1;
var len = ops.length;
while (++i < len) {
var op = ops[i];
addEncodings(op, op.prefix);
op.prefix = getPrefix(op.prefix);
batch.push({
key: encodePrefix(op.prefix, op.key, opts, op),
value: op.type !== 'del' && codec.encodeValue(op.value, opts, op),
type: op.type
});
}
db.db.batch(batch, opts, cb);
},
get: function (key, prefix, opts, cb) {
opts.asBuffer = codec.valueAsBuffer(opts);
return db.db.get(
encodePrefix(prefix, key, opts),
opts,
function (err, value) {
if (err) {
cb(err);
} else {
cb(null, codec.decodeValue(value, opts));
}
}
);
},
createDecoder: function (opts) {
return function (key, value) {
return {
key: codec.decodeKey(precodec.decode(key)[1], opts),
value: codec.decodeValue(value, opts)
};
};
},
isClosed: function isClosed() {
return db.isClosed();
},
close: function close(cb) {
return db.close(cb);
},
iterator: function (_opts) {
var opts = clone(_opts || {});
var prefix = _opts.prefix || [];
function encodeKey(key) {
return encodePrefix(prefix, key, opts, {});
}
ltgt.toLtgt(_opts, opts, encodeKey, precodec.lowerBound, precodec.upperBound);
// if these legacy values are in the options, remove them
opts.prefix = null;
//************************************************
//hard coded defaults, for now...
//TODO: pull defaults and encoding out of levelup.
opts.keyAsBuffer = opts.valueAsBuffer = false;
//************************************************
//this is vital, otherwise limit: undefined will
//create an empty stream.
/* istanbul ignore next */
if ('number' !== typeof opts.limit) {
opts.limit = -1;
}
opts.keyAsBuffer = precodec.buffer;
opts.valueAsBuffer = codec.valueAsBuffer(opts);
function wrapIterator(iterator) {
return {
next: function (cb) {
return iterator.next(cb);
},
end: function (cb) {
iterator.end(cb);
}
};
}
return wrapIterator(db.db.iterator(opts));
}
};
}
export default nut;