Enable QSqlError to handle alphanumeric error codes.
Some database systems (like PostgreSQL) use alphanumeric error codes. Introduce a new method nativeErrorCode() which replaces number(). If the error code cannot be converted to int, number() will return 0. Task-number: QTBUG-142 Change-Id: Ic7fba841737674b75c0c01c2263f51d2041da497 Reviewed-by: Mark Brand <mabrand@mabrand.nl>
This commit is contained in:
parent
e35c2c57cf
commit
106316198d
@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
QDebug operator<<(QDebug dbg, const QSqlError &s)
|
QDebug operator<<(QDebug dbg, const QSqlError &s)
|
||||||
{
|
{
|
||||||
dbg.nospace() << "QSqlError(" << s.number() << ", " << s.driverText() <<
|
dbg.nospace() << "QSqlError(" << s.nativeErrorCode() << ", " << s.driverText() <<
|
||||||
", " << s.databaseText() << ')';
|
", " << s.databaseText() << ')';
|
||||||
return dbg.space();
|
return dbg.space();
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ public:
|
|||||||
QString driverError;
|
QString driverError;
|
||||||
QString databaseError;
|
QString databaseError;
|
||||||
QSqlError::ErrorType errorType;
|
QSqlError::ErrorType errorType;
|
||||||
int errorNumber;
|
QString errorCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ public:
|
|||||||
|
|
||||||
A QSqlError object can provide database-specific error data,
|
A QSqlError object can provide database-specific error data,
|
||||||
including the driverText() and databaseText() messages (or both
|
including the driverText() and databaseText() messages (or both
|
||||||
concatenated together as text()), and the error number() and
|
concatenated together as text()), and the nativeErrorCode() and
|
||||||
type().
|
type().
|
||||||
|
|
||||||
\sa QSqlDatabase::lastError(), QSqlQuery::lastError()
|
\sa QSqlDatabase::lastError(), QSqlQuery::lastError()
|
||||||
@ -91,11 +91,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
\obsolete
|
||||||
|
|
||||||
Constructs an error containing the driver error text \a
|
Constructs an error containing the driver error text \a
|
||||||
driverText, the database-specific error text \a databaseText, the
|
driverText, the database-specific error text \a databaseText, the
|
||||||
type \a type and the optional error number \a number.
|
type \a type and the optional error number \a number.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if QT_DEPRECATED_SINCE(5, 3)
|
||||||
QSqlError::QSqlError(const QString& driverText, const QString& databaseText, ErrorType type,
|
QSqlError::QSqlError(const QString& driverText, const QString& databaseText, ErrorType type,
|
||||||
int number)
|
int number)
|
||||||
{
|
{
|
||||||
@ -104,8 +107,27 @@ QSqlError::QSqlError(const QString& driverText, const QString& databaseText, Err
|
|||||||
d->driverError = driverText;
|
d->driverError = driverText;
|
||||||
d->databaseError = databaseText;
|
d->databaseError = databaseText;
|
||||||
d->errorType = type;
|
d->errorType = type;
|
||||||
d->errorNumber = number;
|
d->errorCode = QString::number(number);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Constructs an error containing the driver error text \a
|
||||||
|
driverText, the database-specific error text \a databaseText, the
|
||||||
|
type \a type and the error code \a code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
QSqlError::QSqlError(const QString &driverText, const QString &databaseText,
|
||||||
|
ErrorType type, const QString &code)
|
||||||
|
{
|
||||||
|
d = new QSqlErrorPrivate;
|
||||||
|
|
||||||
|
d->driverError = driverText;
|
||||||
|
d->databaseError = databaseText;
|
||||||
|
d->errorType = type;
|
||||||
|
d->errorCode = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Creates a copy of \a other.
|
Creates a copy of \a other.
|
||||||
@ -246,14 +268,28 @@ void QSqlError::setType(ErrorType type)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
\fn int QSqlError::number() const
|
||||||
|
\obsolete
|
||||||
|
|
||||||
Returns the database-specific error number, or -1 if it cannot be
|
Returns the database-specific error number, or -1 if it cannot be
|
||||||
determined.
|
determined.
|
||||||
|
|
||||||
|
Returns 0 if the error code is not an integer.
|
||||||
|
|
||||||
|
\warning Some databases use alphanumeric error codes, which makes
|
||||||
|
number() unreliable if such a database is used.
|
||||||
|
|
||||||
|
Use nativeErrorCode() instead
|
||||||
|
|
||||||
|
\sa nativeErrorCode()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if QT_DEPRECATED_SINCE(5, 3)
|
||||||
int QSqlError::number() const
|
int QSqlError::number() const
|
||||||
{
|
{
|
||||||
return d->errorNumber;
|
return d->errorCode.toInt();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn void QSqlError::setNumber(int number)
|
\fn void QSqlError::setNumber(int number)
|
||||||
@ -270,10 +306,20 @@ int QSqlError::number() const
|
|||||||
#if QT_DEPRECATED_SINCE(5, 1)
|
#if QT_DEPRECATED_SINCE(5, 1)
|
||||||
void QSqlError::setNumber(int number)
|
void QSqlError::setNumber(int number)
|
||||||
{
|
{
|
||||||
d->errorNumber = number;
|
d->errorCode = QString::number(number);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the database-specific error code, or an empty string if
|
||||||
|
it cannot be determined.
|
||||||
|
*/
|
||||||
|
|
||||||
|
QString QSqlError::nativeErrorCode() const
|
||||||
|
{
|
||||||
|
return d->errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
This is a convenience function that returns databaseText() and
|
This is a convenience function that returns databaseText() and
|
||||||
driverText() concatenated into a single string.
|
driverText() concatenated into a single string.
|
||||||
|
@ -59,10 +59,16 @@ public:
|
|||||||
TransactionError,
|
TransactionError,
|
||||||
UnknownError
|
UnknownError
|
||||||
};
|
};
|
||||||
|
#if QT_DEPRECATED_SINCE(5, 3)
|
||||||
QSqlError( const QString& driverText = QString(),
|
QSqlError( const QString& driverText = QString(),
|
||||||
const QString& databaseText = QString(),
|
const QString& databaseText = QString(),
|
||||||
ErrorType type = NoError,
|
ErrorType type = NoError,
|
||||||
int number = -1);
|
int number = -1);
|
||||||
|
#endif
|
||||||
|
QSqlError(const QString &driverText,
|
||||||
|
const QString &databaseText,
|
||||||
|
ErrorType type,
|
||||||
|
const QString &errorCode);
|
||||||
QSqlError(const QSqlError& other);
|
QSqlError(const QSqlError& other);
|
||||||
QSqlError& operator=(const QSqlError& other);
|
QSqlError& operator=(const QSqlError& other);
|
||||||
bool operator==(const QSqlError& other) const;
|
bool operator==(const QSqlError& other) const;
|
||||||
@ -72,7 +78,10 @@ public:
|
|||||||
QString driverText() const;
|
QString driverText() const;
|
||||||
QString databaseText() const;
|
QString databaseText() const;
|
||||||
ErrorType type() const;
|
ErrorType type() const;
|
||||||
|
#if QT_DEPRECATED_SINCE(5, 3)
|
||||||
int number() const;
|
int number() const;
|
||||||
|
#endif
|
||||||
|
QString nativeErrorCode() const;
|
||||||
QString text() const;
|
QString text() const;
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
|
|
||||||
|
@ -515,8 +515,8 @@ public:
|
|||||||
static QByteArray printError( const QSqlError& err )
|
static QByteArray printError( const QSqlError& err )
|
||||||
{
|
{
|
||||||
QString result;
|
QString result;
|
||||||
if(err.number() > 0)
|
if (!err.nativeErrorCode().isEmpty())
|
||||||
result += '(' + QString::number(err.number()) + ") ";
|
result += '(' + err.nativeErrorCode() + ") ";
|
||||||
result += '\'';
|
result += '\'';
|
||||||
if(!err.driverText().isEmpty())
|
if(!err.driverText().isEmpty())
|
||||||
result += err.driverText() + "' || '";
|
result += err.driverText() + "' || '";
|
||||||
@ -527,8 +527,8 @@ public:
|
|||||||
static QByteArray printError( const QSqlError& err, const QSqlDatabase& db )
|
static QByteArray printError( const QSqlError& err, const QSqlDatabase& db )
|
||||||
{
|
{
|
||||||
QString result(dbToString(db) + ": ");
|
QString result(dbToString(db) + ": ");
|
||||||
if(err.number() > 0)
|
if (!err.nativeErrorCode().isEmpty())
|
||||||
result += '(' + QString::number(err.number()) + ") ";
|
result += '(' + err.nativeErrorCode() + ") ";
|
||||||
result += '\'';
|
result += '\'';
|
||||||
if(!err.driverText().isEmpty())
|
if(!err.driverText().isEmpty())
|
||||||
result += err.driverText() + "' || '";
|
result += err.driverText() + "' || '";
|
||||||
|
@ -120,6 +120,24 @@ void tst_QSqlError::construction()
|
|||||||
|
|
||||||
QSqlError obj4;
|
QSqlError obj4;
|
||||||
QVERIFY(!obj4.isValid());
|
QVERIFY(!obj4.isValid());
|
||||||
|
|
||||||
|
QSqlError obj5(QStringLiteral("drivertext"), QStringLiteral("databasetext"),
|
||||||
|
QSqlError::UnknownError, QStringLiteral("123"));
|
||||||
|
QCOMPARE(obj5.driverText(), QString("drivertext"));
|
||||||
|
QCOMPARE(obj5.databaseText(), QString("databasetext"));
|
||||||
|
QCOMPARE(obj5.type(), QSqlError::UnknownError);
|
||||||
|
QCOMPARE(obj5.number(), 123);
|
||||||
|
QCOMPARE(obj5.nativeErrorCode(), QStringLiteral("123"));
|
||||||
|
QVERIFY(obj5.isValid());
|
||||||
|
|
||||||
|
QSqlError obj6(QStringLiteral("drivertext"), QStringLiteral("databasetext"),
|
||||||
|
QSqlError::UnknownError, QStringLiteral("Err123"));
|
||||||
|
QCOMPARE(obj6.driverText(), QString("drivertext"));
|
||||||
|
QCOMPARE(obj6.databaseText(), QString("databasetext"));
|
||||||
|
QCOMPARE(obj6.type(), QSqlError::UnknownError);
|
||||||
|
QCOMPARE(obj6.number(), 0);
|
||||||
|
QCOMPARE(obj6.nativeErrorCode(), QStringLiteral("Err123"));
|
||||||
|
QVERIFY(obj6.isValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QSqlError::operators()
|
void tst_QSqlError::operators()
|
||||||
|
Loading…
Reference in New Issue
Block a user