summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2009-06-23 10:32:42 (GMT)
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2009-06-23 10:32:42 (GMT)
commite1eceedaa635d0180eb798b00c3da93156d7af63 (patch)
tree04325155309fd225d68a4cf118be34c2378cb26a /src/sql
parent2c96aeb45320ade7e2c074433560185f16631374 (diff)
parent71be46c61c582d2f4635a1e420e44d57ddb5857a (diff)
downloadQt-e1eceedaa635d0180eb798b00c3da93156d7af63.zip
Qt-e1eceedaa635d0180eb798b00c3da93156d7af63.tar.gz
Qt-e1eceedaa635d0180eb798b00c3da93156d7af63.tar.bz2
Merge commit 'origin/4.5'
Conflicts: src/sql/drivers/psql/qsql_psql.cpp
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp20
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp29
2 files changed, 22 insertions, 27 deletions
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp
index b70868d..7bda969 100644
--- a/src/sql/drivers/odbc/qsql_odbc.cpp
+++ b/src/sql/drivers/odbc/qsql_odbc.cpp
@@ -91,7 +91,6 @@ public:
: hEnv(0), hDbc(0), useSchema(false), disconnectCount(0), isMySqlServer(false),
isMSSqlServer(false), hasSQLFetchScroll(true), hasMultiResultSets(false)
{
- sql_char_type = sql_varchar_type = sql_longvarchar_type = QVariant::ByteArray;
unicode = false;
}
@@ -100,9 +99,6 @@ public:
uint unicode :1;
uint useSchema :1;
- QVariant::Type sql_char_type;
- QVariant::Type sql_varchar_type;
- QVariant::Type sql_longvarchar_type;
int disconnectCount;
bool isMySqlServer;
bool isMSSqlServer;
@@ -129,7 +125,6 @@ public:
QODBCPrivate()
: hEnv(0), hDbc(0), hStmt(0), useSchema(false), hasSQLFetchScroll(true)
{
- sql_char_type = sql_varchar_type = sql_longvarchar_type = QVariant::ByteArray;
unicode = false;
}
@@ -142,9 +137,6 @@ public:
uint unicode :1;
uint useSchema :1;
- QVariant::Type sql_char_type;
- QVariant::Type sql_varchar_type;
- QVariant::Type sql_longvarchar_type;
QSqlRecord rInf;
QVector<QVariant> fieldCache;
@@ -294,14 +286,10 @@ static QVariant::Type qDecodeODBCType(SQLSMALLINT sqltype, const T* p, bool isSi
break;
#endif
case SQL_CHAR:
- type = p->sql_char_type;
- break;
case SQL_VARCHAR:
case SQL_GUID:
- type = p->sql_varchar_type;
- break;
case SQL_LONGVARCHAR:
- type = p->sql_longvarchar_type;
+ type = QVariant::String;
break;
default:
type = QVariant::ByteArray;
@@ -818,9 +806,6 @@ QODBCResult::QODBCResult(const QODBCDriver * db, QODBCDriverPrivate* p)
d->hDbc = p->hDbc;
d->unicode = p->unicode;
d->useSchema = p->useSchema;
- d->sql_char_type = p->sql_char_type;
- d->sql_varchar_type = p->sql_varchar_type;
- d->sql_longvarchar_type = p->sql_longvarchar_type;
d->disconnectCount = p->disconnectCount;
d->hasSQLFetchScroll = p->hasSQLFetchScroll;
}
@@ -1875,7 +1860,6 @@ void QODBCDriverPrivate::checkUnicode()
sizeof(fFunc),
NULL);
if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && (fFunc & SQL_CVT_WCHAR)) {
- sql_char_type = QVariant::String;
unicode = true;
}
@@ -1885,7 +1869,6 @@ void QODBCDriverPrivate::checkUnicode()
sizeof(fFunc),
NULL);
if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && (fFunc & SQL_CVT_WVARCHAR)) {
- sql_varchar_type = QVariant::String;
unicode = true;
}
@@ -1895,7 +1878,6 @@ void QODBCDriverPrivate::checkUnicode()
sizeof(fFunc),
NULL);
if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && (fFunc & SQL_CVT_WLONGVARCHAR)) {
- sql_longvarchar_type = QVariant::String;
unicode = true;
}
}
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index 1ab8214..d197388 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -531,7 +531,7 @@ bool QPSQLResult::prepare(const QString &query)
{
if (!d->preparedQueriesEnabled)
return QSqlResult::prepare(query);
-
+
cleanup();
if (!d->preparedStmtId.isEmpty())
@@ -821,7 +821,20 @@ bool QPSQLDriver::commitTransaction()
return false;
}
PGresult* res = PQexec(d->connection, "COMMIT");
- if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
+
+ bool transaction_failed = false;
+
+ // XXX
+ // This hack is used to tell if the transaction has succeeded for the protocol versions of
+ // PostgreSQL below. For 7.x and other protocol versions we are left in the dark.
+ // This hack can dissapear once there is an API to query this sort of information.
+ if (d->pro == QPSQLDriver::Version8 ||
+ d->pro == QPSQLDriver::Version81 ||
+ d->pro == QPSQLDriver::Version82) {
+ transaction_failed = QByteArray(PQcmdStatus(res)) == QByteArray("ROLLBACK")?true:false;
+ }
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK || transaction_failed) {
PQclear(res);
setLastError(qMakeError(tr("Could not commit transaction"),
QSqlError::TransactionError, d));
@@ -1189,12 +1202,12 @@ bool QPSQLDriver::subscribeToNotificationImplementation(const QString &name)
qPrintable(name));
return false;
}
-
+
int socket = PQsocket(d->connection);
if (socket) {
QString query = QLatin1String("LISTEN ") + escapeIdentifier(name, QSqlDriver::TableName);
- if (PQresultStatus(PQexec(d->connection,
- d->isUtf8 ? query.toUtf8().constData()
+ if (PQresultStatus(PQexec(d->connection,
+ d->isUtf8 ? query.toUtf8().constData()
: query.toLocal8Bit().constData())
) != PGRES_COMMAND_OK) {
setLastError(qMakeError(tr("Unable to subscribe"), QSqlError::StatementError, d));
@@ -1225,8 +1238,8 @@ bool QPSQLDriver::unsubscribeFromNotificationImplementation(const QString &name)
}
QString query = QLatin1String("UNLISTEN ") + escapeIdentifier(name, QSqlDriver::TableName);
- if (PQresultStatus(PQexec(d->connection,
- d->isUtf8 ? query.toUtf8().constData()
+ if (PQresultStatus(PQexec(d->connection,
+ d->isUtf8 ? query.toUtf8().constData()
: query.toLocal8Bit().constData())
) != PGRES_COMMAND_OK) {
setLastError(qMakeError(tr("Unable to unsubscribe"), QSqlError::StatementError, d));
@@ -1259,7 +1272,7 @@ void QPSQLDriver::_q_handleNotification(int)
if (d->seid.contains(name))
emit notification(name);
else
- qWarning("QPSQLDriver: received notification for '%s' which isn't subscribed to.",
+ qWarning("QPSQLDriver: received notification for '%s' which isn't subscribed to.",
qPrintable(name));
qPQfreemem(notify);