diff options
Diffstat (limited to 'src/triplet.c')
-rw-r--r-- | src/triplet.c | 104 |
1 files changed, 97 insertions, 7 deletions
diff --git a/src/triplet.c b/src/triplet.c index 79ca8c2..05b7536 100644 --- a/src/triplet.c +++ b/src/triplet.c @@ -34,3 +34,3 @@ hash_triplet_compare (void const *data1, void const *data2) struct file_triplet const *t2 = data2; - return strcmp (t1->name, t2->name); + return t1->spool == t2->spool && strcmp (t1->name, t2->name); } @@ -100,2 +100,3 @@ register_file (struct file_info *finfo, const struct spool *spool) key.name[finfo->root_len] = 0; + key.spool = spool; @@ -113,2 +114,24 @@ register_file (struct file_info *finfo, const struct spool *spool) +struct file_triplet * +triplet_lookup (struct spool *spool, const char *name) +{ + struct file_triplet key, *ret; + struct file_info finfo; + + if (!triplet_table) + return NULL; + + parse_file_name (name, &finfo); + + key.name = grecs_malloc (finfo.root_len + 1); + memcpy (key.name, finfo.name, finfo.root_len); + key.name[finfo.root_len] = 0; + key.spool = spool; + + ret = grecs_symtab_lookup_or_install (triplet_table, &key, NULL); + file_info_cleanup (&finfo); + + return ret; +} + /* Return true if any part of the triplet TRP was modified more than @@ -149,3 +172,3 @@ enum triplet_state static enum triplet_state -check_triplet_state (struct file_triplet *trp) +check_triplet_state (struct file_triplet *trp, int noauth) { @@ -153,3 +176,3 @@ check_triplet_state (struct file_triplet *trp) { - if (verify_directive_file (trp)) + if (verify_directive_file (trp, noauth)) return triplet_bad; @@ -162,4 +185,3 @@ check_triplet_state (struct file_triplet *trp) } - else if (trp->file[file_dist].name - && trp->file[file_signature].name) + else if (trp->file[file_dist].name && trp->file[file_signature].name) { @@ -214,3 +236,3 @@ triplet_processor (void *data, void *proc_data) - switch (check_triplet_state (trp)) + switch (check_triplet_state (trp, 0)) { @@ -248,3 +270,3 @@ triplet_processor (void *data, void *proc_data) void -enumerate_triplets (const struct spool *spool) +spool_commit_triplets (struct spool *spool) { @@ -253,2 +275,4 @@ enumerate_triplets (const struct spool *spool) spool->tag, mu_url_to_string (spool->dest_url)); + if (spool_open_dictionaries (spool)) + return; if (triplet_table) @@ -266,2 +290,68 @@ count_collected_triplets () +static int +triplet_counter (void *data, void *proc_data) +{ + struct file_triplet *trp = data; + size_t *cp = proc_data; + + if (debug_level) + logmsg (LOG_DEBUG, "FILE %s, DIST=%s, SIG=%s, DIRECTIVE=%s", + trp->name, + SP (trp->file[file_dist].name), + SP (trp->file[file_signature].name), + SP (trp->file[file_directive].name)); + + switch (check_triplet_state (trp, 1)) + { + case triplet_directive: + case triplet_complete: + case triplet_bad: + ++*cp; + case triplet_incomplete: + return 0; + } + + if (triplet_expired_p (trp, trp->spool->file_sweep_time)) + ++*cp;//FIXME + + return 0; +} + +size_t +count_processable_triplets () +{ + size_t count = 0; + if (triplet_table) + grecs_symtab_enumerate (triplet_table, triplet_counter, &count); + return count; +} + +void +triplet_remove_file (struct spool *spool, const char *name) +{ + struct file_triplet *tp = triplet_lookup (spool, name); + int i, n = 0; + + if (!tp) + return; + + for (i = 0; i < FILE_TYPE_COUNT; i++) + { + if (!tp->file[i].name) + /* nothing */; + else if (strcmp (tp->file[i].name, name) == 0) + file_info_cleanup (&tp->file[i]); + else + n++; + } + + if (!n) + { + if (debug_level > 0) + logmsg (LOG_DEBUG, "deleting empty triplet (%s/%s)", + spool->source_dir, name); + grecs_symtab_remove (triplet_table, tp); + } +} + |