]> granicus.if.org Git - postgresql/commitdiff
Tweak pg_dump to say GRANT ALL when appropriate, rather than enumerating
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 25 Jan 2002 18:49:31 +0000 (18:49 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 25 Jan 2002 18:49:31 +0000 (18:49 +0000)
the individual privilege bits.  I regard this as an important change for
cross-version compatibility: without this, a 7.1 dump loaded into 7.2
is likely to be short a few privileges.

src/bin/pg_dump/pg_dump.c

index 77e7bc1585a292942e76bff9198fa2623ec77edd..7380eb316a0a92f6fbde6a738a0f0547983824cc 100644 (file)
@@ -22,7 +22,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.238 2002/01/18 19:17:05 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.239 2002/01/25 18:49:31 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3885,47 +3885,53 @@ AddAcl(char *aclbuf, const char *keyword)
 }
 
 /*
- * This will take a string of 'arwR' and return a malloced,
- * comma delimited string of SELECT,INSERT,UPDATE,DELETE,RULE
+ * This will take a string of privilege code letters and return a malloced,
+ * comma delimited string of keywords for GRANT.
+ *
+ * Note: for cross-version compatibility, it's important to use ALL when
+ * appropriate.
  */
 static char *
 GetPrivileges(Archive *AH, const char *s)
 {
        char            aclbuf[100];
+       bool            all = true;
 
        aclbuf[0] = '\0';
 
-       if (strchr(s, 'a'))
-               AddAcl(aclbuf, "INSERT");
-
-       if (strchr(s, 'r'))
-               AddAcl(aclbuf, "SELECT");
+#define CONVERT_PRIV(code,keywd) \
+       if (strchr(s, code)) \
+               AddAcl(aclbuf, keywd); \
+       else \
+               all = false
 
-       if (strchr(s, 'R'))
-               AddAcl(aclbuf, "RULE");
+       CONVERT_PRIV('a', "INSERT");
+       CONVERT_PRIV('r', "SELECT");
+       CONVERT_PRIV('R', "RULE");
 
        if (AH->remoteVersion >= 70200)
        {
-               if (strchr(s, 'w'))
-                       AddAcl(aclbuf, "UPDATE");
-               if (strchr(s, 'd'))
-                       AddAcl(aclbuf, "DELETE");
-               if (strchr(s, 'x'))
-                       AddAcl(aclbuf, "REFERENCES");
-               if (strchr(s, 't'))
-                       AddAcl(aclbuf, "TRIGGER");
+               CONVERT_PRIV('w', "UPDATE");
+               CONVERT_PRIV('d', "DELETE");
+               CONVERT_PRIV('x', "REFERENCES");
+               CONVERT_PRIV('t', "TRIGGER");
        }
        else
        {
-               if (strchr(s, 'w'))
-                       AddAcl(aclbuf, "UPDATE,DELETE");
+               /* 7.0 and 7.1 have a simpler worldview */
+               CONVERT_PRIV('w', "UPDATE,DELETE");
        }
 
-       return strdup(aclbuf);
+#undef CONVERT_PRIV
+
+       if (all)
+               return strdup("ALL");
+       else
+               return strdup(aclbuf);
 }
 
 /*
- * The name says it all; a function to append a string is the dest
+ * The name says it all; a function to append a string if the dest
  * is big enough. If not, it does a realloc.
  */
 static void