pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
WIN32 NON-BLOCKING
3+ messages / 2 participants
[nested] [flat]

* WIN32 NON-BLOCKING
@ 2001-07-16 22:46 Darko Prenosil <darko_prenosil@yahoo.com>
  2001-07-17 14:11 ` Re: WIN32 NON-BLOCKING Bruce Momjian <pgman@candle.pha.pa.us>
  0 siblings, 1 reply; 3+ messages in thread

From: Darko Prenosil @ 2001-07-16 22:46 UTC (permalink / raw)
  To: pgsql-interfaces

Hi ,Bruce !
There is diff for fe-connect.c.
Diff was made with options -cr as You asked.
I must say that this is the first time I ever use diff, so I do not know if
if it is ok.

I did not check if all of non-blocking functions are working,
but I checked PQsetnonblocking,PQisnonblocking,
PQsendQuery, PQgetResult and few others.
I think that



inline patch 1: ./fe-connect1.c Fri Jun 29 05:25:18 2001 (+7/-6 lines) download inline-1.patch*** ./fe-connect.c Tue Jun 12 20:03:04 2001 --- ./fe-connect1.c Fri Jun 29 05:25:18 2001 *************** *** 189,195 **** static void defaultNoticeProcessor(void *arg, const char *message); static int parseServiceInfo(PQconninfoOption *options, PQExpBuffer errorMessage); ! /* ---------------- * Connecting to a Database --- 189,195 ---- static void defaultNoticeProcessor(void *arg, const char *message); static int parseServiceInfo(PQconninfoOption *options, PQExpBuffer errorMessage); ! static char FLastError[200]; /* ---------------- * Connecting to a Database *************** *** 240,249 **** PQconnectdb(const char *conninfo) { PGconn *conn = PQconnectStart(conninfo); - if (conn && conn->status != CONNECTION_BAD) (void) connectDBComplete(conn); - return conn; } --- 240,247 ---- *************** *** 291,296 **** --- 289,295 ---- { conn->status = CONNECTION_BAD; /* errorMessage is already set */ + sprintf( FLastError, "PQconnectStart-Invalid Connection Info"); return conn; } *************** *** 516,523 **** conn->require_ssl = 0; #endif ! if (error) conn->status = CONNECTION_BAD; else { if (connectDBStart(conn)) --- 515,524 ---- conn->require_ssl = 0; #endif ! if (error){ conn->status = CONNECTION_BAD; + sprintf( FLastError, "Failed to set DBLogin"); + } else { if (connectDBStart(conn)) *************** *** 709,717 **** if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0) #endif { printfPQExpBuffer(&conn->errorMessage, ! "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n", ! errno, strerror(errno)); return 0; } --- 710,724 ---- if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0) #endif { + #ifdef WIN32 + sprintf( FLastError, "connectMakeNonblocking -- fcntl() failed:
errno=%d\n%s\n", + WSAGetLastError()); + #else printfPQExpBuffer(&conn->errorMessage, ! "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n", ! errno, strerror(errno)); ! #endif ! return 0; } *************** *** 788,794 **** { int portno, family; - #ifdef USE_SSL StartupPacket np; /* Used to negotiate SSL connection */ char SSLok; --- 795,800 ---- *************** *** 932,943 **** * Thus, we have make arrangements for all eventualities. * ---------- */ if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0) { - #ifndef WIN32 if (errno == EINPROGRESS || errno == 0) #else ! if (WSAGetLastError() == WSAEINPROGRESS) #endif { --- 938,952 ---- * Thus, we have make arrangements for all eventualities. * ---------- */ + + #ifndef WIN32 if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0) { if (errno == EINPROGRESS || errno == 0) #else ! if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) != 0) ! { ! if (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK) #endif { *************** *** 1056,1061 **** --- 1065,1071 ---- conn->status = CONNECTION_BAD; return 0; + } *************** *** 1095,1100 **** --- 1105,1111 ---- if (pqWait(1, 0, conn)) { conn->status = CONNECTION_BAD; + sprintf(FLastError,conn->errorMessage.data); return 0; } break; *************** *** 1103,1108 **** --- 1114,1120 ---- if (pqWait(0, 1, conn)) { conn->status = CONNECTION_BAD; + sprintf(FLastError,conn->errorMessage.data); return 0; } break; *************** *** 1110,1115 **** --- 1122,1128 ---- default: /* Just in case we failed to set it in PQconnectPoll */ conn->status = CONNECTION_BAD; + sprintf(FLastError,conn->errorMessage.data); return 0; } *************** *** 1208,1222 **** { ACCEPT_TYPE_ARG3 laddrlen; - #ifndef WIN32 - int optval; - - #else - char optval; - - #endif - ACCEPT_TYPE_ARG3 optlen = sizeof(optval); - /* * Write ready, since we've made it here, so the * connection has been made. --- 1221,1226 ---- *************** *** 1226,1235 **** * Now check (using getsockopt) that there is not an error * state waiting for us on the socket. */ if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR, ! (char *) &optval, &optlen) == -1) ! { printfPQExpBuffer(&conn->errorMessage, "PQconnectPoll() -- getsockopt() failed: " "errno=%d\n%s\n", --- 1230,1241 ---- * Now check (using getsockopt) that there is not an error * state waiting for us on the socket. */ + #ifndef WIN32 + int optval; + ACCEPT_TYPE_ARG3 optlen = sizeof(optval); if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR, ! (char *) &optval, &optlen) == -1){ printfPQExpBuffer(&conn->errorMessage, "PQconnectPoll() -- getsockopt() failed: " "errno=%d\n%s\n", *************** *** 1247,1252 **** --- 1253,1272 ---- connectFailureMessage(conn, "PQconnectPoll()", optval); goto error_return; } + #else + char far optval[8]; + ACCEPT_TYPE_ARG3 optlen = sizeof(optval); + + int OptResult=getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,optval, &optlen); + if (OptResult==SOCKET_ERROR){ + printfPQExpBuffer(&conn->errorMessage, + "PQconnectPoll() -- getsockopt() failed: " + "errno=%i\n", + WSAGetLastError()); + connectFailureMessage(conn, "PQconnectPoll()", OptResult); + goto error_return; + } + #endif /* Fill in the client address */ laddrlen = sizeof(conn->laddr); *************** *** 1929,1934 **** --- 1949,1955 ---- #endif if (conn->sock >= 0) #ifdef WIN32 + //WSACleanup(); closesocket(conn->sock); #else close(conn->sock); *************** *** 2699,2706 **** char * PQerrorMessage(const PGconn *conn) { if (!conn) ! return "PQerrorMessage: conn pointer is NULL\n"; return conn->errorMessage.data; } --- 2720,2732 ---- char * PQerrorMessage(const PGconn *conn) { + //char ErrBuffer[200]; if (!conn) ! #ifdef WIN32 ! return FLastError; ! #else ! return "PQerrorMessage: conn pointer is NULL\n"; ! #endif return conn->errorMessage.data; } ^ permalink raw reply [nested|flat] 3+ messages in thread

* Re: WIN32 NON-BLOCKING
  2001-07-16 22:46 WIN32 NON-BLOCKING Darko Prenosil <darko_prenosil@yahoo.com>
@ 2001-07-17 14:11 ` Bruce Momjian <pgman@candle.pha.pa.us>
  0 siblings, 0 replies; 3+ messages in thread

