blob: 7edde1558f79e09ae26cc681c378e2aa682ef763 [file] [log] [blame]
/*
* Copyright 2024-present Alibaba Inc.
*
* 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 <cstdint>
#include <functional>
#include <memory>
#include <string>
#include <vector>
#include "paimon/result.h"
#include "paimon/status.h"
#include "paimon/visibility.h"
namespace paimon {
/// Enumeration for stream seek origin positions.
enum PAIMON_EXPORT SeekOrigin {
/// Seek from the beginning of the stream.
FS_SEEK_SET,
/// Seek from the current position in the stream.
FS_SEEK_CUR,
/// Seek from the end of the stream.
FS_SEEK_END
};
/// Abstract base class for all stream operations.
class PAIMON_EXPORT Stream {
public:
virtual ~Stream() = default;
/// Close the stream.
virtual Status Close() = 0;
};
/// Abstract class for input stream operations.
class PAIMON_EXPORT InputStream : public Stream {
public:
InputStream() = default;
~InputStream() override = default;
/// Seek to a specified position in the input stream.
///
/// @param offset The byte offset relative to the origin position.
/// @param origin The reference point for seeking (`::FS_SEEK_SET`, `::FS_SEEK_CUR`,
/// `::FS_SEEK_END`).
/// @return Status indicating success (OK) or failure with appropriate error information.
virtual Status Seek(int64_t offset, SeekOrigin origin) = 0;
/// Get the current position in the input stream.
///
/// @return Current position in the input stream.
/// @return IOError returned if an I/O error occurred in the underlying stream.
/// implementation while accessing the stream's position.
virtual Result<int64_t> GetPos() const = 0;
/// Read data from the current position in the stream.
/// @param[out] buffer Pointer to the buffer where read data will be stored.
/// @param size Maximum number of bytes to read.
/// @return Result containing the actual number of bytes read on success, or an error status on
/// failure.
/// @note The stream position advances by the number of bytes actually read.
virtual Result<int32_t> Read(char* buffer, uint32_t size) = 0;
/// Read data from given position in the stream.
///
/// Read with offset performs like `pread()` function, which will not change the position in the
/// input stream.
///
/// @param[out] buffer The buffer to store the read content.
/// @param size The number of bytes to read.
/// @param offset The position in the stream to read from.
virtual Result<int32_t> Read(char* buffer, uint32_t size, uint64_t offset) = 0;
/// Asynchronously read data from the input stream.
///
/// This function initiates an asynchronous read operation. The specified number of bytes
/// will be read from the stream starting at the given offset and stored in the provided buffer.
/// Once the read operation is complete, the provided callback function will be invoked with
/// the status of the read operation.
///
/// @param[out] buffer The buffer to store the read content.
/// @param size The number of bytes to read.
/// @param offset The position in the stream to read from.
/// @param callback The callback function to be invoked upon completion of the read operation.
/// The callback will receive a Status object indicating the success or failure
/// of the read operation.
virtual void ReadAsync(char* buffer, uint32_t size, uint64_t offset,
std::function<void(Status)>&& callback) = 0;
/// Get an identifier that uniquely identify the underlying content.
/// @return An uri if the underlying content can be uniquely identified.
/// @return Empty string if the underlying content cannot be uniquely identified.
virtual Result<std::string> GetUri() const = 0;
/// Get the total length of the file in bytes.
virtual Result<uint64_t> Length() const = 0;
};
/// Abstract class for output stream operations.
class PAIMON_EXPORT OutputStream : public Stream {
public:
OutputStream() = default;
/// Write data to the output stream.
/// @param buffer Pointer to the data buffer to write.
/// @param size Number of bytes to write from the buffer.
/// @return Result containing the actual number of bytes written on success, or an error status
/// on failure.
/// @note The stream position advances by the number of bytes actually written.
virtual Result<int32_t> Write(const char* buffer, uint32_t size) = 0;
/// Flush pending data to the disk.
virtual Status Flush() = 0;
/// Get the write position.
virtual Result<int64_t> GetPos() const = 0;
/// Get the uri of the output stream.
virtual Result<std::string> GetUri() const = 0;
};
/// Basic file status information interface.
///
/// This class provides fundamental file system metadata for files and directories. It serves as a
/// lightweight interface for basic file operations that only require path information and directory
/// status.
class PAIMON_EXPORT BasicFileStatus {
public:
BasicFileStatus() = default;
virtual ~BasicFileStatus() = default;
/// Check if this entry represents a directory.
virtual bool IsDir() const = 0;
/// Get the path of this file or directory.
virtual std::string GetPath() const = 0;
};
/// Extended file status information interface.
///
/// This class extends BasicFileStatus to provide comprehensive file system metadata including file
/// size, modification time, and other attributes. It's used for operations that require detailed
/// file information.
class PAIMON_EXPORT FileStatus {
public:
FileStatus() = default;
virtual ~FileStatus() = default;
/// Get the size of the file in bytes.
/// @note For directories, this method is undefined behavior.
virtual uint64_t GetLen() const = 0;
/// Check if this entry represents a directory.
virtual bool IsDir() const = 0;
/// Get the path of this file or directory.
virtual std::string GetPath() const = 0;
/// Get the last modification time of the file.
///
/// @return A long value representing the time the file was last modified, measured in
/// milliseconds since the epoch (UTC January 1, 1970).
virtual int64_t GetModificationTime() const = 0;
};
/// Abstract file system interface.
class PAIMON_EXPORT FileSystem {
public:
virtual ~FileSystem();
/// Check if the given path represents an object store.
/// @note Object stores typically have different semantics than traditional file systems.
static Result<bool> IsObjectStore(const std::string& path_str);
/// Open an existing file for reading.
/// @param path The file path to open.
/// @return Result containing a unique pointer to `InputStream` on success, or error status on
/// failure (e.g., file not found, permission denied).
virtual Result<std::unique_ptr<InputStream>> Open(const std::string& path) const = 0;
/// Create a new file for writing.
/// @param path The file path to create.
/// @param overwrite If true, overwrite existing file; if false, fail if file exists.
/// @return Result containing a unique pointer to `OutputStream` on success, or error status on
/// failure (e.g., I/O error, permission denied).
virtual Result<std::unique_ptr<OutputStream>> Create(const std::string& path,
bool overwrite) const = 0;
/// Create directories recursively.
/// @param path The directory path to create (including all parent directories).
/// @return Status indicating success (OK) or failure with error information.
virtual Status Mkdirs(const std::string& path) const = 0;
/// Rename or move a file or directory.
/// @param src The source path (file or directory to rename/move).
/// @param dst The destination path.
/// @return Status indicating success (OK) or failure with error information.
virtual Status Rename(const std::string& src, const std::string& dst) const = 0;
/// Delete a file or directory.
/// @param path The path to delete.
/// @param recursive If true, delete directories and their contents recursively;
/// if false, only delete empty directories.
/// @return Status indicating success (OK) or failure with error information.
virtual Status Delete(const std::string& path, bool recursive = true) const = 0;
/// Get detailed status information for a file or directory.
/// @param path The file or directory path to query.
/// @return Result containing a unique pointer to `FileStatus` on success, or error status on
/// failure (e.g., path not found, permission denied).
virtual Result<std::unique_ptr<FileStatus>> GetFileStatus(const std::string& path) const = 0;
/// List files of a directory (basic information only).
/// @param directory The directory path to list.
/// @param[out] file_status_list Output vector to store `BasicFileStatus` objects.
/// @return Status indicating success (OK) or failure with error information.
virtual Status ListDir(
const std::string& directory,
std::vector<std::unique_ptr<BasicFileStatus>>* file_status_list) const = 0;
/// List file status with detailed information.
/// @param path The file or directory path to list.
/// @param[out] file_status_list Output vector to store `FileStatus` objects.
/// @return Status indicating success (OK) or failure with error information.
virtual Status ListFileStatus(
const std::string& path,
std::vector<std::unique_ptr<FileStatus>>* file_status_list) const = 0;
/// Check if a file or directory exists.
/// @param path The file or directory path to check.
/// @return Result containing true if path exists, false if not found; or error status if
/// I/O error occurs during check.
virtual Result<bool> Exists(const std::string& path) const = 0;
/// Read entire file content into a string at once.
/// @param path The file path to read.
/// @param[out] content Output string to store the file content.
/// @return Status indicating success (OK) or failure with error information.
/// @note Virtual only for mock testing purposes.
virtual Status ReadFile(const std::string& path, std::string* content);
/// Write the entire content to a file at once.
/// @param path The file path to write to.
/// @param content The string content to write.
/// @param overwrite If true, overwrite existing file; if false, fail if file exists.
/// @return Status indicating success (OK) or failure with error information.
/// @note Virtual only for mock testing purposes.
virtual Status WriteFile(const std::string& path, const std::string& content, bool overwrite);
/// Write content to a file atomically. Atomic operation: writes to temporary hidden file first,
/// then renames to target.
/// @param path The target file path.
/// @param content The string content to write.
/// @return Status indicating success (OK) or failure with error information.
/// @note Virtual only for mock testing purposes.
virtual Status AtomicStore(const std::string& path, const std::string& content);
};
} // namespace paimon