Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 828 | Rev 882 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

# Ce Makefile effectue les substitutions de nom de base de données
# nécessaire au préalable de l'application des scripts SQL

# Cela est d'un part moins complexe:
# - qu'un script PHP (interpréteur, getopt, framework, ...)
# - qu'un shell-script (lancement avec make)
# et d'autre part plus maintenable qu'un shell-script car
# le versionnage des fichiers (inc ".current") permet certaines facilités.


# TODO:
# idéalement, ce Makefile devrait permettre une bonne gestion du jeu de dépendances
# entre les scripts, seulement le lancement d'un script pouvant nécessiter un login/mdp
# il est difficile de vouloir rester "simple".
# Ce serait cependant la meilleure manière de procéder, ainsi "maj2" ne serait lancé qu'en
# cas de succès de "maj1", celui-ci pouvant être détecté comme "déjà exécuté" ou non.
# cf target "maj1" ci-dessous


# à l'aide de, note certains de ces fichiers n'ont pas cours dans le cadre de la maj1 (juillet/août 2013)
# echo $(egrep -l 'BASE(SOURCE|EDIT|ANNUAIRE)' *.sql)
fichiers = cel_references.sql dedup-ordre-201307.sql fix-utilisateur-32.sql maj-cleanup-201307.sql maj-nom-ret.sql \
                   maj-referentiel-201307.sql maj-referentiel-und-201307.sql maj-struct-201307.sql redempteur.sql \
                   referonosaure.sql \
                   .current

# la base de données à modifier
alterdb ?= tb_cel_test

# pour bdtfx, bdtxa, isfan, nvjfl, nva, baseflor, ... lecture seule;
# utilisée pour actualiser les enregistrements de cel_obs dans referonosaure.sql
sourcedb ?= tb_eflore

# pour annuaire_tela, lecture seule;
# utilisée pour initialiser cel_utilisateurs dans maj-struct-201307.sql
annuairedb ?= tela_prod_v4

bdtfx ?= 1_01
bdtxa ?= 1_00
bdtfx_table = bdtfx_v$(bdtfx)
bdtxa_table = bdtxa_v$(bdtxa)

# macro utilisable pour les targets nécessitant de tester la présence d'un couple (base,table)
# exemples:
# * $(call is_table,tb_eflore,bdtfx_v1_01)
# * $(call is_table,$(annuairedb),annuaire_tela)
# argument 1: base de données
# argument 2: table
is_table = @mysql -N $(1) <<<"DESC $(2)" &> /dev/null

# macro utilisable pour effectuer des substitutions:
do_subst = sed -e 's/`BASEEDIT`/`$(alterdb)`/g' \
                   -e 's/`BASEANNUAIRE`/`$(annuairedb)`/g' \
                   -e 's/`BASESOURCE`/`$(sourcedb)`/g' \
                   -e 's/TABLEBDTFX/`$(bdtfx_table)`/g' \
                   -e 's/TABLEBDTXA/`$(bdtxa_table)`/g' \
                   $(1)

# génère les fichiers avec les bases de données souhaitées
compile: reset
        @sed -i -e 's/`BASEEDIT`/`$(alterdb)`/g'  \
                   -e 's/`BASEANNUAIRE`/`$(annuairedb)`/g'  \
                   -e 's/`BASESOURCE`/`$(sourcedb)`/g'  \
                   -e 's/TABLEBDTFX/`$(bdtfx_table)`/g'  \
                   -e 's/TABLEBDTXA/`$(bdtxa_table)`/g'  \
                   $(fichiers)
        @printf "Attention: les changements s'appliqueront sur la base \"%s\"\nLes sources utilisées seront: annuaire=\"%s\" ,  sources=\"%s\" (%s,%s)\n(Ctrl+C pour interrompre, Enter pour continuer)\n" \
                        `grep ^BASEEDIT .current|cut -d '\`' -f2` \
                        `grep ^BASEANNUAIRE .current|cut -d '\`' -f2` \
                        `grep ^BASESOURCE .current|cut -d '\`' -f2` \
                        `grep ^TABLE_BDTFX .current|cut -d '=' -f2` \
                        `grep ^TABLE_BDTXA .current|cut -d '=' -f2`
        @read

reset:
        svn revert -q $(fichiers)

# supprime les fichiers "compilés" (concaténation de plusieurs scripts SQL substitués)
clean:
        rm -f *.comp.sql

help:
        @echo "make [alterdb=<tb_cel_test>] [sourcedb=<tb_eflore>] [annuairedb=<tela_prod_v4>] [bdtfx=<1_01>] [bdtxa=<1_00>]"


### mises à jour

