Date: Sun, 16 Aug 1998 14:56:48 -0400
authorMarc G. Fournier
Mon, 17 Aug 1998 03:50:43 +0000 (03:50 +0000)
committerMarc G. Fournier
Mon, 17 Aug 1998 03:50:43 +0000 (03:50 +0000)
From: Tom Lane 
Attached is a patch for this weekend's work on libpq.  I've dealt
with several issues:

        

16 files changed:
src/backend/parser/scan.c
src/bin/psql/psql.c
src/interfaces/Makefile
src/interfaces/libpgtcl/pgtclCmds.c
src/interfaces/libpgtcl/pgtclId.c
src/interfaces/libpq/Makefile.in
src/interfaces/libpq/fe-auth.c
src/interfaces/libpq/fe-auth.h
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-lobj.c
src/interfaces/libpq/fe-misc.c
src/interfaces/libpq/fe-print.c
src/interfaces/libpq/libpq-fe.h
src/interfaces/libpq/libpqdll.def
src/interfaces/libpq/pqsignal.c

index 83ae575e894223b3edc4093d0b0a192c32cd4e07..cede710c44ebe811d8b16e07e6efad18a0266787 100644 (file)
@@ -1,7 +1,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.22 1998/06/16 07:29:25 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.23 1998/08/17 03:50:15 scrappy Exp $
  */
 
 #define FLEX_SCANNER
@@ -555,7 +555,7 @@ char *yytext;
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.22 1998/06/16 07:29:25 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.23 1998/08/17 03:50:15 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
index 836f949b838df9c1caad6b4e029ad7382f0cdbe3..d4bf4cdf1e02a8b73be07c317b34a958521744d1 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.153 1998/08/10 20:31:38 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.154 1998/08/17 03:50:17 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -121,8 +121,8 @@ struct winsize
 /* declarations for functions in this file */
 static void usage(char *progname);
 static void slashUsage();
-static void handleCopyOut(PGresult *res, FILE *copystream);
-static void
+static bool handleCopyOut(PGresult *res, FILE *copystream);
+static bool
 handleCopyIn(PGresult *res, const bool mustprompt,
             FILE *copystream);
 static int
@@ -1103,23 +1103,23 @@ SendQuery(bool *success_p, PsqlSettings *pset, const char *query,
                    printf("%s\n", PQcmdStatus(results));
                break;
            case PGRES_COPY_OUT:
-               *success_p = true;
                if (copy_out)
-                   handleCopyOut(results, copystream);
+                   *success_p = handleCopyOut(results, copystream);
                else
                {
                    if (!pset->quiet)
                        printf("Copy command returns...\n");
 
-                   handleCopyOut(results, stdout);
+                   *success_p = handleCopyOut(results, stdout);
                }
                break;
            case PGRES_COPY_IN:
-               *success_p = true;
                if (copy_in)
-                   handleCopyIn(results, false, copystream);
+                   *success_p = handleCopyIn(results, false, copystream);
                else
-                   handleCopyIn(results, !pset->quiet && !pset->notty, stdin);
+                   *success_p = handleCopyIn(results,
+                                             !pset->quiet && !pset->notty,
+                                             stdin);
                break;
            case PGRES_NONFATAL_ERROR:
            case PGRES_FATAL_ERROR:
@@ -2646,7 +2646,6 @@ main(int argc, char **argv)
    char       *host = NULL;
    char       *port = NULL;
    char       *qfilename = NULL;
-   char        errbuf[ERROR_MSG_LENGTH];
 
    PsqlSettings settings;
 
@@ -2692,7 +2691,9 @@ main(int argc, char **argv)
                settings.opt.align = 0;
                break;
            case 'a':
+#if 0              /* this no longer does anything */
                fe_setauthsvc(optarg, errbuf);
+#endif
                break;
            case 'c':
                singleQuery = strdup(optarg);
@@ -2875,7 +2876,7 @@ main(int argc, char **argv)
 
 #define COPYBUFSIZ 8192
 
-static void
+static bool
 handleCopyOut(PGresult *res, FILE *copystream)
 {
    bool        copydone;
@@ -2911,12 +2912,12 @@ handleCopyOut(PGresult *res, FILE *copystream)
        }
    }
    fflush(copystream);
-   PQendcopy(res->conn);
+   return ! PQendcopy(res->conn);
 }
 
 
 
-static void
+static bool
 handleCopyIn(PGresult *res, const bool mustprompt, FILE *copystream)
 {
    bool        copydone = false;
@@ -2967,7 +2968,7 @@ handleCopyIn(PGresult *res, const bool mustprompt, FILE *copystream)
        }
        PQputline(res->conn, "\n");
    }
-   PQendcopy(res->conn);
+   return ! PQendcopy(res->conn);
 }
 
 
index 12b0306f08c89c093f2fe335841a68dc27f5b5bb..5cb43e2c9767d02b66ee7fff40224d64e80ced33 100644 (file)
@@ -7,14 +7,21 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/interfaces/Makefile,v 1.10 1998/05/29 17:00:29 momjian Exp $
+#    $Header: /cvsroot/pgsql/src/interfaces/Makefile,v 1.11 1998/08/17 03:50:19 scrappy Exp $
 #
 #-------------------------------------------------------------------------
 
 SRCDIR= ..
 include $(SRCDIR)/Makefile.global
 
-.DEFAULT all:
+
+perl-makefile-dep :=
+ifeq ($(USE_PERL), true)
+  perl-makefile-dep := perl5/Makefile
+endif
+
+
+.DEFAULT all: $(perl-makefile-dep)
    $(MAKE) -C libpq $@
 #  $(MAKE) -C ecpg $@
 ifeq ($(HAVE_Cplusplus), true)
@@ -26,6 +33,8 @@ ifeq ($(USE_TCL), true)
    $(MAKE) -C libpgtcl $@
 endif
 ifeq ($(USE_PERL), true)
-   cd perl5 && perl Makefile.PL
    $(MAKE) -C perl5 $@
 endif
+
+perl5/Makefile: perl5/Makefile.PL
+   cd perl5 && perl Makefile.PL
index ec0844d8aed0cefbc1754230ad1ef58bab3ff949..a619d6206b7b35d10b96a2b1c7a68300cbf27880 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.28 1998/07/09 03:32:09 scrappy Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.29 1998/08/17 03:50:22 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -485,9 +485,8 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
     char *opt;
     int i;
     int tupno;
-    char prearrayInd[MAX_MESSAGE_LEN];
-    char arrayInd[MAX_MESSAGE_LEN];
     char *arrVar;
+    char nameBuffer[256];
 
     if (argc < 3 || argc > 5) {
    Tcl_AppendResult(interp, "Wrong # of arguments\n",0);
@@ -522,6 +521,10 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
    sprintf(interp->result, "%d", PQntuples(result));
    return TCL_OK;
     }
