Diff
Not logged in

Differences From:

File src/content.c part of check-in [574763bab9] - Added revision support to diff and revert by jnc on 2007-09-26 03:37:12. Also file src/content.c part of check-in [8d55aa3597] - Merged in new revision support for diff and revert commands into mainstream by jnc on 2007-09-26 03:38:58. [view]

To:

File src/content.c part of check-in [fb90abe5bd] - Detect delta loops and make at least one member of the loop a phantom. by drh on 2007-12-03 14:42:32. Also file src/content.c part of check-in [d0305b305a] - Merged mainline into my branch to get the newest application. by aku on 2007-12-05 08:07:46. [view]

@@ -45,13 +45,25 @@
   Stmt q;
   Blob src;
   int srcid;
   int rc = 0;
+  static Bag inProcess;
 
   assert( g.repositoryOpen );
   srcid = findSrcid(rid);
   blob_zero(pBlob);
   if( srcid ){
+    if( bag_find(&inProcess, srcid) ){
+      db_multi_exec(
+        "UPDATE blob SET content=NULL, size=-1 WHERE rid=%d;"
+        "DELETE FROM delta WHERE rid=%d;"
+        "INSERT OR IGNORE INTO phantom VALUES(%d);",
+        srcid, srcid, srcid
+      );
+      blob_zero(pBlob);
+      return 0;
+    }
+    bag_insert(&inProcess, srcid);
     if( content_get(srcid, &src) ){
       db_prepare(&q, "SELECT content FROM blob WHERE rid=%d AND size>=0", rid);
       if( db_step(&q)==SQLITE_ROW ){
         Blob delta;
@@ -64,8 +76,9 @@
       }
       db_finalize(&q);
       blob_reset(&src);
     }
+    bag_remove(&inProcess, srcid);
   }else{
     db_prepare(&q, "SELECT content FROM blob WHERE rid=%d AND size>=0", rid);
     if( db_step(&q)==SQLITE_ROW ){
       db_ephemeral_blob(&q, 0, pBlob);