blob: bd743377801b6cd343bb7d4a83affd874016578b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 <chrono>
#include <cstdint>
#include <optional>
#include <string>
namespace opendal {
/**
* @enum EntryMode
* @brief The mode of the entry
*/
enum class EntryMode : int {
FILE = 1,
DIR = 2,
UNKNOWN = 0,
};
/**
* @struct Metadata
* @brief The metadata of a file or directory
*
* Metadata contains all the information related to a specific path.
* Depending on the context of the requests, the metadata for the same path may
* vary. For example, two versions of the same path might have different content
* lengths. Keep in mind that metadata is always tied to the given context and
* is not a global state.
*/
class Metadata {
public:
// Basic file information
EntryMode type{EntryMode::UNKNOWN};
std::uint64_t content_length{0};
// HTTP-style headers
std::optional<std::string>
cache_control; ///< Cache-Control header as defined by RFC 7234
std::optional<std::string>
content_disposition; ///< Content-Disposition header as defined by RFC
///< 6266
std::optional<std::string>
content_md5; ///< Content-MD5 hash (deprecated but widely used)
std::optional<std::string>
content_type; ///< Content-Type header as defined by RFC 9110
std::optional<std::string>
content_encoding; ///< Content-Encoding header as defined by RFC 7231
std::optional<std::string> etag; ///< ETag header as defined by RFC 7232
std::optional<std::chrono::system_clock::time_point>
last_modified; ///< Last-Modified timestamp
// Versioning information
std::optional<std::string>
version; ///< Version identifier (e.g., S3 version ID)
std::optional<bool> is_current; ///< Whether this is the current version
bool is_deleted{false}; ///< Whether this entry has been marked as deleted
// Default constructor
Metadata() = default;
// Destructor
~Metadata() = default;
// Accessor methods
/**
* @brief Get the entry mode (file type)
* @return EntryMode indicating whether this is a file, directory, or unknown
*/
EntryMode Mode() const { return type; }
/**
* @brief Check if this metadata represents a file
* @return true if this is a file, false otherwise
*/
bool IsFile() const { return type == EntryMode::FILE; }
/**
* @brief Check if this metadata represents a directory
* @return true if this is a directory, false otherwise
*/
bool IsDir() const { return type == EntryMode::DIR; }
/**
* @brief Content length in bytes
* @return Content length (0 if not set)
*/
std::uint64_t ContentLength() const { return content_length; }
/**
* @brief Cache control directive
* @return Optional cache control string
*/
const std::optional<std::string>& CacheControl() const {
return cache_control;
}
/**
* @brief Content disposition
* @return Optional content disposition string
*/
const std::optional<std::string>& ContentDisposition() const {
return content_disposition;
}
/**
* @brief Content MD5 hash
* @return Optional MD5 hash string
*/
const std::optional<std::string>& ContentMd5() const {
return content_md5;
}
/**
* @brief Content type (MIME type)
* @return Optional content type string
*/
const std::optional<std::string>& ContentType() const {
return content_type;
}
/**
* @brief Content encoding
* @return Optional content encoding string
*/
const std::optional<std::string>& ContentEncoding() const {
return content_encoding;
}
/**
* @brief ETag
* @return Optional ETag string
*/
const std::optional<std::string>& Etag() const { return etag; }
/**
* @brief Last modified timestamp
* @return Optional timestamp of last modification
*/
const std::optional<std::chrono::system_clock::time_point>& LastModified()
const {
return last_modified;
}
/**
* @brief Version identifier
* @return Optional version string
*/
const std::optional<std::string>& Version() const { return version; }
/**
* @brief Check if this is the current version
* @return Optional boolean indicating if this is current (None if versioning
* not supported)
*/
const std::optional<bool>& IsCurrent() const { return is_current; }
/**
* @brief Check if this entry has been deleted
* @return true if deleted, false otherwise
*/
bool IsDeleted() const { return is_deleted; }
};
/**
* @struct Entry
* @brief The entry of a file or directory
*/
class Entry {
public:
std::string path;
};
} // namespace opendal
namespace opendal {
class Capability {
public:
bool stat;
bool stat_with_if_match;
bool stat_with_if_none_match;
bool read;
bool read_with_if_match;
bool read_with_if_none_match;
bool read_with_override_cache_control;
bool read_with_override_content_disposition;
bool read_with_override_content_type;
bool write;
bool write_can_multi;
bool write_can_empty;
bool write_can_append;
bool write_with_content_type;
bool write_with_content_disposition;
bool write_with_cache_control;
size_t write_multi_max_size;
size_t write_multi_min_size;
size_t write_total_max_size;
bool create_dir;
bool delete_feature;
bool copy;
bool rename;
bool list;
bool list_with_limit;
bool list_with_start_after;
bool list_with_recursive;
bool presign;
bool presign_read;
bool presign_stat;
bool presign_write;
bool shared;
};
}