From b8f13e45be884dc12884ebe8f3dcd9eecb23a106 Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:20:29 +0200 Subject: 5.5 --- lib/db_file.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 5 deletions(-) (limited to 'lib/db_file.h') diff --git a/lib/db_file.h b/lib/db_file.h index e5ae7b50..4425f52c 100644 --- a/lib/db_file.h +++ b/lib/db_file.h @@ -14,17 +14,75 @@ namespace zen { const Zstring SYNC_DB_FILE_ENDING = Zstr(".ffs_db"); -struct DirInformation +//artificial hierarchy of last synchronous state: +struct InSyncFile { - DirContainer baseDirContainer; //hierarchical directory information + enum InSyncType + { + IN_SYNC_BINARY_EQUAL, //checked file content + IN_SYNC_ATTRIBUTES_EQUAL, //only "looks" like they're equal + }; + + InSyncFile(const FileDescriptor& l, const FileDescriptor& r, InSyncType type) : left(l), right(r), inSyncType(type) {} + FileDescriptor left; + FileDescriptor right; + InSyncType inSyncType; +}; + +struct InSyncSymlink +{ + InSyncSymlink(const LinkDescriptor& l, const LinkDescriptor& r) : left(l), right(r) {} + LinkDescriptor left; + LinkDescriptor right; +}; + +struct InSyncDir +{ + //for directories we have a logical problem: we cannot have "not existent" as an indicator for "no last synchronous state" since this precludes + //child elements that may be in sync! + enum InSyncStatus + { + STATUS_IN_SYNC, + STATUS_STRAW_MAN //there is no last synchronous state, but used as container only + }; + InSyncDir(InSyncStatus statusIn) : status(statusIn) {} + + InSyncStatus status; + + //------------------------------------------------------------------ + typedef std::map DirList; // + typedef std::map FileList; // key: shortName + typedef std::map LinkList; // + //------------------------------------------------------------------ + + DirList dirs; + FileList files; + LinkList symlinks; //non-followed symlinks + + //convenience + InSyncDir& addDir(const Zstring& shortName, InSyncStatus statusIn) + { + //use C++11 emplace when available + return dirs.insert(std::make_pair(shortName, InSyncDir(statusIn))).first->second; + } + + void addFile(const Zstring& shortName, const FileDescriptor& dataL, const FileDescriptor& dataR, InSyncFile::InSyncType type) + { + files.insert(std::make_pair(shortName, InSyncFile(dataL, dataR, type))); + } + + void addSymlink(const Zstring& shortName, const LinkDescriptor& dataL, const LinkDescriptor& dataR) + { + symlinks.insert(std::make_pair(shortName, InSyncSymlink(dataL, dataR))); + } }; -typedef std::shared_ptr DirInfoPtr; + DEFINE_NEW_FILE_ERROR(FileErrorDatabaseNotExisting); -std::pair loadFromDisk(const BaseDirMapping& baseMapping); //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! +std::shared_ptr loadLastSynchronousState(const BaseDirMapping& baseMapping); //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! -void saveToDisk(const BaseDirMapping& baseMapping); //throw FileError +void saveLastSynchronousState(const BaseDirMapping& baseMapping); //throw FileError } #endif // DBFILE_H_INCLUDED -- cgit