Tom Lane wrote:
> Bruce Momjian <[EMAIL PROTECTED]> writes:
> > Tom Lane wrote:
> >> What happens in a pg_dump -Fc / pg_restore scenario?
> 
> > So, in non-ascii format, I need to dump a comment record and read it
> > back on restore?  Yuck.  Anyone want to tackle that?
> 
> Yes.  Hacking the output routines alone is almost never the right way
> to do things in pg_dump.
> 
> My feeling is that if anyone cares to tackle this, it would be
> appropriate to add a record type that carries a user-supplied
> comment, and then people could do something like
>       pg_dump --comment "generated on `date`"
> if they want to have a timestamp.  I don't want a timestamp put
> into the file by default, because that creates problems for
> comparing dump files.

OK, new patch.  This puts start/stop times into dumps if you use -v
during dumping.  It creates a new node type:
        
        --
        -- PostgreSQL database dump
        --
        
        SET client_encoding = 'SQL_ASCII';
        SET check_function_bodies = false;
        
        --
        -- Name: DUMP TIMESTAMP; Type: DUMP TIMESTAMP; Schema: -; Owner:
        --
        
        -- Started on 2004-06-05 00:41:25 EDT

        ...

        --
        -- Name: DUMP TIMESTAMP; Type: DUMP TIMESTAMP; Schema: -; Owner:
        --
        
        -- Completed on 2004-06-05 00:44:28 EDT
        
        
        --
        -- PostgreSQL database dump complete
        --

One issue is that the system dumps certain settings into the output file
in ascii dumps, but pg_restore sets them on its own during the restore. 
Because the timestamp can't be done during pg_restore, it has to be a
special node.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/ref/pg_dump.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/pg_dump.sgml,v
retrieving revision 1.70
diff -c -c -r1.70 pg_dump.sgml
*** doc/src/sgml/ref/pg_dump.sgml       31 May 2004 13:37:52 -0000      1.70
--- doc/src/sgml/ref/pg_dump.sgml       5 Jun 2004 04:22:15 -0000
***************
*** 403,409 ****
         <para>
        Specifies verbose mode.  This will cause
        <application>pg_dump</application> to output detailed object
!         comments in the dump file, and progress messages to standard error.
         </para>
        </listitem>
       </varlistentry>
--- 403,410 ----
         <para>
        Specifies verbose mode.  This will cause
        <application>pg_dump</application> to output detailed object
!         comments in the dump file, start and stop times, and progress 
!         messages to standard error.
         </para>
        </listitem>
       </varlistentry>
Index: doc/src/sgml/ref/pg_dumpall.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/pg_dumpall.sgml,v
retrieving revision 1.43
diff -c -c -r1.43 pg_dumpall.sgml
*** doc/src/sgml/ref/pg_dumpall.sgml    29 Nov 2003 19:51:39 -0000      1.43
--- doc/src/sgml/ref/pg_dumpall.sgml    5 Jun 2004 04:22:15 -0000
***************
*** 192,199 ****
        <listitem>
         <para>
        Specifies verbose mode.  This will cause
!       <application>pg_dumpall</application> to print progress
!       messages to standard error.
         </para>
        </listitem>
       </varlistentry>
--- 192,200 ----
        <listitem>
         <para>
        Specifies verbose mode.  This will cause
!       <application>pg_dumpall</application> to output start and stop
!         times in the dump file, and progress messages to standard error.
!         It will also enable verbose output in <application>pg_dump</>.
         </para>
        </listitem>
       </varlistentry>
Index: src/bin/pg_dump/pg_dump.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/pg_dump/pg_dump.c,v
retrieving revision 1.373
diff -c -c -r1.373 pg_dump.c
*** src/bin/pg_dump/pg_dump.c   3 Jun 2004 00:07:36 -0000       1.373
--- src/bin/pg_dump/pg_dump.c   5 Jun 2004 04:22:21 -0000
***************
*** 32,37 ****
--- 32,38 ----
  #ifdef HAVE_TERMIOS_H
  #include <termios.h>
  #endif
+ #include <time.h>
  
  #ifndef HAVE_STRDUP
  #include "strdup.h"
***************
*** 163,168 ****
--- 164,170 ----
  static const char *fmtQualifiedId(const char *schema, const char *id);
  static int    dumpBlobs(Archive *AH, void *arg);
  static void dumpDatabase(Archive *AH);
+ static void dumpTimestamp(Archive *AH, char *msg);
  static void dumpEncoding(Archive *AH);
  static const char *getAttrName(int attrnum, TableInfo *tblInfo);
  static const char *fmtCopyColumnList(const TableInfo *ti);
***************
*** 598,603 ****
--- 600,608 ----
         * in a safe order.
         */
  
+       if (g_fout->verbose)
+               dumpTimestamp(g_fout, "Started on");
+ 
        /* First the special encoding entry. */
        dumpEncoding(g_fout);
  
***************
*** 615,620 ****
--- 620,628 ----
                dumpDumpableObject(g_fout, dobjs[i]);
        }
  
+       if (g_fout->verbose)
+               dumpTimestamp(g_fout, "Completed on");
+ 
        /*
         * And finally we can do the actual output.
         */
***************
*** 1280,1285 ****
--- 1288,1322 ----
        destroyPQExpBuffer(dbQry);
        destroyPQExpBuffer(delQry);
        destroyPQExpBuffer(creaQry);
+ }
+ 
+ 
+ /*
+  * dumpTimestamp
+  */
+ static void
+ dumpTimestamp(Archive *AH, char *msg)
+ {
+       char buf[256];
+       time_t now = time(NULL);
+ 
+       if (strftime(buf, 256, "%Y-%m-%d %H:%M:%S %Z", localtime(&now)) != 0)
+       {
+               PQExpBuffer qry = createPQExpBuffer();
+       
+               appendPQExpBuffer(qry, "-- ");
+               appendPQExpBuffer(qry, msg);
+               appendPQExpBuffer(qry, " ");
+               appendPQExpBuffer(qry, buf);
+               appendPQExpBuffer(qry, "\n");
+ 
+               ArchiveEntry(AH, nilCatalogId, createDumpId(),
+                                        "DUMP TIMESTAMP", NULL, "",
+                                        false, "DUMP TIMESTAMP", qry->data, "", NULL,
+                                        NULL, 0,
+                                        NULL, NULL);
+               destroyPQExpBuffer(qry);
+       }
  }
  
  
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to