Commit b7879492 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Merge branch 'migration_postgres'

parents 94927c26 ae5602c3
Loading
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -11,5 +11,3 @@
# temporaire (pour la branche migration_postgres)
bin/aaa.sh
data/db/
 No newline at end of file
docker/
migration/
 No newline at end of file

bin/.gitignore

0 → 100644
+1 −0
Original line number Diff line number Diff line
aaa.sh
 No newline at end of file

bin/database/README.md

0 → 100644
+57 −0
Original line number Diff line number Diff line
# Base de données : génération de la doc d'installation

Ce README s'adresse au développeur souhaitant générer les scripts de création d'une base de données PostgreSQL
toute neuve *à partir d'une base de données modèle existante*.

## Génération des fichiers

Le script shell [`./build_db_install_files.sh`](build_db_install_files.sh) génère dans un répertoire de votre choix :
  - un répertoire [`sql/`](sql) contenant un ensemble de scripts SQL ordonnés permettant de créer une base de 
    données toute neuve :
    - [01_create_db_user.sql`](sql/01_create_db_user.sql)
    - [02_create_schema.sql`](sql/02_create_schema.sql)
    - [03_insert_bootstrap_data.sql`](sql/03_insert_bootstrap_data.sql)
    - [04_insert_data.sql`](sql/04_insert_data.sql)
    - [05_prepare_data.sql`](sql/05_prepare_data.sql)
    - [06_create_constraints.sql`](sql/06_create_constraints.sql)
    - [07_create_comue.sql.dist`](sql/07_create_comue.sql.dist)
    - [08_init.sql.dist`](sql/08_init.sql.dist)
    - [09_create_fixture.sql.dist`](sql/09_create_fixture.sql.dist)
  - un script bash et un fichier de config pour "préparer" les scripts SQL ayant l'extension `.sql.dist` :    
    - [`build_db_files.conf.dist`](build_db_files.conf.dist)
    - [`build_db_files.sh`](build_db_files.sh)
  - un fichier expliquant comment procéder pour créer la base de données à l'aide de tous ces scripts :
    - [`README.md`](README.md)

Ce script [`./build_db_install_files.sh`](build_db_install_files.sh) :
  - se base sur les fichers `.template.*` situés dans le répertoire [`src/`](src) ;
  - charge le fichier de config [`./conf/build_db_install_files.conf`](confuild_db_install_files.conf)
    dans lequel sont spécifiés les paramètres de génération.

Le script prend en argument le chemin d'un fichier de config et le chemin du répertoire où doivent être générés 
les fichiers.

Voici un exemple pour générer les fichiers de création d'une base de données...
  - dans le répertoire destination `./build`,
  - à partir de la base modèle `sygal` (spécifiée par les variables d'env `PGDATABASE`, etc.),
  - qui permettront de créer une base et un utilisateur spécifiés dans le fichier de config
    `./build_db_install_files.conf ` :
```bash
PGDATABASE='sygal' \
PGUSER='user' \
PGHOST='host.domain.fr' \
PGPORT=5432 \
PGPASSWORD='xxxxxx' \
./build_db_install_files.sh -c ./conf/build_db_install_files.conf -o ./build
```

La façon de procéder pour créer une base de données à partir des fichiers générés est expliquée dans le fichier 
`README.md` (lui aussi généré).

## Copie des fichiers générés

Copier les fichiers générés vers le répertoire contenant la documentation :

```bash
cp -r ./build/* ../../doc/database/
```
+208 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
set -e

#
# Script de génération des fichiers permettant de créer une base de données pour SyGAL.
#

usage() {
  echo "Usage :"
  echo "    $(basename $0) ARGUMENTS"
  echo "Arguments :"
  echo "    -c CONFIG_FILE Chemin du fichier de config. Obligatoire."
  echo "    -o OUTPUT_DIR  Chemin du répertoire où seront générés les scripts SQL. Obligatoire."
  exit 0
}

if [[ ${#} -eq 0 ]]; then
  usage
fi

while getopts ":c:o:" arg; do
  case "${arg}" in
  c)
    CONFIG_FILE="${OPTARG}"
    ;;
  o)
    OUTPUT_DIR="${OPTARG}"
    ;;
  ?)
    echo "Option invalide : -${OPTARG}."
    echo
    usage
    ;;
  esac
done

[[ -z "$CONFIG_FILE" ]] && echo ":-( Un fichier de config doit être spécifié en argument." && usage && exit 1
[[ -z "$OUTPUT_DIR" ]] && echo ":-( Un répertoire de destination doit être spécifié en argument." && usage && exit 1

mkdir -p $OUTPUT_DIR

[[ ! -f "$CONFIG_FILE" ]] && echo "Le fichier de config $CONFIG_FILE est introuvable" && exit 1
[[ ! -z "$(ls -A $OUTPUT_DIR)" ]] && echo "Le répertoire de destination $OUTPUT_DIR doit être vide" && exit 1

[[ -z $PGHOST ]] && echo "Vous devez faire un 'export PGHOST=xxxx'." && exit 1
[[ -z $PGPORT ]] && echo "Vous devez faire un 'export PGPORT=xxxx'." && exit 1
[[ -z $PGDATABASE ]] && echo "Vous devez faire un 'export PGDATABASE=xxxx'." && exit 1
[[ -z $PGUSER ]] && echo "Vous devez faire un 'export PGUSER=xxxx'." && exit 1
[[ -z $PGPASSWORD ]] && echo "Vous devez faire un 'export PGPASSWORD=xxxx'." && exit 1

# Chargement des variables de config :
#   DBNAME
#   DBUSER
source ${CONFIG_FILE}

THIS_DIR=$(cd $(dirname $0) && pwd)
OUTPUT_DIR=$(realpath "$OUTPUT_DIR")

echo "Base de données modèle :"
echo "  PGHOST=$PGHOST"
echo "  PGPORT=$PGPORT"
echo "  PGDATABASE=$PGDATABASE"
echo "  PGUSER=$PGUSER"
echo "Fichier de config chargé : $(realpath ${CONFIG_FILE})"
echo "Génération des fichiers permettant de créer la base de données '$DBNAME' et l'utilisateur '$DBUSER'..."

function replacePgDatabaseAndUserInScript() {
  FILE=$1
  # NB : d'abord le nom de la base puis le user
#  sed -i -e "s|$PGDATABASE|${DBNAME}|g" $FILE
  sed -i -e "s|OWNER TO $PGUSER|OWNER TO ${DBUSER}|g" $FILE
  sed -i -e "s|Owner: $PGUSER|Owner: ${DBUSER}|g" $FILE
}
function injectConfParamsInScript() {
  FILE=$1
  sed -i -e "s|{DBNAME}|${DBNAME}|g" $FILE
  sed -i -e "s|{DBUSER}|${DBUSER}|g" $FILE
}
function prepareScript() {
  FILE=$1
  #sed -i -e 's/public\.//g' $FILE  # suppression du nom de schém "public"
  sed -i -e 's/FOR EACH ROW EXECUTE FUNCTION/FOR EACH ROW EXECUTE PROCEDURE/g' $FILE  # 9.x compatible
}

#=========================================================================#

#
# README.md
#
OUTPUT_FILE=$OUTPUT_DIR/README.md
SRC_SCRIPT=$THIS_DIR/src/README.template.md
cp $SRC_SCRIPT $OUTPUT_FILE
injectConfParamsInScript $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# build_db_files.sh
#
OUTPUT_FILE=$OUTPUT_DIR/build_db_files.sh
SRC_SCRIPT=$THIS_DIR/src/build_db_files.template.sh
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# build_db_files.conf.dist
#
OUTPUT_FILE=$OUTPUT_DIR/build_db_files.conf.dist
SRC_SCRIPT=$THIS_DIR/src/build_db_files.template.conf.dist
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#=========================================================================#

NAME_CLEAR_DB='clear_db'
NAME_CREATE_DB_USER='create_db_user'
NAME_CREATE_SCHEMA='create_schema'
NAME_INSERT_BOOTSTRAP_DATA='insert_bootstrap_data'
NAME_INSERT_DATA='insert_data'
NAME_PREPARE_DATA='prepare_data'
NAME_CREATE_COMUE='create_comue'
NAME_INIT='init'
NAME_CREATE_FIXTURE='create_fixture'
NAME_CREATE_CONSTRAINTS='create_constraints'

mkdir -p $OUTPUT_DIR/sql

##
## clearing
##
#OUTPUT_FILE=$OUTPUT_DIR/sql/$NAME_CLEAR_DB.sql
#SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_CLEAR_DB.gen.sql
#psql --tuples-only --output $OUTPUT_FILE <$SRC_SCRIPT
#echo "> $OUTPUT_FILE"

#
# db and user
#
OUTPUT_FILE=$OUTPUT_DIR/sql/01_$NAME_CREATE_DB_USER.sql
SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_CREATE_DB_USER.template.sql
cp $SRC_SCRIPT $OUTPUT_FILE
injectConfParamsInScript $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# schema objects
#
OUTPUT_FILE=$OUTPUT_DIR/sql/02_$NAME_CREATE_SCHEMA.sql
pg_dump --section=pre-data --schema-only --exclude-table 'MV_INDICATEUR*' >$OUTPUT_FILE
replacePgDatabaseAndUserInScript $OUTPUT_FILE
#prepareScript $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# bootstrap data
#
OUTPUT_FILE=$OUTPUT_DIR/sql/03_$NAME_INSERT_BOOTSTRAP_DATA.sql
SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_INSERT_BOOTSTRAP_DATA.template.sql
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# data
#
OUTPUT_FILE=$OUTPUT_DIR/sql/04_$NAME_INSERT_DATA.sql
PATTERN='categorie_privilege|domaine_scientifique|import_observ|information_langue|nature_fichier|notif|privilege|profil|profil_privilege|soutenance_configuration|soutenance_etat|soutenance_qualite|type_rapport|type_structure|type_validation|version_fichier|wf_etape'
pg_dump --data-only --column-inserts --table="($PATTERN)" >$OUTPUT_FILE
replacePgDatabaseAndUserInScript $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# prepare data
#
OUTPUT_FILE=$OUTPUT_DIR/sql/05_$NAME_PREPARE_DATA.sql
SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_PREPARE_DATA.sql
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# constraints
#
OUTPUT_FILE=$OUTPUT_DIR/sql/06_$NAME_CREATE_CONSTRAINTS.sql
pg_dump --section=post-data --schema-only >$OUTPUT_FILE
replacePgDatabaseAndUserInScript $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# COMUE
#
OUTPUT_FILE=$OUTPUT_DIR/sql/07_$NAME_CREATE_COMUE.sql.dist
SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_CREATE_COMUE.template.sql
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# init
#
OUTPUT_FILE=$OUTPUT_DIR/sql/08_$NAME_INIT.sql.dist
SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_INIT.template.sql
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"

#
# fixtures
#
OUTPUT_FILE=$OUTPUT_DIR/sql/09_$NAME_CREATE_FIXTURE.sql.dist
SRC_SCRIPT=$THIS_DIR/src/sql/$NAME_CREATE_FIXTURE.template.sql
cp $SRC_SCRIPT $OUTPUT_FILE
echo "> $OUTPUT_FILE"
+8 −0
Original line number Diff line number Diff line
#===========================================#
# Config pour la génération des scripts SQL
#     de création d'une BDD pour SyGAL
#===========================================#

#========= Base de données à créer =========#
DBNAME='sygal'                              # Nom de la database que les scripts créeront
DBUSER='ad_sygal'                           # Nom du user que les scripts créeront
Loading