Vérifier données

Deux méthodes pour parer à la (très) mauvaise surprise d’une vérification des données qui signale qu’un 4DD est en vrac depuis dieu sait quand. La première lance la vérification, la seconde est sa “call back”, i.e. méthode appelée régulièrement pendant la vérification lancée par la 1ère… J’ai pris l’option la plus simple : tout vérifier. Je lance cette vérification quotidiennement, avant une sauvegarde où la durée de vérification n’est pas gênante pour les enfants.

J’ai un doute et une question, du coup. Je détermine qu’il y a problème à signaler si je vois passer dans la callback les type message 3 ou 5 (erreurs et avertissements, respectivement). La callback semble être appelée toutes les 1 ou 2 secondes. Est-ce qu’un problème peut être loupé par la callback du fait qu’il se produirait entre deux appels à la callback ? En d’autres termes, ai-je fait un mauvais choix de me fier à la callback et ne devrais-je pas regarder uniquement le log de vérification ?

<code 4D>
//DD_verifierDonnees
//vérifie le fichier de données courant avec
// VÉRIFIER FICHIER DONNÉES OUVERT/ VERIFY CURRENT DATA FILE

$quoiVerifier_l:=Vérifier enregistrements //4
Si (Faux) //autres options, autres constantes…
$quoiVerifier_l:=Tout vérifier //0 ou 16
$quoiVerifier_l:=Vérifier index //8
Fin de si

//options de vérification
$option_l:=Nom historique avec date heure //262144 (2^18)

//méthode callback
Si (Faux)
DD_verifierDonnees_cb //appel masqué
Fin de si
$methodeCallBack_t:=“DD_verifierDonnees_cb”
C_OBJET(DD_verification_o) //DDD
//variable utilisée par la méthode callback pour
// progression, stop, retour d’erreurs & warnings
EFFACER VARIABLE(DD_verification_o) //doit être vide au départ
DD_verification_o:=Créer objet(“debut”;Chaîne(Date du jour;ISO date GMT;Heure courante))

VÉRIFIER FICHIER DONNÉES OUVERT($quoiVerifier_l;$option_l;$methodeCallBack_t)

