Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/core/StarBTreeDatabase.cpp5
-rw-r--r--source/core/StarBTreeDatabase.hpp1
-rw-r--r--source/utility/btree_repacker.cpp15
3 files changed, 16 insertions, 5 deletions
diff --git a/source/core/StarBTreeDatabase.cpp b/source/core/StarBTreeDatabase.cpp
index b188f20..19b0bd2 100644
--- a/source/core/StarBTreeDatabase.cpp
+++ b/source/core/StarBTreeDatabase.cpp
@@ -196,6 +196,11 @@ void BTreeDatabase::forAll(function<void(ByteArray, ByteArray)> v) {
m_impl.forAll(std::move(v));
}
+void BTreeDatabase::recoverAll(function<void(ByteArray, ByteArray)> v, function<void(String const&, std::exception const&)> e) {
+ ReadLocker readLocker(m_lock);
+ m_impl.recoverAll(std::move(v), std::move(e));
+}
+
bool BTreeDatabase::insert(ByteArray const& k, ByteArray const& data) {
WriteLocker writeLocker(m_lock);
checkKeySize(k);
diff --git a/source/core/StarBTreeDatabase.hpp b/source/core/StarBTreeDatabase.hpp
index 8f7a4fd..f1b88a1 100644
--- a/source/core/StarBTreeDatabase.hpp
+++ b/source/core/StarBTreeDatabase.hpp
@@ -64,6 +64,7 @@ public:
void forEach(ByteArray const& lower, ByteArray const& upper, function<void(ByteArray, ByteArray)> v);
void forAll(function<void(ByteArray, ByteArray)> v);
+ void recoverAll(function<void(ByteArray, ByteArray)> v, function<void(String const&, std::exception const&)> e);
// Returns true if a value was overwritten
bool insert(ByteArray const& k, ByteArray const& data);
diff --git a/source/utility/btree_repacker.cpp b/source/utility/btree_repacker.cpp
index 4276571..d711a64 100644
--- a/source/utility/btree_repacker.cpp
+++ b/source/utility/btree_repacker.cpp
@@ -36,11 +36,16 @@ int main(int argc, char** argv) {
newDb.open();
coutf("Repacking {}...\n", bTreePath);
//copy the data over
- unsigned count = 0;
- db.forAll([&count, &newDb](ByteArray key, ByteArray data) {
- newDb.insert(key, data);
+ unsigned count = 0, overwritten = 0;
+ auto visitor = [&](ByteArray key, ByteArray data) {
+ if (newDb.insert(key, data))
+ ++overwritten;
++count;
- });
+ };
+ auto errorHandler = [&](String const& error, std::exception const& e) {
+ coutf("{}: {}\n", error, e.what());
+ };
+ db.recoverAll(visitor, errorHandler);
//close the old db
db.close();
@@ -48,7 +53,7 @@ int main(int argc, char** argv) {
newDb.commit();
newDb.close();
- coutf("Repacked BTree to {} in {}s\n", outputFilename, Time::monotonicTime() - startTime);
+ coutf("Repacked BTree to {} in {:.6f}s\n({} inserts, {} overwritten)\n", outputFilename, Time::monotonicTime() - startTime, count, overwritten);
return 0;
} catch (std::exception const& e) {