OSDN Git Service

Minor documentation improvements and markup fixes.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 17 Oct 1998 22:02:21 +0000 (22:02 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 17 Oct 1998 22:02:21 +0000 (22:02 +0000)
doc/src/sgml/dfunc.sgml
doc/src/sgml/libpgtcl.sgml
doc/src/sgml/libpq.sgml
doc/src/sgml/lobj.sgml
doc/src/sgml/protocol.sgml
doc/src/sgml/ref/notify.sgml
doc/src/sgml/ref/unlisten.sgml
doc/src/sgml/start.sgml
doc/src/sgml/xtypes.sgml

index 4cd047a..1b76dca 100644 (file)
@@ -208,8 +208,8 @@ If the file you specify is
      very simple, since the commands to do it are just:
 <ProgramListing>
 # simple HP-UX example
-&percnt; cc +z +u -c foo.c
-&percnt; ld -b -o foo.sl foo.o
+% cc +z +u -c foo.c
+% ld -b -o foo.sl foo.o
 </ProgramListing>
 </Para>
 
@@ -221,21 +221,21 @@ If the file you specify is
      Under SunOS 4.x, the commands look like:
 <ProgramListing>
 # simple SunOS 4.x example
-&percnt; cc -PIC -c foo.c
-&percnt; ld -dc -dp -Bdynamic -o foo.so foo.o
+% cc -PIC -c foo.c
+% ld -dc -dp -Bdynamic -o foo.so foo.o
 </ProgramListing>
 
      and the equivalent lines under Solaris 2.x are:
 <ProgramListing>
 # simple Solaris 2.x example
-&percnt; cc -K PIC -c foo.c
-&percnt; ld -G -Bdynamic -o foo.so foo.o
+% cc -K PIC -c foo.c
+% ld -G -Bdynamic -o foo.so foo.o
 </ProgramListing>
     or
 <ProgramListing>
 # simple Solaris 2.x example
-&percnt; gcc -fPIC -c foo.c
-&percnt; ld -G -Bdynamic -o foo.so foo.o
+% gcc -fPIC -c foo.c
+% ld -G -Bdynamic -o foo.so foo.o
 </ProgramListing>
 </Para>
 
index ed6758b..f917fb5 100644 (file)
@@ -47,7 +47,7 @@ This package was originally written by Jolly Chen.
   </ROW>
   <ROW>
     <ENTRY>pg_select</ENTRY>
-    <ENTRY>loop over the result of a select statement</ENTRY>
+    <ENTRY>loop over the result of a SELECT statement</ENTRY>
   </ROW>
   <ROW>
     <ENTRY>pg_listen</ENTRY>
@@ -76,7 +76,7 @@ This package was originally written by Jolly Chen.
   </ROW>
   <ROW>
     <ENTRY>pg_lo_lseek</ENTRY>
-    <ENTRY>seek to a position on a large object</ENTRY>
+    <ENTRY>seek to a position in a large object</ENTRY>
   </ROW>
   <ROW>
     <ENTRY>pg_lo_tell</ENTRY>
@@ -168,14 +168,33 @@ proc getDBs { {host "localhost"} {port "5432"} } {
 pg_connect -conninfo <REPLACEABLE CLASS="PARAMETER">connectOptions</REPLACEABLE>
 pg_connect <REPLACEABLE CLASS="PARAMETER">dbName</REPLACEABLE> <OPTIONAL>-host <REPLACEABLE CLASS="PARAMETER">hostName</REPLACEABLE></OPTIONAL>
   <OPTIONAL>-port <REPLACEABLE
-  CLASS="PARAMETER">portNumber</REPLACEABLE></OPTIONAL> <OPTIONAL>-tty
-  <REPLACEABLE CLASS="PARAMETER">pqtty</REPLACEABLE></OPTIONAL>
+  CLASS="PARAMETER">portNumber</REPLACEABLE></OPTIONAL> <OPTIONAL>-tty <REPLACEABLE
+  CLASS="PARAMETER">pqtty</REPLACEABLE></OPTIONAL>
   <OPTIONAL>-options <REPLACEABLE
   CLASS="PARAMETER">optionalBackendArgs</REPLACEABLE></OPTIONAL>
 </SYNOPSIS>
 
 <REFSECT2 ID="R2-PGTCL-PGCONNECT-1">
 <REFSECT2INFO>
+<DATE>1998-10-07</DATE>
+</REFSECT2INFO>
+<TITLE>Inputs (new style)
+</TITLE>
+<VARIABLELIST>
+<VARLISTENTRY>
+<TERM>
+  <REPLACEABLE CLASS="PARAMETER">connectOptions</REPLACEABLE>
+</TERM>
+<LISTITEM>
+<PARA>A string of connection options, each written in the form keyword = value.
+</PARA>
+</LISTITEM>
+</VARLISTENTRY>
+</VARIABLELIST>
+</REFSECT2>
+
+<REFSECT2 ID="R2-PGTCL-PGCONNECT-2">
+<REFSECT2INFO>
 <DATE>1997-12-24</DATE>
 </REFSECT2INFO>
 <TITLE>Inputs (old style)
@@ -213,7 +232,7 @@ pg_connect <REPLACEABLE CLASS="PARAMETER">dbName</REPLACEABLE> <OPTIONAL>-host <
   <OPTIONAL>-tty <REPLACEABLE CLASS="PARAMETER">pqtty</REPLACEABLE></OPTIONAL>
 </TERM>
 <LISTITEM>
-<PARA>(need information thomas 1997-12-24)
+<PARA>Specifies file or tty for optional debug output from backend.
 </PARA>
 </LISTITEM>
 </VARLISTENTRY>
@@ -229,25 +248,6 @@ pg_connect <REPLACEABLE CLASS="PARAMETER">dbName</REPLACEABLE> <OPTIONAL>-host <
 </VARIABLELIST>
 </REFSECT2>
 
-<REFSECT2 ID="R2-PGTCL-PGCONNECT-2">
-<REFSECT2INFO>
-<DATE>1998-10-07</DATE>
-</REFSECT2INFO>
-<TITLE>Inputs (new style)
-</TITLE>
-<VARIABLELIST>
-<VARLISTENTRY>
-<TERM>
-  <REPLACEABLE CLASS="PARAMETER">connectOptions</REPLACEABLE>
-</TERM>
-<LISTITEM>
-<PARA>A string of connection options, each written in the form keyword = value.
-</PARA>
-</LISTITEM>
-</VARLISTENTRY>
-</VARIABLELIST>
-</REFSECT2>
-
 <REFSECT2 ID="R2-PGTCL-PGCONNECT-3">
 <REFSECT2INFO>
 <DATE>1997-12-24</DATE>
@@ -423,7 +423,8 @@ Each entry in the list is a sublist of the format:
 <para>
         {optname label dispchar dispsize value}
 <Para>
-where the optname is usable as an option in pg_connect -conninfo.
+where the optname is usable as an option in
+<FUNCTION>pg_connect -conninfo</FUNCTION>.
 </PARA>
 </LISTITEM>
 </VARLISTENTRY>
@@ -785,7 +786,7 @@ created too many query result objects.
 <REFNAME>pg_select
 </REFNAME>
 <REFPURPOSE>
-loop over the result of a select statement
+loop over the result of a SELECT statement
 </REFPURPOSE>
 <INDEXTERM ID="IX-PGTCL-PGSELECT-1"><PRIMARY>pgtcl</PRIMARY><SECONDARY>connecting</SECONDARY></INDEXTERM>
 <INDEXTERM ID="IX-PGTCL-PGSELECT-2"><PRIMARY>pg_connect</PRIMARY></INDEXTERM>
@@ -1500,7 +1501,7 @@ the actual string to write, not a variable name.
 <REFNAMEDIV>
 <REFNAME>pg_lo_lseek
 </REFNAME>
-<REFPURPOSE>seek to a position on a large object
+<REFPURPOSE>seek to a position in a large object
 </REFPURPOSE>
 <INDEXTERM ID="IX-PGTCL-PGLOLSEEK-1"><PRIMARY>pgtcl</PRIMARY><SECONDARY>positioning</SECONDARY></INDEXTERM>
 <INDEXTERM ID="IX-PGTCL-PGLOLSEEK-2"><PRIMARY>pg_lo_lseek</PRIMARY></INDEXTERM>
index 7caa0ce..2291c88 100644 (file)
@@ -149,7 +149,7 @@ accepts and ignores this keyword for backward compatibility.)
 </ListItem>
 <ListItem>
 <Para>
-<Acronym>tty</Acronym> -- file or tty for optional debug output.
+<Acronym>tty</Acronym> -- file or tty for optional debug output from backend.
 </Para>
 </ListItem>
 </ItemizedList>
@@ -166,20 +166,20 @@ default values for unspecified options.
 PQconninfoOption *PQconndefaults(void)
 
 struct PQconninfoOption
-       {
-               char   *keyword;   /* The keyword of the option */
-               char   *envvar;    /* Fallback environment variable name */
-               char   *compiled;  /* Fallback compiled in default value */
-               char   *val;       /* Options value */
-               char   *label;     /* Label for field in connect dialog */
-               char   *dispchar;  /* Character to display for this field
-                                     in a connect dialog. Values are:
-                                     ""        Display entered value as is
-                                     "*"       Password field - hide value
-                                     "D"       Debug options - don't
-                                     create a field by default */
-               int     dispsize;  /* Field size in characters for dialog */
-       };
+        {
+                char   *keyword;   /* The keyword of the option */
+                char   *envvar;    /* Fallback environment variable name */
+                char   *compiled;  /* Fallback compiled in default value */
+                char   *val;       /* Option's value */
+                char   *label;     /* Label for field in connect dialog */
+                char   *dispchar;  /* Character to display for this field
+                                      in a connect dialog. Values are:
+                                      ""        Display entered value as is
+                                      "*"       Password field - hide value
+                                      "D"       Debug options - don't
+                                      create a field by default */
+                int     dispsize;  /* Field size in characters for dialog */
+        };
 
 </synopsis>
        Returns the address of the connection options structure.  This may
@@ -409,18 +409,18 @@ soon.)
           Returns the result status of the query.  PQresultStatus can return one of the following values:
 <synopsis>
 PGRES_EMPTY_QUERY,
