Archive

Archives pour 09/2011

Supprimer les ressources locales 4D du Client Mac et Windows

27/09/2011 Comments off

 

4D

Pour des raisons techniques et plus précisément lors de l’utilisation de 4D Client en interprété, les ressources locales ne sont pas toujours à jour lors d’une modification de la structure par le développeur.

Pour palier à ce problème récurrent, j’ai réalisé une méthode de suppression du dossier ressources locales de la base situé dans un répertoire cache du système. Cette méthode permet de forcer la mise à jour des ressources locales lors de la connexion suivante par 4D au 4D Server.

Afin de réaliser ce processus, nous avons besoin d’executer un script terminal (.sh) sur Macintosh et d’un script batch (.bat) sous Windows.

La méthode 4D ‘ut_DeleteLocalRessources’:
[sourcecode language= »plain »]
$in:=""
$out:=""
Si (ut_IsMacintosh )
$CacheFolder:=ut_Mac2Posix (ut_ParentFolder (Dossier 4D(Dossier Resources courant)))
$ScriptFile:=ut_Mac2Posix (Dossier 4D(Dossier Resources courant))+"DeleteResLocales.sh"
$Command:="chmod +x "+$ScriptFile
LANCER PROCESS EXTERNE($Command)
Sinon
FIXER VARIABLE ENVIRONNEMENT("_4D_OPTION_BLOCKING_EXTERNAL_PROCESS";"False")
FIXER VARIABLE ENVIRONNEMENT("_4D_OPTION_HIDE_CONSOLE";"True")
$CacheFolder:=ut_ParentFolder (Dossier 4D(Dossier Resources courant))
$ScriptFile:=Dossier 4D(Dossier Resources courant)+"DeleteResLocales.bat"
Fin de si
$Command:=$ScriptFile+" "+$CacheFolder
LANCER PROCESS EXTERNE($Command)
QUITTER 4D[/sourcecode]
Cette méthode exécute donc un script .sh sur Macintosh et un .bat sous Windows, ces deux scripts étant situés dans le répertoire ressources de la base sur le 4D Server et synchronisés au lancement de 4D (Client).

Le script .sh DeleteResLocales.sh pour Macintosh :

[sourcecode language= »bash »]
#!/bin/bash

function waitquit() {
SECS_SLEEP=3
SECS_TIMEOUT=60
SECS_ELAPSED=0
SCRIPT_LOG="4dquitscriptlog.log"
rm $SCRIPT_LOG
RUNNING=`ps auxc | grep "4D"`
echo |tee -a $SCRIPT_LOG
while [[ "$RUNNING" != "" && $SECS_ELAPSED -lt $SECS_TIMEOUT ]]
do
echo "Waiting for 4D to stop"|tee -a $SCRIPT_LOG
echo "Time taken before sleep: $SECS_ELAPSED"|tee -a $SCRIPT_LOG
sleep $SECS_SLEEP
SECS_ELAPSED=$(($SECS_ELAPSED+$SECS_SLEEP))
echo "Time taken after sleep: $SECS_ELAPSED"|tee -a $SCRIPT_LOG
RUNNING=`ps auxc | grep "4D"`
done

RUNNING=`ps auxc | grep "4D"`

if [ "$RUNNING" = "" ]; then
echo "4D not running – deleting cache files at directory $CACHE_FOLDER"|tee -a $SCRIPT_LOG

rm -r "$CACHE_FOLDER"
else
echo "4D is running – can not delete cache files $CACHE_FOLDER"|tee -a $SCRIPT_LOG
fi

echo "Script finished"|tee -a $SCRIPT_LOG
}

CACHE_FOLDER=$1
if [ "$CACHE_FOLDER" != "" ]; then
waitquit&
else
echo "No cache folder passed to script"|tee -a $SCRIPT_LOG
fi

[/sourcecode]
Le script DeleteResLocales.bat pour Windows :
[sourcecode language= »bash »]
echo off
if not defined index set index=0
:maboucle
set /a index=index+1
tasklist /FI "IMAGENAME eq 4D.exe">c:\proc.txt
find /c "en service ne correspond aux" c:\proc.txt

if ERRORLEVEL=2 goto erreur
if ERRORLEVEL=1 goto Find
if ERRORLEVEL=0 goto noFind

:erreur
echo erreur
goto fin

:noFind
REM 4D pas lancé on peut y aller
goto deletecache

:Find
REM 4D non quitté on boucle.
ping -n 2 localhost
if %index% LSS 30 goto maboucle

:deletecache
REM On supprime le répertoire passé en paramètre et le fichier temporaire
rd %1% /s /q
del c:\proc.txt
:fin

[/sourcecode]

Le principe des ces scripts est assez simple, ils vérifient que le process 4D est bien quitté avant de poursuivre et de supprimer le répertoire des ressources locales.
Il doit être possible de faire plus élégant, j’ai simplement recherché l’efficacité sans trop me soucier de l’élégance.
En attendant que 4D corrige ses bugs,j’espère que cela vous sera utile.