blob: a1b6be690de4da3dc421040c68ec713b565d09dc [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_LEDGER_BIN_STORAGE_IMPL_DB_SERIALIZATION_H_
#define SRC_LEDGER_BIN_STORAGE_IMPL_DB_SERIALIZATION_H_
#include "src/ledger/bin/storage/impl/page_db.h"
#include "src/ledger/bin/storage/public/types.h"
#include "third_party/abseil-cpp/absl/strings/string_view.h"
namespace storage {
// The prefix to be used in rows depending on their type. ' ' (space) is used as the value of the
// first one as a way to make rows easier to read on debug information.
//
// Important: Always append at the end. Do not reorder, do not delete.
enum class RowType : uint8_t {
HEADS = ' ',
MERGES, // '!'
COMMITS, // '"'
OBJECTS, // '#'
REFCOUNTS, // '$'
UNSYNCED_COMMIT, // '%'
TRANCIENT_OBJECT_DIGEST, // '&'
LOCAL_OBJECT_DIGEST, // '\''
SYNCED_OBJECT_DIGEST, // '('
SYNC_METADATA, // ')'
PAGE_IS_ONLINE, // '*'
CLOCK_DEVICE_ID, // '+'
CLOCK_ENTRIES, // ','
REMOTE_COMMIT_ID_TO_LOCAL, // '-'
};
class HeadRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::HEADS);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(CommitIdView head);
};
class MergeRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::MERGES);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(CommitIdView parent1_id, CommitIdView parent2_id,
CommitIdView merge_commit_id);
static std::string GetEntriesPrefixFor(CommitIdView parent1_id, CommitIdView parent2_id);
};
class CommitRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::COMMITS);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(CommitIdView commit_id);
};
class ObjectRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::OBJECTS);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(const ObjectDigest& object_digest);
};
// Serialization of rows for reference counting.
// The methods in this class are valid only for non-inline |destination| pieces.
class ReferenceRow {
private:
enum class Type : uint8_t {
OBJECT = ' ',
COMMIT, // '!'
};
enum class Priority : uint8_t {
EAGER = ' ',
LAZY, // '!'
};
static constexpr char kPrefixChar = static_cast<char>(RowType::REFCOUNTS);
static constexpr char kCommitPrefixChar = static_cast<char>(Type::COMMIT);
static constexpr char kObjectPrefixChar = static_cast<char>(Type::OBJECT);
static constexpr char kEagerPrefixChar = static_cast<char>(Priority::EAGER);
static constexpr char kLazyPrefixChar = static_cast<char>(Priority::LAZY);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static constexpr absl::string_view kCommitPrefix = absl::string_view(&kCommitPrefixChar, 1);
static constexpr absl::string_view kObjectPrefix = absl::string_view(&kObjectPrefixChar, 1);
static constexpr absl::string_view kEagerPrefix = absl::string_view(&kEagerPrefixChar, 1);
static constexpr absl::string_view kLazyPrefix = absl::string_view(&kLazyPrefixChar, 1);
// Returns key for object-object links.
static std::string GetKeyForObject(const ObjectDigest& source, const ObjectDigest& destination,
KeyPriority priority);
// Returns key for commit-object links.
static std::string GetKeyForCommit(CommitIdView source, const ObjectDigest& destination);
// Returns key prefix for all links to |destination|.
static std::string GetKeyPrefixFor(const ObjectDigest& destination);
// Returns key prefix for object links to |destination|.
static std::string GetObjectKeyPrefixFor(const ObjectDigest& destination);
// Returns key prefix for eager object links to |destination|.
static std::string GetEagerKeyPrefixFor(const ObjectDigest& destination);
// Returns key prefix for lazy object links to |destination|.
static std::string GetLazyKeyPrefixFor(const ObjectDigest& destination);
// Returns key prefix for commit links to |destination|.
static std::string GetCommitKeyPrefixFor(const ObjectDigest& destination);
};
class UnsyncedCommitRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::UNSYNCED_COMMIT);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(CommitIdView commit_id);
};
// Serialization of rows holding object synchronization status.
// The methods in this class are valid only for non-inline objects.
class ObjectStatusRow {
private:
static constexpr char kTransientPrefixChar = static_cast<char>(RowType::TRANCIENT_OBJECT_DIGEST);
static constexpr char kLocalPrefixChar = static_cast<char>(RowType::LOCAL_OBJECT_DIGEST);
static constexpr char kSyncedPrefixChar = static_cast<char>(RowType::SYNCED_OBJECT_DIGEST);
public:
static constexpr absl::string_view kTransientPrefix = absl::string_view(&kTransientPrefixChar, 1);
static constexpr absl::string_view kLocalPrefix = absl::string_view(&kLocalPrefixChar, 1);
static constexpr absl::string_view kSyncedPrefix = absl::string_view(&kSyncedPrefixChar, 1);
static std::string GetKeyFor(PageDbObjectStatus object_status,
const ObjectIdentifier& object_identifier);
static std::string GetPrefixFor(PageDbObjectStatus object_status,
const ObjectDigest& object_digest);
private:
static absl::string_view GetPrefixFor(PageDbObjectStatus object_status);
};
class SyncMetadataRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::SYNC_METADATA);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(absl::string_view key);
};
class PageIsOnlineRow {
private:
static constexpr char kKeyChar = static_cast<char>(RowType::PAGE_IS_ONLINE);
public:
static constexpr absl::string_view kKey = absl::string_view(&kKeyChar, 1);
};
class ClockRow {
private:
static constexpr char kClockDeviceIdChar = static_cast<char>(RowType::CLOCK_DEVICE_ID);
static constexpr char kClockEntriesPrefixChar = static_cast<char>(RowType::CLOCK_ENTRIES);
public:
static constexpr absl::string_view kDeviceIdKey = absl::string_view(&kClockDeviceIdChar, 1);
static constexpr absl::string_view kEntriesKey = absl::string_view(&kClockEntriesPrefixChar, 1);
};
class RemoteCommitIdToLocalRow {
private:
static constexpr char kPrefixChar = static_cast<char>(RowType::REMOTE_COMMIT_ID_TO_LOCAL);
public:
static constexpr absl::string_view kPrefix = absl::string_view(&kPrefixChar, 1);
static std::string GetKeyFor(absl::string_view remote_commit_id);
};
} // namespace storage
#endif // SRC_LEDGER_BIN_STORAGE_IMPL_DB_SERIALIZATION_H_