MyTetra Share
Делитесь знаниями!
Пример подключения к оповещениям БД 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 &notify : 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 &notifyName, QSqlDriver::NotificationSource source, const QVariant &payload)

{

Q_UNUSED(source)

qDebug() << "Notify:" << notifyName << ", payload:" << payload.toString();

this->onSqlNotify(notifyName);

});

#endif


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования