X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fppastats.c;h=754cf4e1aa76bab377e8f4f302770dcdd06370bd;hb=46db2198db02ed75562dd331d68ddbbbb1f1cff4;hp=4232e5341765f75371b9e72e21f1479d638b2549;hpb=b59ec44bffce28192c6408fed838c4d593a17c82;p=ppastats.git diff --git a/src/ppastats.c b/src/ppastats.c index 4232e53..754cf4e 100644 --- a/src/ppastats.c +++ b/src/ppastats.c @@ -25,15 +25,15 @@ #include #include "list.h" -#include "log.h" #include "lp_ws.h" +#include #include "ppastats.h" static struct package_stats *get_package_stats(struct ppa_stats *stats, const char *name) { - struct package_stats *p, **p_cur; + struct package_stats *p, **p_cur, **tmp; p_cur = stats->packages; while (p_cur && *p_cur) { @@ -52,8 +52,10 @@ static struct package_stats *get_package_stats(struct ppa_stats *stats, p->daily_download_totals = NULL; p->distros = NULL; - stats->packages = (struct package_stats **)list_add + tmp = (struct package_stats **)list_add ((void **)stats->packages, p); + free(stats->packages); + stats->packages = tmp; return p; } @@ -61,7 +63,7 @@ static struct package_stats *get_package_stats(struct ppa_stats *stats, static struct version_stats *get_version_stats(struct package_stats *package, const char *version) { - struct version_stats *v, **cur; + struct version_stats *v, **cur, **tmp; cur = package->versions; while (cur && *cur) { @@ -79,9 +81,10 @@ static struct version_stats *get_version_stats(struct package_stats *package, v->download_count = 0; v->daily_download_totals = NULL; - package->versions - = (struct version_stats **)list_add((void **)package->versions, - v); + tmp = (struct version_stats **)list_add((void **)package->versions, + v); + free((void **)package->versions); + package->versions = tmp; return v; } @@ -104,6 +107,7 @@ static struct distro_stats *get_distro_stats(struct version_stats *version, { struct distro_stats **cur = version->distros; struct distro_stats *d; + struct distro_stats **tmp; while (cur && *cur) { d = *cur; @@ -116,9 +120,11 @@ static struct distro_stats *get_distro_stats(struct version_stats *version, d = distro_stats_new(name); - version->distros - = (struct distro_stats **)list_add((void **)version->distros, + + tmp = (struct distro_stats **)list_add((void **)version->distros, d); + free(version->distros); + version->distros = tmp; return d; } @@ -128,6 +134,7 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, { struct arch_stats **cur = distro->archs; struct arch_stats *a; + struct arch_stats **tmp; while (cur && *cur) { a = *cur; @@ -142,9 +149,10 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, a->name = strdup(name); a->download_count = 0; - distro->archs - = (struct arch_stats **)list_add((void **)distro->archs, - a); + tmp = (struct arch_stats **)list_add((void **)distro->archs, + a); + free((void **)distro->archs); + distro->archs = tmp; return a; } @@ -153,8 +161,7 @@ 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; + struct daily_download_total **cur, **result, *item; if (totals) { cur = totals; @@ -172,24 +179,23 @@ static struct daily_download_total **add_total } } - 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); + result = (struct daily_download_total **)list_add((void **)totals, + ddt_clone(total)); + return result; } -struct daily_download_total **add_totals +static 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; + struct daily_download_total **cur, **result, **tmp; result = total1; cur = total2; while (*cur) { - result = add_total(result, *cur); - + tmp = add_total(result, *cur); + if (result != total1 && result != tmp) + free(result); + result = tmp; cur++; } @@ -202,7 +208,8 @@ pkg_add_distro(struct package_stats *pkg, int distro_count, struct daily_download_total **ddts) { - struct distro_stats **pkg_distros, *pkg_distro; + struct distro_stats **pkg_distros, *pkg_distro, **tmp; + struct daily_download_total **tmp_ddts; pkg_distros = pkg->distros; pkg_distro = NULL; @@ -219,13 +226,32 @@ pkg_add_distro(struct package_stats *pkg, if (!pkg_distro) { pkg_distro = distro_stats_new(distro_name); - pkg->distros - = (struct distro_stats **) - list_add((void **)pkg->distros, (void *)pkg_distro); + tmp = (struct distro_stats **)list_add((void **)pkg->distros, + (void *)pkg_distro); + free(pkg->distros); + pkg->distros = tmp; } pkg_distro->download_count += distro_count; - pkg_distro->ddts = add_totals(pkg_distro->ddts, ddts); + + tmp_ddts = add_totals(pkg_distro->ddts, ddts); + if (pkg_distro->ddts && pkg_distro->ddts != tmp_ddts) + free(pkg_distro->ddts); + pkg_distro->ddts = tmp_ddts; +} + +static struct ppa_stats *ppa_stats_new(const char *owner, const char *ppa_name) +{ + struct ppa_stats *ppa; + + 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; + + return ppa; } struct ppa_stats * @@ -244,7 +270,7 @@ create_ppa_stats(const char *owner, struct distro_stats *distro; struct arch_stats *arch; int count; - struct daily_download_total **totals; + struct daily_download_total **totals, **tmp; ppa_url = get_archive_url(owner, ppa_name); history = get_bpph_list(ppa_url, package_status, ws_size); @@ -255,12 +281,7 @@ create_ppa_stats(const char *owner, exit(EXIT_FAILURE); } - 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; + ppa = ppa_stats_new(owner, ppa_name); for (h_cur = history; *h_cur; ++h_cur) { h = *h_cur; @@ -270,12 +291,7 @@ create_ppa_stats(const char *owner, h->self_link); continue; } - count = get_download_count(h->self_link); - if (count == -1) { - log_err(_("Failed to retrieve download count for %s"), - h->self_link); - count = 0; - } + count = ddts_get_count(totals); pkg_name = h->binary_package_name; pkg_version = h->binary_package_version; arch_series @@ -284,18 +300,24 @@ create_ppa_stats(const char *owner, = get_distro_series(arch_series->distroseries_link); ppa->download_count += count; - ppa->daily_download_totals - = add_totals(ppa->daily_download_totals, totals); + tmp = add_totals(ppa->daily_download_totals, totals); + if (ppa->daily_download_totals != tmp) + free(ppa->daily_download_totals); + ppa->daily_download_totals = tmp; pkg = get_package_stats(ppa, pkg_name); pkg->download_count += count; - pkg->daily_download_totals - = add_totals(pkg->daily_download_totals, totals); + tmp = add_totals(pkg->daily_download_totals, totals); + if (pkg->daily_download_totals != tmp) + free(pkg->daily_download_totals); + pkg->daily_download_totals = tmp; version = get_version_stats(pkg, pkg_version); version->download_count += count; - version->daily_download_totals - = add_totals(version->daily_download_totals, totals); + tmp = add_totals(version->daily_download_totals, totals); + if (version->daily_download_totals != tmp) + free(version->daily_download_totals); + version->daily_download_totals = tmp; distro = get_distro_stats(version, distro_series->name); distro->download_count += count; @@ -332,10 +354,22 @@ static void distro_stats_free(struct distro_stats *distro) free(distro->archs); } + daily_download_total_list_free(distro->ddts); + free(distro->name); free(distro); } +static void distro_stats_list_free(struct distro_stats **distros) +{ + if (distros) { + while (*distros) { + distro_stats_free(*distros); + distros++; + } + } +} + static void version_stats_free(struct version_stats *version) { struct distro_stats **distros; @@ -349,6 +383,8 @@ static void version_stats_free(struct version_stats *version) free(version->distros); } + daily_download_total_list_free(version->daily_download_totals); + free(version->version); free(version); } @@ -365,7 +401,8 @@ static void package_stats_free(struct package_stats *package) } free(package->versions); } - + distro_stats_list_free(package->distros); + daily_download_total_list_free(package->daily_download_totals); free(package->name); free(package); }