Here is an updated version of this patch against head. It builds, runs and
functions as expected. I did not build the sgml.

I've made changes based on various comments as follows:

  - use WAIT_TIME in description consistantly. Reworded for clarity.
    (Stephan Frost)

  - Use a separate query buffer in getTables() (Stephan Frost)
 
  - sets statement_timeout=0 afterwards per new policy (Tom Lane, Marko Kreen)

  - has only --long-option to conserve short option letters (Marko Kreen)

Regards

-dg

-- 
David Gould       [EMAIL PROTECTED]      510 536 1443    510 282 0869
If simplicity worked, the world would be overrun with insects.
*** a/doc/src/sgml/ref/pg_dump.sgml
--- b/doc/src/sgml/ref/pg_dump.sgml
***************
*** 557,564 **** PostgreSQL documentation
          This option disables the use of dollar quoting for function bodies,
          and forces them to be quoted using SQL standard string syntax.
         </para>
!      </listitem>
!     </varlistentry>
  
       <varlistentry>
        <term><option>--disable-triggers</></term>
--- 557,564 ----
          This option disables the use of dollar quoting for function bodies,
          and forces them to be quoted using SQL standard string syntax.
         </para>
!       </listitem>
!      </varlistentry>
  
       <varlistentry>
        <term><option>--disable-triggers</></term>
***************
*** 588,593 **** PostgreSQL documentation
--- 588,605 ----
       </varlistentry>
  
       <varlistentry>
+       <term><option>--lock-wait-timeout=<replaceable 
class="parameter">wait_time</replaceable></option></term>
+       <listitem>
+        <para>
+         Do not wait forever for table locks at the start of the dump. Instead
+         time out and abandon the dump if unable to lock a table within the
+         specified wait time. The wait time may be specified with the same
+         formats as accepted by <command>SET statement_timeout</>.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
        <term><option>--use-set-session-authorization</></term>
        <listitem>
         <para>
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
***************
*** 71,76 **** bool             attrNames;                      /* put attr 
names into insert strings */
--- 71,77 ----
  bool          schemaOnly;
  bool          dataOnly;
  bool          aclsSkip;
+ const char    *lockWaitTimeout;
  
  /* subquery used to convert user ID (eg, datdba) to user name */
  static const char *username_subquery;
***************
*** 265,270 **** main(int argc, char **argv)
--- 266,275 ----
                {"disable-triggers", no_argument, &disable_triggers, 1},
                {"no-tablespaces", no_argument, &outputNoTablespaces, 1},
                {"use-set-session-authorization", no_argument, 
&use_setsessauth, 1},
+               /*
+               * long options with arguments and no short option letter
+               */
+               {"lock-wait-timeout", required_argument, NULL, 1},
  
                {NULL, 0, NULL, 0}
        };
***************
*** 278,283 **** main(int argc, char **argv)
--- 283,289 ----
        strcpy(g_opaque_type, "opaque");
  
        dataOnly = schemaOnly = dumpInserts = attrNames = false;
+       lockWaitTimeout = NULL;
  
        progname = get_progname(argv[0]);
  
***************
*** 436,441 **** main(int argc, char **argv)
--- 442,452 ----
                                /* This covers the long options equivalent to 
-X xxx. */
                                break;
  
+                       case 1:
+                               /* lock-wait-timeout */
+                               lockWaitTimeout = optarg;
+                               break;
+ 
                        default:
                                fprintf(stderr, _("Try \"%s --help\" for more 
information.\n"), progname);
                                exit(1);
***************
*** 757,762 **** help(const char *progname)
--- 768,776 ----
        printf(_("  -F, --format=c|t|p       output file format (custom, tar, 
plain text)\n"));
        printf(_("  -v, --verbose            verbose mode\n"));
        printf(_("  -Z, --compress=0-9       compression level for compressed 
formats\n"));
+       printf(_("  --lock-wait-timeout=WAIT_TIME\n"
+                        "                           timeout and fail after 
waiting WAIT_TIME\n"
+                        "                           for a table lock during 
startup\n"));
        printf(_("  --help                   show this help, then exit\n"));
        printf(_("  --version                output version information, then 
exit\n"));
  
***************
*** 2956,2962 **** getTables(int *numTables)
        int                     ntups;
        int                     i;
        PQExpBuffer query = createPQExpBuffer();
!       PQExpBuffer delqry = createPQExpBuffer();
        PQExpBuffer lockquery = createPQExpBuffer();
        TableInfo  *tblinfo;
        int                     i_reltableoid;
--- 2970,2976 ----
        int                     ntups;
        int                     i;
        PQExpBuffer query = createPQExpBuffer();
!       PQExpBuffer waitquery = createPQExpBuffer();
        PQExpBuffer lockquery = createPQExpBuffer();
        TableInfo  *tblinfo;
        int                     i_reltableoid;
***************
*** 3191,3196 **** getTables(int *numTables)
--- 3205,3218 ----
        i_reltablespace = PQfnumber(res, "reltablespace");
        i_reloptions = PQfnumber(res, "reloptions");
  
+       if (lockWaitTimeout)
+       {
+               /* Abandon the dump instead of waiting forever for a table lock 
*/
+               resetPQExpBuffer(waitquery);
+               appendPQExpBuffer(waitquery, "SET statement_timeout = ");
+               appendStringLiteralConn(waitquery, lockWaitTimeout, g_conn);
+               do_sql_command(g_conn, waitquery->data);
+       }
        for (i = 0; i < ntups; i++)
        {
                tblinfo[i].dobj.objType = DO_TABLE;
***************
*** 3259,3264 **** getTables(int *numTables)
--- 3281,3290 ----
                                          tblinfo[i].dobj.name);
        }
  
+       if (lockWaitTimeout)
+       {
+               do_sql_command(g_conn, "SET statement_timeout = 0");
+       }
        PQclear(res);
  
        /*
***************
*** 3291,3297 **** getTables(int *numTables)
        }
  
        destroyPQExpBuffer(query);
!       destroyPQExpBuffer(delqry);
        destroyPQExpBuffer(lockquery);
  
        return tblinfo;
--- 3317,3323 ----
        }
  
        destroyPQExpBuffer(query);
!       destroyPQExpBuffer(waitquery);
        destroyPQExpBuffer(lockquery);
  
        return tblinfo;
-- 
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

Reply via email to