#pragma once
#include <string>
#include "db/merge_context.h"
#include "db/range_del_aggregator.h"
#include "rocksdb/env.h"
#include "rocksdb/types.h"
#include "table/block.h"
namespace rocksdb {
class MergeContext;
class PinnedIteratorsManager;
class GetContext {
public:
enum GetState {
kNotFound,
kFound,
kDeleted,
kCorrupt,
kMerge };
GetContext(const Comparator* ucmp, const MergeOperator* merge_operator,
Logger* logger, Statistics* statistics, GetState init_state,
const Slice& user_key, PinnableSlice* value, bool* value_found,
MergeContext* merge_context, RangeDelAggregator* range_del_agg,
Env* env, SequenceNumber* seq = nullptr,
PinnedIteratorsManager* _pinned_iters_mgr = nullptr);
void MarkKeyMayExist();
bool SaveValue(const ParsedInternalKey& parsed_key, const Slice& value,
Cleanable* value_pinner = nullptr);
void SaveValue(const Slice& value, SequenceNumber seq);
GetState State() const { return state_; }
RangeDelAggregator* range_del_agg() { return range_del_agg_; }
PinnedIteratorsManager* pinned_iters_mgr() { return pinned_iters_mgr_; }
void SetReplayLog(std::string* replay_log) { replay_log_ = replay_log; }
bool NeedToReadSequence() const { return (seq_ != nullptr); }
bool sample() const { return sample_; }
private:
const Comparator* ucmp_;
const MergeOperator* merge_operator_;
Logger* logger_;
Statistics* statistics_;
GetState state_;
Slice user_key_;
PinnableSlice* pinnable_val_;
bool* value_found_; MergeContext* merge_context_;
RangeDelAggregator* range_del_agg_;
Env* env_;
SequenceNumber* seq_;
std::string* replay_log_;
PinnedIteratorsManager* pinned_iters_mgr_;
bool sample_;
};
void replayGetContextLog(const Slice& replay_log, const Slice& user_key,
GetContext* get_context);
}