The unified diff between revisions [3099ff90..] and [e9aa88ea..] is displayed below. It can also be downloaded as a raw diff.

This diff has been restricted to the following files: 'packet.cc'

#
#
# patch "packet.cc"
#  from [407e15cf1c485e09665a372588be2f99491a17d7]
#    to [0867d1963018a7de23a7ca07be1e637817aaeb50]
#
============================================================
--- packet.cc	407e15cf1c485e09665a372588be2f99491a17d7
+++ packet.cc	0867d1963018a7de23a7ca07be1e637817aaeb50
@@ -246,12 +246,14 @@ delayed_file_delta_packet
   file_id new_id;
   file_delta del;
   bool forward_delta;
+  bool write_full;
 public:
   delayed_file_delta_packet(file_id const & oi,
                             file_id const & ni,
                             file_delta const & md,
-                            bool fwd)
-    : old_id(oi), new_id(ni), del(md), forward_delta(fwd)
+                            bool fwd,
+                            bool full = false)
+    : old_id(oi), new_id(ni), del(md), forward_delta(fwd), write_full(full)
   {}
   virtual void apply_delayed_packet(packet_db_writer & pw);
   virtual ~delayed_file_delta_packet();
@@ -265,12 +267,14 @@ delayed_manifest_delta_packet
   manifest_id new_id;
   manifest_delta del;
   bool forward_delta;
+  bool write_full;
 public:
   delayed_manifest_delta_packet(manifest_id const & oi,
                                 manifest_id const & ni,
                                 manifest_delta const & md,
-                                bool fwd)
-    : old_id(oi), new_id(ni), del(md), forward_delta(fwd)
+                                bool fwd,
+                                bool full = false)
+    : old_id(oi), new_id(ni), del(md), forward_delta(fwd), write_full(full)
   {}
   virtual void apply_delayed_packet(packet_db_writer & pw);
   virtual ~delayed_manifest_delta_packet();
@@ -361,12 +365,13 @@ delayed_manifest_delta_packet::apply_del
 void
 delayed_manifest_delta_packet::apply_delayed_packet(packet_db_writer & pw)
 {
-  L(F("writing delayed manifest %s packet for %s -> %s\n")
+  L(F("writing delayed manifest %s packet for %s -> %s%s\n")
     % (forward_delta ? "delta" : "reverse delta")
     % (forward_delta ? old_id : new_id)
-    % (forward_delta ? new_id : old_id));
+    % (forward_delta ? new_id : old_id)
+    % (write_full ? " (writing in full)" : ""));
   if (forward_delta)
-    pw.consume_manifest_delta(old_id, new_id, del);
+      pw.consume_manifest_delta(old_id, new_id, del, write_full);
   else
     pw.consume_manifest_reverse_delta(new_id, old_id, del);
 }
@@ -381,12 +386,13 @@ delayed_file_delta_packet::apply_delayed
 void
 delayed_file_delta_packet::apply_delayed_packet(packet_db_writer & pw)
 {
-  L(F("writing delayed file %s packet for %s -> %s\n")
+  L(F("writing delayed file %s packet for %s -> %s%s\n")
     % (forward_delta ? "delta" : "reverse delta")
     % (forward_delta ? old_id : new_id)
-    % (forward_delta ? new_id : old_id));
+    % (forward_delta ? new_id : old_id)
+    % (write_full ? " (writing in full)" : ""));
   if (forward_delta)
-    pw.consume_file_delta(old_id, new_id, del);
+    pw.consume_file_delta(old_id, new_id, del, write_full);
   else
     pw.consume_file_reverse_delta(new_id, old_id, del);
 }
