#!/bin/bash
#
# lib/databases/mysql
# Functions to control the configuration and operation of the **MySQL** database backend

# Dependencies:
#
# - DATABASE_{HOST,USER,PASSWORD} must be defined

# Save trace setting
MY_XTRACE=$(set +o | grep xtrace)
set +o xtrace


register_database mysql

# Linux distros, thank you for being incredibly consistent
MYSQL=mysql
if is_fedora; then
    if [[ $DISTRO =~ (rhel6) ]]; then
        MYSQL=mysqld
    else
        MYSQL=mariadb
    fi
fi

# Functions
# ---------

# Get rid of everything enough to cleanly change database backends
function cleanup_database_mysql {
    stop_service $MYSQL
    if is_ubuntu; then
        # Get ruthless with mysql
        stop_service $MYSQL
        apt_get purge -y mysql* mariadb*
        sudo rm -rf /var/lib/mysql
        sudo rm -rf /etc/mysql
        return
    elif is_fedora; then
        if [[ $DISTRO =~ (rhel6) ]]; then
            stop_service mysqld
            uninstall_package mysql-server
            sudo rm -rf /var/lib/mysql
        else
            stop_service mariadb
            uninstall_package mariadb-server
            sudo rm -rf /var/lib/mysql
        fi
    elif is_suse; then
        stop_service mysql
        uninstall_package mysql-community-server
        sudo rm -rf /var/lib/mysql
    else
        return
    fi
}

function recreate_database_mysql {
    local db=$1
    mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -h$MYSQL_HOST -e "DROP DATABASE IF EXISTS $db;"
    mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -h$MYSQL_HOST -e "CREATE DATABASE $db CHARACTER SET utf8;"
}

function configure_database_mysql {
    local my_conf mysql slow_log
    echo_summary "Configuring and starting MySQL"

    if is_ubuntu; then
        my_conf=/etc/mysql/my.cnf
        mysql=mysql
    elif is_fedora; then
        if [[ $DISTRO =~ (rhel6) ]]; then
            mysql=mysqld
        else
            mysql=mariadb
        fi
        my_conf=/etc/my.cnf
    elif is_suse; then
        my_conf=/etc/my.cnf
        mysql=mysql
    else
        exit_distro_not_supported "mysql configuration"
    fi

    # Start mysql-server
    if is_fedora || is_suse; then
        # service is not started by default
        start_service $mysql
    fi

    # Set the root password - only works the first time. For Ubuntu, we already
    # did that with debconf before installing the package.
    if ! is_ubuntu; then
        sudo mysqladmin -u root password $DATABASE_PASSWORD || true
    fi

    # Update the DB to give user ‘$DATABASE_USER’@’%’ full control of the all databases:
    sudo mysql -uroot -p$DATABASE_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%' identified by '$DATABASE_PASSWORD';"

    # Now update ``my.cnf`` for some local needs and restart the mysql service

    # Change ‘bind-address’ from localhost (127.0.0.1) to any (0.0.0.0) and
    # set default db type to InnoDB
    sudo bash -c "source $TOP_DIR/functions && \
        iniset $my_conf mysqld bind-address 0.0.0.0 && \
        iniset $my_conf mysqld sql_mode STRICT_ALL_TABLES && \
        iniset $my_conf mysqld default-storage-engine InnoDB"


    if [[ "$DATABASE_QUERY_LOGGING" == "True" ]]; then
        echo_summary "Enabling MySQL query logging"
        if is_fedora && ! [[ $DISTRO =~ (rhel6) ]]; then
            slow_log=/var/log/mariadb/mariadb-slow.log
        else
            slow_log=/var/log/mysql/mysql-slow.log
        fi
        sudo sed -e '/log.slow.queries/d' \
            -e '/long.query.time/d' \
            -e '/log.queries.not.using.indexes/d' \
            -i $my_conf

        # Turn on slow query log, log all queries (any query taking longer than
        # 0 seconds) and log all non-indexed queries
        sudo bash -c "source $TOP_DIR/functions && \
            iniset $my_conf mysqld slow-query-log 1 && \
            iniset $my_conf mysqld slow-query-log-file $slow_log && \
            iniset $my_conf mysqld long-query-time 0 && \
            iniset $my_conf mysqld log-queries-not-using-indexes 1"

    fi

    restart_service $mysql
}

function install_database_mysql {
    if is_ubuntu; then
        # Seed configuration with mysql password so that apt-get install doesn't
        # prompt us for a password upon install.
        sudo debconf-set-selections <<MYSQL_PRESEED
mysql-server mysql-server/root_password password $DATABASE_PASSWORD
mysql-server mysql-server/root_password_again password $DATABASE_PASSWORD
mysql-server mysql-server/start_on_boot boolean true
MYSQL_PRESEED
    fi

    # while ``.my.cnf`` is not needed for OpenStack to function, it is useful
    # as it allows you to access the mysql databases via ``mysql nova`` instead
    # of having to specify the username/password each time.
    if [[ ! -e $HOME/.my.cnf ]]; then
        cat <<EOF >$HOME/.my.cnf
[client]
user=$DATABASE_USER
password=$DATABASE_PASSWORD
host=$DATABASE_HOST
EOF
        chmod 0600 $HOME/.my.cnf
    fi
    # Install mysql-server
    if is_fedora; then
        if [[ $DISTRO =~ (rhel6) ]]; then
            install_package mysql-server
        else
            install_package mariadb-server
        fi
    elif is_ubuntu; then
        install_package mysql-server
    elif is_suse; then
        if ! is_package_installed mariadb; then
            install_package mysql-community-server
        fi
    else
        exit_distro_not_supported "mysql installation"
    fi
}

function database_connection_url_mysql {
    local db=$1
    echo "$BASE_SQL_CONN/$db?charset=utf8"
}


# Restore xtrace
$MY_XTRACE

# Local variables:
# mode: shell-script
# End:
