diff options
Diffstat (limited to 'chromium/components/leveldb/leveldb_database_impl.cc')
-rw-r--r-- | chromium/components/leveldb/leveldb_database_impl.cc | 87 |
1 files changed, 74 insertions, 13 deletions
diff --git a/chromium/components/leveldb/leveldb_database_impl.cc b/chromium/components/leveldb/leveldb_database_impl.cc index 6a64706985b..f5d618cc190 100644 --- a/chromium/components/leveldb/leveldb_database_impl.cc +++ b/chromium/components/leveldb/leveldb_database_impl.cc @@ -28,12 +28,27 @@ uint64_t GetSafeRandomId(const std::map<uint64_t, T>& m) { return new_id; } +template <typename FunctionType> +leveldb::Status ForEachWithPrefix(leveldb::DB* db, + const leveldb::Slice& key_prefix, + FunctionType function) { + std::unique_ptr<leveldb::Iterator> it( + db->NewIterator(leveldb::ReadOptions())); + it->Seek(key_prefix); + for (; it->Valid(); it->Next()) { + if (!it->key().starts_with(key_prefix)) + break; + function(it->key(), it->value()); + } + return it->status(); +} + } // namespace LevelDBDatabaseImpl::LevelDBDatabaseImpl( - leveldb::LevelDBDatabaseRequest request, - scoped_ptr<leveldb::Env> environment, - scoped_ptr<leveldb::DB> db) + leveldb::mojom::LevelDBDatabaseRequest request, + std::unique_ptr<leveldb::Env> environment, + std::unique_ptr<leveldb::DB> db) : binding_(this, std::move(request)), environment_(std::move(environment)), db_(std::move(db)) {} @@ -60,21 +75,37 @@ void LevelDBDatabaseImpl::Delete(mojo::Array<uint8_t> key, callback.Run(LeveldbStatusToError(status)); } -void LevelDBDatabaseImpl::Write(mojo::Array<BatchedOperationPtr> operations, - const WriteCallback& callback) { +void LevelDBDatabaseImpl::DeletePrefixed( + mojo::Array<uint8_t> key_prefix, + const DeletePrefixedCallback& callback) { + leveldb::WriteBatch batch; + leveldb::Status status = DeletePrefixedHelper( + GetSliceFor(key_prefix), &batch); + if (status.ok()) + status = db_->Write(leveldb::WriteOptions(), &batch); + callback.Run(LeveldbStatusToError(status)); +} + +void LevelDBDatabaseImpl::Write( + mojo::Array<mojom::BatchedOperationPtr> operations, + const WriteCallback& callback) { leveldb::WriteBatch batch; for (size_t i = 0; i < operations.size(); ++i) { switch (operations[i]->type) { - case BatchOperationType::PUT_KEY: { + case mojom::BatchOperationType::PUT_KEY: { batch.Put(GetSliceFor(operations[i]->key), GetSliceFor(operations[i]->value)); break; } - case BatchOperationType::DELETE_KEY: { + case mojom::BatchOperationType::DELETE_KEY: { batch.Delete(GetSliceFor(operations[i]->key)); break; } + case mojom::BatchOperationType::DELETE_PREFIXED_KEY: { + DeletePrefixedHelper(GetSliceFor(operations[i]->key), &batch); + break; + } } } @@ -90,6 +121,20 @@ void LevelDBDatabaseImpl::Get(mojo::Array<uint8_t> key, callback.Run(LeveldbStatusToError(status), mojo::Array<uint8_t>::From(value)); } +void LevelDBDatabaseImpl::GetPrefixed(mojo::Array<uint8_t> key_prefix, + const GetPrefixedCallback& callback) { + mojo::Array<mojom::KeyValuePtr> data; + leveldb::Status status = ForEachWithPrefix( + db_.get(), GetSliceFor(key_prefix), + [&data](const leveldb::Slice& key, const leveldb::Slice& value) { + mojom::KeyValuePtr kv = mojom::KeyValue::New(); + kv->key = GetArrayFor(key); + kv->value = GetArrayFor(value); + data.push_back(std::move(kv)); + }); + callback.Run(LeveldbStatusToError(status), std::move(data)); +} + void LevelDBDatabaseImpl::GetSnapshot(const GetSnapshotCallback& callback) { const Snapshot* s = db_->GetSnapshot(); uint64_t new_id = GetSafeRandomId(snapshot_map_); @@ -111,7 +156,8 @@ void LevelDBDatabaseImpl::GetFromSnapshot(uint64_t snapshot_id, // If the snapshot id is invalid, send back invalid argument auto it = snapshot_map_.find(snapshot_id); if (it == snapshot_map_.end()) { - callback.Run(DatabaseError::INVALID_ARGUMENT, mojo::Array<uint8_t>()); + callback.Run(mojom::DatabaseError::INVALID_ARGUMENT, + mojo::Array<uint8_t>()); return; } @@ -161,7 +207,8 @@ void LevelDBDatabaseImpl::IteratorSeekToFirst( const IteratorSeekToFirstCallback& callback) { auto it = iterator_map_.find(iterator_id); if (it == iterator_map_.end()) { - callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + callback.Run(false, mojom::DatabaseError::INVALID_ARGUMENT, nullptr, + nullptr); return; } @@ -175,7 +222,8 @@ void LevelDBDatabaseImpl::IteratorSeekToLast( const IteratorSeekToLastCallback& callback) { auto it = iterator_map_.find(iterator_id); if (it == iterator_map_.end()) { - callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + callback.Run(false, mojom::DatabaseError::INVALID_ARGUMENT, nullptr, + nullptr); return; } @@ -190,7 +238,8 @@ void LevelDBDatabaseImpl::IteratorSeek( const IteratorSeekToLastCallback& callback) { auto it = iterator_map_.find(iterator_id); if (it == iterator_map_.end()) { - callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + callback.Run(false, mojom::DatabaseError::INVALID_ARGUMENT, nullptr, + nullptr); return; } @@ -203,7 +252,8 @@ void LevelDBDatabaseImpl::IteratorNext(uint64_t iterator_id, const IteratorNextCallback& callback) { auto it = iterator_map_.find(iterator_id); if (it == iterator_map_.end()) { - callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + callback.Run(false, mojom::DatabaseError::INVALID_ARGUMENT, nullptr, + nullptr); return; } @@ -216,7 +266,8 @@ void LevelDBDatabaseImpl::IteratorPrev(uint64_t iterator_id, const IteratorPrevCallback& callback) { auto it = iterator_map_.find(iterator_id); if (it == iterator_map_.end()) { - callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + callback.Run(false, mojom::DatabaseError::INVALID_ARGUMENT, nullptr, + nullptr); return; } @@ -237,4 +288,14 @@ void LevelDBDatabaseImpl::ReplyToIteratorMessage( GetArrayFor(it->value())); } +leveldb::Status LevelDBDatabaseImpl::DeletePrefixedHelper( + const leveldb::Slice& key_prefix, + leveldb::WriteBatch* batch) { + leveldb::Status status = ForEachWithPrefix(db_.get(), key_prefix, + [batch](const leveldb::Slice& key, const leveldb::Slice& value) { + batch->Delete(key); + }); + return status; +} + } // namespace leveldb |