summaryrefslogtreecommitdiff
path: root/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'data.c')
-rw-r--r--data.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/data.c b/data.c
index 4d892cc..8888d4a 100644
--- a/data.c
+++ b/data.c
@@ -285,6 +285,48 @@ int index_add(const char *fn, const char *id)
285} 285}
286 286
287 287
288int index_gc(const char *fn)
289/* garbage-collects an index, deleting objects that are not here */
290{
291 FILE *i, *o;
292 int gc = -1;
293
294 pthread_mutex_lock(&data_mutex);
295
296 if ((i = fopen(fn, "r")) != NULL) {
297 xs *nfn = xs_fmt("%s.new", fn);
298 char line[256];
299
300 if ((o = fopen(nfn, "w")) != NULL) {
301 gc = 0;
302
303 while (fgets(line, sizeof(line), i) != NULL) {
304 line[32] = '\0';
305
306 if (object_here_by_md5(line))
307 fprintf(o, "%s\n", line);
308 else
309 gc++;
310 }
311
312 fclose(o);
313
314 xs *ofn = xs_fmt("%s.bak", fn);
315
316 unlink(ofn);
317 link(fn, ofn);
318 rename(nfn, fn);
319 }
320
321 fclose(i);
322 }
323
324 pthread_mutex_unlock(&data_mutex);
325
326 return gc;
327}
328
329
288int index_del_md5(const char *fn, const char *md5) 330int index_del_md5(const char *fn, const char *md5)
289/* deletes an md5 from an index */ 331/* deletes an md5 from an index */
290{ 332{