94 lines
3.3 KiB
C++
94 lines
3.3 KiB
C++
/*
|
|
* BackupContainer.h
|
|
*
|
|
* This source file is part of the FoundationDB open source project
|
|
*
|
|
* Copyright 2013-2018 Apple Inc. and the FoundationDB project authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "flow/flow.h"
|
|
#include "fdbrpc/IAsyncFile.h"
|
|
#include "fdbrpc/BlobStore.h"
|
|
#include <vector>
|
|
|
|
// Class representing a container for backup files, such as a mounted directory or a remote filesystem.
|
|
class IBackupContainer {
|
|
public:
|
|
virtual void addref() = 0;
|
|
virtual void delref() = 0;
|
|
|
|
enum EMode { READONLY, WRITEONLY };
|
|
|
|
static std::vector<std::string> getURLFormats();
|
|
|
|
IBackupContainer() {}
|
|
virtual ~IBackupContainer() {}
|
|
|
|
// Create the container (if necessary)
|
|
virtual Future<Void> create() = 0;
|
|
|
|
// Open a named file in the container for reading (restore mode) or writing (backup mode)
|
|
virtual Future<Reference<IAsyncFile>> openFile(std::string name, EMode mode) = 0;
|
|
|
|
// Returns whether or not a file exists in the container
|
|
virtual Future<bool> fileExists(std::string name) = 0;
|
|
|
|
// Get a list of backup files in the container
|
|
virtual Future<std::vector<std::string>> listFiles() = 0;
|
|
|
|
// Rename a file
|
|
virtual Future<Void> renameFile(std::string from, std::string to) = 0;
|
|
|
|
// Get an IBackupContainer based on a container spec string
|
|
static Reference<IBackupContainer> openContainer(std::string url, std::string *error = nullptr);
|
|
};
|
|
|
|
class BackupContainerBlobStore : public IBackupContainer, ReferenceCounted<BackupContainerBlobStore> {
|
|
public:
|
|
void addref() { return ReferenceCounted<BackupContainerBlobStore>::addref(); }
|
|
void delref() { return ReferenceCounted<BackupContainerBlobStore>::delref(); }
|
|
static const std::string META_BUCKET;
|
|
|
|
static std::string getURLFormat() { return BlobStoreEndpoint::getURLFormat(true); }
|
|
static Future<std::vector<std::string>> listBackupContainers(Reference<BlobStoreEndpoint> const &bs);
|
|
|
|
BackupContainerBlobStore(Reference<BlobStoreEndpoint> bstore, std::string name)
|
|
: m_bstore(bstore), m_bucketPrefix(name) {}
|
|
|
|
virtual ~BackupContainerBlobStore() { m_bucketCount.cancel(); }
|
|
|
|
// IBackupContainer methods
|
|
Future<Void> create();
|
|
Future<Reference<IAsyncFile>> openFile(std::string name, EMode mode);
|
|
Future<bool> fileExists(std::string name);
|
|
Future<Void> renameFile(std::string from, std::string to);
|
|
Future<std::vector<std::string>> listFiles();
|
|
Future<Void> listFilesStream(PromiseStream<BlobStoreEndpoint::ObjectInfo> results);
|
|
|
|
Future<Void> deleteContainer(int *pNumDeleted = NULL);
|
|
Future<std::string> containerInfo();
|
|
Future<int> getBucketCount();
|
|
std::string getBucketString(int num) { return format("%s_%d", m_bucketPrefix.c_str(), num); }
|
|
Future<std::string> getBucketForFile(std::string const &name);
|
|
Future<std::vector<std::string>> getBucketList();
|
|
|
|
Reference<BlobStoreEndpoint> m_bstore;
|
|
std::string m_bucketPrefix;
|
|
Future<int> m_bucketCount;
|
|
};
|
|
|