#!/bin/sh
# Copyright (c) 1995-2002 SuSE Linux AG Nuernberg, Germany.
#
# Author: Lenz Grimmer <feedback@suse.de>
#
# /etc/init.d/mysql
#
#   and its symbolic link
#
# /usr/sbin/rcmysql
#
### BEGIN INIT INFO
# Provides:       mysql
# Required-Start: $network $remote_fs
# Required-Stop:
# Default-Start:  2 3 5
# Default-Stop:
# Description:    Start the MySQL database server
### END INIT INFO

# Shell functions sourced from /etc/rc.status:
#      rc_check         check and set local and overall rc status
#      rc_status        check and set local and overall rc status
#      rc_status -v     ditto but be verbose in local rc status
#      rc_status -v -r  ditto and clear the local rc status
#      rc_failed        set local and overall rc status to failed
#      rc_failed <num>  set local and overall rc status to <num>
#      rc_reset         clear local rc status (overall remains)
#      rc_exit          exit appropriate to overall rc status
. /etc/rc.status

# First reset status of this service
rc_reset

# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - insufficient privilege
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
# 
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signalling is not supported) are
# considered a success.

# Test, if mysqld or mysql-max actually exist
unset MYSQLD
if test -x /usr/sbin/mysqld-max
then
        MYSQLD=/usr/sbin/mysqld-max
elif test -x /usr/sbin/mysqld
then
        MYSQLD=/usr/sbin/mysqld
fi
test "$MYSQLD" || { echo "Nor /usr/sbin/mysqld nor /usr/sbin/mysqld-max exists"; rc_failed 5; rc_status -v; rc_exit; }

# The following section has been taken from
# the original MySQL init script
basedir=/usr
datadir=/var/lib/mysql
mysql_daemon_user=mysql
mysql_daemon_group=mysql
pid_file=/var/lib/mysql/mysqld.pid
socket=/var/lib/mysql/mysql.sock
MYADMIN=/usr/bin/mysqladmin
export TMPDIR=/var/lib/mysql/tmp
if test -z "$basedir"
then
  basedir=/usr
  bindir=/usr/bin
else
  bindir="$basedir/bin"
fi

if test -z "$pid_file"
then
  pid_file=$datadir/`/bin/hostname`.pid
else
  case "$pid_file" in
    /* ) ;;
    * )  pid_file="$datadir/$pid_file" ;;
  esac
fi

mode=$1 # start or stop

parse_arguments() {
  for arg do
    case "$arg" in
      --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --pid-file=*) pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
	  --socket=*)   socket=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
    esac
  done
}

# Get arguments from the my.cnf file, groups [mysqld] and [mysql_server]
if test -x ./bin/my_print_defaults
then
  print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
then
  print_defaults="$bindir/my_print_defaults"
elif test -x $bindir/mysql_print_defaults
then
  print_defaults="$bindir/mysql_print_defaults"
else
  # Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[ 	]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
      if test -x "$d/bin/mysql_print_defaults"
      then
        print_defaults="$d/bin/mysql_print_defaults"
        break
      fi
    done
  fi

  # Hope it's in the PATH ... but I doubt it
  test -z "$print_defaults" && print_defaults="my_print_defaults"
fi

parse_arguments `$print_defaults $defaults mysqld mysql_server`

# Safeguard (relative paths, core dumps..)
cd $basedir

case "$1" in
    start)
	# exit gracefully, if we are already running
	checkproc $MYSQLD && echo -n "Starting service MySQL " && \
	rc_status -v && rc_exit

	# Test, if safe_mysqld actually exists
	SAFE_MYSQLD=/usr/bin/mysqld_safe
	test -x $SAFE_MYSQLD || { echo "$SAFE_MYSQLD does not exist "; rc_failed 5; rc_status -v; rc_exit; }

    # check for ISAM tables
    tables=`find $datadir -name '*.ISM' | sed "s@$datadir/*@@; s@.ISM@@; s@/@.@;"`
    if test "$tables" ; then
        echo
        echo "Some tables still use ISAM format, please convert them to something "
        echo "better (eg. MyISAM). ISAM support will be dropped in future releases. "
        echo "You can use mysql_convert_table_format script to do this conversion. "
        echo
        echo "Tables using ISAM are: "
        echo "  $tables "
        echo
    fi

    # this file was used in past, but it's batter to place it youtside database directory
    if test -f $datadir/mysql/stamp-4.1 ; then
        rm $datadir/mysql/stamp-4.1
    fi

	# We assume a fresh install if the directory $datadir/mysql
	# does not exist and create the privilege database
	if test ! -f $datadir/update-stamp-4.1 ; then
		echo "Creating/Updating MySQL privilege database... "
		mysql_install_db --user=$mysql_daemon_user --datadir=$datadir || rc_failed

	echo "Fixing privilege tables... "
        (echo 'USE mysql;'; cat /usr/share/mysql/mysql_fix_privilege_tables.sql) \
		| sed '/^---\? /D; s/#.*//; s/;$/#/' | tr '\n' ' ' | tr '#' '\n' \
		| /usr/sbin/mysqld \
            --bootstrap \
            --skip-innodb \
            --skip-bdb \
            --skip-grant-tables \
            --user=$mysql_daemon_user \
            --pid-file=$pid_file \
            --socket=$socket \
            --datadir=$datadir 2>/dev/null

        touch $datadir/update-stamp-4.1
		
		# Fix ownerships and permissions for $datadir
		chmod 755 $datadir
		chown -R $mysql_daemon_user.$mysql_daemon_group $datadir
	fi

	echo -n "Starting service MySQL "

	$SAFE_MYSQLD \
	    --user=$mysql_daemon_user \
	    --pid-file=$pid_file \
	    --socket=$socket \
	    --datadir=$datadir &>/dev/null &

	for((i=0; i<50; i++)); do
	   sleep 0.2
           test -S $socket && i='' && break
        done

	test -z "$i" || rc_failed

	# Rmember status and be verbose
	rc_status -v
	;;

    stop)
	echo -n "Shutting down service MySQL "
	killproc -p $pid_file -TERM $MYSQLD

	# Remember status and be verbose
	rc_status -v
	;;

    try-restart)
	## Stop the service and if this succeeds (i.e. the 
	## service was running before), start it again.
	## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
	$0 status >/dev/null &&  $0 restart

	# Remember status and be quiet
	rc_status
	;;

    restart|force-reload)
	echo "Restarting service MySQL "
	$0 stop
	$0 start

	rc_status
	;;

	reload)
	echo -n "Reloading service MySQL "
	killproc -p $pid_file -HUP $MYSQLD
	touch $pid_file
	rc_status -v
	;;
	
    check|status)
	echo -n "Checking for service MySQL: "
	## Check status with checkproc(8), if process is running
	## checkproc will return with exit status 0.

	# Status has a slightly different for the status command:
	# 0 - service running
	# 1 - service dead, but /var/run/  pid  file exists
	# 2 - service dead, but /var/lock/ lock file exists
	# 3 - service not running

	# NOTE: checkproc returns LSB compliant status values.
	checkproc $MYSQLD
	rc_status -v
	;;

    *)
	echo "Usage: $0 {start|stop|status|reload|restart|try-restart|force-reload}"
	exit 1
	;;
esac
rc_exit

# vim: ft=sh
