# 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 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


# 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 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: