dbStore.set(name, sublevel(levelup(name, opts, function (err) { /* istanbul ignore if */ if (err) { dbStore.delete(name); return callback(err); } db = dbStore.get(name); db._docCount = -1; db._queue = new Deque(); if (opts.db || opts.noMigrate) { afterDBCreated(); } else { migrate.toSublevel(name, db, afterDBCreated); } })));
function disk (name, opts, cb) { opts || (opts = {}) try { var leveldown = require('leveldown') } catch (err) { console.error('Could not load leveldown, skipping tests') return false } mkdirp.sync(tmpdir) var dir = path.join(tmpdir, name) if (opts.clean !== false) rimraf.sync(dir) opts.db = leveldown return levelup(dir, opts, cb) }
tape('subleveldown on deferred multileveldown client', function (t) { t.plan(5) var db = factory() var stream = multileveldown.server(db) var client = multileveldown.client() var sub1 = sub(client, 'test', { valueEncoding: 'json' }) var sub2 = sub(client, 'test') t.is(client.isOpen(), false) stream.pipe(client.createRpcStream()).pipe(stream) sub1.put('hello', { test: 'world' }, function (err) { t.error(err, 'no err') sub1.createReadStream().pipe(concat(function (entries) { t.same(entries, [{ key: 'hello', value: { test: 'world' } }]) })) sub2.createReadStream().pipe(concat(function (entries) { t.same(entries, [{ key: 'hello', value: '{"test":"world"}' }]) })) db.createReadStream().pipe(concat(function (entries) { t.same(entries, [{ key: '!test!hello', value: '{"test":"world"}' }]) })) }) })
test('multilevel', function (t) { t.plan(3) var posts = sub(level(), 'posts', { valueEncoding: 'json' }) var idb = sub(level(), 'title') var byTitle = AutoIndex(posts, idb, keyReducer('title')) var server = multilevel.server(byTitle) var client = multilevel.client(byTitle.manifest) server.pipe(client.createRpcStream()).pipe(server) var post = { title: 'a title', body: 'lorem ipsum' } posts.put('1337', post, function (err) { t.error(err) client.get('a title', function (err, _post) { t.error(err) t.deepEqual(_post, post) }) }) })
function setupDB(dir, setup, callback) { setup = setup || function () {}; callback = callback || function () {}; return levelup(dir, null, (err, newdb) => { if (err) { log.error('Could not open db'); callback(err); return; } newdb.get('setup', (err) => { if (err && err.notFound) { newdb.put('setup', 1); setup(newdb); callback(null, newdb); } else { callback(null, newdb); } }); }); }
function move(store, index, cb) { var storePath = path.join(base, store); var opts; if (index === 3) { opts = { valueEncoding: 'binary' }; } else { opts = { valueEncoding: 'json' }; } var sub = db.sublevel(store, opts); var orig = levelup(storePath, opts); var from = orig.createReadStream(); var writeStream = new LevelWriteStream(sub); var to = writeStream(); from.on('end', function () { orig.close(function (err) { cb(err, storePath); }); }); from.pipe(to); }
var sub2 = sub(client, 'test') sub1.put('hello', { test: 'world' }, function (err) { t.error(err, 'no err') sub1.createReadStream().pipe(concat(function (entries) { t.same(entries, [{ key: 'hello', value: { test: 'world' } }]) })) sub2.createReadStream().pipe(concat(function (entries) { t.same(entries, [{ key: 'hello', value: '{"test":"world"}' }]) }))
test('safe-deep-access', function (t) { t.plan(5) var db = MemDB() var posts = sub(db, 'posts', { valueEncoding: 'json' }) var idb = sub(db, 'index') Index(posts, idb) .by('Title', 'title') .by('Length', ['body.length']) .by('Author', ['author', 'title']) var post = { title: 'a title', author: 'julian' } posts.put('1337', post, function (err) { t.error(err) posts.byTitle.get('a title', onPost) posts.byAuthor.get('julian!a title', onPost) function onPost (err, _post) { t.error(err) t.deepEqual(_post, post) } }) })
test('key encoding', function (t) { t.plan(3) var db = level() var index = { // value encoding should match keyEncoding of indexd db title: sub(db, 'title', { valueEncoding: bytewise }), len: sub(db, 'length', { valueEncoding: bytewise }) } var posts = sub(db, 'posts', { valueEncoding: 'json', keyEncoding: bytewise }) posts.byTitle = AutoIndex(posts, index.title, keyReducer('title')) posts.byLength = AutoIndex(posts, index.len, function (post) { return post.body.length }) var post = { title: 'a title', body: 'lorem ipsum' } var key = ['1337'] posts.put(key, post, function (err) { t.error(err) index.title.get('a title', function (err, _key) { t.error(err) t.deepEqual(_key, key) }) }) })
tape('multileveldown server on deferred subleveldown', function (t) { t.plan(4) var db = factory() var sub1 = sub(db, 'test1') var sub2 = sub(db, 'test2') var stream = multileveldown.server(sub1) var client = multileveldown.client() stream.pipe(client.createRpcStream()).pipe(stream) client.put('from', 'client', function (err) { t.error(err, 'no err') sub2.put('from', 'server', function (err) { t.error(err, 'no err') client.createReadStream().pipe(concat(function (entries) { t.same(entries, [{ key: 'from', value: 'client' }]) })) db.createReadStream().pipe(concat(function (entries) { t.same(entries, [ { key: '!test1!from', value: 'client' }, { key: '!test2!from', value: 'server' } ]) })) }) }) })
t.error(err, 'no err') sub3.put('from', 'server', function (err) { t.error(err, 'no err')