From 0790470692ec1170e3ce5c58a88ff0aa029737dd Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Sat, 8 Dec 2018 23:35:23 +0100 Subject: [PATCH] Implement db_compact_range() --- binding.cc | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ leveldown.js | 17 +++-------------- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/binding.cc b/binding.cc index 788ac893..96d81dba 100644 --- a/binding.cc +++ b/binding.cc @@ -381,6 +381,11 @@ struct Database { return size; } + void CompactRange (const leveldb::Slice* start, + const leveldb::Slice* end) { + db_->CompactRange(start, end); + } + const leveldb::Snapshot* NewSnapshot () { return db_->GetSnapshot(); } @@ -1109,6 +1114,52 @@ NAPI_METHOD(db_approximate_size) { NAPI_RETURN_UNDEFINED(); } +/** + * Worker class for getting a value from a database. + */ +struct CompactRangeWorker : public BaseWorker { + CompactRangeWorker (napi_env env, + Database* database, + napi_value callback, + leveldb::Slice start, + leveldb::Slice end) + : BaseWorker(env, database, callback, "leveldown.db.compact_range"), + start_(start), end_(end) {} + + virtual ~CompactRangeWorker () { + // TODO clean up start_ and end_ slices + // See DisposeStringOrBufferFromSlice() + } + + virtual void DoExecute () { + database_->CompactRange(&start_, &end_); + } + + leveldb::Slice start_; + leveldb::Slice end_; +}; + +/** + * Compacts a range. + */ +NAPI_METHOD(db_compact_range) { + NAPI_ARGV(4); + NAPI_DB_CONTEXT(); + + leveldb::Slice start = ToSlice(env, argv[1]); + leveldb::Slice end = ToSlice(env, argv[2]); + napi_value callback = argv[3]; + + CompactRangeWorker* worker = new CompactRangeWorker(env, + database, + callback, + start, + end); + worker->Queue(); + + NAPI_RETURN_UNDEFINED(); +} + /** * Runs when an Iterator is garbage collected. */ @@ -1777,6 +1828,7 @@ NAPI_INIT() { NAPI_EXPORT_FUNCTION(db_get); NAPI_EXPORT_FUNCTION(db_del); NAPI_EXPORT_FUNCTION(db_approximate_size); + NAPI_EXPORT_FUNCTION(db_compact_range); /** * Iterator related functions. diff --git a/leveldown.js b/leveldown.js index 1b09b8e9..a7c68c3e 100644 --- a/leveldown.js +++ b/leveldown.js @@ -22,12 +22,7 @@ function LevelDOWN (location) { util.inherits(LevelDOWN, AbstractLevelDOWN) LevelDOWN.prototype._open = function (options, callback) { - binding.db_open( - this.context, - this.location, - options, - callback - ) + binding.db_open(this.context, this.location, options, callback) } LevelDOWN.prototype._close = function (callback) { @@ -43,13 +38,7 @@ LevelDOWN.prototype._serializeValue = function (value) { } LevelDOWN.prototype._put = function (key, value, options, callback) { - binding.db_put( - this.context, - key, - value, - options, - callback - ) + binding.db_put(this.context, key, value, options, callback) } LevelDOWN.prototype._get = function (key, options, callback) { @@ -101,7 +90,7 @@ LevelDOWN.prototype.compactRange = function (start, end, callback) { start = this._serializeKey(start) end = this._serializeKey(end) - this.binding.compactRange(start, end, callback) + binding.db_compact_range(this.context, start, end, callback) } LevelDOWN.prototype.getProperty = function (property) {