Skip to content
This repository was archived by the owner on Dec 2, 2024. It is now read-only.

Commit 3f17d79

Browse files
author
James Halliday
committed
failing sublevel test
1 parent decff64 commit 3f17d79

File tree

3 files changed

+95
-3
lines changed

3 files changed

+95
-3
lines changed

index.js

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ var levelProxy = require('level-proxy');
44
var net = require('net');
55
var fs = require('fs');
66
var path = require('path');
7+
var has = require('has');
8+
var manifest = require('level-manifest')({
9+
methods: {
10+
_iteratorCreate: { type: 'async' },
11+
_iteratorNext: { type: 'async' },
12+
_iteratorEnd: { type: 'async' }
13+
}
14+
});
715

816
module.exports = function (dir, opts) {
917
var proxy = levelProxy();
@@ -27,8 +35,40 @@ function withProxy (proxy, dir, opts) {
2735
db.removeListener('error', onerror);
2836

2937
var server = net.createServer(function (stream) {
30-
stream.on('error', function (err) {});
38+
var iterators = {};
39+
if (!db.methods) db.methods = {};
40+
41+
db.methods._iteratorCreate = { type: 'async' };
42+
db._iteratorCreate = function (ix, opts) {
43+
iterators[ix] = (db.iterator && db.iterator(opts))
44+
|| (db.db && db.db.iterator && db.db.iterator(opts))
45+
;
46+
};
47+
48+
db.methods._iteratorNext = { type: 'async' };
49+
db._iteratorNext = function (ix, cb) {
50+
if (!has(iterators, ix)) cb(new Error('no such iterator'))
51+
else iterators[ix].next(function (err, key, value) {
52+
cb(err, key, value);
53+
})
54+
};
55+
56+
db.methods._iteratorEnd = { type: 'async' };
57+
db._iteratorEnd = function (ix, cb) {
58+
if (!has(iterators, ix)) cb(new Error('no such iterator'))
59+
else iterators[ix].end(cb)
60+
};
61+
62+
stream.on('error', function (err) { cleanup() });
63+
stream.once('end', cleanup);
3164
stream.pipe(multilevel.server(db)).pipe(stream);
65+
66+
function cleanup () {
67+
Object.keys(iterators).forEach(function (ix) {
68+
iterators[ix].end();
69+
});
70+
iterators = null;
71+
}
3272
});
3373
server.listen(sockfile);
3474

@@ -58,7 +98,17 @@ function withProxy (proxy, dir, opts) {
5898
}
5999

60100
function createStream () {
61-
var xdb = multilevel.client();
101+
var xdb = multilevel.client(manifest);
102+
103+
var iteratorIx = 0;
104+
xdb.iterator = function (opts) {
105+
var ix = iteratorIx ++;
106+
xdb._iteratorCreate(ix, opts);
107+
108+
return { next: next, end: end };
109+
function next (cb) { xdb._iteratorNext(ix, cb) }
110+
function end (cb) { xdb._iteratorEnd(ix, cb) }
111+
};
62112

63113
(function connect () {
64114
var stream = net.connect(sockfile);

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
"description": "open a leveldb handle multiple times",
55
"main": "index.js",
66
"dependencies": {
7+
"has": "0.0.1",
78
"level": "~0.18.0",
89
"level-proxy": "^1.0.0",
9-
"multilevel": "~5.5.0"
10+
"multilevel": "^6.0.0"
1011
},
1112
"devDependencies": {
1213
"tape": "~2.3.2"

test/sublevel.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
var test = require('tape');
2+
var level = require('../');
3+
var path = require('path');
4+
var sub = require('level-sublevel');
5+
var os = require('os');
6+
var tmpdir = os.tmpdir ? os.tmpdir() : os.tmpDir();
7+
var datadir = path.join(tmpdir, 'level-party-' + Math.random());
8+
9+
test('sublevel', function (t) {
10+
t.plan(6);
11+
var db = level(datadir);
12+
var sdb = sub(db);
13+
var a = sdb.sublevel('aaa', { valueEncoding: 'json' });
14+
var b = sdb.sublevel('bbb', { valueEncoding: 'json' });
15+
16+
var value = Math.floor(Math.random() * 100000);
17+
18+
a.put('x', value, function (err) {
19+
t.ifError(err);
20+
21+
a.get('x', function (err, x) {
22+
t.ifError(err);
23+
t.equal(x, value);
24+
});
25+
b.get('x', function (err, x) {
26+
t.ok(err);
27+
});
28+
29+
a.createReadStream().on('data', function (row) {
30+
t.deepEqual(row.key, 'x');
31+
t.deepEqual(row.value, value);
32+
});
33+
b.createReadStream().on('data', function (row) {
34+
t.fail('b should not have rows');
35+
});
36+
});
37+
38+
t.on('end', function () {
39+
db.close();
40+
});
41+
});

0 commit comments

Comments
 (0)