Check-in [fb90abe5bd]
Not logged in
Overview

SHA1 Hash:fb90abe5bdfb92223dfcc291441868be1c2029af
Date: 2007-12-03 14:42:32
User: drh
Comment:Detect delta loops and make at least one member of the loop a phantom.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/content.c from [02e1a3dfd6] to [1ea5bdca20].

@@ -44,15 +44,27 @@
 int content_get(int rid, Blob *pBlob){
   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;
         db_ephemeral_blob(&q, 0, &delta);
@@ -63,10 +75,11 @@
         rc = 1;
       }
       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);
       blob_uncompress(pBlob, pBlob);