static struct daily_download_total **add_total
(struct daily_download_total **totals, struct daily_download_total *total)
{
- struct daily_download_total **cur, **result;
- struct daily_download_total *item;
+ struct daily_download_total **cur, **result, *item;
if (totals) {
cur = totals;
}
}
- item = malloc(sizeof(struct daily_download_total));
- memcpy(item, total, sizeof(struct daily_download_total));
-
- result = (struct daily_download_total **)
- list_add((void **)totals, (void *)item);
-
- free(totals);
+ 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++;
}
struct daily_download_total **ddts)
{
struct distro_stats **pkg_distros, *pkg_distro, **tmp;
+ struct daily_download_total **tmp_ddts;
pkg_distros = pkg->distros;
pkg_distro = NULL;
if (!pkg_distro) {
pkg_distro = distro_stats_new(distro_name);
- tmp
- = (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;
}
struct ppa_stats *
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);
= 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;
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;
}
free(package->versions);
}
-
+ distro_stats_list_free(package->distros);
free(package->name);
free(package);
}