* v0.0.3
[ppastats.git] / src / ppastats.c
index 078eeab..032a537 100644 (file)
@@ -137,7 +137,56 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro,
 }
 
 
-struct ppa_stats *create_ppa_stats(const char *owner, const char *ppa)
+static 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 **add_totals
+(struct daily_download_total **total1, struct daily_download_total **total2)
+{
+       struct daily_download_total **cur;
+       struct daily_download_total **result;
+
+       result = total1;
+       cur = total2;
+       while (*cur) {
+               result = add_total(result, *cur);
+
+               cur++;
+       }
+
+       return result;
+}
+
+struct ppa_stats *
+create_ppa_stats(const char *owner,
+                const char *ppa,
+                const char *package_status)
 {
        struct ppa_stats *ppastats;
        struct binary_package_publishing_history **history;
@@ -151,9 +200,11 @@ struct ppa_stats *create_ppa_stats(const char *owner, const char *ppa)
        struct distro_stats *distro;
        struct arch_stats *arch;
        int count;
+       struct daily_download_total **totals;
 
        ppa_url = get_archive_url(owner, ppa);
-       history = get_binary_package_publishing_history_list(ppa_url);
+       history = get_binary_package_publishing_history_list(ppa_url,
+                                                            package_status);
        free(ppa_url);
 
        if (!history) {
@@ -177,6 +228,7 @@ struct ppa_stats *create_ppa_stats(const char *owner, const char *ppa)
                        = get_distro_arch_series(h->distro_arch_series_link);
                distro_series
                        = get_distro_series(arch_series->distroseries_link);
+
                count = get_download_count(h->self_link);
 
                package = get_package_stats(ppastats, package_name);
@@ -193,6 +245,22 @@ struct ppa_stats *create_ppa_stats(const char *owner, const char *ppa)
 
                ppastats->download_count += count;
 
+               totals = get_daily_download_totals(h->self_link);
+
+               ppastats->daily_download_totals
+                       = add_totals(ppastats->daily_download_totals,
+                                    totals);
+
+               package->daily_download_totals
+                       = add_totals(package->daily_download_totals,
+                                    totals);
+
+               version->daily_download_totals
+                       = add_totals(version->daily_download_totals,
+                                    totals);
+
+               daily_download_total_list_free(totals);
+
                h_cur++;
        }
 
@@ -274,5 +342,7 @@ void ppa_stats_free(struct ppa_stats *ppastats)
        free(ppastats->owner);
        free(ppastats->name);
 
+       daily_download_total_list_free(ppastats->daily_download_totals);
+
        free(ppastats);
 }