From 2729bab439fb69285e85d86c72bc63ce3401778a Mon Sep 17 00:00:00 2001 From: Silvio <16336508-silvioaissi43@users.noreply.replit.com> Date: Thu, 18 Sep 2025 20:39:13 +0000 Subject: [PATCH] =?UTF-8?q?Ajout=20des=20fonctions=20factoris=C3=A9es=20et?= =?UTF-8?q?=20complexit=C3=A9e=20r=C3=A9duite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stats_ameliorer.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 stats_ameliorer.c diff --git a/stats_ameliorer.c b/stats_ameliorer.c new file mode 100644 index 0000000..e1237d9 --- /dev/null +++ b/stats_ameliorer.c @@ -0,0 +1,197 @@ +/* Version améliorée de stats.c */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/utils.h" +#include "../include/stats.h" +#include "../include/db-sqlite.h" + + +// Structure pour les statistiques +typedef struct { + double mean, max, min; + int nb_high, nb_loss, nb_ping; +} PingStats; + + +// Ouverture du fichier log (complexité : 1) +static FILE* open_ping_log_file() { + return fopen("/var/log/ping-report/last-ping.log", "r"); +} + +// Compilation de la regex (complexité : 3) +static regex_t* compile_ping_regex() { + regex_t* p_reg = malloc(sizeof(*p_reg)); + if (p_reg == NULL) return NULL; + + if (regcomp(p_reg, "time=(.*) ms", REG_EXTENDED) != 0) { + free(p_reg); + return NULL; + } + + return p_reg; +} + +// Extraction de la valeur ping (complexité : 2) +static char* extract_ping_value(char* line, regmatch_t* pmatch) { + int start = pmatch[1].rm_so; + int end = pmatch[1].rm_eo; + size_t size_ping = end - start; + + char* ping = malloc(size_ping + 2); + if (ping == NULL) return NULL; + + strncpy(ping, &line[start], size_ping); + ping[size_ping] = '\n'; + ping[size_ping + 1] = '\0'; + + return ping; +} + +// Extraction du ping depuis le fichier (complexité : 3) +static char* extract_ping_from_file(FILE* fd, regex_t* regex) { + char* read_line = NULL; + size_t n = 0; + regmatch_t pmatch[2]; + + while (getline(&read_line, &n, fd) != -1) { + if (read_line == NULL) break; + + if (regexec(regex, read_line, 2, pmatch, 0) == 0) { + char* ping = extract_ping_value(read_line, pmatch); + free(read_line); + return ping; + } + free(read_line); + read_line = NULL; + n = 0; + } + + if (read_line != NULL) free(read_line); + return NULL; +} + +// Nettoyage des ressources regex (complexité : 2) +static void cleanup_regex_resources(regex_t* regex) { + if (regex != NULL) { + regfree(regex); + free(regex); + } +} + +// Complexité : 3 (au lieu de 14) +char* get_ping_from_temp_log() { + FILE* fd = open_ping_log_file(); + if (fd == NULL) return NULL; + + regex_t* regex = compile_ping_regex(); + if (regex == NULL) { + fclose(fd); + return NULL; + } + + char* ping = extract_ping_from_file(fd, regex); + + cleanup_regex_resources(regex); + fclose(fd); + + return ping; +} + + +// Mise à jour des statistiques (complexité : 4) +static void update_ping_statistics(double ping, PingStats* stats, double* sum) { + stats->nb_ping++; + + if (ping > stats->max) stats->max = ping; + if (ping < stats->min) stats->min = ping; + if (ping > 100.0) stats->nb_high++; + + *sum += ping; +} + +// Traitement d'une ligne de ping (complexité : 3) +static void process_ping_line(char* line, PingStats* stats, double* sum) { + if (strcmp(line, "LOSS") == 0) { + stats->nb_loss++; + } else { + double ping = strtod(line, NULL); + if (ping >= 0.1) { + update_ping_statistics(ping, stats, sum); + } + } +} + +// Calcul des statistiques (complexité : 2) +static PingStats calculate_ping_statistics(FILE* fd) { + PingStats stats = {0.0, 0.0, 100.0, 0, 0, 0}; + double sum = 0.0; + char* read_line = NULL; + size_t n = 0; + + while (getline(&read_line, &n, fd) != -1) { + if (read_line == NULL) break; + + process_ping_line(read_line, &stats, &sum); + + free(read_line); + read_line = NULL; + n = 0; + } + + if (read_line != NULL) free(read_line); + + if (stats.nb_ping > 0) { + stats.mean = sum / stats.nb_ping; + } + + return stats; +} + +// Complexité : 3 (au lieu de 12) +void set_stats_ping() { + FILE* fd = fopen("/var/log/ping-report/all-ping.log", "r"); + if (fd == NULL) { + perror("stats : "); + return; + } + + PingStats stats = calculate_ping_statistics(fd); + fclose(fd); + + if (stats.nb_ping > 0) { + insert_hourly_report(stats.mean, stats.max, stats.min, + stats.nb_high, stats.nb_loss, stats.nb_ping); + } +} + +// Complexité : 4 (déjà acceptable) +void write_ping_log(char* new_ping) { + FILE* fd = fopen("/var/log/ping-report/all-ping.log", "a+"); + + if (fd != NULL) { + if (new_ping == NULL) { + new_ping = malloc(5 * sizeof(char)); + if (new_ping == NULL) { + fclose(fd); + return; + } + snprintf(new_ping, 5, "LOSS"); + } + fwrite(new_ping, sizeof(char), strlen(new_ping), fd); + fclose(fd); + } else { + perror("write ping : "); + } + + free(new_ping); +} +