LevelUP v0.9 Released
As per my previous post, LevelUP v0.9 has been released!
I'm doing a quick post about this release because it's got more changes in it than we normally see, including some things worth explaining.
Relationship to LevelDOWN
The biggest change is the removal of LevelDOWN as a dependency, you should review what I've already said about this as this will impact you if you're currently using LevelUP. In short, you'll either need to explicitly npm install leveldown
or switch to using the new Level package which bundles them both.
Along with this change, we also get better Browserify support. See level.js for more information on this.
Chained batch
The other major change is the introduction of a new chained batch syntax, additional to the existing batch syntax. This method of creating and writing batch operations is much closer to the way LevelDB does batches and under certain circumstances you may find improved performance from using this method.
If you call db.batch()
with no arguments, you'll get a Batch
object back which has the following operations: put()
, del()
, clear()
and write()
. The first three are chainable so you can call them one after the other to build your batch. write()
is the only method that takes a callback because it submits the batch. Until you call write()
, the batch is transient and can be discarded.
Example from the README:
db.batch()
.del('father')
.put('name', 'Yuri Irsenovich Kim')
.put('dob', '16 February 1941')
.put('spouse', 'Kim Young-sook')
.put('occupation', 'Clown')
.write(function () { console.log('Done!') })
Some love for WriteStream
WriteStream got some attention in this release. On the main createWriteStream()
method and on individual write()
calls, you can now pass some new options:
'type'
can switch from the default'put'
to'del'
so you can make a WriteStream that only deletes when youwrite({ key: 'foo' })
, or you can make individual writes delete:write({ type: 'del', key: 'foo' })
.'keyEncoding'
and'valueEncoding'
will switch from default encodings for the current LevelUP instance. Again, you can specify them on the maincreateWriteStream()
or on individualwrite()
calls.
Other changes
- A race condition was fixed that allowed a
put()
to write to the store before an iterator was obtained when calling `createReadStream(). - ReadStream no longer emits a
'ready'
event. - The
db
property on LevelUP instances can be used to get access to LevelDOWN or whatever LevelDOWN-substitute you are using (this was_db
). - Some very LevelDB-specific methods have been deprecated on LevelUP and the documentation now recommends either directly using LevelDOWN or calling via the
db
property. Specifically:db.db.approximateSize()
leveldown.repair()
leveldown.destroy()
- LevelDOWN got a new LevelDB method:
getProperty()
that currently understands 3 properties:db.db.getProperty('leveldb.num-files-at-levelN')
: returns the number of files at level N, where N is an integer representing a valid level (e.g. "0")').db.db.getProperty('leveldb.stats')
: returns a multi-line string describing statistics about LevelDB's internal operation.db.db.getProperty('leveldb.sstables')
: returns a multi-line string describing all of the sstables that make up contents of the current database.
- Significantly improved ReadStream performance improvements (up to 50% faster).
- Some LevelDOWN memory leaks discovered and fixed.
- LevelDOWN upgraded to LevelDB@1.10.0, details here.
Who you should thank
A lot of people put in work to this release. There's a team of people that can claim ownership of LevelUP, LevelDOWN and related projects and most of them have been involved in this release. You should follow these people on Twitter and GitHub!
- Dominic Tarr (GitHub/dominictarr / Twitter/@dominictarr) contributed to the ReadStream fixes and is just a generally valuable & awesome sage in the LevelDB + Node community.
- Julian Gruber (GitHub/juliangruber / Twitter/@juliangruber) contributed the encoding options for WriteStreams and most of the work on the new chained
batch()
. - Matteo Collina (GitHub/mcollina / Twitter/@matteocollina) contributed the
'type'
options for WriteStreams and most of the work on performance improvements to ReadStreams. - David Björklund (GitHub/kesla / Twitter/@david_bjorklund) also contributed work on ReadStream performance.
- Max Ogden (GitHub/maxogden / Twitter/@maxogden) and Anton Whalley (GitHub/No9 / Twitter/@antonwhalley) both worked on extracting most of the LevelDOWN test suite into AbstractLevelDOWN to form a LevelDOWN-spec that's also runnable in browser environments.
And others, who you can find in this 0.9 WIP thread, plus additional users who reported & found issues.