Мы используем leveldb в проекте NodeJS через API более высокого уровня levelUP. Используя API уровня level, вы можете запросить поток всех ключей и установить limit=1
, чтобы ограничить ответ не более чем одним ключом. Если база данных пуста, вы получите пустой поток, иначе вы получите поток с ровно одним элементом.
var empty = true;
db.createReadStream(db, {
keys: true,
values: false,
limit: 1
}.on('data', function(data) {
empty = false;
}.on('end', function() {
console.log('db is ' + (empty ? 'empty' : 'not empty'));
});
Мы используем эту технику в модуле npm level-is-empty.
Поскольку вам нужно решение с использованием API-интерфейса leveldb, я посмотрел, как levelUP реализует API createReadStream()
.
В уровнеUP, createReadStream is implemented using an iterator.
В levelDOWN создается собственный экземпляр Iterator here. Calling next
on it tells you whether the iterator has more data or is finished.
Я нашел пример того, как использовать собственные LevelDB итераторы here
По-видимому, метод итератора Valid()
говорит вам, есть ли еще ключи для чтения. Поэтому, просто называя SeekToFirst(), а затем Valid(), вы должны узнать, есть ли какой-либо ключ в базе данных.
Вот моя догадка (код тестировался, я не имею C компилятор под рукой)
leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
it->SeekToFirst();
bool isEmpty = !(it->Valid());
delete it;
Конечно, я не перебрать все ключи просто чтобы увидеть, если база данных пуста , Я просто попытался сначала проверить, действительно ли итератор https://github.com/nurettin/pwned/blob/master/leveldb/leveldb.hpp#L153, но все же вы дали мне правильную идею. – nurettin