| | @@ -441,5 +441,71 @@ |
| 441 | 441 | @ function xout(id){ |
| 442 | 442 | @ } |
| 443 | 443 | @ </script> |
| 444 | 444 | style_footer(); |
| 445 | 445 | } |
| 446 | + |
| 447 | +#if INTERFACE |
| 448 | +/* Flag parameters to compute_uses_file() */ |
| 449 | +#define USESFILE_DELETE 0x01 /* Include the check-ins where file deleted */ |
| 450 | + |
| 451 | +#endif |
| 452 | + |
| 453 | + |
| 454 | +/* |
| 455 | +** Add to table zTab the record ID (rid) of every check-in that contains |
| 456 | +** the file fid. |
| 457 | +*/ |
| 458 | +void compute_uses_file(const char *zTab, int fid, int usesFlags){ |
| 459 | + Bag seen; |
| 460 | + Bag pending; |
| 461 | + Stmt ins; |
| 462 | + Stmt q; |
| 463 | + int rid; |
| 464 | + |
| 465 | + bag_init(&seen); |
| 466 | + bag_init(&pending); |
| 467 | + db_prepare(&ins, "INSERT OR IGNORE INTO \"%s\" VALUES(:rid)", zTab); |
| 468 | + db_prepare(&q, "SELECT mid FROM mlink WHERE fid=%d", fid); |
| 469 | + while( db_step(&q)==SQLITE_ROW ){ |
| 470 | + int mid = db_column_int(&q, 0); |
| 471 | + bag_insert(&pending, mid); |
| 472 | + bag_insert(&seen, mid); |
| 473 | + db_bind_int(&ins, ":rid", mid); |
| 474 | + db_step(&ins); |
| 475 | + db_reset(&ins); |
| 476 | + } |
| 477 | + db_finalize(&q); |
| 478 | + |
| 479 | + db_prepare(&q, "SELECT mid FROM mlink WHERE pid=%d", fid); |
| 480 | + while( db_step(&q)==SQLITE_ROW ){ |
| 481 | + int mid = db_column_int(&q, 0); |
| 482 | + bag_insert(&seen, mid); |
| 483 | + if( usesFlags & USESFILE_DELETE ){ |
| 484 | + db_bind_int(&ins, ":rid", mid); |
| 485 | + db_step(&ins); |
| 486 | + db_reset(&ins); |
| 487 | + } |
| 488 | + } |
| 489 | + db_finalize(&q); |
| 490 | + db_prepare(&q, "SELECT cid FROM plink WHERE pid=:rid"); |
| 491 | + |
| 492 | + while( (rid = bag_first(&pending))!=0 ){ |
| 493 | + bag_remove(&pending, rid); |
| 494 | + db_bind_int(&q, ":rid", rid); |
| 495 | + while( db_step(&q)==SQLITE_ROW ){ |
| 496 | + int mid = db_column_int(&q, 0); |
| 497 | + if( bag_find(&seen, mid) ) continue; |
| 498 | + bag_insert(&seen, mid); |
| 499 | + bag_insert(&pending, mid); |
| 500 | + db_bind_int(&ins, ":rid", mid); |
| 501 | + db_step(&ins); |
| 502 | + db_reset(&ins); |
| 503 | + } |
| 504 | + db_reset(&q); |
| 505 | + } |
| 506 | + db_finalize(&q); |
| 507 | + db_finalize(&ins); |
| 508 | + bag_clear(&seen); |
| 509 | + bag_clear(&pending); |
| 510 | +} |
| 511 | + |
| 446 | 512 | |