From 5caa75f6654d1475dcd2d118e240b683a617d735 Mon Sep 17 00:00:00 2001 From: Torben Dannhauer Date: Tue, 24 Jan 2012 21:27:36 +0100 Subject: SQL driver implementation to signal notification sources Implements the new notification signal in all QSql drivers which use notifcation. In qt5 only ibase and psql have a notification implementation. PSQL differentiates correctly between 'SelfSource' and 'OtherSource' whereas ibase only signals 'UnknownSource' as a default implementation. Change-Id: Ifcaa139b7a980ed852cf817b3f93284609360ca7 Reviewed-by: Torben Dannhauer Reviewed-by: Yunqiao Yin --- src/sql/drivers/ibase/qsql_ibase.cpp | 4 +++- src/sql/drivers/psql/qsql_psql.cpp | 7 ++++++- src/sql/kernel/qsqldriver.cpp | 17 ++++++++++++++--- src/sql/kernel/qsqldriver.h | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) (limited to 'src/sql') diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp index 7a98803efc..1109dfd62a 100644 --- a/src/sql/drivers/ibase/qsql_ibase.cpp +++ b/src/sql/drivers/ibase/qsql_ibase.cpp @@ -1845,8 +1845,10 @@ void QIBaseDriver::qHandleEventNotification(void *updatedResultBuffer) isc_event_counts(counts, eBuffer->bufferLength, eBuffer->eventBuffer, eBuffer->resultBuffer); if (counts[0]) { - if (eBuffer->subscriptionState == QIBaseEventBuffer::Subscribed) + if (eBuffer->subscriptionState == QIBaseEventBuffer::Subscribed) { emit notification(i.key()); + emit notification(i.key(), QSqlDriver::UnknownSource); + } else if (eBuffer->subscriptionState == QIBaseEventBuffer::Starting) eBuffer->subscriptionState = QIBaseEventBuffer::Subscribed; diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index 8985184e13..e3533581ba 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -1370,8 +1370,13 @@ void QPSQLDriver::_q_handleNotification(int) PGnotify *notify = 0; while((notify = PQnotifies(d->connection)) != 0) { QString name(QLatin1String(notify->relname)); - if (d->seid.contains(name)) + if (d->seid.contains(name)) { emit notification(name); + if (notify->be_pid == PQbackendPID(d->connection)) + emit notification(name, QSqlDriver::SelfSource); + else + emit notification(name, QSqlDriver::OtherSource); + } else qWarning("QPSQLDriver: received notification for '%s' which isn't subscribed to.", qPrintable(name)); diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp index 130eec0239..861cd4ad0f 100644 --- a/src/sql/kernel/qsqldriver.cpp +++ b/src/sql/kernel/qsqldriver.cpp @@ -130,6 +130,17 @@ QSqlDriver::~QSqlDriver() \sa subscribeToNotification() */ +/*! + \since 5.0 + + \fn QSqlDriver::notification(const QString &name, NotificationSource source) + + This signal is emitted when the database posts an event notification + that the driver subscribes to. \a name identifies the event notification, \a source indicates the signal source. + + \sa subscribeToNotification() +*/ + /*! \fn bool QSqlDriver::open(const QString &db, const QString &user, const QString& password, const QString &host, int port, const QString &options) @@ -242,9 +253,9 @@ bool QSqlDriver::isOpenError() const This enum contains a list of SQL notification sources. - \value Unknown The notification source is unknown - \value Self The notification source is the own connection - \value Other The notification source is another connection + \value UnknownSource The notification source is unknown + \value SelfSource The notification source is this connection + \value OtherSource The notification source is another connection */ /*! diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index cd5048243d..5fd74411db 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -78,7 +78,7 @@ public: enum IdentifierType { FieldName, TableName }; - enum NotificationSource { Unknown, Self, Other }; + enum NotificationSource { UnknownSource, SelfSource, OtherSource }; explicit QSqlDriver(QObject *parent=0); ~QSqlDriver(); -- cgit v1.2.3