Skip to content

Commit

Permalink
Merge 6b36113 into 805a22a
Browse files Browse the repository at this point in the history
  • Loading branch information
plainweaver committed Nov 23, 2018
2 parents 805a22a + 6b36113 commit b2ced94
Show file tree
Hide file tree
Showing 11 changed files with 267 additions and 623 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ results
npm-debug.log
node_modules
coverage
package-lock.json
254 changes: 65 additions & 189 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,129 +7,104 @@ var AbstractIterator = require('abstract-leveldown').AbstractIterator;

var LocalStorage = require('./localstorage').LocalStorage;
var LocalStorageCore = require('./localstorage-core');
var utils = require('./utils');
var ltgt = require('ltgt');

// see http://stackoverflow.com/a/15349865/680742
var nextTick = global.setImmediate || process.nextTick;

function LDIterator(db, options) {

AbstractIterator.call(this, db);

this._reverse = !!options.reverse;
this._endkey = options.end;
this._startkey = options.start;
this._gt = options.gt;
this._gte = options.gte;
this._lt = options.lt;
this._lte = options.lte;
this._exclusiveStart = options.exclusiveStart;
this._keysOnly = options.values === false;
this.range = ltgt.toLtgt(options);
this._limit = options.limit;
this._count = 0;

this.onInitCompleteListeners = [];
this.keyAsBuffer = options.keyAsBuffer !== false;
this.valueAsBuffer = options.valueAsBuffer !== false;

this._pos = 0;
this._count = 0;
this._nextQueue = [];
this._initStarted = false;
}

inherits(LDIterator, AbstractIterator);

LDIterator.prototype._init = function (callback) {
var self = this;
self.initStarted = true;

nextTick(function () {
callback();
self.initStarted = true;
self.db.container.keys(function (err, keys) {
self._keys = keys;

if (self.range.reverse) {
self._pos = keys.length - 1;
}

callback();

self.initCompleted = true;
for (var i = 0; i < self._nextQueue.length; i++) {
self._nextQueue[i]();
}
});
});
};