DD_verification_o.fin:=Chaîne(Date du jour;ISO date GMT;Heure courante)
$cheminHisto_t:=""
$alerter_b:=Faux
Si (ok=0) //la vérification n’a pu se faire
Si (Bool(DD_verification_o.progress)) //Vrai si 1 = stop utilisateur
//rien
Sinon
DD_verification_o.retour:=“Vérification échouée (méthode callback inexistante ?)”
$alerter_b:=Vrai
Fin de si
Sinon //la vérif est allée à terme
DD_verification_o.cheminLog:=document
Si (DD_verification_o.avertissements#Null) | (DD_verification_o.erreurs#Null)
$alerter_b:=Vrai
Fin de si
Fin de si

Si ($alerter_b)
$dest_t:="zeVigile@maBaseEstNaze.com"
$sujet_t:=Nom méthode courante+" - PROBLEME"
$corps_t:=“Obj :\r+++++++++++++++++\r”+JSON Stringify(DD_verification_o;*)
TABLEAU TEXTE($PJ_at;0)
AJOUTER À TABLEAU($PJ_at;DD_verification_o.cheminLog)
Mail_envoyer ($dest_t;$sujet_t;$corps_t;->$PJ_at)
Sinon
SUPPRIMER DOCUMENT(DD_verification_o.cheminLog) //pas besoin de le garder
Fin de si

EFFACER VARIABLE(DD_verification_o) //DDD
//_
</code 4D>
<code 4D>
//DD_verifierDonnees_cb
//méthode call back de DD_verifierDonnees
// qui lance une vérification complète des données

//$0 :
// • 0, l’opération continue normalement
// • -128, l’opération est stoppée sans erreur générée
// • autre valeur, l’opération est stoppée et la valeur
// passée dans $0 est retournée en tant que numéro d’erreur
// qui peut être interceptée par appeler sur erreur
//$1 Entier long Type de message (cf. tableau)
//$2 Entier long Type d’objet
//$3 Texte Message
//$4 Entier long Numéro de table
//$5 Entier long Réservé

C_ENTIER LONG($0)
C_ENTIER LONG($1)
C_ENTIER LONG($2)
C_TEXTE($3)
C_ENTIER LONG($4)
C_ENTIER LONG($5)

C_ENTIER LONG($retour_l)
C_ENTIER LONG($typeMsg_l)
C_ENTIER LONG($typeObjet_l)
C_TEXTE($msg_t)
C_ENTIER LONG($table_l)

C_TEXTE($toLog_t)
//_
$retour_l:=0 //défaut = continuer la vérification
$typeMsg_l:=$1
$typeObjet_l:=$2 //type de l’objet vérifié (table, index, etc.)
$msg_t:=$3
$table_l:=$4

$toLog_t:=""

Au cas ou
: ($typeMsg_l=1) //Message, affiché tel quel par la progression
//Message * 1 * 0 * Message de progression * Pourcentage réalisé (0-100)
$stop_l:=0
$pourcent_l:=$table_l //dans ce contexte, pourcentage de progression dans l’objet analysé
Si (DD_verification_o.progress=Null) //la vérif vient de commencer, démarrer la progression
$canCancel_b:=Vrai
DD_verification_o.progress:=UI_progressStart (-1;"";“Vérification des données”;$canCancel_b) //lancer progress
Sinon
Au cas ou
: (Windows Alt enfoncée) //pour debug…
Fin de cas
$stop_l:=UI_progressUpdate (DD_verification_o.progress;Num_percent ($pourcent_l;1;100);$msg_t)
Fin de si
Si ($stop_l=1) //stop utilisateur
UI_progressEnd (DD_verification_o.progress) //arrêt progress
$retour_l:=-128 //stopper la vérification
DD_verification_o.retour:=“Vérification stoppée par l’utilisateur”
Fin de si

: ($typeMsg_l=2)  //Vérification terminée
	  //Vérification terminée * 2 * Type d'objet * Texte du message OK * Numéro de table ou d'index * Réservé
	  //Cet événement n'est jamais renvoyé lorsque le mode de vérification est Tout vérifier. 
	  //Il n'est utilisé qu'en mode Vérifier enregistrements ou Vérifier index.
	  //Note Arnaud : ne se produit jamais en contexte appelant
	  //  de demande de vérification complète (option "Tout vérifier")
	
: ($typeMsg_l=3)  //Erreur
	  //Erreur * 3 * Type d'objet(**) * Texte du message d'erreur * Numéro de table ou d'index * Réservé
	$toLog_t:="erreurs"
	DD_verification_o.erreurs.push(Créer objet("typeObj";$typeObjet_l;"nomTypeObj";$nomTypeObj_t;"msg";$msg_t))
	
: ($typeMsg_l=4)  //Fin d'exécution vérif complète
	  //Fin d'exécution * 4 * 0 * DONE * 0 * Réservé
	  //lorsque $4 = 0 pour $1 = 2, 3 ou 5,
	  // le message ne concerne pas une table
	  // mais le fichier de données dans son ensemble.
	UI_progressEnd (DD_verification_o.progress)  //arrêt progress
	
: ($typeMsg_l=5)  //Warning
	  //Warning * 5 * Type d'objet(**) * Texte du message d'erreur * Numéro de table ou d'index * Réservé
	$toLog_t:="avertissements"

Fin de cas

Si ($toLog_t#"")
$refObj_l:=$table_l
Au cas ou
: ($typeObjet_l=0) //0 = indéterminé
$nomTypeObj_t:=“indéterminé”
: ($typeObjet_l=4) //4 = enregistrement
$nomTypeObj_t:=“enregistrement”
: ($typeObjet_l=8) //8 = index
$nomTypeObj_t:=“index”
: ($typeObjet_l=16) //16 = objet structure (contrôle préliminaire du fichier de données)
$nomTypeObj_t:=“objet structure”
Sinon
$nomTypeObj_t:=“inattendu”
Fin de cas

Si (DD_verification_o[$toLog_t]=Null)
	DD_verification_o[$toLog_t]:=Créer collection
Fin de si 
DD_verification_o[$toLog_t].push(Créer objet("typeObj";$typeObjet_l;"nomTypeObj";$nomTypeObj_t;"msg";$msg_t))

Fin de si

$0:=$retour_l
//_
</code 4D>

PS : la pustule “_cb” signifie “callback” :mrgreen: