# 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 (septembre 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 isfan ?= 2013 bdtfx_table = bdtfx_v$(bdtfx) bdtxa_table = bdtxa_v$(bdtxa) isfan_table = isfan_v$(isfan) # TODO: simply override bdd_user ifdef bdd_user bdd_user_h = -u$(bdd_user) endif ifneq ($(origin bdd_pass), undefined) bdd_pass_h = "-p$(bdd_pass)" endif mysqlbin ?= mysql mysqlcmd = $(mysqlbin) $(bdd_user_h) $(bdd_pass_h) # 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 = $(mysqlcmd) -N $(1) <<<"DESC $(2)" &> /dev/null # macro utilisable pour effectuer des substitutions: do_subst = sed -e "1i--\n-- fichier d'origine: \"${1}\"\n" \ -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' \ -e 's/`TABLEISFAN`/`$(isfan_table)`/g' \ -e 's/TABLEBDTFX/`$(bdtfx_table)`/g' \ -e 's/TABLEBDTXA/`$(bdtxa_table)`/g' \ -e 's/TABLEISFAN/`$(isfan_table)`/g' \ $(1) # default target help: @echo "make [alterdb=<$(alterdb)>] [sourcedb=<$(sourcedb)>] [annuairedb=<$(annuairedb)>] [bdtfx=<$(bdtfx)>] [bdtxa=<$(bdtxa)>] [isfan=$(isfan)] [bdd_user=\"\"] [bdd_pass=\"\"] [mysqlbin=mysql]" @echo "make o_maj1 mysqlbin=/usr/local/mysql/bin/mysql bdd_user=telabotap bdd_pass=XXX" # 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' \ -e 's/`TABLEISFAN`/`$(isfan_table)`/g' \ $(fichiers) printf "Attention: les changements s'appliqueront sur la base \"%s\"\nLes sources utilisées seront: annuaire=\"%s\" , sources=\"%s\" (%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` \ `grep ^TABLE_ISFAN .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 ### mises à jour # mise à jour de septembre 2013 # spécifier les targets dans l'ordre (cf A_LIRE.txt) # première version: substitution des fichiers: pas bon # 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é, #maj1: compile cel_references maj-struct-201307 maj-cleanup-201307 fix-utilisateur-32 dedup-ordre-201307 maj-referentiel-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 o_maj-referentiel-201307 o_referonosaure 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 et conforme à la philosophie Makefile cel_references: $(call is_table,$(sourcedb),$(bdtfx_table)) $(call is_table,$(sourcedb),nvjfl_v2007) $(call is_table,$(sourcedb),nva_index_v2_03) $(call is_table,$(alterdb),cel_references) || $(mysqlcmd) < cel_references.sql o_cel_references: $(call is_table,$(sourcedb),$(bdtfx_table)) $(call is_table,$(sourcedb),nvjfl_v2007) $(call is_table,$(sourcedb),nva_index_v2_03) $(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) $(mysqlcmd) -N $(alterdb) <<<"DESC cel_obs nom_sel"|grep -q 601 || $(mysqlcmd) < maj-struct-201307.sql o_maj-struct-201307: check_cel_obs $(call is_table,$(annuairedb),annuaire_tela) $(mysqlcmd) -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 ! $(mysqlcmd) -N $(alterdb) <<<"SELECT 1 FROM cel_obs WHERE nom_ret = 'null' LIMIT 1"|grep -q 1 || $(mysqlcmd) < maj-cleanup-201307.sql o_maj-cleanup-201307: # tb_cel_test clean ! $(mysqlcmd) -N $(alterdb) <<<"SELECT 1 FROM cel_obs WHERE nom_ret = 'null' LIMIT 1"|grep -q 1 || $(call do_subst,maj-cleanup-201307.sql) > $@.comp.sql fix-utilisateur-32: check_cel_obs $(mysqlcmd) -N $(alterdb) <<<"DESC cel_obs ce_utilisateur"|grep -q 255 || $(mysqlcmd) < fix-utilisateur-32.sql o_fix-utilisateur-32: check_cel_obs $(mysqlcmd) -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 #$(mysqlcmd) -N $(alterdb) <<<'SELECT distinct ce_utilisateur FROM `cel_obs` GROUP BY ce_utilisateur, ordre HAVING COUNT(*) > 1'|grep -q . || $(mysqlcmd) < dedup-ordre-201307.sql $(mysqlcmd) -N $(alterdb) <<<"SHOW INDEX FROM cel_obs"|grep -q couple_user_ordre || $(mysqlcmd) < dedup-ordre-201307.sql o_dedup-ordre-201307: check_cel_obs # l'index doit sur cel_obs doit avoir deux lignes dont le champs "non_unique" = 0 $(mysqlcmd) -N $(alterdb) <<<"SHOW INDEX FROM cel_obs"|grep -w id_obs|awk '{print $$2}'|tr -d "\n"|grep -q 00 || $(call do_subst,dedup-ordre-201307.sql) > $@.comp.sql # maj-referentiel-201307.sql: # pas de test aisé et rapide # doit passer APRÈS o_maj-cleanup-201307 (pas de nom_ret_nn = 0) o_maj-referentiel-201307: check_cel_obs $(call do_subst,maj-referentiel-201307.sql) > $@.comp.sql # pas de test aisé non plus pour savoir s'il doit repasser # néanmoins c'est un script sur (peut-être invoqué répétivement) o_referonosaure: check_cel_obs $(call do_subst,referonosaure.sql) > $@.comp.sql # pour une prochaine maj maj-nom-ret: $(mysqlcmd) -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 o_maj-nom-ret: $(call do_subst,maj-nom-ret.sql) > $@.comp.sql