mirror of
https://github.com/uroni/urbackup_backend.git
synced 2025-10-26 11:36:50 +00:00
152 lines
3.9 KiB
C++
152 lines
3.9 KiB
C++
#pragma once
|
|
#include "../urbackupcommon/fileclient/FileClient.h"
|
|
#include "../Interface/Thread.h"
|
|
#include "server_prepare_hash.h"
|
|
#include "../urbackupcommon/chunk_hasher.h"
|
|
#include "server_log.h"
|
|
#include <memory>
|
|
|
|
class BackupServerHash;
|
|
class FilePathCorrections;
|
|
class MaxFileId;
|
|
|
|
namespace server
|
|
{
|
|
|
|
namespace
|
|
{
|
|
struct SFolderItem
|
|
{
|
|
SFolderItem()
|
|
: created(0), modified(0),
|
|
accessed(0), folder_items(-1),
|
|
counted_items(0)
|
|
{
|
|
|
|
}
|
|
|
|
std::string path;
|
|
std::string os_path;
|
|
int64 created;
|
|
int64 modified;
|
|
int64 accessed;
|
|
int64 folder_items;
|
|
int64 counted_items;
|
|
};
|
|
}
|
|
|
|
class FileMetadataDownloadThread : public IThread
|
|
{
|
|
public:
|
|
FileMetadataDownloadThread(FileClient* fc, const std::string& server_token, logid_t logid, int backupid, int clientid,
|
|
bool use_tmpfiles, std::string tmpfile_path);
|
|
FileMetadataDownloadThread(const std::string& server_token, std::string metadata_tmp_fn, int backupid, int clientid,
|
|
bool use_tmpfiles, std::string tmpfile_path);
|
|
~FileMetadataDownloadThread();
|
|
|
|
virtual void operator()();
|
|
|
|
bool applyMetadata(const std::string& backup_metadata_dir, const std::string& backup_dir,
|
|
INotEnoughSpaceCallback *cb, BackupServerHash* local_hash, FilePathCorrections& filepath_corrections,
|
|
size_t& num_embedded_files, MaxFileId* max_file_id);
|
|
bool applyWindowsMetadata(IFile* metadata_f, IFile* output_f, int64& metadata_size, INotEnoughSpaceCallback *cb, int64 output_offset, int64& metadataf_pos);
|
|
bool applyUnixMetadata(IFile* metadata_f, IFile* output_f, int64& metadata_size, INotEnoughSpaceCallback *cb, int64 output_offset, int64& metadataf_pos);
|
|
|
|
bool getHasError();
|
|
|
|
bool getHasFatalError();
|
|
|
|
bool getHasTimeoutError();
|
|
|
|
void shutdown();
|
|
|
|
bool isDownloading();
|
|
|
|
bool isComplete();
|
|
|
|
bool isFinished();
|
|
|
|
void forceStart();
|
|
|
|
bool hasMetadataId(int64 id);
|
|
|
|
int64 getTransferredBytes();
|
|
|
|
void setProgressLogEnabled(bool b);
|
|
|
|
class FileMetadataApplyThread : public IThread
|
|
{
|
|
public:
|
|
FileMetadataApplyThread(FileMetadataDownloadThread* fmdlt, const std::string& backup_metadata_dir, const std::string& backup_dir,
|
|
INotEnoughSpaceCallback *cb, BackupServerHash* local_hash, FilePathCorrections& filepath_corrections,
|
|
MaxFileId& max_file_id)
|
|
: fmdlt(fmdlt), backup_metadata_dir(backup_metadata_dir), backup_dir(backup_dir),
|
|
cb(cb), local_hash(local_hash), filepath_corrections(filepath_corrections),
|
|
num_embedded_files(0), max_file_id(max_file_id), has_success(false) {}
|
|
|
|
virtual void operator()();
|
|
|
|
bool hasSuccess() { return has_success; }
|
|
|
|
size_t getNumEmbeddedFiles() { return num_embedded_files; }
|
|
private:
|
|
FileMetadataDownloadThread* fmdlt;
|
|
std::string backup_metadata_dir;
|
|
std::string backup_dir;
|
|
INotEnoughSpaceCallback *cb;
|
|
BackupServerHash* local_hash;
|
|
FilePathCorrections& filepath_corrections;
|
|
size_t num_embedded_files;
|
|
MaxFileId& max_file_id;
|
|
bool has_success;
|
|
};
|
|
|
|
private:
|
|
|
|
void setComplete();
|
|
void setFinished();
|
|
|
|
void copyForAnalysis(IFile* metadata_f);
|
|
|
|
void addSingleFileItem(std::string dir_path);
|
|
void addFolderItem(std::string path, const std::string& os_path, bool is_dir, int64 created, int64 modified, int64 accessed, int64 folder_items);
|
|
|
|
bool readRetry(IFile* metadata_f, char* buf, size_t bsize);
|
|
|
|
std::vector<SFolderItem> saved_folder_items;
|
|
|
|
std::unique_ptr<FileClient> fc;
|
|
const std::string& server_token;
|
|
|
|
bool has_error;
|
|
bool has_fatal_error;
|
|
bool has_timeout_error;
|
|
std::string metadata_tmp_fn;
|
|
logid_t logid;
|
|
|
|
int64 max_metadata_id;
|
|
std::vector<int64> last_metadata_ids;
|
|
|
|
bool dry_run;
|
|
|
|
int backupid;
|
|
int clientid;
|
|
|
|
FileClient::ProgressLogCallback* orig_progress_log_callback;
|
|
|
|
bool use_tmpfiles;
|
|
std::string tmpfile_path;
|
|
std::vector<char> buffer;
|
|
|
|
bool is_complete;
|
|
bool is_finished;
|
|
bool force_start;
|
|
std::unique_ptr<IMutex> mutex;
|
|
std::unique_ptr<ICondition> cond;
|
|
};
|
|
|
|
int check_metadata();
|
|
|
|
} //namespace server
|
|
|