блог-форум о программировании

Вы не вошли.

#1 2017-11-20 18:42:21

Majestio
Администратор
Здесь с 2017-11-17
Сообщений: 74
Windows 10Firefox 57.0

Уведомления с аргументом (NOTIFY & Payload & Qt-5.0.2)


Уведомления с аргументом (NOTIFY & Payload & Qt-5.0.2)


Вкусная фишечка обнаружена в PostgreSQL и спустя десяток минут капания в исходниках Qt 5.0.2 - возможность получения асинхронных уведомлений по сигналу от драйвера QPSQLDriver с параметром (Payload)!
В устаревших доках этой вкусности нет.

1) О версиях

Судя по коду из "qtbase/src/sql/drivers/psql/qsql_psql.cpp":

        if (d->seid.contains(name)) {
            QString payload;
#if defined PG_VERSION_NUM && PG_VERSION_NUM-0 >= 70400
            if (notify->extra)
                payload = d->isUtf8 ? QString::fromUtf8(notify->extra) 
                                           : QString::fromLatin1(notify->extra);
#endif
            emit notification(name);
            QSqlDriver::NotificationSource source = 
                           (notify->be_pid == PQbackendPID(d->connection)) ? 
                           QSqlDriver::SelfSource : QSqlDriver::OtherSource;

И по документации, PostgreSQL похоже должен быть версии 7.4+
Про Qt можно утверждать (ссылка на BUGFIX), что требуется Qt 5.0.0+
В последней на момент написания (5.0.2) проверено и работает.

2) О реализации

Привожу код, так понятнее:

//...
//...
//...
// Откроем два соединения, одно для данных и транзакций, второе типа служебное
QSqlDatabase DataBase = QSqlDatabase::addDatabase("QPSQL","First");
QSqlDatabase TechBase = QSqlDatabase::addDatabase("QPSQL","Second");
// Инициализация
DataBase.setHostName("192.168.1.100");
DataBase.setDatabaseName("database");
DataBase.setUserName("pgsql");
DataBase.setPassword("password");
 
TechBase.setHostName("192.168.1.100");
TechBase.setDatabaseName("database");
TechBase.setUserName("pgsql");
TechBase.setPassword("password");
// Открытие базы
if (DataBase.open() && TechBase.open()) {
        // Подписываемся на канал "Virtual"
        if (!TechBase.driver()->subscribeToNotification("Virtual")) 
           qDebug( qPrintable(TechBase.driver()->lastError().databaseText()));
        // Подключаем слот для асинхронных уведомлений
        connect(
           TechBase.driver(), 
           SIGNAL(notification(const QString &, QSqlDriver::NotificationSource, const QVariant &)), 
           this, 
           SLOT(SlotNotify(const QString &, QSqlDriver::NotificationSource, const QVariant &))
        );
}
//...
//...
//...
// А это реализация слота
void MainWindow::SlotNotify(const QString &iName, 
                            QSqlDriver::NotificationSource iSource, 
                            const QVariant &iPayload) 
{
   // собственно в iPayload и прилетает искомый аргумент по каналу iName
   qDebug() << "NOTIFY - Name:" << iName << ", Payload:" << iPayload.toString();
}
//...
//...
//...

Тестируем таким запросом из-вне:

NOTIFY "Virtual", 'Payload with many args'

Все счастливы! :D

ЗЫ: Вполне возможно кому-то и не "открыл Америку" ... но на просторах сети - грусть и печаль по этому вопросу!

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] CCBot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.196 сек, 7 запросов выполнено - Использовано памяти: 2.1 Мбайт (Пик: 2.63 Мбайт) ]

000webhost logo