2013-10-26 77 views
0

假設您不知道leveldb數據庫中的確切鍵。如何檢查leveldb是否爲空

我嘗試插入3個鍵並在鍵範圍上使用GetApproximateSizes,結果始終爲零。

那麼如何檢查leveldb中是否有任何鍵?

回答

0

你不能只使用leveldb掃描並打印所有的鍵和值。例如,要打印所有鍵和值在數據庫中,你可以做到以下幾點:

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions()); 
    for (it->SeekToFirst(); it->Valid(); it->Next()) { 
    cout << it->key().ToString() << ": " << it->value().ToString() << endl; 
    } 
    assert(it->status().ok()); // Check for any errors found during the scan 
    delete it; 

現在GetApproximateSizes給予零值,因爲剛剛插入3個按鍵,它們仍然在內存(memTable中),並沒有達到文件系統。一旦memtable已滿(默認4MB),它將創建0級的第一個文件。因此它對於更大的數據庫和更大的密鑰範圍更加有用。

在你的情況下,文件系統中唯一存在的數據是重做日誌,如果你的密鑰是字符串,你可以通過在db目錄中調用'strings logfile'(在linux中)來快速檢查以打印出將字符串的一部分作爲確認數據已經進入的快速方法。

+0

當然,我並沒有在所有的按鍵迭代只是爲了看看如果數據庫是空的,我只是想先查看迭代器是否有效https://github.com/nurettin/pwned/blob/master/leveldb/leveldb.hpp#L153但仍然給我正確的想法 – nurettin

0

我們通過更高級別的API levelUP在NodeJS項目中使用leveldb。使用levelUP API,您可以請求所有密鑰流,並設置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中使用這種技術。

由於您需要使用leveldb的本地API的解決方案,我研究了levelUP如何實現createReadStream() API。

在levelUP中,createReadStream is implemented using an iterator

在levelDOWN中,創建本地Iterator實例hereCalling next on it tells you whether the iterator has more data or is finished

我發現瞭如何使用本地性LevelDB迭代here

顯然的例子,iterator方法Valid()告訴你是否有更多的鍵翻閱。所以通過簡單地調用SeekToFirst()和Valid(),你應該能夠發現db中是否有任何鍵。

這是我最好的猜測(代碼是未經測試的,我沒有在手的C編譯器)

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions()); 
it->SeekToFirst(); 
bool isEmpty = !(it->Valid()); 
delete it; 
+0

這是什麼createReadStream?我沒有在leveldb資源中找到它。 – nurettin

+0

對不起,它是一個[npm模塊levelup](https://www.npmjs.com/package/levelup)的API,位於名爲[leveldown](https:// github)的Nodejs-leveldb綁定之上。 COM /平/ leveldown /)。我錯誤地認爲你在使用NodeJS。現在我意識到你正在談論leveldb的本地API。我會編輯我的答案。 – regular

+0

哈哈,剛剛看到你對接受答案的評論,所以你想出了相同的解決方案。 – regular