source: filezilla/trunk/fuentes/src/engine/directorycache.h @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 3 years ago

Update new version: 3.15.02

File size: 3.7 KB
Line 
1#ifndef __DIRECTORYCACHE_H__
2#define __DIRECTORYCACHE_H__
3
4/*
5This class is the directory cache used to store retrieved directory listings
6for further use.
7Directory get either purged from the cache if the maximum cache time exceeds,
8or on possible data inconsistencies.
9For example since some servers are case sensitive and others aren't, a
10directory is removed from cache once an operation effects a file wich matches
11multiple entries in a cache directory using a case insensitive search
12On other operations, the directory is marked as unsure. It may still be valid,
13but for some operations the engine/interface prefers to retrieve a clean
14version.
15*/
16
17#include <libfilezilla/mutex.hpp>
18
19#include <set>
20
21const int CACHE_TIMEOUT = 900; // In seconds
22
23class CDirectoryCache final
24{
25public:
26        enum Filetype
27        {
28                unknown,
29                file,
30                dir
31        };
32
33        CDirectoryCache();
34        ~CDirectoryCache();
35
36        CDirectoryCache(CDirectoryCache const&) = delete;
37        CDirectoryCache& operator=(CDirectoryCache const&) = delete;
38
39        void Store(const CDirectoryListing &listing, const CServer &server);
40        bool GetChangeTime(fz::monotonic_clock& time, const CServer &server, const CServerPath &path);
41        bool Lookup(CDirectoryListing &listing, const CServer &server, const CServerPath &path, bool allowUnsureEntries, bool& is_outdated);
42        bool DoesExist(const CServer &server, const CServerPath &path, int &hasUnsureEntries, bool &is_outdated);
43        bool LookupFile(CDirentry &entry, const CServer &server, const CServerPath &path, const wxString& file, bool &dirDidExist, bool &matchedCase);
44        bool InvalidateFile(const CServer &server, const CServerPath &path, const wxString& filename, bool *wasDir = 0);
45        bool UpdateFile(const CServer &server, const CServerPath &path, const wxString& filename, bool mayCreate, enum Filetype type = file, int64_t size = -1);
46        bool RemoveFile(const CServer &server, const CServerPath &path, const wxString& filename);
47        void InvalidateServer(const CServer& server);
48        void RemoveDir(const CServer& server, const CServerPath& path, const wxString& filename, const CServerPath& target);
49        void Rename(const CServer& server, const CServerPath& pathFrom, const wxString& fileFrom, const CServerPath& pathTo, const wxString& fileTo);
50
51protected:
52
53        class CCacheEntry final
54        {
55        public:
56                CCacheEntry() = default;
57                CCacheEntry(CCacheEntry const& entry) = default;
58                CCacheEntry(CCacheEntry && entry) noexcept = default;
59
60                explicit CCacheEntry(CDirectoryListing const& l)
61                        : listing(l)
62                        , modificationTime(fz::monotonic_clock::now())
63                {}
64
65                CDirectoryListing listing;
66                fz::monotonic_clock modificationTime;
67
68                CCacheEntry& operator=(CCacheEntry const& a) = default;
69                CCacheEntry& operator=(CCacheEntry && a) noexcept = default;
70
71                void* lruIt{}; // void* to break cyclic declaration dependency
72
73                bool operator<(CCacheEntry const& op) const noexcept {
74                        return listing.path < op.listing.path;
75                }
76        };
77
78        class CServerEntry final
79        {
80        public:
81                CServerEntry() {}
82                explicit CServerEntry(CServer const& s)
83                        : server(s)
84                {}
85
86                CServer server;
87                std::set<CCacheEntry> cacheList;
88        };
89
90        typedef std::list<CServerEntry>::iterator tServerIter;
91
92        tServerIter CreateServerEntry(const CServer& server);
93        tServerIter GetServerEntry(const CServer& server);
94
95        typedef std::set<CCacheEntry>::iterator tCacheIter;
96        typedef std::set<CCacheEntry>::const_iterator tCacheConstIter;
97
98        bool Lookup(tCacheIter &cacheIter, tServerIter &sit, const CServerPath &path, bool allowUnsureEntries, bool& is_outdated);
99
100        fz::mutex mutex_;
101
102        std::list<CServerEntry> m_serverList;
103
104        void UpdateLru(tServerIter const& sit, tCacheIter const& cit);
105
106        void Prune();
107
108        typedef std::pair<tServerIter, tCacheIter> tFullEntryPosition;
109        typedef std::list<tFullEntryPosition> tLruList;
110        tLruList m_leastRecentlyUsedList;
111
112        int64_t m_totalFileCount{};
113};
114
115#endif
Note: See TracBrowser for help on using the repository browser.