# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

__all__ = [
    'Warning', 'Error', 'InterfaceError', 'DatabaseError', 'DataError',
    'OperationalError', 'IntegrityError', 'InternalError',
    'ProgrammingError', 'NotSupportedError',
]

try:
    _StandardError = StandardError
except NameError:
    _StandardError = Exception


class Warning(_StandardError):
    """Not used by this package, only defined for compatibility
    with DB API 2.0."""


class Error(_StandardError):
    """Exception that is the base class of all other error exceptions.
    You can use this to catch all errors with one single except statement."""

    def __init__(self, message, code=None, sqlstate=None, cause=None):
        super(_StandardError, self).__init__(message, code, sqlstate, cause)

    @property
    def message(self):
        return self.args[0]

    @property
    def code(self):
        return self.args[1]

    @property
    def sqlstate(self):
        return self.args[2]

    @property
    def cause(self):
        return self.args[3]


class InterfaceError(Error):
    """Exception raised for errors that are related to the database
    interface rather than the database itself."""


class DatabaseError(Error):
    """Exception raised for errors that are related to the database."""


class DataError(DatabaseError):
    """Exception raised for errors that are due to problems with the
    processed data like division by zero, numeric value out of range,
    etc."""


class OperationalError(DatabaseError):
    """Raised for errors that are related to the database's operation and not
    necessarily under the control of the programmer, e.g. an unexpected
    disconnect occurs, the data source name is not found, a transaction could
    not be processed, a memory allocation error occurred during
    processing, etc."""


class IntegrityError(DatabaseError):
    """Raised when the relational integrity of the database is affected, e.g. a foreign key check fails."""


class InternalError(DatabaseError):
    """Raised when the database encounters an internal problem."""


class ProgrammingError(DatabaseError):
    """Raises for programming errors, e.g. table not found, syntax error, etc."""


class NotSupportedError(DatabaseError):
    """Raised when using an API that is not supported by the database."""
