Skip to content

Commit d57cf4d

Browse files
Matt Zumwaltmels065
authored andcommitted
Cleaner initialization of hypercore
Change hyperkv back to hypercore temporarily Create framework for hyperkv Add add.js to lib Current work; move to cloud Make add.js in lib and create a test Add import method and test Finish work on delete case for hyperkv Change hyperkv to not use subleveldown when a db is provided Disabling iojs testing because of leveldown issues
1 parent b2da350 commit d57cf4d

File tree

7 files changed

+187
-3
lines changed

7 files changed

+187
-3
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
tmp
22
node_modules
33
data.jawn
4+
npm-debug.log
5+

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ node_js:
55
- "0.12"
66
- "0.11"
77
- "0.10"
8-
- "iojs"
8+
# - "iojs"

index.js

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,73 @@
11
var level = require('level')
22
var hypercore = require('hypercore')
3+
4+
var hyperkv = require('hyperkv')
5+
var hyperlog = require('hyperlog')
6+
var sub = require('subleveldown')
7+
38
var createImportPipeline = require('./lib/import.js')
9+
var importRowsKv = require('./lib/importkv.js')
10+
var addRow = require('./lib/add.js')
11+
var deleteRow = require('./lib/delete.js')
412

513
module.exports = Jawn
614

715
function Jawn (opts) {
816
if (!opts) opts = {}
9-
var db = opts.db || level('data.jawn')
10-
this.core = opts.core || hypercore(db)
17+
this.core = initializeHypercore(opts)
18+
this.kv = initializeHyperkv(opts)
1119
this.db = this.core.db
20+
this.db_kv = this.kv.db
1221
}
1322

1423
Jawn.prototype.createImportPipeline = function (opts) {
1524
return createImportPipeline(this, opts)
1625
}
26+
27+
Jawn.prototype.importRowsKv = function (file, keys) {
28+
return importRowsKv(this, file, keys)
29+
}
30+
31+
Jawn.prototype.addRow = function (key, value) {
32+
return addRow(this, key, value)
33+
}
34+
35+
Jawn.prototype.deleteRow = function (key) {
36+
return deleteRow(this, key)
37+
}
38+
39+
// Initializes hypercore and its database
40+
// @default Creates a leveldb database called `data.jawn` and initializes hypercore using that db
41+
// @option 'core' the hypercore instance to use
42+
// @option 'db' the db instace (leveldb) to initialize hypercore with. This is ignored if you use the `core` option
43+
function initializeHypercore (opts) {
44+
var core
45+
if (opts.hasOwnProperty('core')) {
46+
core = opts.core
47+
} else {
48+
var db = opts.db || level('data.jawn')
49+
core = hypercore(db)
50+
}
51+
return core
52+
}
53+
54+
function initializeHyperkv (opts) {
55+
var kv
56+
if (opts.hasOwnProperty('core')) {
57+
kv = opts.core
58+
} else {
59+
var db = opts.db || level('data.jawn')
60+
if (!opts.db) {
61+
kv = hyperkv({
62+
log: hyperlog(sub(db, 'log'), { valueEncoding: 'json' }),
63+
db: sub(db, 'kv')
64+
})
65+
} else {
66+
kv = hyperkv({
67+
log: hyperlog(db, { valueEncoding: 'json' }),
68+
db: db
69+
})
70+
}
71+
}
72+
return kv
73+
}

lib/add.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = addRow
2+
3+
function addRow (jawn, key, value) {
4+
jawn.kv.put(key, value, function (err, node) {
5+
if (err) console.error(err)
6+
else console.log(node.key + ': ' + node.value)
7+
})
8+
}

lib/delete.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module.exports = deleteRow
2+
3+
function deleteRow (jawn, key) {
4+
jawn.kv.del(key, function (err, node) {
5+
if (err) console.log(err)
6+
else {
7+
console.log(node.key + ' has been deleted')
8+
jawn.kv.emit('delete', node.key, node.value, node)
9+
}
10+
})
11+
}

lib/importkv.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var fs = require('fs')
2+
var path = require('path')
3+
4+
const MAX_KEY = 100000
5+
6+
module.exports = importRowsKv
7+
8+
function importRowsKv (jawn, file, keys) {
9+
var contents = fs.readFileSync(file).toString().split('\n')
10+
contents = contents.slice(0, contents.length - 1)
11+
console.log(contents)
12+
13+
var obj = []
14+
if (path.extname(file) === '.json') {
15+
for (var i = 0; i < contents.length; i++) {
16+
obj.push(contents[i])
17+
}
18+
}
19+
20+
for (i = 0; i < obj.length; i++) {
21+
var key
22+
if (i < keys.length) {
23+
key = keys[i]
24+
} else {
25+
key = Math.floor(Math.random() * MAX_KEY)
26+
}
27+
jawn.addRow(key, obj[i])
28+
}
29+
}

test/hyperkv.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
var test = require('tape')
2+
var Jawn = require('../')
3+
var memdb = require('memdb')
4+
5+
var path = require('path')
6+
7+
test('import file to hyperkv', function (t) {
8+
var jawn = freshJawn()
9+
10+
var file = 'dummy.json'
11+
var expected = [
12+
'0: {"foo":"bar","name":"josie","age":"35"}',
13+
'1: {"foo":"baz","name":"eloise","age":"71"}',
14+
'2: {"foo":"baz","name":"francoise","age":"5"}'
15+
]
16+
17+
jawn.importRowsKv(fixture(file), [0, 1, 2])
18+
19+
jawn.kv.on('put', function (key, value, node) {
20+
t.equal(key + ': ' + value, expected.shift(), key + ' has been imported')
21+
22+
if (expected.length === 0) {
23+
t.end()
24+
}
25+
})
26+
})
27+
28+
var jawn = freshJawn()
29+
30+
test('add 3 rows to hyperkv', function (t) {
31+
var testValues = [
32+
'{"foo":"bar","name":"leslie","age":"46"}',
33+
'{"foo":"baz","name":"jim","age":"25"}',
34+
'{"foo":"baz","name":"pam","age":"17"}'
35+
]
36+
37+
var expected = [
38+
'3: {"foo":"bar","name":"leslie","age":"46"}',
39+
'4: {"foo":"baz","name":"jim","age":"25"}',
40+
'5: {"foo":"baz","name":"pam","age":"17"}'
41+
]
42+
43+
for (var i = 0; i < testValues.length; i++) {
44+
jawn.addRow(i + 3, testValues[i])
45+
}
46+
47+
jawn.kv.on('put', function (key, value, node) {
48+
t.equal(key + ': ' + value, expected.shift(), key + ' is the right value')
49+
50+
if (expected.length === 0) {
51+
t.end()
52+
}
53+
})
54+
})
55+
56+
test('delete a row', function (t) {
57+
jawn.deleteRow(3)
58+
59+
jawn.kv.on('delete', function (key, value, node) {
60+
jawn.kv.get(3, function (err, values) {
61+
if (err) {
62+
console.log(err)
63+
} else {
64+
t.same(values, {}, 'Row 3 has been successfully deleted')
65+
}
66+
t.end()
67+
})
68+
})
69+
})
70+
71+
function freshJawn () {
72+
return new Jawn({db: memdb()})
73+
}
74+
75+
function fixture (name) {
76+
return path.join(__dirname, 'data', name)
77+
}

0 commit comments

Comments
 (0)