Thread: 31.11. Notice Processing - associating notices with calls

31.11. Notice Processing - associating notices with calls

From
Pawel Veselov
Date:
Hi.

What's the best way to "associate" an incoming notice with the statement that resulted in generating it? Notice operate on PGResult objects, but these objects only become available after the statement call is made. Should I have a global (or thread global, since my app is MT) "flag" that would tell the receiver what statement was executed last? I assume that the execution path is that notice call back is invoked while the statement function executes.

Thank you,
  Pawel.


Re: 31.11. Notice Processing - associating notices with calls

From
Tom Lane
Date:
Pawel Veselov <pawel.veselov@gmail.com> writes:
> What's the best way to "associate" an incoming notice with the statement
> that resulted in generating it?

Um ... the first issue with this problem statement is the assumption
that there *is* a statement that caused the notice.  The server is
capable of generating notices autonomously, for example during a forced
database shutdown.  But having said that, you could certainly keep track
of which command you last issued.

> Notice operate on PGResult objects, but
> these objects only become available after the statement call is made.

I think you are misunderstanding the notice receiver API.  The PGresult
that's passed to the receiver is just a transient one created to hold
the notice message's fields.  It has nothing to do with the PGresult
generated to hold the eventual result of the current query (if any).

            regards, tom lane

Re: 31.11. Notice Processing - associating notices with calls

From
Pawel Veselov
Date:

On Mon, Jun 25, 2012 at 8:07 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Pawel Veselov <pawel.veselov@gmail.com> writes:
> What's the best way to "associate" an incoming notice with the statement
> that resulted in generating it?

Um ... the first issue with this problem statement is the assumption
that there *is* a statement that caused the notice.  The server is
capable of generating notices autonomously, for example during a forced
database shutdown.  But having said that, you could certainly keep track
of which command you last issued.

Is there then any way to know if a notice came from a statement? My issue is that there are some statements that generate notices that I can safely dismiss (CREATE something IF NOT EXISTS), but I don't want to dismiss any other. I believe notices are not asynchronous (I don't use any asynchronous API), so if there is a pending notice on the connection, and if I set the "current" statement, and execute it, I will first get the pending notice, and only then the statement-related notice.
 

> Notice operate on PGResult objects, but
> these objects only become available after the statement call is made.

I think you are misunderstanding the notice receiver API.  The PGresult
that's passed to the receiver is just a transient one created to hold
the notice message's fields.  It has nothing to do with the PGresult
generated to hold the eventual result of the current query (if any).

Yes, I did misunderstand it. Is there a "standard" of what would be in this result object?