> -----Original Message-----
> From: Tom Lane [mailto:[EMAIL PROTECTED]]
> Sent: Friday, May 17, 2002 4:38 PM
> To: Dann Corbit
> Cc: [EMAIL PROTECTED]
> Subject: Re: [HACKERS] Error on PQputline() 
> 
> 
> "Dann Corbit" <[EMAIL PROTECTED]> writes:
> >> You're running libpq with the nonblocking mode selected?
> 
> > Actually no.  It should be the default mode for a connection made by
> > PQconnectdb().  That's what made the error so puzzling.
> 
> I'm confused too.  For starters, I cannot find that error message
> string about 'A non-blocking socket operation could not be completed
> immediately' anywhere.  Got any idea what's producing that?  Exactly
> which version of libpq are you using, anyway?

7.1.3.  Sorry for running on fossil PostgreSQL.

/* ---------------------------------------------------------------------
*/
/* pqFlush: send any data waiting in the output buffer
 */
int
pqFlush(PGconn *conn)
{
        char       *ptr = conn->outBuffer;
        int                     len = conn->outCount;

        if (conn->sock < 0)
        {
                printfPQExpBuffer(&conn->errorMessage,
                                                  "pqFlush() --
connection not open\n");
                return EOF;
        }

        /*
         * don't try to send zero data, allows us to use this function
without
         * too much worry about overhead
         */
        if (len == 0)
                return (0);

        /* while there's still data to send */
        while (len > 0)
        {
                /* Prevent being SIGPIPEd if backend has closed the
connection. */
#ifndef WIN32
                pqsigfunc       oldsighandler = pqsignal(SIGPIPE,
SIG_IGN);

#endif

                int                     sent;

#ifdef USE_SSL
                if (conn->ssl)
                        sent = SSL_write(conn->ssl, ptr, len);
                else
#endif
                        sent = send(conn->sock, ptr, len, 0);

#ifndef WIN32
                pqsignal(SIGPIPE, oldsighandler);
#endif

                if (sent < 0)
                {

                        /*
                         * Anything except EAGAIN or EWOULDBLOCK is
trouble. If it's
                         * EPIPE or ECONNRESET, assume we've lost the
backend
                         * connection permanently.
                         */
                        switch (errno)
                        {
#ifdef EAGAIN
                                case EAGAIN:
                                        break;
#endif
#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK !=
EAGAIN))
                                case EWOULDBLOCK:
                                        break;
#endif
                                case EINTR:
                                        continue;

                                case EPIPE:
#ifdef ECONNRESET
                                case ECONNRESET:
#endif
        
printfPQExpBuffer(&conn->errorMessage,
        
"pqFlush() -- backend closed the channel unexpectedly.\n"
        
"\tThis probably means the backend terminated abnormally"
                                                   " before or while
processing the request.\n");

                                        /*
                                         * We used to close the socket
here, but that's a bad
                                         * idea since there might be
unread data waiting
                                         * (typically, a NOTICE message
from the backend
                                         * telling us it's committing
hara-kiri...).  Leave
                                         * the socket open until
pqReadData finds no more data
                                         * can be read.
                                         */
                                        return EOF;
/*
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
vvvvvvv
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!
*/
                                default:
        
printfPQExpBuffer(&conn->errorMessage,
                                          "pqFlush() --  couldn't send
data: errno=%d\n%s\n",
        
errno, strerror(errno));
                                        /* We don't assume it's a fatal
error... */
                                        return EOF;
/*
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!
*/
                        }
                }
                else
                {
                        ptr += sent;
                        len -= sent;
                }

                if (len > 0)
                {
                        /* We didn't send it all, wait till we can send
more */

                        /*
                         * if the socket is in non-blocking mode we may
need to abort
                         * here
                         */
#ifdef USE_SSL
                        /* can't do anything for our SSL users yet */
                        if (conn->ssl == NULL)
                        {
#endif
                                if (pqIsnonblocking(conn))
                                {
                                        /* shift the contents of the
buffer */
                                        memmove(conn->outBuffer, ptr,
len);
                                        conn->outCount = len;
                                        return EOF;
                                }
#ifdef USE_SSL
                        }
#endif

                        if (pqWait(FALSE, TRUE, conn))
                                return EOF;
                }
        }

        conn->outCount = 0;

        if (conn->Pfdebug)
                fflush(conn->Pfdebug);

        return 0;
}
 
> > "Would it be faster to write a file to disk and read it again on the
> > local host for the server or to send the calls via libpq client
> > messages?"
> 
> Good question.  I'd recommend the messaging approach since it 
> eliminates
> lots of headaches about file access privileges and so forth.  But on
> some platforms the overhead could be high.
> 
>                       regards, tom lane
> 

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to