Convert to sqlite3 module, from pysqlite2.
[cumulus.git] / main.cc
diff --git a/main.cc b/main.cc
index d25788d..cd31189 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -1,8 +1,6 @@
-/* Cumulus: Smart Filesystem Backup to Dumb Servers
- *
- * Copyright (C) 2006-2009  The Regents of the University of California
- * Copyright (C) 2012  Google Inc.
- * Written by Michael Vrable <mvrable@cs.ucsd.edu>
+/* Cumulus: Efficient Filesystem Backup to the Cloud
+ * Copyright (C) 2006-2009, 2012 The Cumulus Developers
+ * See the AUTHORS file for a list of contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -84,14 +82,6 @@ static char *block_buf;
  * invocations to help in creating incremental snapshots. */
 LocalDb *db;
 
-/* Keep track of all segments which are needed to reconstruct the snapshot. */
-std::set<string> segment_list;
-
-/* Snapshot intent: 1=daily, 7=weekly, etc.  This is not used directly, but is
- * stored in the local database and can help guide segment cleaning and
- * snapshot expiration policies. */
-double snapshot_intent = 1.0;
-
 /* Selection of files to include/exclude in the snapshot. */
 PathFilterList filter_rules;
 
@@ -100,13 +90,6 @@ bool flag_rebuild_statcache = false;
 /* Whether verbose output is enabled. */
 bool verbose = false;
 
-/* Ensure that the given segment is listed as a dependency of the current
- * snapshot. */
-void add_segment(const string& segment)
-{
-    segment_list.insert(segment);
-}
-
 /* Attempts to open a regular file read-only, but with safety checks for files
  * that might not be fully trusted. */
 int safe_open(const string& path, struct stat *stat_buf)
@@ -234,8 +217,6 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path,
                  i != old_blocks.end(); ++i) {
                 const ObjectReference &ref = *i;
                 object_list.push_back(ref.to_string());
-                if (ref.is_normal())
-                    add_segment(ref.get_segment());
                 db->UseObject(ref);
             }
             size = stat_buf.st_size;
@@ -276,9 +257,10 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path,
             double block_age = 0.0;
             ObjectReference ref;
 
-            SHA1Checksum block_hash;
-            block_hash.process(block_buf, bytes);
-            string block_csum = block_hash.checksum_str();
+            Hash *hash = Hash::New();
+            hash->update(block_buf, bytes);
+            string block_csum = hash->digest_str();
+            delete hash;
 
             if (all_zero) {
                 ref = ObjectReference(ObjectReference::REF_ZERO);
@@ -334,8 +316,6 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path,
             while (!refs.empty()) {
                 ref = refs.front(); refs.pop_front();
                 object_list.push_back(ref.to_string());
-                if (ref.is_normal())
-                    add_segment(ref.get_segment());
                 db->UseObject(ref);
             }
             size += bytes;
@@ -672,8 +652,7 @@ void usage(const char *program)
         "  --signature-filter=COMMAND\n"
         "                       program though which to filter descriptor\n"
         "  --scheme=NAME        optional name for this snapshot\n"
-        "  --intent=FLOAT       intended backup type: 1=daily, 7=weekly, ...\n"
-        "                           (defaults to \"1\")\n"
+        "  --intent=FLOAT       DEPRECATED: ignored, and will be removed soon\n"
         "  --full-metadata      do not re-use metadata from previous backups\n"
         "  --rebuild-statcache  re-read all file data to verify statcache\n"
         "  -v --verbose         list files as they are backed up\n"
@@ -704,7 +683,7 @@ int main(int argc, char *argv[])
             {"dest", 1, 0, 0},              // 3
             {"scheme", 1, 0, 0},            // 4
             {"signature-filter", 1, 0, 0},  // 5
-            {"intent", 1, 0, 0},            // 6
+            {"intent", 1, 0, 0},            // 6, DEPRECATED
             {"full-metadata", 0, 0, 0},     // 7
             {"tmpdir", 1, 0, 0},            // 8
             {"upload-script", 1, 0, 0},     // 9
@@ -744,9 +723,9 @@ int main(int argc, char *argv[])
                 signature_filter = optarg;
                 break;
             case 6:     // --intent
-                snapshot_intent = atof(optarg);
-                if (snapshot_intent <= 0)
-                    snapshot_intent = 1;
+                fprintf(stderr,
+                        "Warning: The --intent= option is deprecated and will "
+                        "be removed in the future.\n");
                 break;
             case 7:     // --full-metadata
                 flag_full_metadata = true;
@@ -821,7 +800,7 @@ int main(int argc, char *argv[])
      * a temporary directory for staging files.  Otherwise, write backups
      * directly to the destination directory. */
     if (backup_script != "") {
-        tmp_dir = tmp_dir + "/lbs." + generate_uuid();
+        tmp_dir = tmp_dir + "/cumulus." + generate_uuid();
         if (mkdir(tmp_dir.c_str(), 0700) < 0) {
             fprintf(stderr, "Cannot create temporary directory %s: %m\n",
                     tmp_dir.c_str());
@@ -847,8 +826,7 @@ int main(int argc, char *argv[])
      * snapshot. */
     string database_path = localdb_dir + "/localdb.sqlite";
     db = new LocalDb;
-    db->Open(database_path.c_str(), desc_buf, backup_scheme.c_str(),
-             snapshot_intent);
+    db->Open(database_path.c_str(), desc_buf, backup_scheme.c_str());
 
     tss = new TarSegmentStore(remote, db);
 
@@ -861,7 +839,6 @@ int main(int argc, char *argv[])
     }
 
     ObjectReference root_ref = metawriter->close();
-    add_segment(root_ref.get_segment());
     string backup_root = root_ref.to_string();
 
     delete metawriter;
@@ -879,13 +856,14 @@ int main(int argc, char *argv[])
         checksum_filename += backup_scheme + "-";
     checksum_filename = checksum_filename + desc_buf + "." + csum_type + "sums";
     RemoteFile *checksum_file = remote->alloc_file(checksum_filename,
-                                                   "checksums");
+                                                   "meta");
     FILE *checksums = fdopen(checksum_file->get_fd(), "w");
 
+    std::set<string> segment_list = db->GetUsedSegments();
     for (std::set<string>::iterator i = segment_list.begin();
          i != segment_list.end(); ++i) {
         string seg_path, seg_csum;
-        if (db->GetSegmentChecksum(*i, &seg_path, &seg_csum)) {
+        if (db->GetSegmentMetadata(*i, &seg_path, &seg_csum)) {
             const char *raw_checksum = NULL;
             if (strncmp(seg_csum.c_str(), csum_type,
                         strlen(csum_type)) == 0) {
@@ -927,7 +905,7 @@ int main(int argc, char *argv[])
     string desc_filename = "snapshot-";
     if (backup_scheme.size() > 0)
         desc_filename += backup_scheme + "-";
-    desc_filename = desc_filename + desc_buf + ".lbs";
+    desc_filename = desc_filename + desc_buf + ".cumulus";
 
     RemoteFile *descriptor_file = remote->alloc_file(desc_filename,
                                                      "snapshots");
@@ -952,7 +930,6 @@ int main(int argc, char *argv[])
     fprintf(descriptor, "Date: %s\n", desc_buf);
     if (backup_scheme.size() > 0)
         fprintf(descriptor, "Scheme: %s\n", backup_scheme.c_str());
-    fprintf(descriptor, "Backup-Intent: %g\n", snapshot_intent);
     fprintf(descriptor, "Root: %s\n", backup_root.c_str());
 
     if (csum.size() > 0) {