# 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


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

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

function recreate_database_mysql {
    local db=$1
    local charset=$2
    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 $charset;"
}

function configure_database_mysql {
    echo_summary "Configuring and starting MySQL"

    if is_ubuntu; then
        MY_CONF=/etc/mysql/my.cnf
        MYSQL=mysql
    elif is_fedora; then
        if [[ $DISTRO =~ (rhel7) ]]; then
            MYSQL=mariadb
        else
            MYSQL=mysqld
        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)
    sudo sed -i '/^bind-address/s/127.0.0.1/0.0.0.0/g' $MY_CONF

    # Set default db type to InnoDB
    if sudo grep -q "default-storage-engine" $MY_CONF; then
        # Change it
        sudo bash -c "source $TOP_DIR/functions; iniset $MY_CONF mysqld default-storage-engine InnoDB"
    else
        # Add it
        sudo sed -i -e "/^\[mysqld\]/ a \
default-storage-engine = InnoDB" $MY_CONF
    fi

    if [[ "$DATABASE_QUERY_LOGGING" == "True" ]]; then
        echo_summary "Enabling MySQL query logging"

        # Turn on slow query log
        sudo sed -i '/log.slow.queries/d' $MY_CONF
        sudo sed -i -e "/^\[mysqld\]/ a \
            log-slow-queries = /var/log/mysql/mysql-slow.log" $MY_CONF

        # Log all queries (any query taking longer than 0 seconds)
        sudo sed -i '/long.query.time/d' $MY_CONF
        sudo sed -i -e "/^\[mysqld\]/ a \
            long-query-time = 0" $MY_CONF

        # Log all non-indexed queries
        sudo sed -i '/log.queries.not.using.indexes/d' $MY_CONF
        sudo sed -i -e "/^\[mysqld\]/ a \
            log-queries-not-using-indexes" $MY_CONF

    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.
        cat <<MYSQL_PRESEED | sudo debconf-set-selections
mysql-server-5.1 mysql-server/root_password password $DATABASE_PASSWORD
mysql-server-5.1 mysql-server/root_password_again password $DATABASE_PASSWORD
mysql-server-5.1 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_ubuntu || is_fedora; then
        if [[ $DISTRO =~ (rhel7) ]]; then
            install_package mariadb-server
        else
            install_package mysql-server
        fi
    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:
