diff --git a/txmongo/connection.py b/txmongo/connection.py index 713b398f..021f51a0 100755 --- a/txmongo/connection.py +++ b/txmongo/connection.py @@ -15,7 +15,7 @@ from twisted.python.compat import StringType from txmongo.database import Database from txmongo.protocol import MongoProtocol, Query -from txmongo.utils import timeout +from txmongo.utils import timeout, get_err DEFAULT_MAX_BSON_SIZE = 16777216 DEFAULT_MAX_WRITE_BATCH_SIZE = 1000 @@ -103,7 +103,7 @@ def configure(self, proto): # Make sure the command was successful. if not config.get("ok"): code = config.get("code") - msg = "TxMongo: " + config.get("err", "Unknown error") + msg = "TxMongo: " + get_err(config, "Unknown error") raise OperationFailure(msg, code) # Check that the replicaSet matches. diff --git a/txmongo/protocol.py b/txmongo/protocol.py index e439789a..034f13bc 100644 --- a/txmongo/protocol.py +++ b/txmongo/protocol.py @@ -30,6 +30,7 @@ from twisted.internet import defer, protocol, error from twisted.python import failure, log from twisted.python.compat import unicode +from txmongo.utils import get_err if PY3: @@ -449,7 +450,7 @@ def on_reply(reply): assert len(reply.documents) == 1 document = reply.documents[0].decode() - err = document.get("err", None) + err = get_err(document, None) code = document.get("code", None) if err is not None: diff --git a/txmongo/utils/__init__.py b/txmongo/utils/__init__.py index e976f3d7..7a322386 100644 --- a/txmongo/utils/__init__.py +++ b/txmongo/utils/__init__.py @@ -56,3 +56,9 @@ def on_fail(failure): def check_deadline(_deadline): if _deadline is not None and _deadline < time(): raise TimeExceeded("TxMongo: now '{0}', deadline '{1}'".format(time(), _deadline)) + + +def get_err(document, default=None): + err = document.get("err", None) or document.get("codeName", None) + errmsg = document.get("errmsg", None) + return ": ".join(filter(None, (err, errmsg))) or default