comparison schema/update-db.sh @ 3978:7b7c324b318f

Added database schema versioning and db update script.
author Sascha Wilde <wilde@intevation.de>
date Wed, 17 Jul 2019 12:05:06 +0200
parents
children 5396581cf203
comparison
equal deleted inserted replaced
3977:3eab3fc113b7 3978:7b7c324b318f
1 #!/bin/bash -e
2 # This is Free Software under GNU Affero General Public License v >= 3.0
3 # without warranty, see README.md and license for details.
4 #
5 # SPDX-License-Identifier: AGPL-3.0-or-later
6 # License-Filename: LICENSES/AGPL-3.0.txt
7 #
8 # Copyright (C) 2019 by via donau
9 # – Österreichische Wasserstraßen-Gesellschaft mbH
10 # Software engineering by Intevation GmbH
11 #
12 # Author(s):
13 # * Sascha Wilde <wilde@intevation.de>
14
15 ME=`basename "$0"`
16 BASEDIR=`dirname "$0"`
17
18 usage()
19 {
20 cat <<EOF
21 $ME [OPTION]...
22
23 Options:
24 -d, --db=NAME create the database NAME. Default: "gemma"
25 -p, --port=PORT connect do the postgresql cluster at PORT.
26 Default is the postgresql standard port 5432
27 --help display this help and exit
28
29 EOF
30 }
31
32 fatal()
33 {
34 echo >&2 "$1"
35 exit 23
36 }
37
38 genpw()
39 # $1 - length
40 {
41 PW=''
42 until [ "$(grep '[^[:alnum:]]' <<<$PW)" -a "$(grep '[[:digit:]]' <<<$PW)" ]
43 do
44 PW=$(dd count=1 if=/dev/urandom 2>/dev/null \
45 | tr -cd '[:alnum:],._!?-' | tail -c "$1")
46 done
47 echo "$PW"
48 }
49
50 # Defaults:
51
52 db=gemma
53 port=5432
54
55 # Parse options:
56
57 OPTS=`getopt \
58 -l help,db:,port: \
59 -o d:p: -n "$ME" -- "$@"`
60 [ $? -eq 0 ] || { usage ; exit 1 ; }
61
62 eval set -- "$OPTS"
63
64 while true ; do
65 case "$1" in
66 --db|-d)
67 db="$2"
68 shift 2
69 ;;
70 --port|-p)
71 port="$2"
72 shift 2
73 ;;
74 --help)
75 { usage ; exit 0 ; }
76 ;;
77 --)
78 shift
79 break
80 ;;
81 esac
82 done
83
84
85 get_version()
86 {
87 local ver
88 if ver=$( psql -qtA -p "$port" -d "$db" \
89 -c 'SELECT get_schema_version()' 2>/dev/null )
90 then
91 echo $ver
92 else
93 echo '-1'
94 fi
95 }
96
97 # Main ------------------------------------------------------------
98
99 current_ver=$( get_version )
100
101 for d in $BASEDIR/updates/* ; do
102 new_ver=$( basename $d )
103 if [ -d "$d" -a "$new_ver" -gt $current_ver ] ; then
104 echo "Running updates for $new_ver ..."
105
106 sql=$( cat `echo "$d/"* | sort -n` )
107 psql -q -p "$port" -d "$db" -c "$sql"
108 fi
109 done