/** * Generate CSV on partial fields for the following modules: * OS, BROWSERS, REFERRERS, REFERRING_SITES, KEYPHRASES, STATUS_CODES */ static void print_csv_generic (FILE * fp, const GHolder * h, int process) { char *data; const char *id = NULL; float percent; int i, idx, hits; if (h->module == BROWSERS) id = BROWS_ID; else if (h->module == OS) id = OPERA_ID; else if (h->module == REFERRERS) id = REFER_ID; else if (h->module == REFERRING_SITES) id = SITES_ID; else if (h->module == KEYPHRASES) id = KEYPH_ID; else if (h->module == STATUS_CODES) id = CODES_ID; #ifdef HAVE_LIBGEOIP else if (h->module == GEO_LOCATION) id = GEOLO_ID; #endif for (i = 0, idx = 0; i < h->idx; i++, idx++) { hits = h->items[i].hits; data = h->items[i].data; percent = get_percentage (process, hits); percent = percent < 0 ? 0 : percent; fprintf (fp, "\"%d\",", idx); /* idx */ fprintf (fp, ","); /* parent idx */ fprintf (fp, "\"%s\",", id); fprintf (fp, "\"%d\",", hits); fprintf (fp, "\"%4.2f%%\",", percent); fprintf (fp, "\""); escape_cvs_output (fp, data); fprintf (fp, "\","); fprintf (fp, "\r\n"); /* parent idx */ if (h->module == OS || h->module == BROWSERS || h->module == STATUS_CODES #ifdef HAVE_LIBGEOIP || h->module == GEO_LOCATION #endif ) print_csv_sub_items (fp, h->items[i].sub_list, process, id, &idx); } }
/* Output first-level items. */ static void print_csv_data (FILE * fp, GHolder * h, int valid) { GMetrics *nmetrics; int i; for (i = 0; i < h->idx; i++) { set_data_metrics (h->items[i].metrics, &nmetrics, valid); fprintf (fp, "\"%d\",", i); /* idx */ fprintf (fp, ","); /* no parent */ fprintf (fp, "\"%s\",", module_to_id (h->module)); fprintf (fp, "\"%d\",", nmetrics->hits); fprintf (fp, "\"%d\",", nmetrics->visitors); fprintf (fp, "\"%4.2f%%\",", nmetrics->percent); if (conf.bandwidth) fprintf (fp, "\"%lld\",", (long long) nmetrics->bw.nbw); if (conf.serve_usecs) { fprintf (fp, "\"%lld\",", (long long) nmetrics->avgts.nts); fprintf (fp, "\"%lld\",", (long long) nmetrics->cumts.nts); fprintf (fp, "\"%lld\",", (long long) nmetrics->maxts.nts); } if (conf.append_method && nmetrics->method) fprintf (fp, "\"%s\"", nmetrics->method); fprintf (fp, ","); if (conf.append_protocol && nmetrics->protocol) fprintf (fp, "\"%s\"", nmetrics->protocol); fprintf (fp, ","); fprintf (fp, "\""); escape_cvs_output (fp, nmetrics->data); fprintf (fp, "\"\r\n"); if (h->sub_items_size) print_csv_sub_items (fp, h, i, valid); free (nmetrics); } }
/* Output first-level items. * * On success, outputs item value. */ static void print_csv_data (FILE * fp, GHolder * h, GPercTotals totals) { GMetrics *nmetrics; int i; for (i = 0; i < h->idx; i++) { set_data_metrics (h->items[i].metrics, &nmetrics, totals); fprintf (fp, "\"%d\",", i); /* idx */ fprintf (fp, ","); /* no parent */ fprintf (fp, "\"%s\",", module_to_id (h->module)); /* output metrics */ print_csv_metric_block (fp, nmetrics); if (h->sub_items_size) print_csv_sub_items (fp, h, i, totals); free (nmetrics); } }