X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fppastats.c;h=fdcd6e1ffa34b56a44594d1089cd648e9c0ac2c4;hb=717b36dbe3f5b51e1079815b92f74feed9366015;hp=56a89428754165d6b75207586b75c7695ca5522c;hpb=f5fbf6bcfcac7e2b6df90e00f618c642539d013d;p=ppastats.git diff --git a/src/ppastats.c b/src/ppastats.c index 56a8942..fdcd6e1 100644 --- a/src/ppastats.c +++ b/src/ppastats.c @@ -46,6 +46,7 @@ static struct package_stats *get_package_stats(struct ppa_stats *stats, p->versions = NULL; p->download_count = 0; p->daily_download_totals = NULL; + p->distros = NULL; stats->packages = (struct package_stats **)list_add ((void **)stats->packages, p); @@ -81,6 +82,19 @@ static struct version_stats *get_version_stats(struct package_stats *package, return v; } +static struct distro_stats *distro_stats_new(const char *name) +{ + struct distro_stats *d; + + d = malloc(sizeof(struct distro_stats)); + d->name = strdup(name); + d->archs = NULL; + d->download_count = 0; + d->ddts = NULL; + + return d; +} + static struct distro_stats *get_distro_stats(struct version_stats *version, const char *name) { @@ -96,11 +110,7 @@ static struct distro_stats *get_distro_stats(struct version_stats *version, cur++; } - d = malloc(sizeof(struct distro_stats)); - d->name = strdup(name); - d->archs = NULL; - d->download_count = 0; - d->daily_download_totals = NULL; + d = distro_stats_new(name); version->distros = (struct distro_stats **)list_add((void **)version->distros, @@ -126,7 +136,6 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, a = malloc(sizeof(struct arch_stats)); a->name = strdup(name); - a->daily_download_totals = NULL; a->download_count = 0; distro->archs @@ -137,25 +146,102 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, } +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; +} + +static void +pkg_add_distro(struct package_stats *pkg, + const char *distro_name, + int distro_count, + struct daily_download_total **ddts) +{ + struct distro_stats **pkg_distros, *pkg_distro; + + pkg_distros = pkg->distros; + pkg_distro = NULL; + + if (pkg_distros) + while (*pkg_distros) { + if (!strcmp((*pkg_distros)->name, distro_name)) { + pkg_distro = *pkg_distros; + break; + } + + pkg_distros++; + } + + if (!pkg_distro) { + pkg_distro = distro_stats_new(distro_name); + pkg->distros + = (struct distro_stats **) + list_add((void **)pkg->distros, (void *)pkg_distro); + } + + pkg_distro->download_count += distro_count; + pkg_distro->ddts = add_totals(pkg_distro->ddts, ddts); +} + struct ppa_stats * create_ppa_stats(const char *owner, - const char *ppa, + const char *ppa_name, const char *package_status) { - struct ppa_stats *ppastats; - struct binary_package_publishing_history **history; - struct binary_package_publishing_history **h_cur; - struct binary_package_publishing_history *h; - char *ppa_url, *package_name, *package_version; - struct package_stats *package; + struct ppa_stats *ppa; + struct binary_package_publishing_history **history, **h_cur, *h; + char *ppa_url, *pkg_name, *pkg_version; + struct package_stats *pkg; struct version_stats *version; const struct distro_series *distro_series; const struct distro_arch_series *arch_series; struct distro_stats *distro; struct arch_stats *arch; int count; + struct daily_download_total **totals; - ppa_url = get_archive_url(owner, ppa); + ppa_url = get_archive_url(owner, ppa_name); history = get_binary_package_publishing_history_list(ppa_url, package_status); free(ppa_url); @@ -165,30 +251,38 @@ create_ppa_stats(const char *owner, exit(EXIT_FAILURE); } - ppastats = malloc(sizeof(struct ppa_stats)); - ppastats->name = strdup(ppa); - ppastats->owner = strdup(owner); - ppastats->packages = NULL; - ppastats->daily_download_totals = NULL; - ppastats->download_count = 0; + ppa = malloc(sizeof(struct ppa_stats)); + ppa->name = strdup(ppa_name); + ppa->owner = strdup(owner); + ppa->packages = NULL; + ppa->daily_download_totals = NULL; + ppa->download_count = 0; h_cur = history; while (*h_cur) { h = *h_cur; - package_name = h->binary_package_name; - package_version = h->binary_package_version; + totals = get_daily_download_totals(h->self_link); + count = get_download_count(h->self_link); + pkg_name = h->binary_package_name; + pkg_version = h->binary_package_version; arch_series = 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); + ppa->download_count += count; + ppa->daily_download_totals + = add_totals(ppa->daily_download_totals, totals); - package = get_package_stats(ppastats, package_name); - package->download_count += count; + pkg = get_package_stats(ppa, pkg_name); + pkg->download_count += count; + pkg->daily_download_totals + = add_totals(pkg->daily_download_totals, totals); - version = get_version_stats(package, package_version); + version = get_version_stats(pkg, pkg_version); version->download_count += count; + version->daily_download_totals + = add_totals(version->daily_download_totals, totals); distro = get_distro_stats(version, distro_series->name); distro->download_count += count; @@ -196,14 +290,16 @@ create_ppa_stats(const char *owner, arch = get_arch_stats(distro, arch_series->architecture_tag); arch->download_count += count; - ppastats->download_count += count; + pkg_add_distro(pkg, distro_series->name, count, totals); + + daily_download_total_list_free(totals); h_cur++; } binary_package_publishing_history_list_free(history); - return ppastats; + return ppa; } static void arch_stats_free(struct arch_stats *arch) @@ -279,5 +375,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); }