* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#pragma once
#include <memory>
#include <string>
#include <vector>
#include <rocksdb/iterator.h>
#include <rocksdb/db.h>
#include "core/utils/ByteView.h"
class RocksIteratorWrapper {
public:
* 构造函数:接收一个 rocksdb::Iterator 指针,转移所有权
* @param iter 必须非空
*/
explicit RocksIteratorWrapper(std::unique_ptr<rocksdb::Iterator> iter)
: iterator(std::move(iter))
{
if (!iterator) {
throw std::invalid_argument("Iterator cannot be null");
}
}
RocksIteratorWrapper(const RocksIteratorWrapper&) = delete;
RocksIteratorWrapper& operator=(const RocksIteratorWrapper&) = delete;
RocksIteratorWrapper(RocksIteratorWrapper&&) noexcept = default;
RocksIteratorWrapper& operator=(RocksIteratorWrapper&&) noexcept = default;
* 检查迭代器是否有效
*/
bool isValid()
{
bool valid = iterator->Valid();
if (!valid) {
status();
}
return valid;
}
* 移动到第一个键
*/
void seekToFirst()
{
iterator->SeekToFirst();
}
* 移动到最后一个键
*/
void seekToLast()
{
iterator->SeekToLast();
}
* 查找目标键(字节数组)
*/
void seek(const std::vector<uint8_t>& target)
{
iterator->Seek(rocksdb::Slice(reinterpret_cast<const char*>(target.data()), target.size()));
}
* 反向查找目标键
*/
void seekForPrev(const std::vector<uint8_t>& target)
{
iterator->SeekForPrev(rocksdb::Slice(reinterpret_cast<const char*>(target.data()), target.size()));
}
* 字符串版本(常用)
*/
void seek(const std::string& target)
{
iterator->Seek(rocksdb::Slice(target));
}
void seek(const rocksdb::Slice& target)
{
iterator->Seek(target);
}
void seekForPrev(const std::string& target)
{
iterator->SeekForPrev(rocksdb::Slice(target));
}
* 下一个
*/
void next()
{
iterator->Next();
}
* 上一个
*/
void prev()
{
iterator->Prev();
}
* 检查内部状态,若出错则抛出 FlinkRuntimeException
*/
void status()
{
try {
auto status = iterator->status();
if (!status.ok()) {
throw std::runtime_error("Internal exception found in RocksDB: " + status.ToString());
}
} catch (...) {
throw std::runtime_error("Internal exception found in RocksDB");
}
}
* 刷新迭代器(RocksDB 支持)
* @throws FlinkRuntimeException 如果刷新失败
*/
void refresh()
{
try {
iterator->Refresh();
status();
} catch (const rocksdb::Status& s) {
throw std::runtime_error("Refresh failed: " + s.ToString());
}
}
* 获取当前键
* @return 字符串(拷贝)
*/
std::string key()
{
return iterator->key().ToString();
}
* 获取当前键
* @return 字节视图,仅在下一次移动或关闭 iterator 前有效
*/
ByteView keyView() {
auto slice = iterator->key();
return ByteView::fromBuffer(slice.data(), slice.size());
}
* 获取当前键
* @return Slice
*/
rocksdb::Slice keySlice() {
return iterator->key();
}
* 获取当前值
* @return 字符串(拷贝)
*/
std::string value() {
return iterator->value().ToString();
}
* 获取当前值
* @return 字节视图,仅在下一次移动或关闭 iterator 前有效
*/
ByteView valueView() {
auto slice = iterator->value();
return ByteView::fromBuffer(slice.data(), slice.size());
}
* 获取当前值
* @return Slice
*/
rocksdb::Slice valueSlice() {
return iterator->value();
}
* 析构函数:自动关闭(RAII 替代 Closeable)
*/
~RocksIteratorWrapper() = default;
* 显式关闭(可选,用于提前释放)
*/
void close()
{
iterator.reset();
}
private:
std::unique_ptr<rocksdb::Iterator> iterator;
};