|
|||||||
Пример подключения к оповещениям БД PostgreSQL для Qt4 и Qt5
Время создания: 15.11.2024 15:15
Текстовые метки: postgresql, sql, notify, qt, qt4, qt5, оповещения, подключение, код, пример
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Базы данных
Запись: xintrea/mytetra_syncro/master/base/1731672954yci0gsdqcm/text.html на raw.github.com
|
|||||||
|
|||||||
Ниже дан пример кода, в котором происходит подключение C++ кода к оповещениям (notify), генерирующимся в PostgreSQL. Данный код работает как в Qt4, так и в Qt5. QSqlDatabase pgSqlDb if ( QSqlDatabase::contains(localConnectionName) ) { // Соединение уже было ранее создано pgSqlDb = QSqlDatabase::database(localConnectionName); } else { // Создается новое соединение pgSqlDb = QSqlDatabase::addDatabase("QPSQL", localConnectionName); pgSqlDb.setHostName ( m_fullConnectSettings->getLocalConnectionHostName() ); pgSqlDb.setDatabaseName( m_fullConnectSettings->getLocalConnectionDatabaseName() ); pgSqlDb.setUserName ( m_fullConnectSettings->getLocalConnectionUserName() ); pgSqlDb.setPassword ( m_fullConnectSettings->getLocalConnectionPassword() ); } // Если данное соединение еще не было открыто if ( !pgSqlDb.isOpen() ) { bool openResult = pgSqlDb.open(); // Соединение открывается if( !openResult ) { qWarning() << Q_FUNC_INFO << "Ошибка: невозможно открыть локальное БД-соединение " << localConnectionName; return; } } // Формирование перечня названий оповещений, к которым надо подключиться // предполагается, что в каждой таблице есть уведомления с именами // syncnotify_insert, syncnotify_update QStringList notifies; QStringList tables = m_fullConnectSettings->getSynchroTables(); for ( const auto &table : tables ) { QStringList actions = QStringList() << "insert" << "update"; for ( const auto &action : actions ) { notifies.append( QString("syncnotify_%1_%2").arg(action).arg(table)); } } // Подписка на оповещения for ( const auto ¬ify : notifies ) { if ( !pgSqlDb.driver()->subscribeToNotification(notify) ) { qWarning() << Q_FUNC_INFO << "Ошибка: невозможно подписаться на SQL-оповещение " << notify; qWarning() << Q_FUNC_INFO << pgSqlDb.driver()->lastError().databaseText(); continue; } } // Код для Qt4 #if QT_VERSION < 0x050000 QObject::connect(pgSqlDb.driver(), SIGNAL(notification(const QString&)), this, SLOT(onSqlNotify(const QString &))); #endif // Код для Qt5 #if QT_VERSION >= 0x050000 QObject::connect(pgSqlDb.driver(), static_cast<void(QSqlDriver::*)(const QString &, QSqlDriver::NotificationSource, const QVariant &)>(&QSqlDriver::notification), [=](const QString ¬ifyName, QSqlDriver::NotificationSource source, const QVariant &payload) { Q_UNUSED(source) qDebug() << "Notify:" << notifyName << ", payload:" << payload.toString(); this->onSqlNotify(notifyName); }); #endif |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|