# mise à jour de juillet/août 2013
# spécifier dans les targets l'ordre (cf A_LIRE.txt)
# attention, si un prérequis ne génère pas de SQL, cela n'empêchera pas le fichier
# final de maj d'être généré (bien, 
maj1: compile cel_references maj-struct-201307 maj-cleanup-201307 fix-utilisateur-32 dedup-ordre-201307
        @echo done

o_maj1: fichiers_generes = $(addsuffix .comp.sql,$(filter-out clean,$?))
o_maj1: clean o_cel_references o_maj-struct-201307 o_maj-cleanup-201307 o_fix-utilisateur-32 o_dedup-ordre-201307
        cat $(fichiers_generes) > maj1.comp.sql
        @echo done

### fin: mises à jour


### tools

check_cel_obs:
        $(call is_table,$(alterdb),cel_obs)

### fin: tools


### mises à jour individuelles (scripts)
### pour chacun d'entre-eux, deux versions existent,
### 1) L'un compile (après substitution des noms dans le fichier SQL original)
### et pipe vers mysql directement, ce qui suppose aussi un .my.cnf ou autre
### 2) L'autre (préfixé par o_), renvoie le fichier substitué en sortie standard
### et le target principal s'occupe de concaténer et de créer un fichier de destination
### Cette méthode est de loin préférable
cel_references:
        $(call is_table,$(sourcedb),$(bdtfx_table))
        $(call is_table,$(alterdb),cel_references) || mysql < cel_references.sql
o_cel_references:
        $(call is_table,$(sourcedb),$(bdtfx_table))
        $(call is_table,$(alterdb),cel_references) || $(call do_subst,cel_references.sql) > $@.comp.sql

maj-struct-201307: check_cel_obs
        $(call is_table,$(annuairedb),annuaire_tela)
        @mysql -N $(alterdb) <<<"DESC cel_obs nom_sel"|grep -q 601 || mysql < maj-struct-201307.sql
o_maj-struct-201307: check_cel_obs
        $(call is_table,$(annuairedb),annuaire_tela)
        @mysql -N $(alterdb) <<<"DESC cel_obs nom_sel"|grep -q 601 || $(call do_subst,maj-struct-201307.sql) > $@.comp.sql

maj-cleanup-201307: check_cel_obs
        @ ! mysql -N $(alterdb) <<<"SELECT 1 FROM cel_obs WHERE date_observation = '0000-00-00 00:00:00' LIMIT 1"|grep -q 1 || mysql < maj-cleanup-201307.sql
o_maj-cleanup-201307:
        @ ! mysql -N $(alterdb) <<<"SELECT 1 FROM cel_obs WHERE date_observation = '0000-00-00 00:00:00' LIMIT 1"|grep -q 1 || $(call do_subst,maj-cleanup-201307.sql) > $@.comp.sql

fix-utilisateur-32: check_cel_obs
        @mysql -N $(alterdb) <<<"DESC cel_obs ce_utilisateur"|grep -q 255 || mysql < fix-utilisateur-32.sql
o_fix-utilisateur-32: check_cel_obs
        @mysql -N $(alterdb) <<<"DESC cel_obs ce_utilisateur"|grep -q 255 || $(call do_subst,fix-utilisateur-32.sql) > $@.comp.sql

dedup-ordre-201307: check_cel_obs
#@mysql -N $(alterdb) <<<'SELECT distinct ce_utilisateur FROM `cel_obs` GROUP BY ce_utilisateur, ordre HAVING COUNT(*) > 1'|grep -q . || mysql < dedup-ordre-201307.sql
        @mysql -N $(alterdb) <<<"SHOW INDEX FROM cel_obs"|grep -q couple_user_ordre || mysql < dedup-ordre-201307.sql
o_dedup-ordre-201307: check_cel_obs
        @mysql -N $(alterdb) <<<"SHOW INDEX FROM cel_obs"|grep -q couple_user_ordre || $(call do_subst,dedup-ordre-201307.sql) > $@.comp.sql




# pour une prochaine maj
maj-nom-ret:
        @mysql -N <<<'SELECT count(1) FROM `$(alterdb)`.`cel_obs` c LEFT JOIN `$(sourcedb)`.`$(bdtfx_table)` b on (c.nom_ret = b.nom_sci) WHERE nom_ret_nn = 0 AND c.nom_ret != "" AND id_observation NOT IN ( SELECT id_observation FROM `$(alterdb)`.`cel_obs` c, `$(sourcedb)`.`$(bdtfx_table)` b WHERE c.nom_ret = b.nom_sci AND c.nom_ret_nn = 0 );'|grep -q 0