Overview
SHA1 Hash: | bd3c1d0023c2e573dbf92d19de29952603d24a92 |
---|---|
Date: | 2007-08-09 19:07:28 |
User: | drh |
Comment: | Additional work on the xfer mechanism, trying to increase the use of delta compression. |
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/xfer.c from [78443669a5] to [0239f4e4fe].
@@ -236,23 +236,47 @@ /* ** Send all pending files. */ static int send_all_pending(Blob *pOut){ - int iRidSent = 0; + int rid, xid, i; + int nIgot = 0; int sent = 0; int nSent = 0; int maxSize = db_get_int("http-msg-size", 500000); - Stmt q; - - db_prepare(&q, "SELECT rid FROM pending ORDER BY rid"); - while( db_step(&q)==SQLITE_ROW ){ - int rid = db_column_int(&q, 0); + static const char *azQuery[] = { + "SELECT srcid FROM delta JOIN pending ON pending.rid=delta.srcid" + " WHERE delta.rid=%d" + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=srcid)", + + "SELECT delta.rid FROM delta JOIN pending ON pending.rid=delta.rid" + " WHERE srcid=%d" + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=delta.rid)", + + "SELECT pid FROM plink JOIN pending ON rid=pid" + " WHERE cid=%d" + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)", + + "SELECT cid FROM plink JOIN pending ON rid=cid" + " WHERE pid=%d" + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=cid)", + + "SELECT pid FROM mlink JOIN pending ON rid=pid" + " WHERE fid=%d" + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)", + + "SELECT fid FROM mlink JOIN pending ON rid=fid" + " WHERE pid=%d" + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=fid)", + }; + + rid = db_int(0, "SELECT rid FROM pending"); + while( rid && nIgot<200 ){ + db_multi_exec("DELETE FROM pending WHERE rid=%d", rid); if( sent<maxSize ){ sent += send_file(rid, pOut); nSent++; - iRidSent = rid; }else{ char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d AND size>=0", rid); if( zUuid ){ if( pOut ){ @@ -259,22 +283,22 @@ blob_appendf(pOut, "igot %s\n", zUuid); }else{ cgi_printf("igot %s\n", zUuid); } free(zUuid); - } + nIgot++; + } + } + xid = 0; + for(i=0; xid==0 && i<sizeof(azQuery)/sizeof(azQuery[0]); i++){ + xid = db_int(0, azQuery[i], rid); + } + rid = xid; + if( rid==0 ){ + rid = db_int(0, "SELECT rid FROM pending"); } } - db_finalize(&q); - - /* Delete the 'pending' records for all files just sent. Otherwise, - ** we can wind up sending some files more than once. - */ - if( nSent>0 ){ - db_multi_exec("DELETE FROM pending WHERE rid <= %d", iRidSent); - } - return nSent; } /*