Partial commit of statcache support.
[cumulus.git] / statcache.h
1 /* LBS: An LFS-inspired filesystem backup system Copyright (C) 2007  Michael
2  * Vrable
3  *
4  * To speed backups, we maintain a "stat cache" containing selected information
5  * about all regular files, including modification times and the list of blocks
6  * that comprised the file in the last backup.  If the file has not changed
7  * according to a stat() call, we may re-use the information contained in the
8  * stat cache instead of re-reading the entire file.  It is always safe to
9  * discard information from the stat cache; this will only cause a file to be
10  * re-read to determine that it contains the same data as before.
11  *
12  * The stat cache is stored in a file called "statcache" in the local backup
13  * directory.  During a backup, a new statcache file is written out with a
14  * suffix based on the current time; at the end of a successful backup this
15  * file is renamed over the original statcache file.
16  *
17  * The information in the statcache file is stored in sorted order as we
18  * traverse the filesystem, so that we can read and write it in a purely
19  * streaming manner.  (This is why we don't include the information in the
20  * SQLite local database; doing so is likely less efficient.)
21  */
22
23 #ifndef _LBS_STATCACHE_H
24 #define _LBS_STATCACHE_H
25
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <unistd.h>
29
30 #include <iostream>
31 #include <list>
32 #include <string>
33
34 class StatCache {
35 public:
36     void Open(const char *path, const char *snapshot_name);
37     void Close();
38     void Save(const std::string &path, struct stat *stat_buf,
39               const std::string &checksum,
40               const std::list<std::string> &blocks);
41
42 private:
43     std::string oldpath, newpath;
44     std::ifstream *oldcache;
45     std::ofstream *newcache;
46 };
47
48 #endif // _LBS_STATCACHE_H