From 7db79d70a76bfe7a614117bb202526303139c8a9 Mon Sep 17 00:00:00 2001
From: lisasmah <lisa.smah@developpemnt-durable.gouv.fr>
Date: Thu, 6 Mar 2025 10:47:44 +0100
Subject: [PATCH] =?UTF-8?q?#29=20Ajout=20de=20fonction=20"get=5Ftable=5Fla?=
 =?UTF-8?q?st=5Fupdate"=20qui=20r=C3=A9cup=C3=A8re=20la=20date=20de=20mise?=
 =?UTF-8?q?=20=C3=A0=20jour=20d'une=20table?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 R/get_table_last_update.R | 88 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)
 create mode 100644 R/get_table_last_update.R

diff --git a/R/get_table_last_update.R b/R/get_table_last_update.R
new file mode 100644
index 0000000..4a02936
--- /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
+  }
+}
+
-- 
GitLab