# lib/database
# Interface for interacting with different database backends

# Dependencies:
# ``ENABLED_SERVICES`` must be defined

# ``DATABASE_BACKENDS`` will contain a list of available database backends
# after sourcing this file.

# This is a wrapper for the specific database backends available.
# Each database must implement four functions:
#   recreate_database_$DATABASE_TYPE
#   install_database_$DATABASE_TYPE
#   configure_database_$DATABASE_TYPE
#   database_connection_url_$DATABASE_TYPE
#
# and call register_database $DATABASE_TYPE

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

# Register a database backend
#  $1 The name of the database backend
function register_database {
    [ -z "$DATABASE_BACKENDS" ] && DATABASE_BACKENDS=$1 || DATABASE_BACKENDS+=" $1"
}

# Sourcing the database libs sets DATABASE_BACKENDS with the available list
for f in $TOP_DIR/lib/databases/*; do source $f; done

# ``DATABASE_BACKENDS`` now contains a list of the supported databases
# Look in ``ENABLED_SERVICES`` to see if one has been selected
for db in $DATABASE_BACKENDS; do
    # Set the type for the rest of the backend to use
    if is_service_enabled $db; then
        # Set this now for the rest of the database funtions
        DATABASE_TYPE=$db
    fi
done
# If ``DATABASE_TYPE`` is unset here no database was selected
# This is not an error as multi-node installs will do this on the compute nodes


# Get rid of everything enough to cleanly change database backends
function cleanup_database {
    cleanup_database_$DATABASE_TYPE
}

# Set the database type based on the configuration
function initialize_database_backends {
    for backend in $DATABASE_BACKENDS; do
        is_service_enabled $backend && DATABASE_TYPE=$backend
    done

    [ -z "$DATABASE_TYPE" ] && return 1

    # For backward-compatibility, read in the MYSQL_HOST/USER variables and use
    # them as the default values for the DATABASE_HOST/USER variables.
    MYSQL_HOST=${MYSQL_HOST:-localhost}
    MYSQL_USER=${MYSQL_USER:-root}

    DATABASE_HOST=${DATABASE_HOST:-${MYSQL_HOST}}
    DATABASE_USER=${DATABASE_USER:-${MYSQL_USER}}

    if [ -n "$MYSQL_PASSWORD" ]; then
        DATABASE_PASSWORD=$MYSQL_PASSWORD
    else
        read_password DATABASE_PASSWORD "ENTER A PASSWORD TO USE FOR THE DATABASE."
    fi

    # We configure Nova, Horizon, Glance and Keystone to use MySQL as their
    # database server.  While they share a single server, each has their own
    # database and tables.

    # By default this script will install and configure MySQL.  If you want to
    # use an existing server, you can pass in the user/password/host parameters.
    # You will need to send the same ``DATABASE_PASSWORD`` to every host if you are doing
    # a multi-node DevStack installation.

    # NOTE: Don't specify ``/db`` in this string so we can use it for multiple services
    BASE_SQL_CONN=${BASE_SQL_CONN:-${DATABASE_TYPE}://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST}

    return 0
}

# Recreate a given database
#  $1 The name of the database
#  $2 The character set/encoding of the database
function recreate_database {
    local db=$1
    local charset=$2
    recreate_database_$DATABASE_TYPE $db $charset
}

# Install the database
function install_database {
    install_database_$DATABASE_TYPE
}

# Configure and start the database
function configure_database {
    configure_database_$DATABASE_TYPE
}

# Generate an SQLAlchemy connection URL and store it in a variable
#  $1 The variable name in which to store the connection URL
#  $2 The name of the database
function database_connection_url {
    local var=$1
    local db=$2
    database_connection_url_$DATABASE_TYPE $var $db
}

# Restore xtrace
$XTRACE

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