aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/Backups/IBackup.h
blob: 660f7d5da22614c70d058e08a719b957f06d24c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma once

#include <Core/Types.h>
#include <Disks/WriteMode.h>
#include <IO/WriteSettings.h>
#include <memory>
#include <optional>


namespace DB
{
class IBackupEntry;
using BackupEntryPtr = std::shared_ptr<const IBackupEntry>;
struct BackupFileInfo;
class IDisk;
using DiskPtr = std::shared_ptr<IDisk>;
class SeekableReadBuffer;

/// Represents a backup, i.e. a storage of BackupEntries which can be accessed by their names.
/// A backup can be either incremental or non-incremental. An incremental backup doesn't store
/// the data of the entries which are not changed compared to its base backup.
class IBackup : public std::enable_shared_from_this<IBackup>
{
public:
    virtual ~IBackup() = default;

    /// Name of the backup.
    //virtual const String & getName() const = 0;
    virtual const String & getNameForLogging() const = 0;

    enum class OpenMode
    {
        READ,
        WRITE,
    };

    /// Returns whether the backup was opened for reading or writing.
    virtual OpenMode getOpenMode() const = 0;

    /// Returns the time point when this backup was created.
    virtual time_t getTimestamp() const = 0;

    /// Returns UUID of the backup.
    virtual UUID getUUID() const = 0;

    /// Returns the base backup (can be null).
    virtual std::shared_ptr<const IBackup> getBaseBackup() const = 0;

    /// Returns the number of files stored in the backup. Compare with getNumEntries().
    virtual size_t getNumFiles() const = 0;

    /// Returns the total size of files stored in the backup. Compare with getTotalSizeOfEntries().
    virtual UInt64 getTotalSize() const  = 0;

    /// Returns the number of entries in the backup, i.e. the number of files inside the folder if the backup is stored as a folder or
    /// the number of files inside the archive if the backup is stored as an archive.
    /// It's not the same as getNumFiles() if it's an incremental backups or if it contains empty files or duplicates.
    /// The following is always true: `getNumEntries() <= getNumFiles()`.
    virtual size_t getNumEntries() const = 0;

    /// Returns the size of entries in the backup, i.e. the total size of files inside the folder if the backup is stored as a folder or
    /// the total size of files inside the archive if the backup is stored as an archive.
    /// It's not the same as getTotalSize() because it doesn't include the size of duplicates and the size of files from the base backup.
    /// The following is always true: `getSizeOfEntries() <= getTotalSize()`.
    virtual UInt64 getSizeOfEntries() const = 0;

    /// Returns the uncompressed size of the backup. It equals to `getSizeOfEntries() + size_of_backup_metadata (.backup)`
    virtual UInt64 getUncompressedSize() const = 0;

    /// Returns the compressed size of the backup. If the backup is not stored as an archive it's the same as getUncompressedSize().
    virtual UInt64 getCompressedSize() const = 0;

    /// Returns the number of files read during RESTORE from this backup.
    /// The following is always true: `getNumFilesRead() <= getNumFiles()`.
    virtual size_t getNumReadFiles() const  = 0;

    // Returns the total size of files read during RESTORE from this backup.
    /// The following is always true: `getNumReadBytes() <= getTotalSize()`.
    virtual UInt64 getNumReadBytes() const = 0;

    /// Returns names of entries stored in a specified directory in the backup.
    /// If `directory` is empty or '/' the functions returns entries in the backup's root.
    virtual Strings listFiles(const String & directory, bool recursive = false) const = 0;

    /// Checks if a specified directory contains any files.
    /// The function returns the same as `!listFiles(directory).empty()`.
    virtual bool hasFiles(const String & directory) const = 0;

    using SizeAndChecksum = std::pair<UInt64, UInt128>;

    /// Checks if an entry with a specified name exists.
    virtual bool fileExists(const String & file_name) const = 0;
    virtual bool fileExists(const SizeAndChecksum & size_and_checksum) const = 0;

    /// Returns the size of the entry's data.
    /// This function does the same as `read(file_name)->getSize()` but faster.
    virtual UInt64 getFileSize(const String & file_name) const = 0;

    /// Returns the checksum of the entry's data.
    /// This function does the same as `read(file_name)->getCheckum()` but faster.
    virtual UInt128 getFileChecksum(const String & file_name) const = 0;

    /// Returns both the size and checksum in one call.
    virtual SizeAndChecksum getFileSizeAndChecksum(const String & file_name) const = 0;

    /// Reads an entry from the backup.
    virtual std::unique_ptr<SeekableReadBuffer> readFile(const String & file_name) const = 0;
    virtual std::unique_ptr<SeekableReadBuffer> readFile(const SizeAndChecksum & size_and_checksum) const = 0;

    /// Copies a file from the backup to a specified destination disk. Returns the number of bytes written.
    virtual size_t copyFileToDisk(const String & file_name, DiskPtr destination_disk, const String & destination_path,
                                  WriteMode write_mode = WriteMode::Rewrite) const = 0;

    virtual size_t copyFileToDisk(const SizeAndChecksum & size_and_checksum, DiskPtr destination_disk, const String & destination_path,
                                  WriteMode write_mode = WriteMode::Rewrite) const = 0;

    /// Puts a new entry to the backup.
    virtual void writeFile(const BackupFileInfo & file_info, BackupEntryPtr entry) = 0;

    /// Finalizes writing the backup, should be called after all entries have been successfully written.
    virtual void finalizeWriting() = 0;

    /// Whether it's possible to add new entries to the backup in multiple threads.
    virtual bool supportsWritingInMultipleThreads() const = 0;
};

using BackupPtr = std::shared_ptr<const IBackup>;
using BackupMutablePtr = std::shared_ptr<IBackup>;

}