blob: 81ed36588af6ccc8f7a7402b8c0082a2f8e31e8b [file] [log] [blame]
#!/bin/sh
# This works like postgres_wrapper.sh but for mysql.
#
# This will bind to localhost on the specified port. There is a database
# called testdb; user 'root' can login without a password.
#
# Example:
# ./mysql_wrapper /tmp/myinstance 9101 mysql -u root -P 9101 testdb
#
# Inspired by https://github.com/tk0miya/testing.mysqld
set -eu
DBDIR="$1"
shift
if [ -d "${DBDIR}" ]; then
echo 1>&2 "${DBDIR} already exists"
exit 1
fi
PORT="$1"
shift
mkdir -p "${DBDIR}"
mkdir -p "${DBDIR}/etc"
mkdir -p "${DBDIR}/data"
cat > "${DBDIR}/etc/my.cnf" << __EOF__
[mysqld]
bind-address = 127.0.0.1
port = ${PORT}
user = $(whoami)
__EOF__
MYSQL_INSTALL_DB_FLAGS+=" --defaults-file=\"${DBDIR}/etc/my.cnf\""
MYSQL_INSTALL_DB_FLAGS+=" --initialize-insecure"
MYSQL_INSTALL_DB_FLAGS+=" --user=$(whoami)"
MYSQL_INSTALL_DB_FLAGS+=" --datadir=\"${DBDIR}/data\""
MYSQL_INSTALL_DB_FLAGS+=" >& \"${DBDIR}/install_db.log\""
echo "$ mysqld ${MYSQL_INSTALL_DB_FLAGS}"
eval mysqld ${MYSQL_INSTALL_DB_FLAGS}
MYSQLD_FLAGS+=" --defaults-file=\"${DBDIR}/etc/my.cnf\""
MYSQLD_FLAGS+=" --datadir=\"${DBDIR}/data\""
MYSQLD_FLAGS+=" --pid-file=\"${DBDIR}/mysqld.pid\""
MYSQLD_FLAGS+=" --log-error=\"${DBDIR}/mysqld.error.log\""
MYSQLD_FLAGS+="&"
echo "$ mysqld ${MYSQLD_FLAGS}"
eval mysqld ${MYSQLD_FLAGS}
MYSQLADMIN_FLAGS+=" --defaults-file=\"${DBDIR}/etc/my.cnf\""
MYSQLADMIN_FLAGS+=" -h 127.0.0.1"
MYSQLADMIN_FLAGS+=" -P ${PORT}"
MYSQLADMIN_FLAGS+=" -u root"
# Poll server for 10 seconds to see when it is up.
set +e
for i in {1..100}
do
sleep 0.1
echo "$ mysqladmin ${MYSQLADMIN_FLAGS} status"
eval mysqladmin ${MYSQLADMIN_FLAGS} status
if [ $? -eq 0 ]; then
break
fi
done
set -e
# Drop database to be sure. The DB may not exist if the test has not been run
# before: hide output to avoid confusion.
set +e
echo "$ mysqladmin ${MYSQLADMIN_FLAGS} drop --force testdb"
eval mysqladmin ${MYSQLADMIN_FLAGS} drop --force testdb >& /dev/null
set -e
echo "$ mysqladmin ${MYSQLADMIN_FLAGS} create testdb"
eval mysqladmin ${MYSQLADMIN_FLAGS} create testdb
# Execute command
eval "$@"
RC=$?
# Kill server
MYSQLD_PID="$(cat "${DBDIR}/mysqld.pid")"
kill -15 ${MYSQLD_PID}
[ $? -ne 0 ] && (echo 1>&1 "Could not kill mysql server"; exit 1)
wait "${MYSQLD_PID}"
exit $RC