"""
$URL: svn+ssh://svn.mems-exchange.org/repos/trunk/durus/error.py $
$Id: error.py 29090 2006-11-27 14:02:24Z dbinger $
"""
from durus.utils import str_to_int8

class DurusError (StandardError):
    """Durus error."""

class DurusKeyError (KeyError, DurusError):
    """Key not found in database."""

    def __str__(self):
        first_oid = self.oids[0]
        return str(first_oid and str_to_int8(first_oid))


class ConflictError (DurusError):
    """
    There has been some kind of conflict involving the named oids.
    """
    def __init__(self, oids=None):
        self.oids = oids

    def __str__(self):
        if self.oids is None:
            return "conflicting oids not available"
        else:
            if len(self.oids) > 1:
                s = "oids=[%s ...]"
            else:
                s = "oids=[%s]"
            first_oid = self.oids[0]
            return s % (first_oid and str_to_int8(first_oid))


class WriteConflictError (ConflictError):
    """
    Two transactions tried to modify the same object at once.
    """

class ReadConflictError (ConflictError):
    """
    Conflict detected when object was loaded.
    An attempt was made to read an object that has changed in another
    transaction (eg. another process).
    """

class ProtocolError(DurusError):
    """
    An error occurred during communication between the storage server
    and the client.
    """
