#ifndef _LBS_METADATA_H
#define _LBS_METADATA_H
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <list>
#include <string>
#include <sstream>
#include "ref.h"
#include "util.h"
+extern bool flag_full_metadata;
+
+/* Metadata for a single inode, ready to be written out. */
+struct MetadataItem {
+ int offset;
+ std::string text;
+
+ bool reused;
+ ObjectReference ref;
+};
+
class MetadataWriter {
public:
- MetadataWriter(TarSegmentStore *store);
- void add(const std::string& path, dictionary info);
+ MetadataWriter(TarSegmentStore *store, const char *path,
+ const char *snapshot_name, const char *snapshot_scheme);
+ void add(dictionary info);
ObjectReference close();
+ bool find(const std::string& path);
+ ObjectReference old_ref() const {
+ return ObjectReference::parse(old_metadata_loc);
+ }
+
+ bool is_unchanged(const struct stat *stat_buf);
+
+ dictionary get_old_metadata() const { return old_metadata; }
+ std::list<ObjectReference> get_blocks();
+ std::string get_checksum() { return old_metadata["checksum"]; }
+
private:
void metadata_flush();
+ void read_statcache();
+ // Where are objects eventually written to?
TarSegmentStore *store;
- std::ostringstream metadata, metadata_root;
+
+ // File descriptors for reading/writing local statcache data
+ std::string statcache_path, statcache_tmp_path;
+ FILE *statcache_in, *statcache_out;
+
+ // Metadata not yet written out to the segment store
+ size_t chunk_size;
+ std::list<MetadataItem> items;
+ std::ostringstream metadata_root;
+
+ // Statcache information read back in from a previous run
+ bool old_metadata_eof;
+ dictionary old_metadata;
+ std::string old_metadata_loc; // Reference to where the metadata is found
};
#endif // _LBS_METADATA_H