From e50e2182c0e423e63238c6b50d1d381c6c48948e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <henrik@trineo.org>
Date: Wed, 25 Mar 2020 16:00:18 +0100
Subject: [PATCH] ENH: building mysql arguments is now a function

---
 config.defaults                  |  3 ---
 make_db                          | 44 +++++++++++++++-----------------
 makefile                         | 17 ++++++------
 patches/patch20151022-0/patch.sh |  2 +-
 utils/backup.sh                  |  2 +-
 utils/helpers.sh                 | 32 ++++++++++++++++++++---
 utils/load_settings.sh           | 43 ++++++-------------------------
 utils/patch_header.sh            |  3 ++-
 8 files changed, 70 insertions(+), 76 deletions(-)

diff --git a/config.defaults b/config.defaults
index a07b908..bd669cb 100644
--- a/config.defaults
+++ b/config.defaults
@@ -55,6 +55,3 @@ DATABASE_USER_PW=random1234
 # wildcard for all hosts, so `192.168.0.%` permits logins from the local
 # network.
 DATABASE_USER_HOST_LIST=localhost,
-
-# path to utility scripts
-UTILSPATH=`realpath "utils"`
diff --git a/make_db b/make_db
index bb92bfc..0ff4537 100755
--- a/make_db
+++ b/make_db
@@ -24,21 +24,18 @@
 
 INSTALL_SQL_FILE="db_2_0.sql"
 
-source utils/load_settings.sh
-source .config || true
+if [ -z "$UTILSPATH" ]; then
+	UTILSPATH="$(realpath $(dirname $0))/utils"
+	export UTILSPATH
+fi
 
-# To fail fast, but beware https://mywiki.wooledge.org/BashFAQ/105
-set -e
+source $UTILSPATH/load_settings.sh
+source $UTILSPATH/helpers.sh
 
-if [ -z $LOGIN_PATH ] ; then
-    MYSQL_CONNECTION="--host=${MYSQL_HOST} --port=${MYSQL_PORT}
- --user=${MYSQL_USER}
- --password=${MYSQL_USER_PASSWORD}"
-else
-    MYSQL_CONNECTION="--login-path=$LOGIN_PATH"
-fi
+echo "no1 $MYSQL_HOST"
+INSTALL_SQL_FILE="db_2_0.sql"
 
