*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.90 2000/02/07 23:10:10 petere Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.91 2000/02/24 04:50:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/*
* NOTIFY and NOTICE messages can happen in any state besides COPY
* OUT; always process them right away.
+ *
+ * Most other messages should only be processed while in BUSY state.
+ * (In particular, in READY state we hold off further parsing until
+ * the application collects the current PGresult.)
+ *
+ * However, if the state is IDLE then we got trouble; we need to
+ * deal with the unexpected message somehow.
*/
if (id == 'A')
{
if (getNotice(conn))
return;
}
- else
+ else if (conn->asyncStatus != PGASYNC_BUSY)
{
-
+ /* If not IDLE state, just wait ... */
+ if (conn->asyncStatus != PGASYNC_IDLE)
+ return;
/*
- * Other messages should only be processed while in BUSY
- * state. (In particular, in READY state we hold off further
- * parsing until the application collects the current
- * PGresult.) If the state is IDLE then we got trouble.
+ * Unexpected message in IDLE state; need to recover somehow.
+ * ERROR messages are displayed using the notice processor;
+ * anything else is just dropped on the floor after displaying
+ * a suitable warning notice. (An ERROR is very possibly the
+ * backend telling us why it is about to close the connection,
+ * so we don't want to just discard it...)
*/
- if (conn->asyncStatus != PGASYNC_BUSY)
+ if (id == 'E')
{
- if (conn->asyncStatus == PGASYNC_IDLE)
- {
- sprintf(noticeWorkspace,
- "Backend message type 0x%02x arrived while idle\n",
- id);
- DONOTICE(conn, noticeWorkspace);
- /* Discard the unexpected message; good idea?? */
- conn->inStart = conn->inEnd;
- }
- return;
+ if (getNotice(conn))
+ return;
+ }
+ else
+ {
+ sprintf(noticeWorkspace,
+ "Backend message type 0x%02x arrived while idle\n",
+ id);
+ DONOTICE(conn, noticeWorkspace);
+ /* Discard the unexpected message; good idea?? */
+ conn->inStart = conn->inEnd;
+ break;
}
+ }
+ else
+ {
+ /*
+ * In BUSY state, we can process everything.
+ */
switch (id)
{
case 'C': /* command complete */