#include <string>
#include <iostream>
+#include <map>
#include "metadata.h"
#include "ref.h"
#include "util.h"
using std::list;
+using std::map;
using std::string;
using std::ostream;
using std::ostringstream;
return pathcmp(slash1 + 1, slash2 + 1);
}
+/* Encode a dictionary of string key/value pairs into a sequence of lines of
+ * the form "key: value". If it exists, the key "name" is treated specially
+ * and will be listed first. */
+static string encode_dict(const map<string, string>& dict)
+{
+ string result;
+
+ if (dict.find("name") != dict.end()) {
+ result += "name: " + dict.at("name") + "\n";
+ }
+
+ for (map<string, string>::const_iterator i = dict.begin();
+ i != dict.end(); ++i) {
+ if (i->first == "name")
+ continue;
+ result += i->first + ": " + i->second + "\n";
+ }
+
+ return result;
+}
+
MetadataWriter::MetadataWriter(TarSegmentStore *store,
const char *path,
const char *snapshot_name,
throw IOException("Error opening statcache");
}
- found_match = false;
old_metadata_eof = false;
this->store = store;
while (!old_metadata_eof) {
string old_path = uri_decode(old_metadata["name"]);
int cmp = pathcmp(old_path.c_str(), path_str);
- if (cmp == 0) {
- found_match = true;
+ if (cmp == 0)
return true;
- } else if (cmp > 0) {
- found_match = false;
+ else if (cmp > 0)
return false;
- } else {
+ else
read_statcache();
- }
}
- found_match = false;
return false;
}
/* Does a file appear to be unchanged from the previous time it was backed up,
- * based on stat information?
- *
- * TODO: Notice files that were modified as they were being backed up the last
- * time. */
+ * based on stat information? */
bool MetadataWriter::is_unchanged(const struct stat *stat_buf)
{
+ if (old_metadata.find("volatile") != old_metadata.end()
+ && parse_int(old_metadata["volatile"]) != 0)
+ return false;
+
if (old_metadata.find("ctime") == old_metadata.end())
return false;
if (stat_buf->st_ctime != parse_int(old_metadata["ctime"]))
s++;
}
- ObjectReference *r = ObjectReference::parse(ref);
- if (r != NULL) {
- blocks.push_back(*r);
- delete r;
- }
+ ObjectReference r = ObjectReference::parse(ref);
+ if (!r.is_null())
+ blocks.push_back(r);
}
return blocks;
item.text += encode_dict(info) + "\n";
if (info == old_metadata) {
- ObjectReference *ref = ObjectReference::parse(old_metadata_loc);
- if (ref != NULL) {
+ ObjectReference ref = ObjectReference::parse(old_metadata_loc);
+ if (!ref.is_null()) {
item.reused = true;
- item.ref = *ref;
- delete ref;
+ item.ref = ref;
}
}