-PGRES_COMMAND_OK,  /* the query was a command returning no data */
-PGRES_TUPLES_OK,  /* the query successfully returned tuples */
-PGRES_COPY_OUT,  /* Copy Out (from server) data transfer started */
-PGRES_COPY_IN,  /* Copy In (to server) data transfer started */
-PGRES_BAD_RESPONSE, /* an unexpected response was received */
+PGRES_COMMAND_OK,       /* the query was a command returning no data */
+PGRES_TUPLES_OK,        /* the query successfully returned tuples */
+PGRES_COPY_OUT,         /* Copy Out (from server) data transfer started */
+PGRES_COPY_IN,          /* Copy In (to server) data transfer started */
+PGRES_BAD_RESPONSE,     /* an unexpected response was received */
 PGRES_NONFATAL_ERROR,
 PGRES_FATAL_ERROR
 </synopsis>
           If  the result status is PGRES_TUPLES_OK, then the
           routines described below can be  used  to  retrieve  the
           tuples returned by the query.  Note that a SELECT that
-         happens to retrieve zero tuples still shows PGRES_TUPLES_OK;
+         happens to retrieve zero tuples still shows PGRES_TUPLES_OK.
          PGRES_COMMAND_OK is for commands that can never return tuples.
 </Para>
 </ListItem>
