public static function toLegacy(Exception\Exception $e, $fallbackClass = 'MongoException')
{
$message = $e->getMessage();
$code = $e->getCode();
switch (get_class($e)) {
case Exception\AuthenticationException::class:
case Exception\ConnectionException::class:
case Exception\ConnectionTimeoutException::class:
case Exception\SSLConnectionException::class:
$class = 'MongoConnectionException';
break;
case Exception\BulkWriteException::class:
case Exception\WriteException::class:
$writeResult = $e->getWriteResult();
if ($writeResult) {
$writeError = $writeResult->getWriteErrors()[0];
$message = $writeError->getMessage();
$code = $writeError->getCode();
}
switch ($code) {
// see https://github.com/mongodb/mongo-php-driver-legacy/blob/ad3ed45739e9702ae48e53ddfadc482d9c4c7e1c/cursor_shared.c#L540
case 11000:
case 11001:
case 12582:
$class = 'MongoDuplicateKeyException';
break;
default:
$class = 'MongoCursorException';
}
break;
case Exception\ExecutionTimeoutException::class:
$class = 'MongoExecutionTimeoutException';
break;
default:
$class = $fallbackClass;
}
if (strpos($message, 'No suitable servers found') !== false) {
return new \MongoConnectionException($message, $code, $e);
}
if ($message === "cannot use 'w' > 1 when a host is not replicated") {
return new \MongoWriteConcernException($message, $code, $e);
}
return new $class($message, $code, $e);
}