// Copyright (c) Meta Platforms, Inc. and affiliates. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #include #include #include "rocksdb/rocksdb_namespace.h" #include "rocksdb/status.h" #include "rocksdb/wide_columns.h" namespace ROCKSDB_NAMESPACE { class Slice; // Wide-column serialization/deserialization primitives. // // The two main parts of the layout are 1) a sorted index containing the column // names and column value sizes and 2) the column values themselves. Keeping the // index and the values separate will enable selectively reading column values // down the line. Note that currently the index has to be fully parsed in order // to find out the offset of each column value. // // Legend: cn = column name, cv = column value, cns = column name size, cvs = // column value size. // // +----------+--------------+----------+-------+----------+---... // | version | # of columns | cns 1 | cn 1 | cvs 1 | // +----------+--------------+------------------+--------- +---... // | varint32 | varint32 | varint32 | bytes | varint32 | // +----------+--------------+----------+-------+----------+---... // // ... continued ... // // ...---+----------+-------+----------+-------+---...---+-------+ // | cns N | cn N | cvs N | cv 1 | | cv N | // ...---+----------+-------+----------+-------+---...---+-------+ // | varint32 | bytes | varint32 | bytes | | bytes | // ...---+----------+-------+----------+-------+---...---+-------+ class WideColumnSerialization { public: static Status Serialize(const WideColumns& columns, std::string& output); static Status Deserialize(Slice& input, WideColumns& columns); static WideColumns::const_iterator Find(const WideColumns& columns, const Slice& column_name); static constexpr uint32_t kCurrentVersion = 1; }; } // namespace ROCKSDB_NAMESPACE