blob: f23790c57ccaf1260ea06211db5457247eea5351 [file]
/*
* Copyright 2024-present Alibaba Cloud.
*
* 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 <atomic>
#include <functional>
#include <jdo_data_types.h>
#include <mutex>
#include <string>
#include <vector>
#include <tuple>
#include <memory>
#include <unordered_map>
#include "jdo_common.h"
#include "JdoConfig.hpp"
#include "JdoStatus.hpp"
class JdoFileInfo;
class JdoListResult;
class JdoContentSummary;
using JdoFileInfoPtr = std::shared_ptr<JdoFileInfo>;
using JdoListResultPtr = std::shared_ptr<JdoListResult>;
using JdoContentSummaryPtr = std::shared_ptr<JdoContentSummary>;
class JDO_EXPORT JdoTask {
public:
JdoTask() = default;
virtual ~JdoTask() = default;
virtual JdoStatus perform() = 0;
virtual JdoStatus wait() = 0;
virtual JdoStatus cancel() = 0;
};
typedef std::shared_ptr<JdoTask> JdoTaskPtr;
class JDO_EXPORT JdoReader {
public:
JdoReader() = default;
virtual ~JdoReader() = default;
virtual bool closed() const = 0;
virtual JdoStatus name(std::string_view* result) const = 0;
virtual JdoStatus read(size_t n, std::string_view* result, char* scratch) = 0;
virtual JdoTaskPtr readAsync(size_t n, std::string_view* result, char* scratch,
std::function<void(JdoStatus)> callback) = 0;
virtual JdoStatus pread(int64_t offset, size_t n, std::string_view* result, char* scratch) = 0;
virtual JdoTaskPtr preadAsync(int64_t offset, size_t n, std::string_view* result, char* scratch,
std::function<void(JdoStatus)> callback) = 0;
virtual JdoStatus preadv(std::vector<int64_t>& offsets, std::vector<size_t>& lengths, std::vector<char*>& scratches) = 0;
virtual JdoTaskPtr preadvAsync(std::vector<int64_t>& offsets, std::vector<size_t>& lengths, std::vector<char*>& scratches,
std::function<void(JdoStatus)> callback) = 0;
virtual JdoStatus tell(int64_t &offset) = 0;
virtual JdoTaskPtr tellAsync(std::function<void(JdoStatus, int64_t)> callback) = 0;
virtual JdoStatus seek(int64_t offset) = 0;
virtual JdoTaskPtr seekAsync(int64_t offset, std::function<void(JdoStatus, int64_t)> callback) = 0;
virtual JdoStatus getFileLength(int64_t &length) = 0;
virtual JdoTaskPtr getFileLengthAsync(std::function<void(JdoStatus, int64_t)> callback) = 0;
virtual JdoStatus close() = 0;
virtual JdoTaskPtr closeAsync(std::function<void(JdoStatus)> callback) = 0;
};
class JDO_EXPORT JdoWriter {
public:
JdoWriter() = default;
virtual ~JdoWriter() = default;
virtual bool closed() const = 0;
virtual JdoStatus name(std::string_view* result) const = 0;
virtual JdoStatus write(std::string_view data) = 0;
virtual JdoTaskPtr writeAsync(std::string_view data, std::function<void(JdoStatus)> callback) = 0;
virtual JdoStatus flush() = 0;
virtual JdoTaskPtr flushAsync(std::function<void(JdoStatus)> callback) = 0;
virtual JdoStatus tell(int64_t &offset) = 0;
virtual JdoTaskPtr tellAsync(std::function<void(JdoStatus, int64_t)> callback) = 0;
virtual JdoStatus close() = 0;
virtual JdoTaskPtr closeAsync(std::function<void(JdoStatus)> callback) = 0;
};
class JDO_EXPORT JdoFileSystem {
public:
JdoFileSystem();
virtual ~JdoFileSystem();
JdoStatus init(const std::string &uri, const std::string &user, const std::shared_ptr<JdoConfig> &config);
JdoStatus destroy();
JdoStatus openReader(const std::string &path, std::unique_ptr<JdoReader>* result);
JdoStatus openWriter(const std::string &path, std::unique_ptr<JdoWriter>* result);
JdoStatus mkdir(const std::string &path, bool recursive);
JdoTaskPtr mkdirAsync(const std::string &path, bool recursive, std::function<void(JdoStatus)> callback);
JdoStatus rename(const std::string &oldpath, const std::string &newpath);
JdoTaskPtr renameAsync(const std::string &oldpath, const std::string &newpath,
std::function<void(JdoStatus)> callback);
JdoStatus remove(const std::string &path, bool recursive);
JdoTaskPtr removeAsync(const std::string &path, bool recursive, std::function<void(JdoStatus)> callback);
JdoStatus exists(const std::string &path);
JdoTaskPtr existsAsync(const std::string &path, std::function<void(JdoStatus)> callback);
JdoStatus getFileInfo(const std::string &path, JdoFileInfo* info);
JdoTaskPtr getFileInfoAsync(const std::string &path, std::function<void(JdoStatus, JdoFileInfoPtr)> callback);
JdoStatus listDir(const std::string &path, bool recursive, JdoListResult* result);
JdoTaskPtr listDirAsync(const std::string &path, bool recursive,
std::function<void(JdoStatus, JdoListResultPtr)> callback);
JdoStatus getContentSummary(const std::string &path, bool recursive, JdoContentSummary* result);
JdoTaskPtr getContentSummaryAsync(const std::string &path, bool recursive,
std::function<void(JdoStatus, JdoContentSummaryPtr)> callback);
JdoStatus setPermission(const std::string &path, int16_t perm);
JdoTaskPtr setPermissionAsync(const std::string &path, int16_t perm, std::function<void(JdoStatus)> callback);
JdoStatus setOwner(const std::string &path, const std::string& user, const std::string& group);
JdoTaskPtr setOwnerAsync(const std::string &path, const std::string& user, const std::string& group, std::function<void(JdoStatus)> callback);
private:
JdoStatus getFileInfoInternal(JdoStore_t client,
const std::string &path,
JdoFileInfo* info);
// return JdoStore_t, status
std::tuple<JdoStore_t, JdoStatus> GetJdoStore(const std::string &uri);
private:
JdoStore_t _store = nullptr;
JdoOptions_t _options = nullptr;
bool _inited = false;
};