Я установил триггер и проверил, используя pgadmin4 (используя LISTEN), который изменяет мою таблицу, получая уведомления. Ожидается, что веб-интерфейс может вносить изменения в настройки, и мой бэкэнд-код должен принять эти изменения и применить.
Я создал небольшой класс (функции встроены), расширяющий класс получателя уведомлений.
class SettingsChangeListener: public pqxx::notification_receiver
{
public:
SettingsChangeListener(pqxx::connection_base &c);
virtual void operator()(const std::string &payload, int backend_pid)
throw ();
void RegisterParentData(SINT32 queueId, UINT32 eventID);
private:
SINT32 m_parentQueueHandle; // handle to the parent's message queue
UINT32 m_eventID; // event to send to the parent on notification
};
inline SettingsChangeListener::SettingsChangeListener(pqxx::connection_base &c)
: pqxx::notification_receiver(c, "settings_changed"), m_parentQueueHandle(0), m_eventID(0)
{
}
inline void SettingsChangeListener::operator()(const std::string &payload, int backend_pid)
throw ()
{
if (m_parentQueueHandle > 0)
{
LOG_SYSTEM_INFO("Detected Change in Settings\n");
// don't need the notification text - notify parent that the data has changed
CmnMessage msg;
msg.SetMessageID(m_eventID);
msg.SetMessageType(MESSAGE_TYPE_Local);
msg.SetMessageSource(MODULE_DATABASE);
MsgQueueMessage msgToSend;
size_t size = msg.Export(msgToSend);
if (FAIL == msgsnd(m_parentQueueHandle, &msgToSend, size, IPC_NOWAIT))
{
LOG_SYSTEM_ERROR("FAILED to send message on queue : %s\n", strerror(errno));
}
}
}
inline void SettingsChangeListener::RegisterParentData(SINT32 queueId, UINT32 eventID)
{
m_parentQueueHandle = msgget(queueId, IPC_CREAT | MSGQ_CREAT_PERMISSION);
m_eventID = eventID;
}
В одном из моих других классов я включил член SettingsChangeListener и инициализировал в конструкторе этот класс.
MyClass::MyClass()
: m_connection(DB_CONNECTION_STRING.c_str()), m_settingsDbAdapter(m_connection), m_settingsChangeListener(m_connection)
{}
Соединение и член сохраняются в течение всего срока действия приложения. Адаптер БД - это класс, который управляет таблицей настроек (добавление / обновление / удаление / получение) и работает без проблем.
Я ставлю точку останова в операторе () (), и она никогда не срабатывает, и я никогда не видеть уведомление. Я установил точку останова и подтвердил, что регистрация родительских данных произошла, как и ожидалось.
Я впервые использую pqxx, и не все функции кажутся простыми для реализации. Я думаю, что есть что-то простое, что мне не хватает, но я просто не могу его найти.