+    else if (strcmp(opt, "-numAttrs") == 0) {
+   sprintf(interp->result, "%d", PQnfields(result));
+   return TCL_OK;
+    }
     else if (strcmp(opt, "-assign") == 0) {
    if (argc != 4) {
        Tcl_AppendResult(interp, "-assign option must be followed by a variable name",0);
@@ -530,17 +533,21 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
    arrVar = argv[3];
    /* this assignment assigns the table of result tuples into a giant
       array with the name given in the argument,
-      the indices of the array or (tupno,attrName)*/
+      the indices of the array or (tupno,attrName).
+      Note we expect field names not to exceed a few dozen characters,
+      so truncating to prevent buffer overflow shouldn't be a problem.
+      */
    for (tupno = 0; tupno
        for (i=0;i
-       sprintf(arrayInd, "%d,%s", tupno, PQfname(result,i));
-       Tcl_SetVar2(interp, arrVar, arrayInd
+       sprintf(nameBuffer, "%d,%.200s", tupno, PQfname(result,i));
+       if (Tcl_SetVar2(interp, arrVar, nameBuffer
 #ifdef TCL_ARRAYS
-               tcl_value(PQgetvalue(result,tupno,i)),
+               tcl_value(PQgetvalue(result,tupno,i)),
 #else
-               PQgetvalue(result,tupno,i),
+               PQgetvalue(result,tupno,i),
 #endif
-               TCL_LEAVE_ERR_MSG);
+               TCL_LEAVE_ERR_MSG) == NULL)
+         return TCL_ERROR;
        }
    }
    Tcl_AppendResult(interp, arrVar, 0);
@@ -554,15 +561,23 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
       arrVar = argv[3];
       /* this assignment assigns the table of result tuples into a giant
          array with the name given in the argument,
-         the indices of the array or (tupno,attrName)*/
+         the indices of the array or (tupno,attrName).
+    Here, we still assume PQfname won't exceed 200 characters,
+    but we dare not make the same assumption about the data in field 0.
+    */
       for (tupno = 0; tupno
-          sprintf(prearrayInd,"%s",PQgetvalue(result,tupno,0));
+     const char *field0 = PQgetvalue(result,tupno,0);
+     char * workspace = malloc(strlen(field0) + 210);
           for (i=1;i
-              sprintf(arrayInd, "%s,%s", prearrayInd, PQfname(result,i));
-              Tcl_SetVar2(interp, arrVar, arrayInd,
-                          PQgetvalue(result,tupno,i),
-                          TCL_LEAVE_ERR_MSG);
+              sprintf(workspace, "%s,%.200s", field0, PQfname(result,i));
+              if (Tcl_SetVar2(interp, arrVar, workspace,
+                 PQgetvalue(result,tupno,i),
+                 TCL_LEAVE_ERR_MSG) == NULL) {
+       free(workspace);
+       return TCL_ERROR;
+         }
           }
+     free(workspace);
       }
       Tcl_AppendResult(interp, arrVar, 0);
       return TCL_OK;
@@ -573,25 +588,13 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
        return TCL_ERROR;
    }
    tupno = atoi(argv[3]);
-   
-   if (tupno >= PQntuples(result)) {
+   if (tupno < 0 || tupno >= PQntuples(result)) {
        Tcl_AppendResult(interp, "argument to getTuple cannot exceed number of tuples - 1",0);
        return TCL_ERROR;
    }
-
-#ifdef TCL_ARRAYS
    for (i=0; i
-       Tcl_AppendElement(interp, tcl_value(PQgetvalue(result,tupno,i)));
-   }
-#else
-/* Tcl_AppendResult(interp, PQgetvalue(result,tupno,0),NULL); */
-        Tcl_AppendElement(interp, PQgetvalue(result,tupno,0));
-   for (i=1;i
-/*   Tcl_AppendResult(interp, " ", PQgetvalue(result,tupno,i),NULL);*/
-         Tcl_AppendElement(interp, PQgetvalue(result,tupno,i));
+       Tcl_AppendElement(interp, PQgetvalue(result,tupno,i));
    }
-#endif
-
    return TCL_OK;
     }
     else if (strcmp(opt, "-tupleArray") == 0) {
@@ -600,41 +603,42 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
        return TCL_ERROR;
    }
    tupno = atoi(argv[3]);
-   
-   if (tupno >= PQntuples(result)) {
+   if (tupno < 0 || tupno >= PQntuples(result)) {
        Tcl_AppendResult(interp, "argument to tupleArray cannot exceed number of tuples - 1",0);
        return TCL_ERROR;
    }
-
    for ( i = 0; i < PQnfields(result); i++) {
-      if (Tcl_SetVar2(interp, argv[4], PQfname(result, i), PQgetvalue(result, tupno, i), TCL_LEAVE_ERR_MSG) == NULL) {
+      if (Tcl_SetVar2(interp, argv[4], PQfname(result, i),
+              PQgetvalue(result, tupno, i),
+              TCL_LEAVE_ERR_MSG) == NULL) {
           return TCL_ERROR;
       }
    }
    return TCL_OK;
     }
     else if (strcmp(opt, "-attributes") == 0) {
-      Tcl_AppendResult(interp, PQfname(result,0),NULL);
-      for (i=1;i
-   Tcl_AppendResult(interp, " ", PQfname(result,i), NULL);
+      for (i=0;i
+   Tcl_AppendElement(interp, PQfname(result,i));
       }
       return TCL_OK;
     }
     else if (strcmp(opt, "-lAttributes") == 0) {
-      char buf[512];
-      Tcl_ResetResult(interp);
       for (i = 0; i < PQnfields(result); i++) {
-          sprintf(buf, "{%s} %ld %d", PQfname(result, i),
-                     (long) PQftype(result, i),
-                     PQfsize(result, i));
-          Tcl_AppendElement(interp, buf);
+   /* start a sublist */
+   if (i > 0)
+     Tcl_AppendResult(interp, " {", 0);
+   else
+     Tcl_AppendResult(interp, "{", 0);
+   Tcl_AppendElement(interp, PQfname(result, i));
+   sprintf(nameBuffer, "%ld", (long) PQftype(result, i));
+   Tcl_AppendElement(interp, nameBuffer);
+   sprintf(nameBuffer, "%ld", (long) PQfsize(result, i));
+   Tcl_AppendElement(interp, nameBuffer);
+   /* end the sublist */
+   Tcl_AppendResult(interp, "}", 0);
       }
       return TCL_OK;
     }
-    else if (strcmp(opt, "-numAttrs") == 0) {
-      sprintf(interp->result, "%d", PQnfields(result));
-      return TCL_OK;
-    }
     else   { 
    Tcl_AppendResult(interp, "Invalid option",0);
    goto Pg_result_errReturn;
@@ -649,9 +653,9 @@ Pg_result(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
             "\t-assign arrayVarName\n",
             "\t-assignbyidx arrayVarName\n",
             "\t-numTuples\n",
+            "\t-numAttrs\n"
             "\t-attributes\n"
             "\t-lAttributes\n"
-            "\t-numAttrs\n"
             "\t-getTuple tupleNumber\n",
             "\t-tupleArray tupleNumber arrayVarName\n",
             "\t-clear\n",
index 4ed8f58d57f3b2c694eca18e75cb9fc36282d240..05dfb19b6dea51c07578ba2e72539f288ae175b9 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.11 1998/06/16 04:10:17 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.12 1998/08/17 03:50:26 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,7 +43,10 @@ static int PgEndCopy(Pg_ConnectionId *connid, int *errorCodePtr)
 }
 
 /*
- *  Called when reading data (via gets) for a copy  to stdout
+ *  Called when reading data (via gets) for a copy  to stdout.
+ *
+ *  NOTE: this routine knows way more than it ought to about libpq's
+ *  internal buffering mechanisms.
  */
 int PgInputProc(DRIVER_INPUT_PROTO)
 {
@@ -62,10 +65,10 @@ int PgInputProc(DRIVER_INPUT_PROTO)
     }
 
     /* Try to load any newly arrived data */
-    errno = 0;
-
-    if (pqReadData(conn) < 0) {
-   *errorCodePtr = errno ? errno : EIO;
+    conn->errorMessage[0] = '\0';
+    PQconsumeInput(conn);
+    if (conn->errorMessage[0]) {
+   *errorCodePtr = EIO;
    return -1;
     }
 
@@ -80,8 +83,8 @@ int PgInputProc(DRIVER_INPUT_PROTO)
     conn->inCursor = conn->inStart;
 
     avail = bufSize;
-    while (avail > 0 &&
-      pqGetc(&c, conn) == 0) {
+    while (avail > 0 && conn->inCursor < conn->inEnd) {
+   c = conn->inBuffer[conn->inCursor++];
    *buf++ = c;
    --avail;
    if (c == '\n') {
@@ -130,10 +133,12 @@ int PgOutputProc(DRIVER_OUTPUT_PROTO)
    return -1;
     }
 
-    errno = 0;
+    conn->errorMessage[0] = '\0';
 
-    if (pqPutnchar(buf, bufSize, conn)) {
-   *errorCodePtr = errno ? errno : EIO;
+    PQputnbytes(conn, buf, bufSize);
+
+    if (conn->errorMessage[0]) {
+   *errorCodePtr = EIO;
    return -1;
     }
 
@@ -141,7 +146,6 @@ int PgOutputProc(DRIVER_OUTPUT_PROTO)
      * in a single operation; maybe not such a good assumption?
      */
     if (bufSize >= 3 && strncmp(&buf[bufSize-3], "\\.\n", 3) == 0) {
-   (void) pqFlush(conn);
    if (PgEndCopy(connid, errorCodePtr) == -1)
        return -1;
     }
@@ -423,7 +427,7 @@ PgGetConnByResultId(Tcl_Interp *interp, char *resid_c)
     *mark = '\0';
     conn_chan = Tcl_GetChannel(interp, resid_c, 0);
     *mark = '.';
-    if(conn_chan && Tcl_GetChannelType(conn_chan) != &Pg_ConnType) {
+    if(conn_chan && Tcl_GetChannelType(conn_chan) == &Pg_ConnType) {
    Tcl_SetResult(interp, Tcl_GetChannelName(conn_chan), TCL_VOLATILE);
    return TCL_OK;
     }
index 7dbe54f146939adc4d7ffcc071f5807c8b1282d0..b13e7753c17317e20e2786930251806ddead1471 100644 (file)
@@ -7,7 +7,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/interfaces/libpq/Attic/Makefile.in,v 1.25 1998/07/26 04:31:35 scrappy Exp $
+#    $Header: /cvsroot/pgsql/src/interfaces/libpq/Attic/Makefile.in,v 1.26 1998/08/17 03:50:29 scrappy Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -87,7 +87,7 @@ ifeq ($(PORTNAME), hpux)
   CFLAGS += $(CFLAGS_SL)
 endif
 
-all: libpq.a $(shlib) c.h
+all: libpq.a $(shlib)
 
 libpq.a: $(OBJS)
 ifdef MK_NO_LORDER
@@ -97,8 +97,6 @@ else
 endif
    $(RANLIB) libpq.a
 
-fe-lobj.o: $(SRCDIR)/backend/fmgr.h
-
 # We need to compile this with special options for shared libs,
 # so we can't use the object in $(SRCDIR)/backend
 dllist.c:  $(SRCDIR)/backend/lib/dllist.c
@@ -120,6 +118,8 @@ endif
 # The following rules cause dependencies in the backend directory to 
 # get made if they don't exist, but don't cause them to get remade if they
 # are out of date.
+fe-lobj.o: $(SRCDIR)/backend/fmgr.h
+
 $(SRCDIR)/backend/fmgr.h:
    $(MAKE) -C $(SRCDIR)/backend fmgr.h
 
@@ -128,12 +128,6 @@ $(shlib): $(OBJS)
    ln -sf $@ libpq.so
 
 
-c.h: $(SRCDIR)/include/c.h
-   rm -f c.h
-   echo "#undef PORTNAME" >  c.h
-   echo "#define PORTNAME $(PORTNAME)" >> c.h
-   cat $(SRCDIR)/include/c.h >> c.h
-
 .PHONY: beforeinstall-headers install-headers
 .PHONY: install install-libpq install-shlib-dep 
 
@@ -142,15 +136,17 @@ install: install-headers install-libpq $(install-shlib-dep)
 # Many of the headers we install below have nothing to do with libpq,
 # so should be installed by someone else.
 #
-install-headers: beforeinstall-headers c.h \
+install-headers: beforeinstall-headers $(SRCDIR)/include/c.h \
                  $(SRCDIR)/include/postgres.h $(SRCDIR)/include/postgres_ext.h \
                  $(SRCDIR)/include/config.h $(SRCDIR)/include/libpq/pqcomm.h \
                  $(SRCDIR)/include/libpq/libpq-fs.h $(SRCDIR)/include/lib/dllist.h \
-                 $(SRCDIR)/include/utils/geo_decls.h libpq-fe.h
+                 $(SRCDIR)/include/utils/geo_decls.h libpq-fe.h libpq-int.h
    $(INSTALL) $(INSTLOPTS) $(SRCDIR)/include/os.h \
           $(HEADERDIR)/os.h
    $(INSTALL) $(INSTLOPTS) $(SRCDIR)/include/config.h \
           $(HEADERDIR)/config.h
+   $(INSTALL) $(INSTLOPTS) $(SRCDIR)/include/c.h \
+          $(HEADERDIR)/c.h
    $(INSTALL) $(INSTLOPTS) $(SRCDIR)/include/postgres.h \
           $(HEADERDIR)/postgres.h
    $(INSTALL) $(INSTLOPTS) $(SRCDIR)/include/postgres_ext.h \
@@ -174,19 +170,17 @@ install-headers: beforeinstall-headers c.h \
    $(INSTALL) $(INSTLOPTS) $(SRCDIR)/include/commands/trigger.h \
           $(HEADERDIR)/commands/trigger.h
    $(INSTALL) $(INSTLOPTS) libpq-fe.h $(HEADERDIR)/libpq-fe.h
+   $(INSTALL) $(INSTLOPTS) libpq-int.h $(HEADERDIR)/libpq-int.h
 ifeq ($(PORTNAME), hpux)
    $(INSTALL) $(INSTLOPTS) $(SRCDIR)/backend/port/hpux/fixade.h \
           $(HEADERDIR)/port/hpux/fixade.h
 endif
-   $(INSTALL) $(INSTLOPTS) c.h $(HEADERDIR)/c.h
 
 beforeinstall-headers:
    @if [ ! -d $(HEADERDIR) ]; then mkdir $(HEADERDIR); fi
    @if [ ! -d $(HEADERDIR)/port ]; then mkdir $(HEADERDIR)/port; fi
    @if [ ! -d $(HEADERDIR)/port/$(PORTNAME) ]; \
        then mkdir $(HEADERDIR)/port/$(PORTNAME); fi
-   @if [ ! -d $(HEADERDIR)/include ]; \
-       then mkdir $(HEADERDIR)/include; fi
    @if [ ! -d $(HEADERDIR)/lib ]; \
        then mkdir $(HEADERDIR)/lib; fi
    @if [ ! -d $(HEADERDIR)/libpq ]; \
@@ -213,7 +207,8 @@ depend dep:
 
 .PHONY: clean
 clean:
-   rm -f libpq.a $(shlib) $(OBJS) c.h dllist.c libpq.so
+   rm -f libpq.a $(shlib) libpq.so $(OBJS)
+   rm -f dllist.c common.c wchar.c conv.c
 
 ifeq (depend,$(wildcard depend))
 include depend
index 8d96a1af8cce7053533be4e6bcf906051b16a212..5d137afe6de2d1810730a833c566361ce008dfec 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.21 1998/08/09 02:59:25 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.22 1998/08/17 03:50:31 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
  *
  *
  */
+
+#include "libpq-fe.h"
+#include "libpq-int.h"
+#include "fe-auth.h"
+#include "postgres.h"
+
 #ifdef WIN32
 #include "win32.h"
 #else
-#include 
 #include 
 #include          /* for MAXHOSTNAMELEN on most */
-#include 
 #ifndef  MAXHOSTNAMELEN
 #include              /* for MAXHOSTNAMELEN on some */
 #endif
+#if !defined(NO_UNISTD_H)
 #include 
+#endif
 #include 
 #endif /* WIN32 */
 
-#include "postgres.h"
-
-#include "libpq/pqcomm.h"
-
-#include "libpq-fe.h"
-#include "fe-auth.h"
-#include "fe-connect.h"
-
 #ifdef HAVE_CRYPT_H
 #include 
 #endif
@@ -469,7 +467,7 @@ pg_password_sendauth(PGconn *conn, const char *password, AuthRequest areq)
    if (areq == AUTH_REQ_CRYPT)
        password = crypt(password, conn->salt);
 
-   return packetSend(conn, password, strlen(password) + 1);
+   return pqPacketSend(conn, password, strlen(password) + 1);
 }
 
 /*
index ebbca5dfb3e56b6de61a98bff2fe5313ababf3d0..c014204722edbf5bca777a22708b780c363b8278 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: fe-auth.h,v 1.8 1998/01/29 03:24:21 scrappy Exp $
+ * $Id: fe-auth.h,v 1.9 1998/08/17 03:50:33 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -14,6 +14,7 @@
 #define FE_AUTH_H
 
 #include "libpq-fe.h"
+#include "libpq-int.h"
 
 
 /*----------------------------------------------------------------
 
 extern int
 fe_sendauth(AuthRequest areq, PGconn *conn, const char *hostname,
-           const char *password, char *PQerromsg);
+           const char *password, char *PQerrormsg);
+extern MsgType fe_getauthsvc(char *PQerrormsg);
 extern void fe_setauthsvc(const char *name, char *PQerrormsg);
+extern char *fe_getauthname(char *PQerrormsg);
 
 #define PG_KRB4_VERSION "PGVER4.1"     /* at most KRB_SENDAUTH_VLEN chars */
 #define PG_KRB5_VERSION "PGVER5.1"
index cc8af6d6acfb824058884fd64cc21fd29ff32ded..30f9933950c680736907f3d290dd7288a645feea 100644 (file)
@@ -7,35 +7,31 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.78 1998/08/09 02:59:26 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.79 1998/08/17 03:50:34 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
 
+#include "libpq-fe.h"
+#include "libpq-int.h"
+#include "fe-auth.h"
+#include "postgres.h"
+
 #include 
-#include 
 #ifdef WIN32
 #include "win32.h"
 #else
-#include 
+#if !defined(NO_UNISTD_H)
 #include 
+#endif
 #include 
-#include 
-#include 
 #include 
 #endif
 #include 
-#include 
-#include 
 #include 
 #include 
 #include              /* for isspace() */
 
-#include "postgres.h"
-#include "fe-auth.h"
-#include "fe-connect.h"
-#include "libpq-fe.h"
-
 #ifndef HAVE_STRDUP
 #include "strdup.h"
 #endif
@@ -113,7 +109,7 @@ static PQconninfoOption PQconninfoOptions[] = {
    NULL, NULL, 0}
 };
 
-struct EnvironmentOptions
+static struct EnvironmentOptions
 {
    const char *envName,
               *pgName;
@@ -496,7 +492,7 @@ connectDB(PGconn *conn)
    struct hostent *hp;
    StartupPacket sp;
    AuthRequest areq;
-   int         laddrlen = sizeof(SockAddr);
+   int         laddrlen;
    int         portno,
                family;
    char        beresp;
@@ -514,7 +510,7 @@ connectDB(PGconn *conn)
 
    MemSet((char *) &sp, 0, sizeof(StartupPacket));
 
-   sp.protoVersion = (ProtocolVersion) htonl(PG_PROTOCOL_LATEST);
+   sp.protoVersion = (ProtocolVersion) htonl(PG_PROTOCOL_LIBPQ);
 
    strncpy(sp.user, conn->pguser, SM_USER);
    strncpy(sp.database, conn->dbName, SM_DATABASE);
@@ -626,6 +622,7 @@ connectDB(PGconn *conn)
    }
 
    /* Fill in the client address */
+   laddrlen = sizeof(conn->laddr);
    if (getsockname(conn->sock, &conn->laddr.sa, &laddrlen) < 0)
    {
        (void) sprintf(conn->errorMessage,
@@ -640,7 +637,7 @@ connectDB(PGconn *conn)
 
    /* Send the startup packet. */
 
-   if (packetSend(conn, (char *) &sp, sizeof(StartupPacket)) != STATUS_OK)
+   if (pqPacketSend(conn, (char *) &sp, sizeof(StartupPacket)) != STATUS_OK)
    {
        sprintf(conn->errorMessage,
                "connectDB() --  couldn't send startup packet: errno=%d\n%s\n",
@@ -786,7 +783,7 @@ PQsetenv(PGconn *conn)
    char        setQuery[80];   /* mjl: size okay? XXX */
 #ifdef MULTIBYTE
    char    *envname = "PGCLIENTENCODING";
-   char    envbuf[64];
+   static char envbuf[64];     /* big enough? */
    char    *env;
    char    *encoding = 0;
    PGresult   *rtn;
@@ -875,7 +872,7 @@ freePGconn(PGconn *conn)
 {
    if (!conn)
        return;
-   PQclearAsyncResult(conn);   /* deallocate result and curTuple */
+   pqClearAsyncResult(conn);   /* deallocate result and curTuple */
    if (conn->sock >= 0)
 #ifdef WIN32
        closesocket(conn->sock);
@@ -919,19 +916,13 @@ closePGconn(PGconn *conn)
    {
        /*
         * Try to send "close connection" message to backend.
-        * BUT: backend might have already closed connection.
-        * To avoid being killed by SIGPIPE, we need to detect this before
-        * writing.  Check for "read ready" condition which indicates EOF.
+        * Ignore any error.
+        * Note: this routine used to go to substantial lengths to avoid
+        * getting SIGPIPE'd if the connection were already closed.
+        * Now we rely on pqFlush to avoid the signal.
         */
-       while (pqReadReady(conn)) {
-           if (pqReadData(conn) < 0)
-               break;
-       }
-       if (conn->sock >= 0) {
-           /* Should be safe now... */
-           (void) pqPuts("X", conn);
-           (void) pqFlush(conn);
-       }
+       (void) pqPuts("X", conn);
+       (void) pqFlush(conn);
    }
 
    /*
@@ -947,7 +938,7 @@ closePGconn(PGconn *conn)
    conn->status = CONNECTION_BAD;      /* Well, not really _bad_ - just
                                         * absent */
    conn->asyncStatus = PGASYNC_IDLE;
-   PQclearAsyncResult(conn);   /* deallocate result and curTuple */
+   pqClearAsyncResult(conn);   /* deallocate result and curTuple */
    if (conn->lobjfuncs)
        free(conn->lobjfuncs);
    conn->lobjfuncs = NULL;
@@ -1080,14 +1071,14 @@ cancel_errReturn:
 
 
 /*
- * PacketSend() -- send a single-packet message.
+ * pqPacketSend() -- send a single-packet message.
  * this is like PacketSend(), defined in backend/libpq/pqpacket.c
  *
  * RETURNS: STATUS_ERROR if the write fails, STATUS_OK otherwise.
  * SIDE_EFFECTS: may block.
 */
 int
-packetSend(PGconn *conn, const char *buf, size_t len)
+pqPacketSend(PGconn *conn, const char *buf, size_t len)
 {
    /* Send the total packet size. */
 
index 8979018314407e71b37d625568a29ad95c036154..c909c42446893ca9f7a853b5c6a633b8c27ed4fe 100644 (file)
@@ -7,24 +7,25 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.61 1998/08/09 02:59:27 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.62 1998/08/17 03:50:35 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
+#include "libpq-fe.h"
+#include "libpq-int.h"
+#include "postgres.h"
+
 #ifdef WIN32
 #include "win32.h"
+#else
+#if !defined(NO_UNISTD_H)
+#include 
+#endif
 #endif
 #include 
-#include 
 #include 
 #include 
 #include 
-#if !defined(NO_UNISTD_H)
-#include 
-#endif
-#include "postgres.h"
-#include "libpq/pqcomm.h"
-#include "libpq-fe.h"
 
 
 /* the rows array in a PGresGroup  has to grow to accommodate the rows */
@@ -32,7 +33,7 @@
 #define TUPARR_GROW_BY 100
 
 /* keep this in same order as ExecStatusType in libpq-fe.h */
-const char *pgresStatus[] = {
+const char * const pgresStatus[] = {
    "PGRES_EMPTY_QUERY",
    "PGRES_COMMAND_OK",
    "PGRES_TUPLES_OK",
@@ -144,7 +145,7 @@ freeTuple(PGresAttValue *tuple, int numAttributes)
  */
 
 void
-PQclearAsyncResult(PGconn *conn)
+pqClearAsyncResult(PGconn *conn)
 {
    /* Get rid of incomplete result and any not-yet-added tuple */
    if (conn->result)
@@ -210,25 +211,6 @@ PQsendQuery(PGconn *conn, const char *query)
        return 0;
    }
 
-   if (conn->asyncStatus != PGASYNC_IDLE)
-   {
-       sprintf(conn->errorMessage,
-               "PQsendQuery() -- another query already in progress.");
-       return 0;
-   }
-
-   /* Check for pending input (asynchronous Notice or Notify messages);
-    * also detect the case that the backend just closed the connection.
-    * Note: we have to loop if the first call to pqReadData successfully
-    * reads some data, since in that case pqReadData won't notice whether
-    * the connection is now closed.
-    */
-   while (pqReadReady(conn)) {
-       if (pqReadData(conn) < 0)
-           return 0;           /* errorMessage already set */
-       parseInput(conn);       /* deal with Notice or Notify, if any */
-   }
-
    /* Don't try to send if we know there's no live connection. */
    if (conn->status != CONNECTION_OK)
    {
@@ -236,6 +218,13 @@ PQsendQuery(PGconn *conn, const char *query)
                "to the backend.\n");
        return 0;
    }
+   /* Can't send while already busy, either. */
+   if (conn->asyncStatus != PGASYNC_IDLE)
+   {
+       sprintf(conn->errorMessage,
+               "PQsendQuery() -- another query already in progress.");
+       return 0;
+   }
 
    /* clear the error string */
    conn->errorMessage[0] = '\0';
@@ -361,7 +350,7 @@ parseInput(PGconn *conn)
                    if (pqGets(conn->asyncErrorMessage,ERROR_MSG_LENGTH,conn))
                        return;
                    /* delete any partially constructed result */
-                   PQclearAsyncResult(conn);
+                   pqClearAsyncResult(conn);
                    /* we leave result NULL while setting asyncStatus=READY;
                     * this signals an error condition to PQgetResult.
                     */
@@ -468,7 +457,7 @@ parseInput(PGconn *conn)
                    /* Discard the unexpected message; good idea?? */
                    conn->inStart = conn->inEnd;
                    /* delete any partially constructed result */
-                   PQclearAsyncResult(conn);
+                   pqClearAsyncResult(conn);
                    conn->asyncStatus = PGASYNC_READY;
                    return;
            }                   /* switch on protocol character */
@@ -583,7 +572,7 @@ getAnotherTuple(PGconn *conn, int binary)
    {
        sprintf(conn->asyncErrorMessage,
                "getAnotherTuple() -- null-values bitmap is too large\n");
-       PQclearAsyncResult(conn);
+       pqClearAsyncResult(conn);
        conn->asyncStatus = PGASYNC_READY;
        /* Discard the broken message */
        conn->inStart = conn->inEnd;
@@ -688,7 +677,7 @@ PQgetResult(PGconn *conn)
        if (pqWait(TRUE, FALSE, conn) ||
            pqReadData(conn) < 0)
        {
-           PQclearAsyncResult(conn);
+           pqClearAsyncResult(conn);
            conn->asyncStatus = PGASYNC_IDLE;
            /* conn->errorMessage has been set by pqWait or pqReadData. */
            return makeEmptyPGresult(conn, PGRES_FATAL_ERROR);
@@ -939,6 +928,16 @@ PQputline(PGconn *conn, const char *s)
        (void) pqPutnchar(s, strlen(s), conn);
 }
 
+/*
+ * PQputnbytes -- like PQputline, but buffer need not be null-terminated.
+ */
+void
+PQputnbytes(PGconn *conn, const char *buffer, int nbytes)
+{
+   if (conn && conn->sock >= 0)
+       (void) pqPutnchar(buffer, nbytes, conn);
+}
+
 /*
  * PQendcopy
  *     After completing the data transfer portion of a copy in/out,
@@ -968,6 +967,7 @@ PQendcopy(PGconn *conn)
 
    /* Return to active duty */
    conn->asyncStatus = PGASYNC_BUSY;
+   conn->errorMessage[0] = '\0';
 
    /* Wait for the completion response */
    result = PQgetResult(conn);
@@ -986,8 +986,10 @@ PQendcopy(PGconn *conn)
     */
    PQclear(result);
 
-   sprintf(conn->errorMessage, "PQendcopy: resetting connection\n");
-   DONOTICE(conn, conn->errorMessage);
+   if (conn->errorMessage[0])
+       DONOTICE(conn, conn->errorMessage);
+
+   DONOTICE(conn, "PQendcopy: resetting connection\n");
 
    PQreset(conn);
 
@@ -1344,23 +1346,40 @@ PQcmdStatus(PGresult *res)
 const char *
 PQoidStatus(PGresult *res)
 {
-   static char oidStatus[32] = {0};
+   char    *p, *e, *scan;
+   int     slen, olen;
 
    if (!res)
        return "";
 
-   oidStatus[0] = 0;
+   if (strncmp(res->cmdStatus, "INSERT ", 7) != 0)
+       return "";
 
-   if (strncmp(res->cmdStatus, "INSERT ", 7) == 0)
-   {
-       char       *p = res->cmdStatus + 7;
-       char       *e;
+   /* The cmdStatus string looks like
+    *     INSERT oid count\0
+    * In order to be able to return an ordinary C string without
+    * damaging the result for PQcmdStatus or PQcmdTuples, we copy
+    * the oid part of the string to just after the null, so that
+    * cmdStatus looks like
+    *     INSERT oid count\0oid\0
+    *                       ^ our return value points here
+    * Pretty klugy eh?  This routine should've just returned an Oid value.
+    */
 
-       for (e = p; *e != ' ' && *e;)
-           e++;
-       sprintf(oidStatus, "%.*s", e - p, p);
-   }
-   return oidStatus;
+   slen = strlen(res->cmdStatus);
+   p = res->cmdStatus + 7;         /* where oid is now */
+   e = res->cmdStatus + slen + 1;  /* where to put the oid string */
+
+   for (scan = p; *scan && *scan != ' '; )
+       scan++;
+   olen = scan - p;
+   if (slen + olen + 2 > sizeof(res->cmdStatus))
+       return "";              /* something very wrong if it doesn't fit */
+
+   strncpy(e, p, olen);
+   e[olen] = '\0';
+
+   return e;
 }
 
 /*
index a59815fc529624b49e0deb166c6b295015b4ac46..8b89e940f2ef7ea21f7603364e466990348effad 100644 (file)
@@ -7,24 +7,29 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.14 1998/07/03 04:24:14 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.15 1998/08/17 03:50:37 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
+
+#include "libpq-fe.h"
+#include "libpq-int.h"
+#include "postgres.h"
+
 #ifdef WIN32
 #include "win32.h"
 #include 
 #else
+#if !defined(NO_UNISTD_H)
 #include 
 #endif
-#include 
+#endif
 #include 
 #include 
 #include 
-#include 
-#include "postgres.h"
-#include "libpq-fe.h"
-#include "libpq/libpq-fs.h"
+
+#include "libpq/libpq-fs.h"    /* must come after sys/stat.h */
+
 
 #define LO_BUFSIZE       1024
 
index 512633ca0fc815d6e2298ef725e00b7891c508c5..5608a0de2f8942733e8f89ac5a6527dd1f696392 100644 (file)
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.17 1998/08/09 02:59:29 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.18 1998/08/17 03:50:38 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
 
+#include "libpq-fe.h"
+#include "libpq-int.h"
+#include "postgres.h"
+#include "pqsignal.h"
+
 #include 
-#include 
 #include 
 #include 
+#include 
 #include 
 #ifdef WIN32
 #include "win32.h"
 #include 
 #endif
 #endif /* WIN32 */
-#include          /* for fd_set stuff */
+
 #ifdef HAVE_SYS_SELECT_H
 #include 
 #endif
 
-#include "postgres.h"
-#include "libpq-fe.h"
 
 #define DONOTICE(conn,message) \
    ((*(conn)->noticeHook) ((conn)->noticeArg, (message)))
@@ -273,7 +276,7 @@ pqPutInt(int value, int bytes, PGconn *conn)
 /* --------------------------------------------------------------------- */
 /* pqReadReady: is select() saying the file is ready to read?
  */
-int
+static int
 pqReadReady(PGconn *conn)
 {
    fd_set          input_mask;
@@ -451,7 +454,17 @@ pqFlush(PGconn *conn)
 
    while (len > 0)
    {
+       /* Prevent being SIGPIPEd if backend has closed the connection. */
+#ifndef WIN32
+       pqsigfunc oldsighandler = pqsignal(SIGPIPE, SIG_IGN);
+#endif
+
        int sent = send(conn->sock, ptr, len, 0);
+
+#ifndef WIN32
+       pqsignal(SIGPIPE, oldsighandler);
+#endif
+
        if (sent < 0)
        {
            /* Anything except EAGAIN or EWOULDBLOCK is trouble */
index f60231be699f2caa3a7fd66f8696a56feed4f6b6..4671373090d934337488901e9103a9387f0a163e 100644 (file)
@@ -9,31 +9,31 @@
  * didn't really belong there.
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.9 1998/08/09 02:59:30 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.10 1998/08/17 03:50:39 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
+#include "libpq-fe.h"
+#include "libpq-int.h"
+#include "postgres.h"
+#include "pqsignal.h"
+
 #ifdef WIN32
 #include "win32.h"
-#endif
-#include 
-#include 
-#include 
-#include 
-#include 
-#ifndef WIN32
+#else
+#if !defined(NO_UNISTD_H)
 #include 
-#include 
 #endif
-#include "libpq/pqsignal.h"
-#include "libpq-fe.h"
-#ifndef WIN32
+#include 
 #ifndef HAVE_TERMIOS_H
 #include 
 #else
 #include 
 #endif
 #endif /* WIN32 */
+#include 
+#include 
+#include 
 
 #ifdef MULTIBYTE
 #include "mb/pg_wchar.h"
index 7e6660c83dbd23ff6a64d7fc9cbc8c7208c6e3c4..4cd45fca6c39d5e10755ee00483d04b6ff12136a 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq-fe.h,v 1.37 1998/08/09 02:59:31 momjian Exp $
+ * $Id: libpq-fe.h,v 1.38 1998/08/17 03:50:40 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,12 +20,15 @@ extern      "C"
 #endif
 
 #include 
+/* these wouldn't need to be included if PGSockAddr weren't exported: */
+#include 
+#include 
+#include 
 /* ----------------
  *     include stuff common to fe and be
  * ----------------
  */
 #include "postgres_ext.h"
-#include "libpq/pqcomm.h"
 #include "lib/dllist.h"
 
 /* Application-visible enum types */
@@ -53,7 +56,7 @@ extern        "C"
    } ExecStatusType;
 
 /* string descriptions of the ExecStatusTypes */
-   extern const char *pgresStatus[];
+   extern const char * const pgresStatus[];
 
 /*
  * POSTGRES backend dependent Constants.
@@ -61,9 +64,6 @@ extern        "C"
 
 /* ERROR_MSG_LENGTH should really be the same as ELOG_MAXLEN in utils/elog.h*/
 #define ERROR_MSG_LENGTH 4096
-#define COMMAND_LENGTH 20
-#define REMARK_LENGTH 80
-#define PORTAL_NAME_LENGTH 16
 #define CMDSTATUS_LEN 40
 
 /* PGresult and the subsidiary types PGresAttDesc, PGresAttValue
@@ -85,7 +85,8 @@ extern        "C"
    ASCII tuples are guaranteed to be null-terminated
    For binary tuples, the first four bytes of the value is the size,
    and the bytes afterwards are the value. The binary value is
-   not guaranteed to be null-terminated.  In fact, it can have embedded nulls*/
+   not guaranteed to be null-terminated.  In fact, it can have embedded nulls
+ */
 
 #define NULL_LEN       (-1)    /* pg_result len for NULL value */
 
@@ -134,6 +135,15 @@ extern     "C"
        PGASYNC_COPY_OUT        /* Copy Out data transfer in progress */
    } PGAsyncStatusType;
 
+/* generic socket address type for PGconn connection information.
+ * Really shouldn't be visible to users */
+   typedef union PGSockAddr
+   {
+       struct sockaddr sa;
+       struct sockaddr_in in;
+       struct sockaddr_un un;
+   } PGSockAddr;
+
 /* large-object-access data ... allocated only if large-object code is used.
  * Really shouldn't be visible to users */
    typedef struct pgLobjfuncs
@@ -150,7 +160,9 @@ extern      "C"
    } PGlobjfuncs;
 
 /* PGconn encapsulates a connection to the backend.
- * XXX contents of this struct really shouldn't be visible to applications
+ * XXX contents of this struct really shouldn't be visible to applications,
+ * but we might break some existing applications if we tried to make it
+ * completely opaque.
  */
    typedef struct pg_conn
    {
@@ -179,8 +191,8 @@ extern      "C"
 
        /* Connection data */
        int         sock;       /* Unix FD for socket, -1 if not connected */
-       SockAddr    laddr;      /* Local address */
-       SockAddr    raddr;      /* Remote address */
+       PGSockAddr  laddr;      /* Local address */
+       PGSockAddr  raddr;      /* Remote address */
        int         raddr_len;  /* Length of remote address */
 
        /* Miscellaneous stuff */
@@ -213,14 +225,14 @@ extern        "C"
        char        asyncErrorMessage[ERROR_MSG_LENGTH];
    } PGconn;
 
-   typedef char pqbool;
-
    /*
     * We can't use the conventional "bool", because we are designed to be
     * included in a user's program, and user may already have that type
     * defined.  Pqbool, on the other hand, is unlikely to be used.
     */
 
+   typedef char pqbool;
+
 /* Print options for PQprint() */
 
    typedef struct _PQprintOpt
@@ -255,7 +267,7 @@ extern      "C"
    } PQArgBlock;
 
 /* ----------------
- * Structure for the conninfo parameter definitions of PQconnectdb()
+ * Structure for the conninfo parameter definitions returned by PQconndefaults
  * ----------------
  */
    typedef struct _PQconninfoOption
@@ -274,24 +286,36 @@ extern        "C"
        int         dispsize;   /* Field size in characters for dialog  */
    } PQconninfoOption;
 
+/* ----------------
+ * Exported functions of libpq
+ * ----------------
+ */
+
 /* === in fe-connect.c === */
+
    /* make a new client connection to the backend */
    extern PGconn *PQconnectdb(const char *conninfo);
+   extern PGconn *PQsetdbLogin(const char *pghost, const char *pgport,
+                               const char *pgoptions, const char *pgtty,
+                               const char *dbName,
+                               const char *login, const char *pwd);
+#define PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME)  \
+   PQsetdbLogin(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME, NULL, NULL)
+
+   /* get info about connection options known to PQconnectdb */
    extern PQconninfoOption *PQconndefaults(void);
-   extern PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
-                                           const char *pgtty, const char *dbName, const char *login, const char *pwd);
-#define PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME)   PQsetdbLogin(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME, NULL, NULL)
+
    /* close the current connection and free the PGconn data structure */
    extern void PQfinish(PGconn *conn);
-   /* issue a cancel request */
-   extern int  PQrequestCancel(PGconn *conn);
-
    /*
     * close the current connection and restablish a new one with the same
     * parameters
     */
    extern void PQreset(PGconn *conn);
 
+   /* issue a cancel request */
+   extern int  PQrequestCancel(PGconn *conn);
+
    /* Accessor functions for PGconn objects */
    extern char *PQdb(PGconn *conn);
    extern char *PQuser(PGconn *conn);
@@ -313,28 +337,33 @@ extern        "C"
                                      void *arg);
 
 /* === in fe-exec.c === */
+
    /* Simple synchronous query */
    extern PGresult *PQexec(PGconn *conn, const char *query);
    extern PGnotify *PQnotifies(PGconn *conn);
+
    /* Interface for multiple-result or asynchronous queries */
    extern int  PQsendQuery(PGconn *conn, const char *query);
    extern PGresult *PQgetResult(PGconn *conn);
+
    /* Routines for managing an asychronous query */
    extern int  PQisBusy(PGconn *conn);
    extern void PQconsumeInput(PGconn *conn);
+
    /* Routines for copy in/out */
    extern int  PQgetline(PGconn *conn, char *string, int length);
    extern void PQputline(PGconn *conn, const char *string);
+   extern void PQputnbytes(PGconn *conn, const char *buffer, int nbytes);
    extern int  PQendcopy(PGconn *conn);
-   /* Not really meant for application use: */
+
+   /* "Fast path" interface --- not really recommended for application use */
    extern PGresult *PQfn(PGconn *conn,
-                                     int fnid,
-                                     int *result_buf,
-                                     int *result_len,
-                                     int result_is_int,
-                                     PQArgBlock *args,
-                                     int nargs);
-   extern void PQclearAsyncResult(PGconn *conn);
+                         int fnid,
+                         int *result_buf,
+                         int *result_len,
+                         int result_is_int,
+                         PQArgBlock *args,
+                         int nargs);
 
    /* Accessor functions for PGresult objects */
    extern ExecStatusType PQresultStatus(PGresult *res);
@@ -351,14 +380,16 @@ extern        "C"
    extern char *PQgetvalue(PGresult *res, int tup_num, int field_num);
    extern int  PQgetlength(PGresult *res, int tup_num, int field_num);
    extern int  PQgetisnull(PGresult *res, int tup_num, int field_num);
+
    /* Delete a PGresult */
    extern void PQclear(PGresult *res);
 
 /* === in fe-print.c === */
+
    extern void PQprint(FILE *fout,     /* output stream */
                        PGresult *res,
-                       PQprintOpt *ps /* option structure */
-       );
+                       PQprintOpt *ps); /* option structure */
+
    /* PQdisplayTuples() is a better version of PQprintTuples(),
     * but both are obsoleted by PQprint().
     */
@@ -376,37 +407,16 @@ extern        "C"
                                                     * or not */
                              int terseOutput,      /* delimiter bars or
                                                     * not? */
-                             int width     /* width of column, if
+                             int width);   /* width of column, if
                                             * 0, use variable width */
-       );
 
 #ifdef MULTIBYTE
    extern int PQmblen(unsigned char *s);
 #endif
 
-/* === in fe-auth.c === */
-   extern MsgType fe_getauthsvc(char *PQerrormsg);
-   extern void fe_setauthsvc(const char *name, char *PQerrormsg);
-   extern char *fe_getauthname(char *PQerrormsg);
-
-/* === in fe-misc.c === */
-   /* "Get" and "Put" routines return 0 if successful, EOF if not.
-    * Note that for Get, EOF merely means the buffer is exhausted,
-    * not that there is necessarily any error.
-    */
-   extern int  pqGetc(char *result, PGconn *conn);
-   extern int  pqGets(char *s, int maxlen, PGconn *conn);
-   extern int  pqPuts(const char *s, PGconn *conn);
-   extern int  pqGetnchar(char *s, int len, PGconn *conn);
-   extern int  pqPutnchar(const char *s, int len, PGconn *conn);
-   extern int  pqGetInt(int *result, int bytes, PGconn *conn);
-   extern int  pqPutInt(int value, int bytes, PGconn *conn);
-   extern int  pqReadData(PGconn *conn);
-   extern int  pqReadReady(PGconn *conn);
-   extern int  pqFlush(PGconn *conn);
-   extern int  pqWait(int forRead, int forWrite, PGconn *conn);
-
 /* === in fe-lobj.c === */
+
+   /* Large-object access routines */
    extern int  lo_open(PGconn *conn, Oid lobjId, int mode);
    extern int  lo_close(PGconn *conn, int fd);
    extern int  lo_read(PGconn *conn, int fd, char *buf, int len);
@@ -418,36 +428,8 @@ extern     "C"
    extern Oid  lo_import(PGconn *conn, char *filename);
    extern int  lo_export(PGconn *conn, Oid lobjId, char *filename);
 
-/* max length of message to send  */
-#define MAX_MESSAGE_LEN 8193
-
-/* maximum number of fields in a tuple */
-#define MAX_FIELDS 512
-
-/* bits in a byte */
-#define BYTELEN 8
-
-/* fall back options if they are not specified by arguments or defined
-   by environment variables */
-#define DefaultHost        "localhost"
-#define DefaultTty     ""
-#define DefaultOption  ""
-#define DefaultAuthtype          ""
-#define DefaultPassword          ""
-
-
-   typedef void *TUPLE;
-#define palloc malloc
-#define pfree free
-
-#if defined(sun) && defined(sparc) && !defined(__SVR4)
-   extern char *sys_errlist[];
-#define strerror(A) (sys_errlist[(A)])
-#endif                         /* sunos4 */
-
 #ifdef __cplusplus
 };
-
 #endif
 
 #endif                         /* LIBPQ_FE_H */
index 0a46f8273c7a5440213b0daed37e30bd6480dd50..f1a0b324d1a857d751980dcc330abb1cb0c8ab58 100644 (file)
@@ -2,72 +2,59 @@ LIBRARY LIBPQ
 DESCRIPTION "Postgres Client Access Library"
 EXPORTS
    PQconnectdb         @ 1
-   PQconndefaults      @ 2
-   PQsetdbLogin        @ 3
+   PQsetdbLogin        @ 2
+   PQconndefaults      @ 3
    PQfinish        @ 4
    PQreset         @ 5
-   PQdb            @ 6
-   PQuser          @ 7
-   PQhost          @ 8
-   PQoptions       @ 9
-   PQport          @ 10
-   PQtty           @ 11
-   PQstatus        @ 12
-   PQerrorMessage      @ 13
-   PQsocket        @ 14
-   PQtrace         @ 15
-   PQuntrace       @ 16
-   PQexec          @ 17
-   PQnotifies      @ 18
-   PQsendQuery     @ 19
-   PQgetResult     @ 20
-   PQisBusy        @ 21
-   PQconsumeInput      @ 22
-   PQrequestCancel     @ 23
-   PQgetline       @ 24
-   PQputline       @ 25
-   PQendcopy       @ 26
-   PQfn            @ 27
-   PQclearAsyncResult  @ 28
-   PQresultStatus      @ 29
-   PQntuples       @ 30
-   PQnfields       @ 31
-   PQfname         @ 32
-   PQfnumber       @ 33
-   PQftype         @ 34
-   PQfsize         @ 35
-   PQfmod          @ 36
-   PQcmdStatus     @ 37
-   PQoidStatus     @ 38
-   PQcmdTuples     @ 39
-   PQgetvalue      @ 40
-   PQgetlength     @ 41
-   PQgetisnull     @ 42
-   PQclear         @ 43
-   PQprint         @ 44
-   PQdisplayTuples     @ 45
-   PQprintTuples       @ 46
-   fe_getauthsvc       @ 47
-   fe_setauthsvc       @ 48
-   fe_getauthname      @ 49
-   pqGetc          @ 50
-   pqGets          @ 51
-   pqPuts          @ 52
-   pqGetnchar      @ 53
-   pqPutnchar      @ 54
-   pqGetInt        @ 55
-   pqPutInt        @ 56
-   pqReadData      @ 57
-   pqFlush         @ 58
-   pqWait          @ 59
-   lo_open         @ 60
-   lo_close        @ 61
-   lo_read         @ 62
-   lo_write        @ 63
-   lo_lseek        @ 64
-   lo_creat        @ 65
-   lo_tell         @ 66
-   lo_unlink       @ 67
-   lo_import       @ 68
-   lo_export       @ 69
-       
+   PQrequestCancel     @ 6
+   PQdb            @ 7
+   PQuser          @ 8
+   PQhost          @ 9
+   PQoptions       @ 10
+   PQport          @ 11
+   PQtty           @ 12
+   PQstatus        @ 13
+   PQerrorMessage      @ 14
+   PQsocket        @ 15
+   PQtrace         @ 16
+   PQuntrace       @ 17
+   PQsetNoticeProcessor    @ 18
+   PQexec          @ 19
+   PQnotifies      @ 20
+   PQsendQuery     @ 21
+   PQgetResult     @ 22
+   PQisBusy        @ 23
+   PQconsumeInput      @ 24
+   PQgetline       @ 25
+   PQputline       @ 26
+   PQputnbytes     @ 27
+   PQendcopy       @ 28
+   PQfn            @ 29
+   PQresultStatus      @ 30
+   PQntuples       @ 31
+   PQnfields       @ 32
+   PQfname         @ 33
+   PQfnumber       @ 34
+   PQftype         @ 35
+   PQfsize         @ 36
+   PQfmod          @ 37
+   PQcmdStatus     @ 38
+   PQoidStatus     @ 39
+   PQcmdTuples     @ 40
+   PQgetvalue      @ 41
+   PQgetlength     @ 42
+   PQgetisnull     @ 43
+   PQclear         @ 44
+   PQprint         @ 45
+   PQdisplayTuples     @ 46
+   PQprintTuples       @ 47
+   lo_open         @ 48
+   lo_close        @ 49
+   lo_read         @ 50
+   lo_write        @ 51
+   lo_lseek        @ 52
+   lo_creat        @ 53
+   lo_tell         @ 54
+   lo_unlink       @ 55
+   lo_import       @ 56
+   lo_export       @ 57
index 815c00f343d904a4c6666bce2fe67be2f797e1d7..58de98b450c93a06ef76aaa83e246c2353c0f48e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/pqsignal.c,v 1.6 1998/06/15 19:30:26 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/pqsignal.c,v 1.7 1998/08/17 03:50:43 scrappy Exp $
  *
  * NOTES
  *     This shouldn't be in libpq, but the monitor and some other
  *-------------------------------------------------------------------------
  */
 #include 
-
 #include 
 
-#include "libpq/pqsignal.h"
+#include "pqsignal.h"
 
 pqsigfunc
 pqsignal(int signo, pqsigfunc func)