# 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
# This is required to be defined before the specific database scripts are sourced
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 functions
        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


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

# 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 output it using echo
#  $1 The name of the database
function database_connection_url {
    local db=$1
    database_connection_url_$DATABASE_TYPE $db
}


# Restore xtrace
$XTRACE

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