@@ -522,13 +522,15 @@ Oid PQftype(PGresult *res,
 <Para>
 <Function>PQfsize</Function>
           Returns  the  size  in bytes of the field
-          associated with the given field index. If the size
-          returned  is  -1,  the  field is a variable length
-          field.  Field indices start at 0.
+          associated with the given field index.
+          Field indices start at 0.
 <synopsis>
 int PQfsize(PGresult *res,
             int field_index);
 </synopsis>
+       PQfsize returns the space allocated for this field in a database
+       tuple, in other words the size of the server's binary representation
+       of the data type.  -1 is returned if the field is variable size.
 </Para>
 </ListItem>
 
@@ -558,11 +560,12 @@ char* PQgetvalue(PGresult *res,
 </synopsis>
           For most queries, the value returned by PQgetvalue
           is a null-terminated ASCII  string  representation
-          of the attribute value.  If the query extracted data from
-          a <Acronym>BINARY</Acronym> cursor, then  the  value  returned  by
+          of the attribute value.  But if PQbinaryTuples() is TRUE,
+          the  value  returned  by
           PQgetvalue  is  the  binary  representation of the
-          type in the internal format of the backend server.
-          It  is the programmer's responsibility to cast and
+          type in the internal format of the backend server
+         (but not including the size word, if the field is variable-length).
+          It  is then the programmer's responsibility to cast and
           convert the data to the correct C type.  The pointer
           returned  by  PQgetvalue points to storage that is
           part of the PGresult structure.  One should not modify it,
@@ -574,39 +577,34 @@ char* PQgetvalue(PGresult *res,
 
 <ListItem>
 <Para>
-<Function>PQgetisnull</Function>
-           Tests a field for a NULL entry.
-           Tuple and field indices start at 0.
+<Function>PQgetlength</Function>
+          Returns   the   length  of  a  field (attribute) in bytes.
+          Tuple and field indices start at 0.
 <synopsis>
-int PQgetisnull(PGresult *res,
+int PQgetlength(PGresult *res,
                 int tup_num,
                 int field_num);
 </synopsis>
-            This function returns  1 if the field contains a NULL, 0 if
-            it contains a non-null value.  (Note that PQgetvalue
-            will return an empty string, not a null pointer, for a NULL
-            field.)
+This is the actual data length for the particular data value, that is the
+size of the object pointed to by PQgetvalue.  Note that for ASCII-represented
+values, this size has little to do with the binary size reported by PQfsize.
 </Para>
 </ListItem>
 
 <ListItem>
 <Para>
-<Function>PQgetlength</Function>
-          Returns   the   length  of  a  field
-          (attribute) in bytes.
-          Tuple and field indices start at 0.
+<Function>PQgetisnull</Function>
+           Tests a field for a NULL entry.
+           Tuple and field indices start at 0.
 <synopsis>
-int PQgetlength(PGresult *res,
+int PQgetisnull(PGresult *res,
                 int tup_num,
                 int field_num);
 </synopsis>
-This is the actual data length for the particular data value,
-whereas PQfsize shows the allocated space for all entries in
-this column.
-If the field  is  a  struct
-          varlena, the length returned here does not include
-          the size field of the varlena, i.e., it is 4 bytes
-          less.
+            This function returns  1 if the field contains a NULL, 0 if
+            it contains a non-null value.  (Note that PQgetvalue
+            will return an empty string, not a null pointer, for a NULL
+            field.)
 </Para>
 </ListItem>
 
@@ -658,18 +656,18 @@ void PQprint(FILE* fout,      /* output stream */
              PQprintOpt* po);
 
 struct _PQprintOpt
-       {
-               pqbool  header;      /* print output field headings and row count */
-               pqbool  align;       /* fill align the fields */
-               pqbool  standard;    /* old brain dead format */
-               pqbool  html3;       /* output html tables */
-               pqbool  expanded;    /* expand tables */
-               pqbool  pager;       /* use pager for output if needed */
-               char    *fieldSep;   /* field separator */
-               char    *tableOpt;   /* insert to HTML &lt;table ...&gt; */
-               char    *caption;    /* HTML &lt;caption&gt; */
-               char    **fieldName; /* null terminated array of replacement field names */
-       };
+        {
+                pqbool  header;      /* print output field headings and row count */
+                pqbool  align;       /* fill align the fields */
+                pqbool  standard;    /* old brain dead format */
+                pqbool  html3;       /* output html tables */
+                pqbool  expanded;    /* expand tables */
+                pqbool  pager;       /* use pager for output if needed */
+                char    *fieldSep;   /* field separator */
+                char    *tableOpt;   /* insert to HTML &lt;table ...&gt; */
+                char    *caption;    /* HTML &lt;caption&gt; */
+                char    **fieldName; /* null terminated array of replacement field names */
+        };
 </synopsis>
        This function is intended to replace PQprintTuples(), which is
        now obsolete.  The <FileName>psql</FileName> program uses
@@ -855,8 +853,8 @@ was actually collected.   After calling PQconsumeInput,
 the application may check PQisBusy and/or PQnotifies to see if their state
 has changed.
          PQconsumeInput may be called even if the application is not
-         prepared to deal with a result or notification just yet.
-         It will read available data and save it in a buffer, thereby
+         prepared to deal with a result or notification just yet.  The
+         routine will read available data and save it in a buffer, thereby
          causing a select(2) read-ready indication to go away.  The
          application can thus use PQconsumeInput to clear the select
          condition immediately, and then examine the results at leisure.
@@ -959,13 +957,16 @@ or the backend is not currently processing a query.
 <Title>Fast Path</Title>
 
 <Para>
+<ProductName>Postgres</ProductName> provides a fast path interface to send
+function calls to the backend.  This is a trapdoor into system internals and
+can be a potential security hole.  Most users will not need this feature.
+
+<Para>
 <ItemizedList>
 <ListItem>
 <Para>
-<ProductName>Postgres</ProductName>  provides  a fast path interface to send function
- calls to the backend.  This  is  a  trapdoor  into
-     system  internals and can be a potential security hole.
-     Most users will not need this feature.
+<Function>PQfn</Function>
+       Request execution of a backend function via the fast path interface.
 <synopsis>
 PGresult* PQfn(PGconn* conn,
                int fnid,
@@ -979,12 +980,15 @@ PGresult* PQfn(PGconn* conn,
      executed.
      result_buf is the buffer in which
      to place the return value.  The caller must  have  allocated
-     sufficient space to store the return value.  The
-     result length will be returned in the  storage  pointed
-     to  by  result_len.   If the result is to be an integer
-     value, than result_is_int should be set to 1; otherwise
-     it  should  be  set  to  0.  args and nargs specify the
-     arguments to the function.
+     sufficient space to store the return value (there is no check!).
+     The actual result length will be returned in the integer pointed
+     to  by  result_len.   If a 4-byte integer result is expected, set
+     result_is_int to 1; otherwise set it to 0.  (Setting result_is_int to 1
+     tells libpq to byte-swap the value if necessary, so that it is
+     delivered as a proper int value for the client machine.  When
+     result_is_int is 0, the byte string sent by the backend is returned
+     unmodified.)
+     args and nargs specify the arguments to be passed to the function.
 <synopsis>
 typedef struct {
              int len;
@@ -1037,9 +1041,19 @@ messages can be detected by calling PQnotifies().
          removed from the list of notifications.
 <synopsis>
 PGnotify* PQnotifies(PGconn *conn);
+
+typedef struct pgNotify
+    {
+        char        relname[NAMEDATALEN];       /* name of relation
+                                                 * containing data */
+        int         be_pid;                     /* process id of backend */
+    } PGnotify;
 </synopsis>
          After processing a PGnotify object returned by PQnotifies,
          be sure to free it with free() to avoid a memory leak.
+         NOTE: in <productname>Postgres</productname> 6.4 and later,
+         the be_pid is the notifying backend's, whereas in earlier versions
+         it was always your own backend's PID.
 </Para>
 </ListItem>
 </ItemizedList>
@@ -1307,7 +1321,7 @@ defaultNoticeProcessor(void * arg, const char * message)
 
 <Para>
 To use a special notice processor, call <function>PQsetNoticeProcessor</function> just after
-any creation of a new PGconn object.
+creation of a new PGconn object.
 
 </Sect1>
 
@@ -1565,8 +1579,8 @@ main()
      */
     if (PQstatus(conn) == CONNECTION_BAD)
     {
-        fprintf(stderr, "Connection to database '&percnt;s' failed.\n", dbName);
-        fprintf(stderr, "&percnt;s", PQerrorMessage(conn));
+        fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
+        fprintf(stderr, "%s", PQerrorMessage(conn));
         exit_nicely(conn);
     }
 
@@ -1612,14 +1626,14 @@ main()
     /* first, print out the attribute names */
     nFields = PQnfields(res);
     for (i = 0; i &lt; nFields; i++)
-        printf("&percnt;-15s", PQfname(res, i));
+        printf("%-15s", PQfname(res, i));
     printf("\n\n");
 
     /* next, print out the instances */
     for (i = 0; i &lt; PQntuples(res); i++)
     {
         for (j = 0; j &lt; nFields; j++)
-            printf("&percnt;-15s", PQgetvalue(res, i, j));
+            printf("%-15s", PQgetvalue(res, i, j));
         printf("\n");
     }
 
@@ -1713,8 +1727,8 @@ main()
      */
     if (PQstatus(conn) == CONNECTION_BAD)
     {
-        fprintf(stderr, "Connection to database '&percnt;s' failed.\n", dbName);
-        fprintf(stderr, "&percnt;s", PQerrorMessage(conn));
+        fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
+        fprintf(stderr, "%s", PQerrorMessage(conn));
         exit_nicely(conn);
     }
 
@@ -1746,7 +1760,7 @@ main()
         while ((notify = PQnotifies(conn)) != NULL)
         {
             fprintf(stderr,
-                 "ASYNC NOTIFY of '&percnt;s' from backend pid '&percnt;d' received\n",
+                 "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                     notify-&gt;relname, notify-&gt;be_pid);
             free(notify);
         }
@@ -1841,8 +1855,8 @@ main()
      */
     if (PQstatus(conn) == CONNECTION_BAD)
     {
-        fprintf(stderr, "Connection to database '&percnt;s' failed.\n", dbName);
-        fprintf(stderr, "&percnt;s", PQerrorMessage(conn));
+        fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
+        fprintf(stderr, "%s", PQerrorMessage(conn));
         exit_nicely(conn);
     }
 
@@ -1888,7 +1902,7 @@ main()
 
     for (i = 0; i &lt; 3; i++)
     {
-        printf("type[&percnt;d] = &percnt;d, size[&percnt;d] = &percnt;d\n",
+        printf("type[%d] = %d, size[%d] = %d\n",
                i, PQftype(res, i),
                i, PQfsize(res, i));
     }
@@ -1910,13 +1924,13 @@ main()
          */
         pval = (POLYGON *) malloc(plen + VARHDRSZ);
         pval-&gt;size = plen;
-        memmove((char *) &pval-&gt;npts, PQgetvalue(res, i, p_fnum), plen);
-        printf("tuple &percnt;d: got\n", i);
-        printf(" i = (&percnt;d bytes) &percnt;d,\n",
+        memmove((char *) &amp;pval-&gt;npts, PQgetvalue(res, i, p_fnum), plen);
+        printf("tuple %d: got\n", i);
+        printf(" i = (%d bytes) %d,\n",
                PQgetlength(res, i, i_fnum), *ival);
-        printf(" d = (&percnt;d bytes) &percnt;f,\n",
+        printf(" d = (%d bytes) %f,\n",
                PQgetlength(res, i, d_fnum), *dval);
-        printf(" p = (&percnt;d bytes) &percnt;d points \tboundbox = (hi=&percnt;f/&percnt;f, lo = &percnt;f,&percnt;f)\n",
+        printf(" p = (%d bytes) %d points \tboundbox = (hi=%f/%f, lo = %f,%f)\n",
                PQgetlength(res, i, d_fnum),
                pval-&gt;npts,
                pval-&gt;boundbox.xh,
index a7bed50..0ec632f 100644 (file)
@@ -284,7 +284,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
               */
              fd = open(filename, O_RDONLY, 0666);
              if (fd &lt; 0)  {   /* error */
-              fprintf(stderr, "can't open unix file
+              fprintf(stderr, "can't open unix file %s\n", filename);
              }
 
              /*
@@ -292,7 +292,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
               */
              lobjId = lo_creat(conn, INV_READ|INV_WRITE);
              if (lobjId == 0) {
-              fprintf(stderr, "can't create large object");
+              fprintf(stderr, "can't create large object\n");
              }
 
              lobj_fd = lo_open(conn, lobjId, INV_WRITE);
@@ -302,7 +302,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
              while ((nbytes = read(fd, buf, BUFSIZE)) &gt; 0) {
               tmp = lo_write(conn, lobj_fd, buf, nbytes);
               if (tmp &lt; nbytes) {
-                  fprintf(stderr, "error while reading
+                  fprintf(stderr, "error while reading large object\n");
               }
              }
 
@@ -321,7 +321,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
 
              lobj_fd = lo_open(conn, lobjId, INV_READ);
              if (lobj_fd &lt; 0) {
-              fprintf(stderr,"can't open large object %d",
+              fprintf(stderr,"can't open large object %d\n",
                    lobjId);
              }
 
@@ -335,7 +335,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
               fprintf(stderr,"&gt;&gt;&gt; %s", buf);
               nread += nbytes;
              }
-             fprintf(stderr,"0);
+             fprintf(stderr,"\n");
              lo_close(conn, lobj_fd);
          }
 
@@ -349,7 +349,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
 
              lobj_fd = lo_open(conn, lobjId, INV_READ);
              if (lobj_fd &lt; 0) {
-              fprintf(stderr,"can't open large object %d",
+              fprintf(stderr,"can't open large object %d\n",
                    lobjId);
              }
 
@@ -365,7 +365,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
               nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);
               nwritten += nbytes;
              }
-             fprintf(stderr,"0);
+             fprintf(stderr,"\n");
              lo_close(conn, lobj_fd);
          }
 
@@ -385,7 +385,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
               */
              lobj_fd = lo_open(conn, lobjId, INV_READ);
              if (lobj_fd &lt; 0) {
-              fprintf(stderr,"can't open large object %d",
+              fprintf(stderr,"can't open large object %d\n",
                    lobjId);
              }
 
@@ -394,7 +394,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
               */
              fd = open(filename, O_CREAT|O_WRONLY, 0666);
              if (fd &lt; 0)  {   /* error */
-              fprintf(stderr, "can't open unix file
+              fprintf(stderr, "can't open unix file %s\n",
                    filename);
              }
 
@@ -404,7 +404,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
              while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) &gt; 0) {
               tmp = write(fd, buf, nbytes);
                  if (tmp &lt; nbytes) {
-                  fprintf(stderr,"error while writing
+                  fprintf(stderr,"error while writing %s\n",
                        filename);
               }
              }
@@ -432,7 +432,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
              PGresult *res;
 
              if (argc != 4) {
-              fprintf(stderr, "Usage: %s database_name in_filename out_filename0,
+              fprintf(stderr, "Usage: %s database_name in_filename out_filename\n",
                    argv[0]);
               exit(1);
              }
@@ -448,7 +448,7 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
 
              /* check to see that the backend connection was successfully made */
              if (PQstatus(conn) == CONNECTION_BAD) {
-              fprintf(stderr,"Connection to database '%s' failed.0, database);
+              fprintf(stderr,"Connection to database '%s' failed.\n", database);
               fprintf(stderr,"%s",PQerrorMessage(conn));
               exit_nicely(conn);
              }
@@ -456,20 +456,20 @@ SELECT lo_export(image.raster, "/tmp/motd") from image
              res = PQexec(conn, "begin");
              PQclear(res);
 
-             printf("importing file
+             printf("importing file %s\n", in_filename);
          /*  lobjOid = importFile(conn, in_filename); */
              lobjOid = lo_import(conn, in_filename);
          /*
-             printf("as large object %d.0, lobjOid);
+             printf("as large object %d.\n", lobjOid);
 
-             printf("picking out bytes 1000-2000 of the large object0);
+             printf("picking out bytes 1000-2000 of the large object\n");
              pickout(conn, lobjOid, 1000, 1000);
 
-             printf("overwriting bytes 1000-2000 of the large object with X's0);
+             printf("overwriting bytes 1000-2000 of the large object with X's\n");
              overwrite(conn, lobjOid, 1000, 1000);
          */
 
-             printf("exporting large object to file
+             printf("exporting large object to file %s\n", out_filename);
          /*    exportFile(conn, lobjOid, out_filename); */
              lo_export(conn, lobjOid,out_filename);
 
index 582b0b1..5bad947 100644 (file)
@@ -691,13 +691,14 @@ AsciiRow (B)
 </Term>
 <ListItem>
 <Para>
-
                 A bit map with one bit for each field in the row.  The 1st
-                field corresponds to bit 7 of the 1st byte, the 2nd field
-                corresponds to bit 6 of the 1st byte, the 8th field corresponds
-                to bit 0 of the 1st byte, the 9th field corresponds to bit 8 of
-                the 2nd byte, and so on.  The bit is set if the value of the
-                corresponding field is not NULL.
+                field corresponds to bit 7 (MSB) of the 1st byte, the 2nd
+                field corresponds to bit 6 of the 1st byte, the 8th field
+                corresponds to bit 0 (LSB) of the 1st byte, the 9th field
+                corresponds to bit 7 of the 2nd byte, and so on.  Each bit
+                is set if the value of the corresponding field is not NULL.
+                If the number of fields is not a multiple of 8, the remainder
+                of the last byte in the bit map is wasted.
 </Para>
 <Para>
        Then, for each field with a non-NULL value, there is the following:
@@ -720,7 +721,10 @@ AsciiRow (B)
 <ListItem>
 <Para>
                        Specifies the value of the field itself in <Acronym>ASCII</Acronym>
-                       characters.  <Replaceable>n</Replaceable> is the above size minus 4.
+                       characters.  <Replaceable>n</Replaceable> is the above
+                       size minus 4.
+                        There is no trailing '\0' in the field data; the front
+                       end must add one if it wants one.
 </Para>
 </ListItem>
 </VarListEntry>
@@ -985,11 +989,13 @@ BinaryRow (B)
 <ListItem>
 <Para>
                 A bit map with one bit for each field in the row.  The 1st
-                field corresponds to bit 7 of the 1st byte, the 2nd field
-                corresponds to bit 6 of the 1st byte, the 8th field corresponds
-                to bit 0 of the 1st byte, the 9th field corresponds to bit 8 of
-                the 2nd byte, and so on.  The bit is set if the value of the
-                corresponding field is not NULL.
+                field corresponds to bit 7 (MSB) of the 1st byte, the 2nd
+                field corresponds to bit 6 of the 1st byte, the 8th field
+                corresponds to bit 0 (LSB) of the 1st byte, the 9th field
+                corresponds to bit 7 of the 2nd byte, and so on.  Each bit
+                is set if the value of the corresponding field is not NULL.
+                If the number of fields is not a multiple of 8, the remainder
+                of the last byte in the bit map is wasted.
 </Para>
 <Para>
        Then, for each field with a non-NULL value, there is the following:
@@ -1561,7 +1567,7 @@ NotificationResponse (B)
 </Term>
 <ListItem>
 <Para>
-               The process ID of the backend process.
+               The process ID of the notifying backend process.
 </Para>
 </ListItem>
 </VarListEntry>
@@ -1571,7 +1577,7 @@ NotificationResponse (B)
 </Term>
 <ListItem>
 <Para>
-               The name of the relation that the notify has been raised on.
+               The name of the condition that the notify has been raised on.
 </Para>
 </ListItem>
 </VarListEntry>
@@ -1664,7 +1670,7 @@ RowDescription (B)
 </Term>
 <ListItem>
 <Para>
-               Specifies the number of fields in a row (and may be zero).
+               Specifies the number of fields in a row (may be zero).
 </Para>
 <Para>
        Then, for each field, there is the following:
@@ -1756,7 +1762,7 @@ StartupPacket (F)
 </Term>
 <ListItem>
 <Para>
-               The database name, defaults to the user name if omitted.
+               The database name, defaults to the user name if empty.
 </Para>
 </ListItem>
 </VarListEntry>
index 0404de2..90b361b 100644 (file)
@@ -73,6 +73,9 @@ Acknowledgement that notify command has executed.
 </PARA>
 </LISTITEM>
 </VARLISTENTRY>
+</variablelist>
+</LISTITEM>
+</VARLISTENTRY>
 <VARLISTENTRY>
 <TERM>
 Notify events
@@ -84,9 +87,6 @@ application reacts depends on its programming.
 </PARA>
 </LISTITEM>
 </VARLISTENTRY>
-</variablelist>
-</LISTITEM>
-</VARLISTENTRY>
 </VARIABLELIST>
 </REFSECT2>
 </REFSYNOPSISDIV>
index b353ff6..5ba9f2c 100644 (file)
@@ -104,7 +104,7 @@ The backend does not complain if you UNLISTEN something you were not
 listening for.
 
 <para>
-Each backend will automatically execute <command>UNLISTEN "*"</command> when
+Each backend will automatically execute <command>UNLISTEN *</command> when
 exiting.
 
 <para>
index 0567e3a..5208236 100644 (file)
@@ -27,7 +27,7 @@ to this guide when the installation is complete.
 
 <Para>
      Throughout this manual, any examples  that  begin  with
-     the  character  <Quote>&percnt</Quote> are commands that should be typed
+     the  character  <Quote>%</Quote> are commands that should be typed
      at the UNIX shell prompt.  Examples that begin with the
      character <Quote>*</Quote> are commands in the Postgres query 
      language, Postgres <Acronym>SQL</Acronym>.
index b1e592e..8d8b73b 100644 (file)
@@ -51,7 +51,7 @@
                 {
                     double x, y;
                     Complex *result;
-                    if (sscanf(str, " ( &percnt;lf , &percnt;lf )", &amp;x, &amp;y) != 2) {
+                    if (sscanf(str, " ( %lf , %lf )", &amp;x, &amp;y) != 2) {
                         elog(WARN, "complex_in: error in parsing
                         return NULL;
                     }
@@ -71,7 +71,7 @@
                     if (complex == NULL)
                         return(NULL);
                     result = (char *) palloc(60);
-                    sprintf(result, "(&percnt;g,&percnt;g)", complex-&gt;x, complex-&gt;y);
+                    sprintf(result, "(%g,%g)", complex-&gt;x, complex-&gt;y);
                     return(result);
                 }
 </ProgramListing>