LDIterator.prototype._next = function (callback) {
var self = this;

function onInitComplete() {
if (self._pos === self._keys.length || self._pos < 0) { // done reading
return callback();
}
if (!self.initStarted) {
return self._init(onInitComplete);
}

var key = self._keys[self._pos];
if (!self.initCompleted) {
return self._nextQueue.push(onInitComplete);
}

if (!!self._endkey && (self._reverse ? key < self._endkey : key > self._endkey)) {
nextTick(onInitComplete);

function onInitComplete () {
if (self._pos >= self._keys.length || self._pos < 0) {
return callback();
}

if (!!self._limit && self._limit > 0 && self._count++ >= self._limit) {
if (self._limit >= 0 && self._limit <= self._count) {
return callback();
}

if ((self._lt && key >= self._lt) ||
(self._lte && key > self._lte) ||
(self._gt && key <= self._gt) ||
(self._gte && key < self._gte)) {
return callback();
var key = self._keys[self._pos];
self._pos += self.range.reverse ? -1 : 1;

if (!ltgt.contains(self.range, key)) {
return self._next(callback);
}

self._pos += self._reverse ? -1 : 1;
if (self._keysOnly) {
return callback(null, key);
if (self.keyAsBuffer) {
key = bufferFrom(String(key));
}

self.db.container.getItem(key, function (err, value) {
if (err) {
if (err.message === 'NotFound') {
return nextTick(function () {
self._next(callback);
});
}
return callback(err);
return self._next(callback);
}

if (self.valueAsBuffer) {
value = bufferFrom(String(value));
}

self._count++;
callback(null, key, value);
});
}
if (!self.initStarted) {
process.nextTick(function () {
self.initStarted = true;
self._init(function (err) {
if (err) {
return callback(err);
}
self.db.container.keys(function (err, keys) {
if (err) {
return callback(err);
}
self._keys = keys;
if (self._startkey) {
var index = utils.sortedIndexOf(self._keys, self._startkey);
var startkey = (index >= self._keys.length || index < 0) ?
undefined : self._keys[index];
self._pos = index;
if (self._reverse) {
if (self._exclusiveStart || startkey !== self._startkey) {
self._pos--;
}
} else if (self._exclusiveStart && startkey === self._startkey) {
self._pos++;
}
} else {
self._pos = self._reverse ? self._keys.length - 1 : 0;
}
onInitComplete();

self.initCompleted = true;
var i = -1;
while (++i < self.onInitCompleteListeners.length) {
nextTick(self.onInitCompleteListeners[i]);
}
});
});
});
} else if (!self.initCompleted) {
self.onInitCompleteListeners.push(onInitComplete);
} else {
process.nextTick(onInitComplete);
}
};


function LD(location) {
if (!(this instanceof LD)) {
return new LD(location);
}
AbstractLevelDOWN.call(this, location);
AbstractLevelDOWN.call(this);

this.location = location;
this.container = new LocalStorage(location);
}

Expand All @@ -140,43 +115,10 @@ LD.prototype._open = function (options, callback) {
};

LD.prototype._put = function (key, value, options, callback) {

var err = checkKeyValue(key, 'key');

if (err) {
return nextTick(function () {
callback(err);
});
}

err = checkKeyValue(value, 'value');

if (err) {
return nextTick(function () {
callback(err);
});
}

if (typeof value === 'object' && !Buffer.isBuffer(value) && value.buffer === undefined) {
var obj = {};
obj.storetype = "json";
obj.data = value;
value = JSON.stringify(obj);
}

this.container.setItem(key, value, callback);
};

LD.prototype._get = function (key, options, callback) {

var err = checkKeyValue(key, 'key');

if (err) {
return nextTick(function () {
callback(err);
});
}

if (!Buffer.isBuffer(key)) {
key = String(key);
}
Expand All @@ -190,30 +132,11 @@ LD.prototype._get = function (key, options, callback) {
value = bufferFrom(value);
}


if (options.asBuffer === false) {
if (value.indexOf("{\"storetype\":\"json\",\"data\"") > -1) {
var res = JSON.parse(value);
value = res.data;
}
}
callback(null, value);
});
};

LD.prototype._del = function (key, options, callback) {

var err = checkKeyValue(key, 'key');

if (err) {
return nextTick(function () {
callback(err);
});
}
if (!Buffer.isBuffer(key)) {
key = String(key);
}

this.container.removeItem(key, callback);
};

Expand All @@ -225,36 +148,21 @@ LD.prototype._batch = function (array, options, callback) {
var value;

var numDone = 0;
var overallErr;
function checkDone() {
if (++numDone === array.length) {
callback(overallErr);
callback(err);
}
}

if (Array.isArray(array) && array.length) {
for (var i = 0; i < array.length; i++) {
var task = array[i];
if (task) {
key = Buffer.isBuffer(task.key) ? task.key : String(task.key);
err = checkKeyValue(key, 'key');
if (err) {
overallErr = err;
checkDone();
} else if (task.type === 'del') {
self._del(task.key, options, checkDone);
} else if (task.type === 'put') {
value = Buffer.isBuffer(task.value) ? task.value : String(task.value);
err = checkKeyValue(value, 'value');
if (err) {
overallErr = err;
checkDone();
} else {
self._put(key, value, options, checkDone);
}
}
} else {
checkDone();
key = Buffer.isBuffer(task.key) ? task.key : String(task.key);
if (task.type === 'del') {
self._del(task.key, options, checkDone);
} else if (task.type === 'put') {
value = Buffer.isBuffer(task.value) ? task.value : String(task.value);
self._put(key, value, options, checkDone);
}
}
} else {
Expand All @@ -267,40 +175,8 @@ LD.prototype._iterator = function (options) {
return new LDIterator(this, options);
};

LD.destroy = function (name, callback) {
LocalStorageCore.destroy(name, callback);
LD.prototype.destroy = function (callback) {
LocalStorageCore.destroy(this.location, callback);
};

function checkKeyValue(obj, type) {
if (obj === null || obj === undefined) {
return new Error(type + ' cannot be `null` or `undefined`');
}
if (obj === null || obj === undefined) {
return new Error(type + ' cannot be `null` or `undefined`');
}

if (type === 'key') {

if (obj instanceof Boolean) {
return new Error(type + ' cannot be `null` or `undefined`');
}
if (obj === '') {
return new Error(type + ' cannot be empty');
}
}
if (obj.toString().indexOf("[object ArrayBuffer]") === 0) {
if (obj.byteLength === 0 || obj.byteLength === undefined) {
return new Error(type + ' cannot be an empty Buffer');
}
}

if (Buffer.isBuffer(obj)) {
if (obj.length === 0) {
return new Error(type + ' cannot be an empty Buffer');
}
} else if (String(obj) === '') {
return new Error(type + ' cannot be an empty String');
}
}

module.exports = LD;
2 changes: 1 addition & 1 deletion lib/localstorage.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ LocalStorage.prototype.removeItem = function (key, callback) {
var self = this;
self.sequentialize(callback, function (callback) {
var idx = utils.sortedIndexOf(self._keys, key);
if (self._keys[idx] === key) {
if (self._keys[idx] === key) {
self._keys.splice(idx, 1);
self._store.remove(key, function (err) {
if (err) {
Expand Down
4 changes: 4 additions & 0 deletions lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ exports.sortedIndexOf = function(arr, item) {
}
return low;
};

exports.test = function(value) {

};
Loading

0 comments on commit b2ced94

Please sign in to comment.