1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
// *****************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 *
// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved *
// *****************************************************************************
#ifndef DB_FILE_H_834275398588021574
#define DB_FILE_H_834275398588021574
#include <unordered_map>
#include <zen/file_error.h>
#include "file_hierarchy.h"
#include "process_callback.h"
namespace fff
{
constexpr ZstringView SYNC_DB_FILE_ENDING = Zstr(".ffs_db"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace!
struct InSyncDescrFile //subset of FileAttributes
{
time_t modTime = 0;
AFS::FingerPrint filePrint = 0; //optional!
};
struct InSyncDescrLink
{
time_t modTime = 0;
};
//artificial hierarchy of last synchronous state:
struct InSyncFile
{
InSyncDescrFile left; //support flip()!
InSyncDescrFile right; //
CompareVariant cmpVar = CompareVariant::timeSize; //the one active while finding "file in sync"
uint64_t fileSize = 0; //file size must be identical on both sides!
};
struct InSyncSymlink
{
InSyncDescrLink left;
InSyncDescrLink right;
CompareVariant cmpVar = CompareVariant::timeSize;
};
struct InSyncFolder
{
//------------------------------------------------------------------
using FolderList = std::unordered_map<ZstringNorm, InSyncFolder >; //
using FileList = std::unordered_map<ZstringNorm, InSyncFile >; // key: file name (ignoring Unicode normal forms)
using SymlinkList = std::unordered_map<ZstringNorm, InSyncSymlink>; //
//------------------------------------------------------------------
FolderList folders;
FileList files;
SymlinkList symlinks; //non-followed symlinks
//convenience
InSyncFolder& addFolder(const Zstring& folderName)
{
const auto [it, inserted] = folders.try_emplace(folderName);
assert(inserted);
return it->second;
}
void addFile(const Zstring& fileName, const InSyncDescrFile& descrL, const InSyncDescrFile& descrR, CompareVariant cmpVar, uint64_t fileSize)
{
files.emplace(fileName, InSyncFile {descrL, descrR, cmpVar, fileSize});
assert(inserted);
}
void addSymlink(const Zstring& linkName, const InSyncDescrLink& descrL, const InSyncDescrLink& descrR, CompareVariant cmpVar)
{
symlinks.emplace(linkName, InSyncSymlink {descrL, descrR, cmpVar});
assert(inserted);
}
};
std::unordered_map<const BaseFolderPair*, zen::SharedRef<const InSyncFolder>> loadLastSynchronousState(const std::vector<const BaseFolderPair*>& baseFolders,
PhaseCallback& callback /*throw X*/); //throw X
void saveLastSynchronousState(const BaseFolderPair& baseFolder, bool transactionalCopy, //throw X
PhaseCallback& callback /*throw X*/);
}
#endif //DB_FILE_H_834275398588021574
|