блог-форум о программировании
Вы не вошли.
Вкусная фишечка обнаружена в PostgreSQL и спустя десяток минут капания в исходниках Qt 5.0.2 - возможность получения асинхронных уведомлений по сигналу от драйвера QPSQLDriver с параметром (Payload)!
В устаревших доках этой вкусности нет.
Судя по коду из "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) проверено и работает.
Привожу код, так понятнее:
//...
//...
//...
// Откроем два соединения, одно для данных и транзакций, второе типа служебное
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'
Все счастливы!
ЗЫ: Вполне возможно кому-то и не "открыл Америку" ... но на просторах сети - грусть и печаль по этому вопросу!
:: Мои программные ништяки ::
Вне форума
[ Сгенерировано за 0.066 сек, 9 запросов выполнено - Использовано памяти: 2.26 Мбайт (Пик: 2.72 Мбайт) ]