-SQL="$MYSQL_CMD $MYSQL_CONNECTION"
+set -e
 
 function fail() {
   echo "Some error occured, exiting."
@@ -66,7 +63,7 @@ function _execute_tests () {
     for tfile in $TESTS ; do
         echo "Running $tfile"
         echo "----- $tfile -----" >> .TEST_RESULTS
-        cat $tfile | $SQL --disable-pager --batch --raw --skip-column-names --unbuffered >> .TEST_RESULTS
+		cat $tfile | $MYSQL_CMD $(get_con_args_nodb) --disable-pager --batch --raw --skip-column-names --unbuffered >> .TEST_RESULTS
     done;
 
     popd
@@ -87,7 +84,7 @@ function _install_unit_test_database () {
         fi
     fi
 
-    sed "s/db_2_0/$DATABASE_NAME/g" "$INSTALL_SQL_FILE" | $SQL
+    sed "s/db_2_0/$DATABASE_NAME/g" "$INSTALL_SQL_FILE" | $MYSQL_CMD $(get_con_args_nodb)
 
     # crate test user
     grant
@@ -111,7 +108,7 @@ function _setup_mytap() {
     pushd libs > /dev/null
     unzip -u mytap*.zip > /dev/null
     pushd mytap*/ > /dev/null
-    $SQL < mytap.sql > /dev/null || exit 1
+    $MYSQL_CMD $(get_con_args_nodb) < mytap.sql > /dev/null || exit 1
     popd > /dev/null
     rm -r mytap*/
     popd > /dev/null
@@ -146,17 +143,18 @@ Call 'make drop-$DATABASE_NAME' to delete that database or reconfigure with
         exit 0
     fi
 
-	  sed "s/db_2_0/$DATABASE_NAME/g" "$INSTALL_SQL_FILE" | $SQL
+	  sed "s/db_2_0/$DATABASE_NAME/g" "$INSTALL_SQL_FILE" | $MYSQL_CMD $(get_con_args_nodb)
 }
 
 # Inserts the dump (arg 1) into the database
 function restore_db() {
     SQL_FILE="$1"
-    $SQL -D "$DATABASE_NAME" < "$SQL_FILE"
+    $MYSQL_CMD $(get_con_args) < "$SQL_FILE"
 }
 
 function test-connection() {
-    $SQL -e "select 0;"
+	echo $SQL
+	$MYSQL_CMD $(get_con_args_nodb) -e "select 0;"
 }
 
 # Creates a user and grants it sufficient rights.
@@ -180,7 +178,7 @@ function grant() {
     if [[ "$1" == "--strict" ]] ; then
         for host in ${DATABASE_USER_HOST_LIST//,/ } ; do
             CMD="SELECT COUNT(*) FROM mysql.user WHERE user='${DATABASE_USER}' AND host='${host}';"
-		        [[ $($SQL -s -N -e "$CMD") == 0 ]] || {
+		        [[ $($MYSQL_CMD $(get_con_args_nodb) -s -N -e "$CMD") == 0 ]] || {
                 echo "The user '${DATABASE_USER}@${host}' is already in the database."
                 echo "Please use another user or delete it, e.g. with"
                 echo "'mysql -u ${MYSQL_USER} -p -e \"DROP USER ${DATABASE_USER}@${host};\"'"
@@ -191,7 +189,7 @@ function grant() {
 
     for host in ${DATABASE_USER_HOST_LIST//,/ } ; do
         echo "Granting admin privileges to '$DATABASE_USER'@'$host'"
-        $SQL <<EOF
+        $MYSQL_CMD $(get_con_args_nodb) <<EOF
 CREATE USER IF NOT EXISTS
     '$DATABASE_USER'@'$host' identified by '$DATABASE_USER_PW';
 GRANT USAGE ON *.* TO '$DATABASE_USER'@'$host';
@@ -206,16 +204,16 @@ EOF
 function drop() {
     DROPDB="$1"
     for host in ${DATABASE_USER_HOST_LIST//,/ } ; do
-        $SQL -e "DROP USER '${DATABASE_USER}'@'${host}';" || true
+        $MYSQL_CMD $(get_con_args_nodb) -e "DROP USER '${DATABASE_USER}'@'${host}';" || true
     done
-    "$MYSQLADMIN_CMD" $MYSQL_CONNECTION -f drop "$DROPDB"
+    "$MYSQLADMIN_CMD" $(get_con_args_nodb) -f drop "$DROPDB"
 }
 
 
 # Returns 0 or non-zero, depending on whether the database exists already.
 # Optional parameter: [DATABASE_NAME], else $DATABASE_NAME is used.
 function _db_exists() {
-    $SQL -D "${1-${DATABASE_NAME}}" -e "show tables;" > /dev/null 2>&1 \
+    $MYSQL_CMD $(get_con_args_nodb) -D "${1-${DATABASE_NAME}}" -e "show tables;" > /dev/null 2>&1 \
         && return 0 || return 1
 }
 
diff --git a/makefile b/makefile
index f08e739..50b6858 100644
--- a/makefile
+++ b/makefile
@@ -22,15 +22,16 @@
 #
 SHELL=/bin/bash
 
-include .config
-
 INSTALL_SQL_FILE=db_2_0.sql
-ifdef LOGIN_PATH
-	M_MYSQL_CONNECTION=--login-path=$(M_LOGIN_PATH)
-else
-	MYSQL_CONNECTION=--host="$(MYSQL_HOST)" --port="$(MYSQL_PORT)"	\
-		--user="$(MYSQL_USER)" --password="$(MYSQL_USER_PASSWORD)"
-endif
+
+
+# TODO can this be removed?
+#ifdef LOGIN_PATH
+#	M_MYSQL_CONNECTION=--login-path=$(M_LOGIN_PATH)
+#else
+#	MYSQL_CONNECTION=--host="$(MYSQL_HOST)" --port="$(MYSQL_PORT)"	\
+#		--user="$(MYSQL_USER)" --password="$(MYSQL_USER_PASSWORD)"
+#endif
 
 .PHONY: test-connection
 test-connection:
diff --git a/patches/patch20151022-0/patch.sh b/patches/patch20151022-0/patch.sh
index 7952afe..43bc753 100755
--- a/patches/patch20151022-0/patch.sh
+++ b/patches/patch20151022-0/patch.sh
@@ -35,7 +35,7 @@ fi
 check_version $OLD_VERSION
 
 function addIdx {
-    $MYSQL_CMD $MYSQL_CONNECTION -D $DATABASE -e "ALTER TABLE $1 ADD COLUMN pidx TINYINT UNSIGNED NOT NULL DEFAULT 0;"
+    $MYSQL_CMD $(get_con_args) -e "ALTER TABLE $1 ADD COLUMN pidx TINYINT UNSIGNED NOT NULL DEFAULT 0;"
 }
 
 addIdx "reference_data"
diff --git a/utils/backup.sh b/utils/backup.sh
index d041d57..64455cf 100755
--- a/utils/backup.sh
+++ b/utils/backup.sh
@@ -75,7 +75,7 @@ function backup() {
 		    failure "dumpfile already exists."
 	  fi
     echo "Dumping database $NARG_NAME to $NARG_FILE ... "
-	  $MYSQLDUMP_CMD $MYSQL_CONNECTION_NO_DB $* --opt --default-character-set=utf8 --routines \
+	  $MYSQLDUMP_CMD $(get_con_args_no_db) $* --opt --default-character-set=utf8 --routines \
                     "$NARG_NAME" > "$NARG_FILE"
 
     if [[ "$YAML" == "true" ]] ; then
diff --git a/utils/helpers.sh b/utils/helpers.sh
index ff93750..cbe6d23 100644
--- a/utils/helpers.sh
+++ b/utils/helpers.sh
@@ -19,14 +19,14 @@
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
 function dump_table {
-    $MYSQLDUMP_CMD $MYSQL_CONNECTION_NO_DB $DATABASE_NAME $1 \
+	$MYSQLDUMP_CMD $(get_con_args_nodb) $DATABASE_NAME $1 \
                     > ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql
 }
 
 function mysql_execute {
 	set +e
-	echo $MYSQL_CMD $MYSQL_CONNECTION -e "$1"
-	$MYSQL_CMD $MYSQL_CONNECTION -e "$1"
+	echo $MYSQL_CMD $(get_con_args) -e "$1"
+	$MYSQL_CMD $(get_con_args) -e "$1"
 	ret=${PIPESTATUS[0]}
 	if [ "$ret" -ne 0 ]; then
 		failure "MYSQL ERROR"
@@ -34,8 +34,32 @@ function mysql_execute {
 	set -e
 }
 
+function get_con_args {
+	echo "$(get_con_args_nodb) --database=$DATABASE_NAME"
+}
+
+function get_con_args_nodb {
+	if [ "$LOGIN_PATH" ]; then
+		mysql_con_arguments="--login-path=$LOGIN_PATH"
+		mysql_con_arguments="$mysql_con_arguments"
+	else
+		if [ "$DATABASE_USER" ]; then
+			mysql_con_arguments="--user=$DATABASE_USER"
+		fi
+		if [ "$DATABASE_USER_PW" ]; then
+			mysql_con_arguments="$mysql_con_arguments --password=$DATABASE_USER_PW"
+		fi
+		if [[ "$MYSQL_HOST" && ( "$MYSQL_HOST" != "localhost" ) ]]; then
+			mysql_con_arguments="$mysql_con_arguments --host=$MYSQL_HOST"
+			if [ "$MYSQL_PORT" ]; then
+				mysql_con_arguments="$mysql_con_arguments --port=$MYSQL_PORT"
+			fi
+		fi
+	fi
+	echo $mysql_con_arguments
+}
 function redo_table {
-	  $MYSQL_CMD $MYSQL_CONNECTION < ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql
+	$MYSQL_CMD $(get_con_args) < ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql
 }
 
 function success {
diff --git a/utils/load_settings.sh b/utils/load_settings.sh
index 2feaeb4..4c36b37 100644
--- a/utils/load_settings.sh
+++ b/utils/load_settings.sh
@@ -22,42 +22,15 @@
 [[ -n ".config" ]] && source ".config"
 [[ -n "$ENV_FILE" ]] && source "$ENV_FILE"
 
-if [[ -z "$DATABASE_NAME" && -z "$MYSQL_CONNECTION" ]]
-then
- echo "A database or a mysql connection need to be set via the corresponding" \
- "environment variables."
- exit 1
-fi
-
-if [ "$LOGIN_PATH" ]; then
-  MYSQL_CONNECTION="--login-path=$LOGIN_PATH"
-  MYSQL_CONNECTION_NO_DB="$MYSQL_CONNECTION"
-  MYSQL_CONNECTION="$MYSQL_CONNECTION --database=$DATABASE_NAME"
-
-elif [[ -z "$MYSQL_CONNECTION" ]]; then
-  MYSQL_CONNECTION=""
-  if [ "$DATABASE_USER" ]
-  then
-    MYSQL_CONNECTION="--user=$DATABASE_USER"
-  fi
-  if [ "$DATABASE_USER_PW" ]
-  then
-    MYSQL_CONNECTION="$MYSQL_CONNECTION --password=$DATABASE_USER_PW"
-  fi
-  if [[ "$MYSQL_HOST" && ( "$MYSQL_HOST" != "localhost" ) ]]; then
-      MYSQL_CONNECTION="$MYSQL_CONNECTION --host=$MYSQL_HOST"
-      if [ "$MYSQL_PORT" ]; then
-          MYSQL_CONNECTION="$MYSQL_CONNECTION --port=$MYSQL_PORT"
-      fi
-  fi
-  # This option should come last, so we also have one version without the database
-  MYSQL_CONNECTION_NO_DB="$MYSQL_CONNECTION"
-  MYSQL_CONNECTION="$MYSQL_CONNECTION --database=$DATABASE_NAME"
-fi
-
 export MYSQL_CMD
 export MYSQLDUMP_CMD
-export MYSQL_CONNECTION
-export MYSQL_CONNECTION_NO_DB
+export MYSQLADMIN_CMD
+export MYSQL_CONFIG_EDITOR_CMD
+export MYSQL_HOST
+export MYSQL_PORT
+export MYSQL_USER
 export DATABASE_NAME
+export DATABASE_USER
+export DATABASE_USER_PW
+export DATABASE_USER_HOST_LIST
 export UTILSPATH
diff --git a/utils/patch_header.sh b/utils/patch_header.sh
index 5a4039f..c0ce98f 100644
--- a/utils/patch_header.sh
+++ b/utils/patch_header.sh
@@ -25,6 +25,7 @@
 
 # load useful functions #######################################################
 . $UTILSPATH/helpers.sh
+echo $(get_con_args)
 
 USAGE="$1 [ --env=ENV_FILE ] [ --patch=PATCH ] [ --backupdir=BACKUPDIR ]\n\n"
 CMD_OPTIONS=$(cat <<EOF
@@ -110,7 +111,7 @@ fi
 # @param $1: db version string, e.g. v2.0.0
 # @return: 0 on success, 1 on failure
 function check_version {
-    local version=$($MYSQL_CMD $MYSQL_CONNECTION -B -e "Select CaosDBVersion();")
+    local version=$($MYSQL_CMD $(get_con_args) -B -e "Select CaosDBVersion();")
 	  if [[ "$(echo $version | sed 's/^CaosDBVersion()\s//')" = "$1" ]]; then
         return 0
 	  fi
-- 
GitLab