I need notifications to a C application on inserts to a table. The notification funcion is listed below. My program and "Example 31-2. libpq Example Program 2" receive the notification, but the payload message in "PGnotify *notify->extra" is invalid.
The example code is located here: https://www.postgresql.org/docs/current/libpq-example.html
I modified the code to include the "extra" member in the following statement:
fprintf(stderr,
"ASYNC NOTIFY of '%s' received from backend PID %d: %s\n",
notify->relname, notify->be_pid, notify->extra);
"ASYNC NOTIFY of '%s' received from backend PID %d: %s\n",
notify->relname, notify->be_pid, notify->extra);
Both the example and my application core on an invalid address for "extra". Using psql with LISTEN works correctly. My application works as expected except for the payload message. I was unable to locate any example of how to retrieve the payload in C. The "extra" member is a char*.
================================================
CREATE OR REPLACE FUNCTION OS_FB_UPDATE_FCNFY()
RETURNS trigger
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
notification TEXT;
BEGIN
notification :=
NEW.node_id || ':' ||
NEW.block_id || ':' ||
NEW.operation || ':' ||
NEW.update_class || ':' ||
NEW.update_data || ':' ||
to_char(COALESCE(NEW.time_stamp, current_timestamp), 'MM-DD-YYY HH24:MI:SS');
PERFORM pg_notify('notifyondatachange', row_to_json(NEW)::text);
RETURN NEW;
EXCEPTION
WHEN others THEN
RAISE WARNING '[ONSITE.OS_FB_UPDATE_FCNFY] - UDF ERROR [OTHER] - SQLSTATE: %, SQLERRM: %', SQLSTATE, SQLERRM;
END
$BODY$;
RETURNS trigger
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
notification TEXT;
BEGIN
notification :=
NEW.node_id || ':' ||
NEW.block_id || ':' ||
NEW.operation || ':' ||
NEW.update_class || ':' ||
NEW.update_data || ':' ||
to_char(COALESCE(NEW.time_stamp, current_timestamp), 'MM-DD-YYY HH24:MI:SS');
PERFORM pg_notify('notifyondatachange', row_to_json(NEW)::text);
RETURN NEW;
EXCEPTION
WHEN others THEN
RAISE WARNING '[ONSITE.OS_FB_UPDATE_FCNFY] - UDF ERROR [OTHER] - SQLSTATE: %, SQLERRM: %', SQLSTATE, SQLERRM;
END
$BODY$;