2016-12-12 15:53:56 +01:00

86 lines
2.2 KiB
Python

"""Schema-providing interfaces for backend databases"""
from functools import singledispatch
import bigchaindb
from bigchaindb.backend.connection import connect
@singledispatch
def create_database(connection, dbname):
"""Create database to be used by BigchainDB
Args:
dbname (str): the name of the database to create.
Raises:
:exc:`~bigchaindb.common.exceptions.DatabaseAlreadyExists`: If the
given :attr:`dbname` already exists as a database.
"""
raise NotImplementedError
@singledispatch
def create_tables(connection, dbname):
"""Create the tables to be used by BigchainDB
Args:
dbname (str): the name of the database to create tables for.
"""
raise NotImplementedError
@singledispatch
def create_indexes(connection, dbname):
"""Create the indexes to be used by BigchainDB
Args:
dbname (str): the name of the database to create indexes for.
"""
raise NotImplementedError
@singledispatch
def drop_database(connection, dbname):
"""Drop the database used by BigchainDB
Args:
dbname (str): the name of the database to drop.
Raises:
:exc:`~bigchaindb.common.exceptions.DatabaseDoesNotExist`: If the
given :attr:`dbname` does not exist as a database.
"""
raise NotImplementedError
def init_database(connection=None, dbname=None):
"""Initialize the configured backend for use with BigchainDB.
Creates a database with :attr:`dbname` with any required tables
and supporting indexes.
Args:
connection (:class:`~bigchaindb.backend.connection.Connection`): an
existing connection to use to initialize the database.
Creates one if not given.
dbname (str): the name of the database to create.
Defaults to the database name given in the BigchainDB
configuration.
Raises:
:exc:`~bigchaindb.common.exceptions.DatabaseAlreadyExists`: If the
given :attr:`dbname` already exists as a database.
"""
connection = connection or connect()
dbname = dbname or bigchaindb.config['database']['name']
create_database(connection, dbname)
create_tables(connection, dbname)
create_indexes(connection, dbname)