From: Bruce Momjian @ 2001-07-17 14:11 UTC (permalink / raw)
  To: Darko Prenosil <darko_prenosil@yahoo.com>; +Cc: pgsql-interfaces

FYI, please see that I have two libpq win32 patches at:

	http://candle.pha.pa.us/cgi-bin/pgpatches

I will need these two patches merged into one patch.

> Hi ,Bruce !
> There is diff for fe-connect.c.
> Diff was made with options -cr as You asked.
> I must say that this is the first time I ever use diff, so I do not know if
> if it is ok.
> 
> I did not check if all of non-blocking functions are working,
> but I checked PQsetnonblocking,PQisnonblocking,
> PQsendQuery, PQgetResult and few others.
> I think that
> 
> 
> 
> *** ./fe-connect.c Tue Jun 12 20:03:04 2001
> --- ./fe-connect1.c Fri Jun 29 05:25:18 2001
> ***************
> *** 189,195 ****
>   static void defaultNoticeProcessor(void *arg, const char *message);
>   static int parseServiceInfo(PQconninfoOption *options,
>        PQExpBuffer errorMessage);
> !
> 
>   /* ----------------
>    *  Connecting to a Database
> --- 189,195 ----
>   static void defaultNoticeProcessor(void *arg, const char *message);
>   static int parseServiceInfo(PQconninfoOption *options,
>        PQExpBuffer errorMessage);
> ! static char FLastError[200];
> 
>   /* ----------------
>    *  Connecting to a Database
> ***************
> *** 240,249 ****
>   PQconnectdb(const char *conninfo)
>   {
>    PGconn    *conn = PQconnectStart(conninfo);
> -
>    if (conn && conn->status != CONNECTION_BAD)
>     (void) connectDBComplete(conn);
> -
>    return conn;
>   }
> 
> --- 240,247 ----
> ***************
> *** 291,296 ****
> --- 289,295 ----
>    {
>     conn->status = CONNECTION_BAD;
>     /* errorMessage is already set */
> +   sprintf( FLastError, "PQconnectStart-Invalid Connection Info");
>     return conn;
>    }
> 
> ***************
> *** 516,523 ****
>     conn->require_ssl = 0;
>   #endif
> 
> !  if (error)
>     conn->status = CONNECTION_BAD;
>    else
>    {
>     if (connectDBStart(conn))
> --- 515,524 ----
>     conn->require_ssl = 0;
>   #endif
> 
> !  if (error){
>     conn->status = CONNECTION_BAD;
> +   sprintf( FLastError, "Failed to set DBLogin");
> +  }
>    else
>    {
>     if (connectDBStart(conn))
> ***************
> *** 709,717 ****
>    if   (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
>   #endif
>    {
>     printfPQExpBuffer(&conn->errorMessage,
> !      "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n",
> !         errno, strerror(errno));
>     return 0;
>    }
> 
> --- 710,724 ----
>    if   (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
>   #endif
>    {
> +  #ifdef WIN32
> +   sprintf( FLastError, "connectMakeNonblocking -- fcntl() failed:
> errno=%d\n%s\n",
> +   WSAGetLastError());
> +  #else
>     printfPQExpBuffer(&conn->errorMessage,
> !      "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n",
> !      errno, strerror(errno));
> !  #endif
> !
>     return 0;
>    }
> 
> ***************
> *** 788,794 ****
>   {
>    int   portno,
>       family;
> -
>   #ifdef USE_SSL
>    StartupPacket np;   /* Used to negotiate SSL connection */
>    char  SSLok;
> --- 795,800 ----
> ***************
> *** 932,943 ****
>     * Thus, we have make arrangements for all eventualities.
>     * ----------
>     */
>    if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0)
>    {
> - #ifndef WIN32
>     if (errno == EINPROGRESS || errno == 0)
>   #else
> !   if (WSAGetLastError() == WSAEINPROGRESS)
>   #endif
>     {
> 
> --- 938,952 ----
>     * Thus, we have make arrangements for all eventualities.
>     * ----------
>     */
> +
> + #ifndef WIN32
>    if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0)
>    {
>     if (errno == EINPROGRESS || errno == 0)
>   #else
> !  if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) != 0)
> !  {
> !   if (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() ==
> WSAEWOULDBLOCK)
>   #endif
>     {
> 
> ***************
> *** 1056,1061 ****
> --- 1065,1071 ----
>    conn->status = CONNECTION_BAD;
> 
>    return 0;
> +
>   }
> 
> 
> ***************
> *** 1095,1100 ****
> --- 1105,1111 ----
>       if (pqWait(1, 0, conn))
>       {
>        conn->status = CONNECTION_BAD;
> +      sprintf(FLastError,conn->errorMessage.data);
>        return 0;
>       }
>       break;
> ***************
> *** 1103,1108 ****
> --- 1114,1120 ----
>       if (pqWait(0, 1, conn))
>       {
>        conn->status = CONNECTION_BAD;
> +      sprintf(FLastError,conn->errorMessage.data);
>        return 0;
>       }
>       break;
> ***************
> *** 1110,1115 ****
> --- 1122,1128 ----
>      default:
>       /* Just in case we failed to set it in PQconnectPoll */
>       conn->status = CONNECTION_BAD;
> +     sprintf(FLastError,conn->errorMessage.data);
>       return 0;
>     }
> 
> ***************
> *** 1208,1222 ****
>      {
>       ACCEPT_TYPE_ARG3 laddrlen;
> 
> - #ifndef WIN32
> -     int   optval;
> -
> - #else
> -     char  optval;
> -
> - #endif
> -     ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
> -
>       /*
>        * Write ready, since we've made it here, so the
>        * connection has been made.
> --- 1221,1226 ----
> ***************
> *** 1226,1235 ****
>        * Now check (using getsockopt) that there is not an error
>        * state waiting for us on the socket.
>        */
> 
>       if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
> !           (char *) &optval, &optlen) == -1)
> !     {
>        printfPQExpBuffer(&conn->errorMessage,
>             "PQconnectPoll() -- getsockopt() failed: "
>              "errno=%d\n%s\n",
> --- 1230,1241 ----
>        * Now check (using getsockopt) that there is not an error
>        * state waiting for us on the socket.
>        */
> + #ifndef WIN32
> +     int   optval;
> +     ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
> 
>       if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
> !           (char *) &optval, &optlen) == -1){
>        printfPQExpBuffer(&conn->errorMessage,
>             "PQconnectPoll() -- getsockopt() failed: "
>              "errno=%d\n%s\n",
> ***************
> *** 1247,1252 ****
> --- 1253,1272 ----
>        connectFailureMessage(conn, "PQconnectPoll()", optval);
>        goto error_return;
>       }
> + #else
> +     char far  optval[8];
> +     ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
> +
> +     int OptResult=getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,optval,
> &optlen);
> +     if (OptResult==SOCKET_ERROR){
> +      printfPQExpBuffer(&conn->errorMessage,
> +           "PQconnectPoll() -- getsockopt() failed: "
> +            "errno=%i\n",
> +            WSAGetLastError());
> +      connectFailureMessage(conn, "PQconnectPoll()", OptResult);
> +      goto error_return;
> +     }
> + #endif
> 
>       /* Fill in the client address */
>       laddrlen = sizeof(conn->laddr);
> ***************
> *** 1929,1934 ****
> --- 1949,1955 ----
>   #endif
>    if (conn->sock >= 0)
>   #ifdef WIN32
> +   //WSACleanup();
>     closesocket(conn->sock);
>   #else
>     close(conn->sock);
> ***************
> *** 2699,2706 ****
>   char *
>   PQerrorMessage(const PGconn *conn)
>   {
>    if (!conn)
> !   return "PQerrorMessage: conn pointer is NULL\n";
> 
>    return conn->errorMessage.data;
>   }
> --- 2720,2732 ----
>   char *
>   PQerrorMessage(const PGconn *conn)
>   {
> +  //char  ErrBuffer[200];
>    if (!conn)
> !   #ifdef WIN32
> !    return FLastError;
> !   #else
> !    return "PQerrorMessage: conn pointer is NULL\n";
> !   #endif
> 
>    return conn->errorMessage.data;
>   }
> 
> 
> 
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026



^ permalink  raw  reply  [nested|flat] 3+ messages in thread

* Re: WIN32 Non Blocking
@ 2001-07-21 19:56 Darko Prenosil <darko_prenosil@yahoo.com>
  0 siblings, 0 replies; 3+ messages in thread

From: Darko Prenosil @ 2001-07-21 19:56 UTC (permalink / raw)
  To: Bruce Momjian <pgman@candle.pha.pa.us>


> I think we are in great shape now.  Thanks. The elog() problem was
> because they didn't define FRONTEND in the compile.
>
> --
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 853-3000
>   +  If your life is a hard drive,     |  830 Blythe Avenue
>   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

I start to dig little bit further and tried to compile WIN32 with MULTIBYTE
support.
There are also a few simple problems.
In src/include/miscadmin.h there is declared external function GetUserName.

Under WIN32 there is already declared that function in winbase.h

Description from MSDN:

BOOL GetUserName(
  LPTSTR lpBuffer,  // address of name buffer
  LPDWORD nSize     // address of size of name buffer
);
The GetUserName function retrieves the user name of the current thread. This
is the name of the user currently logged onto the system.


Fortunately Compiler reports error because function arguments are not the
same.
These two functions are not the same at all !!!
I think that this header should not be imported in libpq at all, or should
be
imported only some parts, I'm not for shore yet.
Just to make it work I only disabled GetUserName using WIN32 compiler
constant.
Is there maybe some other compiler constant that means that we are compiling
client library, or should I use FRONTEND compiler constant ?

Compilation after this, and few corrections in win32.h and win32.mak passed
ok,
but now I have another problem. When I tried to test libpq.dll by setting
client encoding, I end up with this error message from server :

"Client Encoding LATIN1 is not supported !"

I think that my server is compiled without MULTIBYTE, because it also
reports error
when I try to CREATE DATABASE WITH ENCODING.
Should I be shamed to confess that I do not know how to re-compile under
Linux ?
So, I first must read the installation manuals or wait for our "Linux-Man"
that returns to work in Monday !

However I'll send you a note as soon as some testing is done !

Darko.Prenosil@finteh.hr



_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com





^ permalink  raw  reply  [nested|flat] 3+ messages in thread


end of thread, other threads:[~2001-07-21 19:56 UTC | newest]

Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2001-07-16 22:46 WIN32 NON-BLOCKING Darko Prenosil <darko_prenosil@yahoo.com>
2001-07-17 14:11 ` Bruce Momjian <pgman@candle.pha.pa.us>
2001-07-21 19:56 Re: WIN32 Non Blocking Darko Prenosil <darko_prenosil@yahoo.com>

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox