performance: keep track of the ddts older than 4 weeks
[ppastats.git] / src / lp.c
index fe4c019..c307a36 100644 (file)
--- a/src/lp.c
+++ b/src/lp.c
@@ -220,3 +220,91 @@ struct bpph **bpph_list_append_list(struct bpph **list1, struct bpph **list2)
 
        return list1;
 }
+
+time_t ddts_get_last_date(struct daily_download_total **ddts)
+{
+       struct daily_download_total **cur;
+       time_t t, last_t;
+
+       if (!ddts)
+               return 0;
+
+       last_t = 0;
+       for(cur = ddts; *cur; cur++) {
+               t = mktime(&(*cur)->date);
+               if (t > last_t)
+                       last_t = t;
+       }
+
+       return last_t;
+}
+
+int ddts_length(struct daily_download_total **ddts)
+{
+       int n;
+       struct daily_download_total **cur;
+
+       n = 0;
+
+       if (ddts)
+               for(cur = ddts; *cur; cur++)
+                       n++;
+
+       return n;
+}
+
+
+struct daily_download_total **add_total
+(struct daily_download_total **totals, struct daily_download_total *total)
+{
+       struct daily_download_total **cur;
+       struct daily_download_total *item;
+
+       if (totals) {
+               cur = totals;
+               while (*cur) {
+                       item = *cur;
+
+                       if (item->date.tm_year == total->date.tm_year &&
+                           item->date.tm_mon == total->date.tm_mon &&
+                           item->date.tm_mday == total->date.tm_mday) {
+                               item->count = total->count;
+                               return totals;
+                       }
+
+                       cur++;
+               }
+       }
+
+       item = malloc(sizeof(struct daily_download_total));
+       memcpy(item, total, sizeof(struct daily_download_total));
+
+       return (struct daily_download_total **)
+               list_add((void **)totals, (void *)item);
+}
+
+
+struct daily_download_total **
+ddts_merge(struct daily_download_total **ddts1,
+          struct daily_download_total **ddts2)
+{
+       struct daily_download_total **ddts, **cur, **tmp;
+
+       if (ddts1) {
+               ddts = malloc((ddts_length(ddts1) + 1) * sizeof(struct daily_download_total *));
+               memcpy(ddts, ddts1, (ddts_length(ddts1) + 1) * sizeof(void *));
+       } else {
+               ddts = malloc(sizeof(struct daily_download_total *));
+               ddts[0] = NULL;
+       }
+
+       if (ddts2)
+               for(cur = ddts2; *cur; cur++) {
+                       tmp = add_total(ddts, *cur);
+                       if (tmp != ddts) {
+                               ddts = tmp;
+                       }
+               }
+
+       return ddts;
+}