@@ -656,6 +662,15 @@ packet_db_writer::consume_file_delta(fil
                                      file_id const & new_id,
                                      file_delta const & del)
 {
+  consume_file_delta(old_id, new_id, del, false);
+}
+
+void
+packet_db_writer::consume_file_delta(file_id const & old_id,
+                                     file_id const & new_id,
+                                     file_delta const & del,
+                                     bool write_full)
+{
   transaction_guard guard(pimpl->app.db);
   if (! pimpl->file_version_exists_in_db(new_id))
     {
@@ -669,7 +684,10 @@ packet_db_writer::consume_file_delta(fil
           calculate_ident(file_data(new_dat), confirm);
           if (confirm == new_id)
             {
-              pimpl->app.db.put_file_version(old_id, new_id, del);
+              if (!write_full)
+                pimpl->app.db.put_file_version(old_id, new_id, del);
+              else
+                pimpl->app.db.put_file(new_id, file_data(new_dat));
               pimpl->accepted_file(new_id, *this);
             }
           else
@@ -682,7 +700,7 @@ packet_db_writer::consume_file_delta(fil
         {
           L(F("delaying file delta %s -> %s for preimage\n") % old_id % new_id);
           shared_ptr<delayed_packet> dp;
-          dp = shared_ptr<delayed_packet>(new delayed_file_delta_packet(old_id, new_id, del, true));
+          dp = shared_ptr<delayed_packet>(new delayed_file_delta_packet(old_id, new_id, del, true, write_full));
           shared_ptr<prerequisite> fp;
           pimpl->get_file_prereq(old_id, fp);
           dp->add_prerequisite(fp);
@@ -761,6 +779,15 @@ packet_db_writer::consume_manifest_delta
                                          manifest_id const & new_id,
                                          manifest_delta const & del)
 {
+  consume_manifest_delta(old_id, new_id, del, false);
+}
+
+void
+packet_db_writer::consume_manifest_delta(manifest_id const & old_id,
+                                         manifest_id const & new_id,
+                                         manifest_delta const & del,
+                                         bool write_full)
+{
   transaction_guard guard(pimpl->app.db);
   if (! pimpl->manifest_version_exists_in_db(new_id))
     {
@@ -774,7 +801,11 @@ packet_db_writer::consume_manifest_delta
           calculate_ident(manifest_data(new_dat), confirm);
           if (confirm == new_id)
             {
-              pimpl->app.db.put_manifest_version(old_id, new_id, del);
+              if (!write_full)
+                pimpl->app.db.put_manifest_version(old_id, new_id, del);
+              else
+                pimpl->app.db.put_manifest(new_id, manifest_data(new_dat));
+
               pimpl->accepted_manifest(new_id, *this);
             }
           else
@@ -787,7 +818,7 @@ packet_db_writer::consume_manifest_delta
         {
           L(F("delaying manifest delta %s -> %s for preimage\n") % old_id % new_id);
           shared_ptr<delayed_packet> dp;
-          dp = shared_ptr<delayed_packet>(new delayed_manifest_delta_packet(old_id, new_id, del, true));
+          dp = shared_ptr<delayed_packet>(new delayed_manifest_delta_packet(old_id, new_id, del, true, write_full));
           shared_ptr<prerequisite> fp;
           pimpl->get_manifest_prereq(old_id, fp);
           dp->add_prerequisite(fp);
@@ -1108,6 +1139,15 @@ void
 }

 void
+packet_db_valve::consume_file_delta(file_id const & id_old,
+                                    file_id const & id_new,
+                                    file_delta const & del,
+                                    bool write_full)
+{
+  DOIT(delayed_file_delta_packet(id_old, id_new, del, true, write_full));
+}
+
+void
 packet_db_valve::consume_file_reverse_delta(file_id const & id_new,
                                             file_id const & id_old,
                                             file_delta const & del)
@@ -1131,6 +1171,15 @@ void
 }

 void
+packet_db_valve::consume_manifest_delta(manifest_id const & id_old,
+                                        manifest_id const & id_new,
+                                        manifest_delta const & del,
+                                        bool write_full)
+{
+  DOIT(delayed_manifest_delta_packet(id_old, id_new, del, true, write_full));
+}
+
+void
 packet_db_valve::consume_manifest_reverse_delta(manifest_id const & id_new,
                                                 manifest_id const & id_old,
                                                 manifest_delta const & del)