// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. // 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 "rocksdb/file_system.h" namespace ROCKSDB_NAMESPACE { // An abstract FileSystem wrapper that creates a view of an existing // FileSystem by remapping names in some way. // // This class has not been fully analyzed for providing strong security // guarantees. class RemapFileSystem : public FileSystemWrapper { public: explicit RemapFileSystem(const std::shared_ptr& base); protected: // Returns status and mapped-to path in the wrapped filesystem. // If it returns non-OK status, the returned path should not be used. virtual std::pair EncodePath( const std::string& path) = 0; // Similar to EncodePath() except used in cases in which it is OK for // no file or directory on 'path' to already exist, such as if the // operation would create one. However, the parent of 'path' is expected // to exist for the operation to succeed. // Default implementation: call EncodePath virtual std::pair EncodePathWithNewBasename( const std::string& path); public: // Left abstract: // const char* Name() const override { ... } static const char* kClassName() { return "RemapFileSystem"; } bool IsInstanceOf(const std::string& id) const override { if (id == kClassName()) { return true; } else { return FileSystemWrapper::IsInstanceOf(id); } } Status RegisterDbPaths(const std::vector& paths) override; Status UnregisterDbPaths(const std::vector& paths) override; IOStatus NewSequentialFile(const std::string& fname, const FileOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus NewRandomAccessFile(const std::string& fname, const FileOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus NewWritableFile(const std::string& fname, const FileOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus ReopenWritableFile(const std::string& fname, const FileOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus ReuseWritableFile(const std::string& fname, const std::string& old_fname, const FileOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus NewRandomRWFile(const std::string& fname, const FileOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus NewDirectory(const std::string& dir, const IOOptions& options, std::unique_ptr* result, IODebugContext* dbg) override; IOStatus FileExists(const std::string& fname, const IOOptions& options, IODebugContext* dbg) override; IOStatus GetChildren(const std::string& dir, const IOOptions& options, std::vector* result, IODebugContext* dbg) override; IOStatus GetChildrenFileAttributes(const std::string& dir, const IOOptions& options, std::vector* result, IODebugContext* dbg) override; IOStatus DeleteFile(const std::string& fname, const IOOptions& options, IODebugContext* dbg) override; IOStatus CreateDir(const std::string& dirname, const IOOptions& options, IODebugContext* dbg) override; IOStatus CreateDirIfMissing(const std::string& dirname, const IOOptions& options, IODebugContext* dbg) override; IOStatus DeleteDir(const std::string& dirname, const IOOptions& options, IODebugContext* dbg) override; IOStatus GetFileSize(const std::string& fname, const IOOptions& options, uint64_t* file_size, IODebugContext* dbg) override; IOStatus GetFileModificationTime(const std::string& fname, const IOOptions& options, uint64_t* file_mtime, IODebugContext* dbg) override; IOStatus IsDirectory(const std::string& path, const IOOptions& options, bool* is_dir, IODebugContext* dbg) override; IOStatus RenameFile(const std::string& src, const std::string& dest, const IOOptions& options, IODebugContext* dbg) override; IOStatus LinkFile(const std::string& src, const std::string& dest, const IOOptions& options, IODebugContext* dbg) override; IOStatus LockFile(const std::string& fname, const IOOptions& options, FileLock** lock, IODebugContext* dbg) override; IOStatus NewLogger(const std::string& fname, const IOOptions& options, std::shared_ptr* result, IODebugContext* dbg) override; IOStatus GetAbsolutePath(const std::string& db_path, const IOOptions& options, std::string* output_path, IODebugContext* dbg) override; }; } // namespace ROCKSDB_NAMESPACE