|
1 | | -#!/bin/sh |
| 1 | +#!/bin/bash |
2 | 2 | # @configure_input@ |
3 | 3 |
|
4 | 4 | # This script allows one to perform DOMjudge database setup actions. |
@@ -52,32 +52,47 @@ not have to pass any of the options above. |
52 | 52 | EOF |
53 | 53 | } |
54 | 54 |
|
| 55 | +urlencode() |
| 56 | +{ |
| 57 | + php -r "echo rawurlencode('$1');" |
| 58 | +} |
| 59 | + |
| 60 | +# This is global variable to be able to return the output from |
| 61 | +# mysql_options() below as an array, which is not possible otherwise. |
| 62 | +declare -a _mysql_options |
| 63 | + |
55 | 64 | mysql_options() |
56 | 65 | { |
57 | 66 | local user pass |
| 67 | + _mysql_options=() |
58 | 68 |
|
59 | 69 | # shellcheck disable=SC2153 |
60 | 70 | if [ -n "$DBUSER" ]; then |
61 | | - user="-u $DBUSER" |
62 | | - else |
63 | | - user="${DBA_USER:+-u ${DBA_USER}}" |
| 71 | + _mysql_options+=('-u' "$DBUSER") |
| 72 | + elif [ -n "$DBA_USER" ]; then |
| 73 | + _mysql_options+=('-u' "$DBA_USER") |
64 | 74 | fi |
65 | 75 | # shellcheck disable=SC2153 |
66 | 76 | if [ -n "$PASSWD" ]; then |
67 | | - pass="-p$PASSWD" |
68 | | - else |
69 | | - [ -n "$PROMPT_PASSWD" ] && pass="-p" |
70 | | - [ -n "$DBA_PASSWD" ] && pass="-p$DBA_PASSWD" |
| 77 | + _mysql_options+=("-p$PASSWD") |
| 78 | + elif [ -n "$DBA_PASSWD" ]; then |
| 79 | + _mysql_options+=("-p$DBA_PASSWD") |
| 80 | + elif [ -n "$PROMPT_PASSWD" ]; then |
| 81 | + _mysql_options+=('-p') |
71 | 82 | fi |
72 | 83 |
|
73 | | - [ -z "$USE_SOCKET" ] && port="-P$DBPORT" |
74 | | - echo $user ${pass:+"$pass"} -h "$DBHOST" ${port:+"$port"} |
| 84 | + _mysql_options+=('-h' "$DBHOST") |
| 85 | + |
| 86 | + if [ -z "$USE_SOCKET" ]; then |
| 87 | + _mysql_options+=("-P$DBPORT") |
| 88 | + fi |
75 | 89 | } |
76 | 90 |
|
77 | 91 | # Wrapper around mysql command to allow setting options, user, etc. |
78 | 92 | mysql() |
79 | 93 | { |
80 | | - command mysql $(mysql_options) --silent --skip-column-names "$@" |
| 94 | + mysql_options |
| 95 | + command mysql "${_mysql_options[@]}" --silent --skip-column-names "$@" |
81 | 96 | } |
82 | 97 |
|
83 | 98 | # Quick shell hack to get a key from an INI file. |
@@ -128,10 +143,13 @@ symfony_console() |
128 | 143 | fi |
129 | 144 |
|
130 | 145 | if [ -n "$DBA_USER" ]; then |
| 146 | + user=$(urlencode "${DBA_USER}") |
| 147 | + host=$(urlencode "${domjudge_DBHOST}") |
| 148 | + db=$(urlencode "${domjudge_DBNAME}") |
131 | 149 | if [ -n "$DBA_PASSWD" ]; then |
132 | | - DATABASE_URL=mysql://${DBA_USER}:${DBA_PASSWD}@${domjudge_DBHOST}:${domjudge_DBPORT}/${domjudge_DBNAME} |
| 150 | + DATABASE_URL="mysql://$user:$(urlencode "${DBA_PASSWD}")@$host:${domjudge_DBPORT}/$db" |
133 | 151 | else |
134 | | - DATABASE_URL=mysql://${DBA_USER}@${domjudge_DBHOST}:${domjudge_DBPORT}/${domjudge_DBNAME} |
| 152 | + DATABASE_URL="mysql://$user@$host:${domjudge_DBPORT}/$db" |
135 | 153 | fi |
136 | 154 | fi |
137 | 155 | fi |
|
0 commit comments