1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-03-09 15:40:10 +00:00

serialize boc with bfs (with multiget)

This commit is contained in:
Marat S 2025-02-12 19:08:57 +00:00
parent 3c245c6146
commit fbb9954391
14 changed files with 448 additions and 122 deletions

View file

@ -153,6 +153,40 @@ Result<RocksDb::GetStatus> RocksDb::get(Slice key, std::string &value) {
return from_rocksdb(status);
}
Result<std::vector<RocksDb::GetStatus>> RocksDb::get_multi(td::Span<Slice> keys, std::vector<std::string> *values) {
std::vector<rocksdb::Status> statuses(keys.size());
std::vector<rocksdb::Slice> keys_rocksdb;
keys_rocksdb.reserve(keys.size());
for (auto &key : keys) {
keys_rocksdb.push_back(to_rocksdb(key));
}
std::vector<rocksdb::PinnableSlice> values_rocksdb(keys.size());
rocksdb::ReadOptions options;
if (snapshot_) {
options.snapshot = snapshot_.get();
db_->MultiGet(options, db_->DefaultColumnFamily(), keys_rocksdb.size(), keys_rocksdb.data(), values_rocksdb.data(), statuses.data());
} else if (transaction_) {
transaction_->MultiGet(options, db_->DefaultColumnFamily(), keys_rocksdb.size(), keys_rocksdb.data(), values_rocksdb.data(), statuses.data());
} else {
db_->MultiGet(options, db_->DefaultColumnFamily(), keys_rocksdb.size(), keys_rocksdb.data(), values_rocksdb.data(), statuses.data());
}
std::vector<GetStatus> res(statuses.size());
values->resize(statuses.size());
for (size_t i = 0; i < statuses.size(); i++) {
auto &status = statuses[i];
if (status.ok()) {
res[i] = GetStatus::Ok;
values->at(i) = values_rocksdb[i].ToString();
} else if (status.code() == rocksdb::Status::kNotFound) {
res[i] = GetStatus::NotFound;
values->at(i) = "";
} else {
return from_rocksdb(status);
}
}
return res;
}
Status RocksDb::set(Slice key, Slice value) {
if (write_batch_) {
return from_rocksdb(write_batch_->Put(to_rocksdb(key), to_rocksdb(value)));