#!/bin/sh
# Copyright (C) 2000-2017 Synology Inc. All rights reserved.

PACKAGE_NAME="MariaDB10"
ETC_FILES="my.cnf"
LIB_FILES="mysql libmysqlclient.so libmysqlclient.so.18 libmysqlclient_r.so libmysqlclient_r.so.18 libmysqlclient_r.so.18.0.0 libmysqld.so libmysqld.so.18"
USR_BIN_FILES="myisam_ftdump myisamchk myisamlog myisampack aria_ftdump aria_chk aria_read_log aria_dump_log aria_pack mysql mysqltest mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysql_plugin mysqlbinlog mysqladmin mysqlslap my_print_defaults perror resolveip replace innochecksum resolve_stack_dump mysql_waitpid mysqlbug mysql_install_db msql2mysql mysql_fix_extensions mysql_setpermission mysql_zap mysqlaccess mysql_convert_table_format mysql_find_rows mysqlhotcopy mysqldumpslow mysqld_multi mysqld_safe mysqld_safe_helper mysqld mysql_tzinfo_to_sql"
CONF_FILE="/var/packages/MariaDB10/etc/.mariadb.conf"
MY_PORT_CNF_FILE="/var/packages/MariaDB10/etc/my_port.cnf"
PORT_CONFIG_FILE="/var/packages/MariaDB10/target/port_conf/MariaDB10.sc"
DATADIR="/var/packages/MariaDB10/target/mysql"
IS_USBSTATION="$(/bin/get_key_value /etc.defaults/synoinfo.conf usbstation)"

MARIADB_BASE_DIR="/usr/local/mariadb10"
MYSQL_SERVER="$MARIADB_BASE_DIR"/share/mysql/mysql.server
BIN_MYSQL_UPGRADE="$MARIADB_BASE_DIR"/bin/mysql_upgrade
BIN_MYSQL_INSTALL_DB="$MARIADB_BASE_DIR"/bin/mysql_install_db
BIN_MYSQL_MYSQLDUMP="$MARIADB_BASE_DIR"/bin/mysqldump
BIN_MYSQL="$MARIADB_BASE_DIR"/bin/mysql
BIN_SET_MYSQL_PORT="/var/packages/MariaDB10/target/tool/setmysqlport"

if [ "$SYNOPKG_TEMP_LOGFILE" ]; then
	log() {
		local text="$1"
		local idx=0
		shift 1
		for val in "$@"; do
			text="${text//\{$idx\}/$val}"
			let idx=1+$idx
		done
		echo "$text" >> $SYNOPKG_TEMP_LOGFILE
	}
fi

ChkExecEnv()
{
	local found="N"
	local mysqlSubPath=
	if [ "yes" = "$IS_USBSTATION" ]; then
		mysqlSubPath="@sharebin/@database/mariadb10"
		volRegExp='/volumeUSB[1-9]/usbshare'
	else
		mysqlSubPath="@database/mariadb10"
		volRegExp='/volume[1-9]'
	fi

	local mysqlVol=
	local mysqlPath=

	if [ ! -L ${DATADIR} ]; then
		# try to find old mysql volume
		for volume in `grep -e " $volRegExp " /proc/mounts | awk '{ print $2 }'`; do
			if [ -d "${volume}/${mysqlSubPath}" ]; then
				mysqlVol="${volume}"
				found=Y
				break;
			fi
		done

		if [ "$found" = "N" ]; then
			mysqlVol=`/usr/syno/bin/servicetool --get-first-alive-volume`
			if [ ! -d "$mysqlVol" ]; then # no volume found
				exit 1
			fi
		fi
		mysqlPath="${mysqlVol}/${mysqlSubPath}"
		/bin/ln -fs "${mysqlPath}" "${DATADIR}"
	else
		mysqlPath=$(readlink ${DATADIR})
	fi

	if [ ! -d "${mysqlPath}" ]; then
		mkdir -p "${mysqlPath}"

		# register for USB Station
		if [ "$SYNOPKG_DSM_VERSION_BUILD" -ge 40000 ]; then
			/usr/syno/bin/servicetool --regvol -n "${PACKAGE_NAME}" -p "${mysqlVol}" -t SERVICE_PKG
		else
			/usr/syno/sbin/synoservice --regvol -n "${PACKAGE_NAME}" -p "${mysqlVol}" -t SERVICE_PKG
		fi
	fi

	[ ! -d /run/mysqld ] && /bin/mkdir -p /run/mysqld
	/bin/chown -R mysql:mysql /run/mysqld "${DATADIR}"/
}

StartSingleUser()
{
	$MYSQL_SERVER start --skip-grant-tables --skip-networking --max-allowed-packet=512M
	for i in $(seq 15); do
		if ! $MYSQL_SERVER status; then
			sleep 1
			continue
		fi
		return 0
	done
	return 1
}

RebuildDatabase()
{
	[ ! -z "$pkgwizard_new_root_password" ] && new_root_pass="$pkgwizard_new_root_password"
	ChkExecEnv
	if [ ! -d ${DATADIR}/mysql ]; then
		echo "Initialize MySQL database"
		"$BIN_MYSQL_INSTALL_DB" --user=mysql --basedir="$MARIADB_BASE_DIR" --datadir="${DATADIR}"
		echo "${PKGVERSION}" | sed 's|\(.*\)-[0-9]*|\1|' > "${DATADIR}/VERSION"
		"$MYSQL_SERVER" start
		"$BIN_MYSQL" -e "UPDATE mysql.user SET Password=PASSWORD('$new_root_pass') WHERE User='root'"
		"$BIN_MYSQL" -e "DELETE FROM mysql.user WHERE User=''"
		"$BIN_MYSQL" -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"
		"$BIN_MYSQL" -e "DROP DATABASE IF EXISTS test"
		"$BIN_MYSQL" -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
		"$BIN_MYSQL" -e "FLUSH PRIVILEGES"
		"$MYSQL_SERVER" stop
	fi
}

CHECK_AND_LINK_FILE()
{
	LINK=$1
	LINK_TARGET="`realpath ${SYNOPKG_PKGDEST}${LINK}`"
	LINK_BASE=`dirname $1`

	if [ ! -d "$LINK_BASE" ]; then
		mkdir -p $LINK_BASE
	fi
	if [ ! -e "$LINK" ]; then
		ln -sf $LINK_TARGET $LINK
	fi
}

DO_LINK()
{
	for file in $ETC_FILES
	do
		CHECK_AND_LINK_FILE "$MARIADB_BASE_DIR/etc/mysql/$file"
	done

	for file in $USR_BIN_FILES
	do
		CHECK_AND_LINK_FILE "$MARIADB_BASE_DIR/bin/$file"
	done

	for file in $LIB_FILES
	do
		CHECK_AND_LINK_FILE "$MARIADB_BASE_DIR/lib/$file"
	done

	CHECK_AND_LINK_FILE "$MARIADB_BASE_DIR/share/mysql"
}

CHECK_AND_REMOVE()
{
	[ -L $1 ] && rm $1
}

DO_REMOVE()
{
	for file in $ETC_FILES
	do
		CHECK_AND_REMOVE "$MARIADB_BASE_DIR/etc/mysql/$file"
	done

	for file in $USR_BIN_FILES
	do
		CHECK_AND_REMOVE "$MARIADB_BASE_DIR/bin/$file"
	done

	for file in $LIB_FILES
	do
		CHECK_AND_REMOVE "$MARIADB_BASE_DIR/lib/$file"
	done

	CHECK_AND_REMOVE "$MARIADB_BASE_DIR/share/mysql"
}

