diff --git a/R/get_table_last_update.R b/R/get_table_last_update.R new file mode 100644 index 0000000000000000000000000000000000000000..4a029365e635f609302633f04c0bcb09f6dcf27c --- /dev/null +++ b/R/get_table_last_update.R @@ -0,0 +1,88 @@ +#' get_table_last_update : Récupérer la date de dernière mise à jour d'une table +#' +#' Cette fonction permet de récupérer la date de dernière mise à jour d'une table +#' +#' @param conn : connexion à la base de données. +#' @param nom_schema : nom du schéma où la table se trouve. +#' @param nom_table : nom de la table dont on souhaite récupérer la date de dernière mise à jour. +#' +#' @return +#' Si `track_commit_timestamp` est activée et qu'une date de commit est trouvée, +#' la fonction renvoie cette date. +#' Si la date de commit n'est pas trouvée et que la table existe dans `zz_r_df_def`, +#' elle renvoie la date trouvée dans le dernier commentaire posté sur la table (au format JJ/MM/AAAA). +#' Si aucune des deux sources n'est disponible, un message est retourné. +#' +#' @export +#' +#' @importFrom DBI dbGetQuery +#' @importFrom rlang .data +#' +#' #' @examples +#' conn <- datalibaba::connect_to_db(db = "base", user = "user") +#' get_table_last_update(conn, "schema", "table") + + +get_table_last_update <- function(conn, nom_schema, nom_table) { + # Vérifier si track_commit_timestamp est activée + query_pg_settings <- "SHOW track_commit_timestamp;" + track_commit_timestamp <- dbGetQuery(conn, query_pg_settings) + + # Vérification de la validité de track_commit_timestamp + if (!is.null(track_commit_timestamp) && nrow(track_commit_timestamp) > 0) { + track_commit_timestamp_value <- track_commit_timestamp$track_commit_timestamp[1] + + # Si track_commit_timestamp est activée + if (track_commit_timestamp_value == "on") { + # Requête pour obtenir la dernière date de commit de la table + query_commit_timestamp <- paste0(" + SELECT pg_xact_commit_timestamp(t.xmin) AS modified_timestamp + FROM ", nom_schema, ".", nom_table, " t + ORDER BY modified_timestamp DESC NULLS LAST + LIMIT 1;") + + # Exécuter la requête + result <- dbGetQuery(conn, query_commit_timestamp) + + # Vérifier si un résultat a été retourné + if (nrow(result) > 0) { + return(result$modified_timestamp[1]) # Retourne la dernière date de commit + } else { + # Si pas de résultat, vérifier dans zz_r_df_def + query_check_table <- paste0(" + SELECT commentaire + FROM ", nom_schema, ".zz_r_df_def + WHERE table_nm = '", nom_table, "' + ORDER BY date_postee DESC + LIMIT 1;") + + comment_result <- dbGetQuery(conn, query_check_table) + + # Vérifier si un commentaire a été trouvé + if (nrow(comment_result) > 0) { + # Extraire la dernière ligne de commentaire + comment_text <- comment_result$commentaire[1] + + # Chercher la date dans le commentaire + date_pattern <- "\\d{2}/\\d{2}/\\d{4}" # Expression régulière pour la date au format JJ/MM/AAAA + + # Extraire la date avec l'expression régulière + date_match <- regmatches(comment_text, regexpr(date_pattern, comment_text)) + + if (length(date_match) > 0) { + return(date_match) # Retourne la date extraite du commentaire + } else { + return("Le commentaire ne contient pas de date valide.") # Si la date n'est pas au bon format + } + } else { + return("Aucun commentaire trouvé pour la table dans zz_r_df_def.") # Si aucun commentaire n'est trouvé + } + } + } else { + return("L'option track_commit_timestamp est désactivée.") # Option désactivée + } + } else { + return("track_commit_timestamp n'a pas retourné de résultat valide.") # Erreur de récupération des paramètres + } +} +