diff --git a/sqlmig b/sqlmig index 959399d..267637e 100755 --- a/sqlmig +++ b/sqlmig @@ -98,7 +98,7 @@ OPTIONS -e, --export DESTUPDATEDIR Exporter les définitions de bases de données et mises à jour du répertoire courant vers le répertoire DESTUPDATEDIR - -u, --update + -u, --update-all Mettre à jour la base de données. C'est l'option par défaut -t, --updatedir UPDATEDIR Spécifier le répertoire qui contient les répertoires de mises à jour @@ -114,6 +114,10 @@ OPTIONS données est calculé à partir du nom du répertoire DATABASEDIR. Cette option peut être utilisée par exemple pour créer une base de test à partir des définitions d'une base de prod. + -f, --update-one UPDATE + Forcer l'application de la mise à jour spécifiée. Ne pas mettre à jour + l'état des mises à jour installées. Avec cette option, tout se passe + comme si le seul fichier existant est celui spécifié. -n, --fake Ne pas faire les mises à jour, afficher simplement ce qui serait fait @@ -421,36 +425,48 @@ function mysql_set_mysqlargs() { } MYSQL_ADMIN_CONF_DONE= function mysql_admin_update() { - local name="$1" update="$2" done - if [ -z "$MYSQL_ADMIN_CONF_DONE" ]; then - MYSQL_ADMIN_CONF_DONE=1 - mysql_tbconf + local name="$1" update="$2" updatefile="$3" done + if [ -z "$updatefile" ]; then + if [ -z "$MYSQL_ADMIN_CONF_DONE" ]; then + MYSQL_ADMIN_CONF_DONE=1 + mysql_tbconf + fi + if ! setx done=mysql_get_done "$name"; then + [ -n "$fake" ] || die + fi + [ -n "$done" ] && return fi - if ! setx done=mysql_get_done "$name"; then - [ -n "$fake" ] || die - fi - [ -n "$done" ] && return estep "$name" [ -n "$fake" ] && return - mysql_before_update || die + if [ -z "$updatefile" ]; then + mysql_before_update || die + fi cat "$update" | mysql_admin_ve || abort_on_error - mysql_after_update || die + if [ -z "$updatefile" ]; then + mysql_after_update || die + fi } function mysql_user_update() { - local name="$1" update="$2" dbname="$3" done - if ! setx done=mysql_get_done "$name" "$dbname"; then - [ -n "$fake" ] || die + local name="$1" update="$2" dbname="$3" updatefile="$4" done + if [ -z "$updatefile" ]; then + if ! setx done=mysql_get_done "$name" "$dbname"; then + [ -n "$fake" ] || die + fi + [ -n "$done" ] && return fi - [ -n "$done" ] && return estep "$name" [ -n "$fake" ] && return - mysql_before_update "$dbname" || die + if [ -z "$updatefile" ]; then + mysql_before_update "$dbname" || die + fi cat "$update" | mysql_user_ve || abort_on_error - mysql_after_update "$dbname" || die + if [ -z "$updatefile" ]; then + mysql_after_update "$dbname" || die + fi } ################################################################################ @@ -739,32 +755,44 @@ function oracle_source_userconf() { } ORACLE_ADMIN_CONF_DONE= function oracle_admin_update() { - local name="$1" update="$2" done - if [ -z "$ORACLE_ADMIN_CONF_DONE" ]; then - ORACLE_ADMIN_CONF_DONE= - oracle_tbconf + local name="$1" update="$2" updatefile="$3" done + if [ -z "$updatefile" ]; then + if [ -z "$ORACLE_ADMIN_CONF_DONE" ]; then + ORACLE_ADMIN_CONF_DONE= + oracle_tbconf + fi + setx done=oracle_get_done "$name" || die + [ -n "$done" ] && return fi - setx done=oracle_get_done "$name" || die - [ -n "$done" ] && return estep "$name" [ -n "$fake" ] && return - oracle_before_update || die + if [ -z "$updatefile" ]; then + oracle_before_update || die + fi cat "$update" | oracle_admin_ve || abort_on_error - oracle_after_update || die + if [ -z "$updatefile" ]; then + oracle_after_update || die + fi } function oracle_user_update() { - local name="$1" update="$2" dbname="$3" done - setx done=oracle_get_done "$name" "$dbname" || die - [ -n "$done" ] && return + local name="$1" update="$2" dbname="$3" updatefile="$4" done + if [ -z "$updatefile" ]; then + setx done=oracle_get_done "$name" "$dbname" || die + [ -n "$done" ] && return + fi estep "$name" [ -n "$fake" ] && return - oracle_before_update "$dbname" || die + if [ -z "$updatefile" ]; then + oracle_before_update "$dbname" || die + fi cat "$update" | oracle_user_ve || abort_on_error - oracle_after_update "$dbname" || die + if [ -z "$updatefile" ]; then + oracle_after_update "$dbname" || die + fi } ################################################################################ @@ -793,6 +821,7 @@ updatedir= exportdir= dbdir= dbname= +updatefile= force= data_csv=auto mode="$MODE" @@ -818,10 +847,11 @@ args=( --oracle type=oracle -0,--init action=init -e:,--export: '$action=export; set@ exportdir' - -u,--update action=update + -u,--update-all action=update -t:,--updatedir: updatedir= -d:,--databasedir: dbdir= -b:,--database: dbname= + -f:,--update-one: updatefile= -n,--fake fake=1 --force,--continue-on-error force=1 --no-data-csv data_csv= @@ -1028,6 +1058,8 @@ if [ -n "$dbname" -a ${#dbdirs[*]} -gt 1 ]; then die "Avec l'option -n, une seule base de données doit être spécifiée" fi +[ -n "$updatefile" ] && setx updatefile=abspath "$updatefile" + # répertoire temporaire pour Oracle OPDIR= @@ -1047,7 +1079,8 @@ if [ -n "$updatedir" ]; then for update in "${updates[@]}"; do setx name=basename "$update" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue - mysql_admin_update "$name" "$update" + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue + mysql_admin_update "$name" "$update" "$updatefile" done eend; eclearp @@ -1061,7 +1094,8 @@ if [ -n "$updatedir" ]; then for update in "${updates[@]}"; do setx name=basename "$update" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue - oracle_admin_update "$name" "$update" + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue + oracle_admin_update "$name" "$update" "$updatefile" done eend; eclearp fi @@ -1139,6 +1173,7 @@ for dbdir in "${dbdirs[@]}"; do for drop in "${drops[@]}"; do setx name=basename "$drop" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue estep "$name" [ -n "$fake" ] && continue @@ -1154,6 +1189,7 @@ for dbdir in "${dbdirs[@]}"; do for create in "${creates[@]}"; do setx name=basename "$create" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue estep "$name" [ -n "$fake" ] && continue @@ -1169,10 +1205,11 @@ for dbdir in "${dbdirs[@]}"; do for update in "${updates[@]}"; do setx name=basename "$update" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue if have_tag admin "$update"; then - mysql_admin_update "$name" "$update" + mysql_admin_update "$name" "$update" "$updatefile" else - mysql_user_update "$name" "$update" "$dbname" + mysql_user_update "$name" "$update" "$dbname" "$updatefile" fi done eend; eclearp @@ -1196,6 +1233,7 @@ for dbdir in "${dbdirs[@]}"; do for drop in "${drops[@]}"; do setx name=basename "$drop" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue estep "$name" [ -n "$fake" ] && continue @@ -1211,6 +1249,7 @@ for dbdir in "${dbdirs[@]}"; do for create in "${creates[@]}"; do setx name=basename "$create" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue estep "$name" [ -n "$fake" ] && continue @@ -1226,10 +1265,11 @@ for dbdir in "${dbdirs[@]}"; do for update in "${updates[@]}"; do setx name=basename "$update" [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue + [ -z "$updatefile" -o "$updatefile" == "$update" ] || continue if have_tag admin "$update"; then - oracle_admin_update "$name" "$update" + oracle_admin_update "$name" "$update" "$updatefile" else - oracle_user_update "$name" "$update" "$dbname" + oracle_user_update "$name" "$update" "$dbname" "$updatefile" fi done eend; eclearp