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
- branch=trunk inherited from [a28c83647d]
- sym-trunk inherited from [a28c83647d]
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);