]> granicus.if.org Git - postgresql/commitdiff
This is my -- hopefully sufficiently portable -- attempt at cleaning out
authorBruce Momjian <bruce@momjian.us>
Fri, 17 Dec 1999 01:05:31 +0000 (01:05 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 17 Dec 1999 01:05:31 +0000 (01:05 +0000)
initdb. No more obscure dependencies on environment variables or paths.
It
now finds the templates and the right postgres itself (with cmd line
options as fallback). It also no longer depends on $USER (su safe), and
doesn't advertise that --username allows you to install the db as a
different user, since that doesn't work anyway. Also, recovery and
cleanup
on all errors. Consistent options, clearer documentation.

Please take a look at this and adopt it if you feel it's safe enough. I
have simulated all the stupid circumstances I could think of, but you
never know with shell scripts.

Oh yeah, you can give the postgres user a default password now.

--
Peter Eisentraut                  Sernanders väg 10:115

doc/src/sgml/ref/initdb.sgml
src/bin/initdb/initdb.sh
src/include/catalog/pg_shadow.h

index 200c030ed480fe4f1248071859e5ef3db0761683..2e235c082c95427b2fc79e4e7ab904bcb537fc82 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/initdb.sgml,v 1.5 1999/07/22 15:09:12 thomas Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/initdb.sgml,v 1.6 1999/12/17 01:05:29 momjian Exp $
 Postgres documentation
 -->
 
@@ -15,24 +15,26 @@ Postgres documentation
    <application>initdb</application>
   </refname>
   <refpurpose>
-   Create a new <productname>Postgres</productname> database installation
+   Create a new <productname>PostgreSQL</productname> database installation
   </refpurpose>
  </refnamediv>
  <refsynopsisdiv>
   <refsynopsisdivinfo>
-   <date>1999-07-20</date>
+   <date>1999-12-17</date>
   </refsynopsisdivinfo>
   <synopsis>
-initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <replaceable class="parameter">dbdir</replaceable> ]
-    [ --pglib=<replaceable class="parameter">libdir</replaceable> | -l <replaceable class="parameter">libdir</replaceable> ]
-    [ --template=<replaceable class="parameter">template</replaceable> | -t <replaceable class="parameter">template</replaceable> ]
-    [ --username=<replaceable class="parameter">name</replaceable> | -u <replaceable class="parameter">name</replaceable> ]
-    [ --noclean | -n ] [ --debug | -d ]
+initdb [ --pgdata|-D <replaceable class="parameter">dbdir</replaceable> ]
+       [ --sysid|-i <replaceable class="parameter">sysid</replaceable> ]
+       [ --password|-W <replaceable class="parameter">password</replaceable> ]
+       [ --pgencoding|-e <replaceable class="parameter">encoding</replaceable> ]
+       [ --pglib|-L <replaceable class="parameter">libdir</replaceable> ]
+       [ --username|-u <replaceable class="parameter">name</replaceable> ]
+       [ --noclean | -n ] [ --debug | -d ] [ --template | -t ]
   </synopsis>
 
   <refsect2 id="R2-APP-INITDB-1">
    <refsect2info>
-    <date>1998-10-02</date>
+    <date>1999-11-17</date>
    </refsect2info>
    <title>
     Inputs
@@ -41,62 +43,61 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
 
     <variablelist>
      <varlistentry>
-      <term>--pglib=<replaceable class="parameter">libdir</replaceable></term>
-      <term>-l <replaceable class="parameter">libdir</replaceable></term>
-      <term><envar>PGLIB</envar></term>
+      <term>--pgdata=<replaceable class="parameter">dbdir</replaceable></term>
+      <term>-D <replaceable class="parameter">dbdir</replaceable></term>
+      <term><envar>PGDATA</envar></term>
       <listitem>
        <para>
-       Where are the files that make up <productname>Postgres</productname>? 
-       Apart from files that
-       have to go in particular directories because of their function, the
-       files that make up the <productname>Postgres</productname> software 
-       were installed in a directory
-       called the <replaceable class="parameter">libdir</replaceable> directory.
-       An example of a file that will be found
-       there that <application>initdb</application>
-       needs is <filename>global1.bki.source</filename>,
-       which contains all the information that goes
-       into the shared catalog tables.
+        This option specifies where in the file system the database should be
+        stored. This is the only information required by initdb, but you can avoid
+        it by setting the <envar>PGDATA</envar> environment variable, which
+        can be convenient since the database server (<filename>postmaster</filename>)
+        can find the database directory later by the same variable.
        </para>
       </listitem>
      </varlistentry>
 
      <varlistentry>
-      <term>--pgdata=<replaceable class="parameter">dbdir</replaceable></term>
-      <term>-r <replaceable class="parameter">dbdir</replaceable></term>
-      <term><envar>PGDATA</envar></term>
+      <term>--sysid=<replaceable class="parameter">sysid</replaceable></term>
+      <term>-i <replaceable class="parameter">sysid</replaceable></term>
       <listitem>
        <para>
-       Where in your Unix filesystem do you want the database data to go?
-       The top level directory is called the <envar>PGDATA</envar> directory.
+        Selects the system id of the database superuser. This defaults to
+        the effective user id of the user running initdb. It is really
+        not important what the superuser's sysid is, but one might choose
+        to start the numbering at some number like 0 or 1.
        </para>
       </listitem>
      </varlistentry>
-
      <varlistentry>
-      <term>--username=<replaceable class="parameter">name</replaceable></term>
-      <term>-u <replaceable class="parameter">name</replaceable></term>
-      <term><envar>PGUSER</envar></term>
+      <term>--password=<replaceable class="parameter">password</replaceable></term>
+      <term>-W <replaceable class="parameter">password</replaceable></term>
       <listitem>
        <para>
-       Who will be the <productname>Postgres</productname> superuser
-       for this database system?  The
-       <productname>Postgres</productname> superuser is a Unix user 
-       who owns all files that store the database
-       system and also owns the postmaster and backend processes that access them.
-       Or just let it default to you (the Unix user who runs
-       <application>initdb</application>).
+        Sets the password of the database superuser. If you don't plan
+        on using password authentication, this is not important. If you
+        do, you can save yourself a trip by specifying it here, but you
+        can always change it later. The default password is empty.
        </para>
-       <note>
-       <para>
-        Only the Unix superuser (<literal>root</literal>)
-        can create a database system with an owner
-        different from the <productname>Postgres</productname> superuser.
-       </para>
-       </note>
       </listitem>
      </varlistentry>
-    </variablelist>
+     <varlistentry>
+      <term>--pgencoding=<replaceable class="parameter">encoding</replaceable></term>
+      <term>-e <replaceable class="parameter">encoding</replaceable></term>
+      <listitem>
+       <para>
+        Selects the multibyte encoding of the template database. This will also
+        be the default encoding of any database you create later, unless you
+        override it there. To use the multibyte encoding feature, you must
+        specify so at build time, at which time you also select the default
+        for this option.
+       </para>
+      </listitem>
+     </varlistentry>
+
+   </variablelist>
    </para>
 
    <para>
@@ -104,15 +105,46 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
 
     <variablelist>
      <varlistentry>
-      <term>--template=<replaceable class="parameter">template</replaceable></term>
-      <term>-t <replaceable class="parameter">template</replaceable></term>
+      <term>--pglib=<replaceable class="parameter">libdir</replaceable></term>
+      <term>-l <replaceable class="parameter">libdir</replaceable></term>
+      <listitem>
+       <para>
+        initdb needs a few input files to initialize the database. This option
+        tells where to find them. You normally don't have to worry about this
+        since initdb knows about the most common installation layouts and will
+        find the files itself. You will be told if you need to specify their
+        location explicitly. If that happens, one of the files is called
+       <filename>global1.bki.source</filename> and is traditionally installed
+        along with the others in the library directory (e.g.,
+        <filename>/usr/local/pgsql/lib</filename>).
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term>--username=<replaceable class="parameter">name</replaceable></term>
+      <term>-u <replaceable class="parameter">name</replaceable></term>
+      <listitem>
+       <para>
+        The database system will be initialized with the username that is
+        running initdb. That is a requirement. If for some unimaginable
+        reason initdb cannot find out what the current user's name is,
+        you have to use this option. Normally, this will not be necessary
+        and initdb will tell you when it is.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term>--template</term>
+      <term>-t</term>
       <listitem>
        <para>
        Replace the <literal>template1</literal>
        database in an existing database system, and don't touch anything else.
        This is useful when you need to upgrade your <literal>template1</literal>
        database using <application>initdb</application>
-       from a newer release of <productname>Postgres</productname>, 
+       from a newer release of <productname>PostgreSQL</productname>, 
        or when your <literal>template1</literal>
        database has become corrupted by some system problem.  Normally the
        contents of <literal>template1</literal>
@@ -133,8 +165,7 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
        By default, when <application>initdb</application>
        determines that error prevent it from completely creating the database
        system, it removes any files it may have created before determining
-       that it can't finish the job.  That includes any core files left by
-       the programs it invokes.  This option inhibits any tidying-up and is
+       that it can't finish the job. This option inhibits any tidying-up and is
        thus useful for debugging.
        </para>
       </listitem>
@@ -145,10 +176,11 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
       <term>-d</term>
       <listitem>
        <para>
-       Print debugging output from the bootstrap backend.  
+       Print debugging output from the bootstrap backend and a few other
+        messages of lesser interest for the general public.
        The bootstrap backend is the program <application>initdb</application>
        uses to create the catalog tables.  This option generates a tremendous
-       amount of output.  It also turns off the final vacuuming step.
+       amount of output.
        </para>
       </listitem>
      </varlistentry>
@@ -156,56 +188,17 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
     </variablelist>
    </para>
 
-   <para>
-    Files are also input to <application>initdb</application>:
-
-    <variablelist>
-     <varlistentry>
-      <term><application>postconfig</application></term>
-      <listitem>
-       <para>
-       If appearing somewhere in the Unix command search path 
-       (defined by the PATH environment variable).
-       This is a program that specifies defaults for some of the
-       command options.  See below.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><filename><envar>PGLIB</envar>/global1.bki.source</filename></term>
-      <listitem>
-       <para>
-       Contents for the shared catalog tables in the new database system.  This
-       file is part of the <productname>Postgres</productname> software.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><filename><envar>PGLIB</envar>/local1_template1.bki.source</filename></term>
-      <listitem>
-       <para>
-       Contents for the template1 tables in the new database system.  This
-       file is part of the <productname>Postgres</productname> software.
-       </para>
-      </listitem>
-     </varlistentry>
-
-    </variablelist>
-   </para>
   </refsect2>
 
   <refsect2 id="R2-APP-INITDB-2">
    <refsect2info>
-    <date>1998-09-26</date>
+    <date>1999-12-17</date>
    </refsect2info>
    <title>
     Outputs
    </title>
    <para>
-    <application>initdb</application> will create files in the
-    <envar>PGDATA</envar>
+    <application>initdb</application> will create files in the specified
     data area which are the system tables and framework for a complete
     installation.
    </para>
@@ -214,14 +207,14 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
 
  <refsect1 id="R1-APP-INITDB-1">
   <refsect1info>
-   <date>1998-09-26</date>
+   <date>1999-12-17</date>
   </refsect1info>
   <title>
    Description
   </title>
   <para>
    <application>initdb</application> creates a new 
-   <productname>Postgres</productname> database system.
+   <productname>PostgreSQL</productname> database system.
    A database system is a
    collection of databases that are all administered by the same Unix user
    and managed by a single postmaster.
@@ -231,74 +224,37 @@ initdb [ --pgdata=<replaceable class="parameter">dbdir</replaceable> | -r <repla
    the database data will live, generating the shared catalog tables 
    (tables that don't belong to any particular database), and
    creating the <literal>template1</literal>
-   database.  What is the <literal>template1</literal>
-   database?  When you create a database, <productname>Postgres</productname> 
-   does it by copying
-   everything from the <literal>template1</literal>
-   database.  It contains catalog tables filled in for things like the
+   database.  When you create a new database, everything in the
+   <literal>template1</literal> database is copied.
+   It contains catalog tables filled in for things like the
    builtin types.
   </para>
-  <para>
-   After <application>initdb</application> 
-   creates the database, it completes the initialization by running
-   <application>vacuum</application>, which resets some optimization parameters.
-  </para>
-  <para>
-   There are three ways to give parameters to <application>initdb</application>.
 
-   <itemizedlist>
-    <listitem>
-     <para>
-      You can use <application>initdb</application> command options.
-     </para>
-    </listitem>
-    <listitem>
-     <para>
-      You can set environment
-      variables before invoking <application>initdb</application>.
-     </para>
-    </listitem>
-
-    <listitem>
-     <para>
-      You can have a program called <application>postconfig</application>
-      in your Unix command search path.
-      <application>initdb</application> invokes that program and that program then writes 
-      <application>initdb</application> parameters to its standard output stream.
-      This third option is not a common thing to do, however.
-     </para>
-    </listitem>
-   </itemizedlist>
+  <para>
+   You must not execute <application>initdb</application> as root. This is
+   because you cannot run the database server as root either, but the
+   server needs to have access to the files <application>initdb</application>
+   creates. Furthermore, during the initialization phase, when there are no
+   users and no access controls installed, postgres will only connect with
+   the name of the current Unix user, so you must log in under the account
+   that will own the server process.
   </para>
 
   <para>
-   Command options always override parameters specified any other way.
-   The values returned by <application>postconfig</application>
-   override any environment variables, but your
-   <application>postconfig</application> 
-   program may base its output on the environment variables if you want
-   their values to be used.
+   Although <application>initdb</application> will attempt to create the respective
+   data directory, chances are that it won't have the permission to do so. Thus
+   it is a good idea to create the data directory before running <application>initdb</application>
+   <emphasis>and</emphasis> to hand over the ownership of it to the database superuser.
   </para>
 
   <para>
-   The value that <application>postconfig</application> 
-   outputs must have the format
-   <synopsis>
-<replaceable>var1</replaceable>=<replaceable class="parameter">value1</replaceable> <replaceable class="parameter">var2</replaceable>=<replaceable class="parameter">value2</replaceable> ...
-   </synopsis>
-
-   It can output nothing if it doesn't want to supply any parameters.
-   The <replaceable>var</replaceable> values are equal to 
-   the corresponding environment variable
-   names.  For example,
-   <programlisting>
-PGDATA=/tmp/postgres_test
-   </programlisting>
-   has the
-   same effect as invoking <application>initdb</application>
-   with an environment variable called <envar>PGDATA</envar> whose value is
-   <filename>/tmp/postgres_test</filename>.
+   Note that if you use the <option>--username</option> you must give correct
+   information about the name of the <emphasis>current</emphasis> user. If you don't
+   this will usually manifest itself in an error message about <literal>chmod</literal>
+   failing on a file <filename>pg_pwd</filename>, because the backend silently
+   refuses to create it.
   </para>
+
  </refsect1>
 </refentry>
 
index 4ccd718fc73eed2fa6a8e918121c9074081aa398..245f3455f94cde41a7ab5fc947aa7cf8eacfeb7a 100644 (file)
@@ -26,7 +26,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.65 1999/12/16 20:09:56 momjian Exp $
+#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.66 1999/12/17 01:05:30 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -291,38 +291,31 @@ umask 077
 
 if [ -f "$PGDATA/PG_VERSION" ]; then
     if [ $template_only -eq 0 ]; then
-        echo "$CMDNAME: error: File $PGDATA/PG_VERSION already exists."
-        echo "This probably means initdb has already been run and the "
+        echo "$CMDNAME: The file $PGDATA/PG_VERSION already exists."
+        echo "This probably means initdb has already been run and the"
         echo "database system already exists."
         echo 
-        echo "If you want to create a new database system, either remove "
-        echo "the directory $PGDATA or run initdb with a --pgdata option "
+        echo "If you want to create a new database system, either remove"
+        echo "the directory $PGDATA or run initdb with a --pgdata argument"
         echo "other than $PGDATA."
         exit 1
     fi
 else
     if [ ! -d $PGDATA ]; then
-        echo "Creating Postgres database system directory $PGDATA"
-        echo
-        mkdir $PGDATA
-        if [ $? -ne 0 ]; then exit 5; fi
-       else
-        echo "Fixing permissions on pre-existing $PGDATA"
-        echo
-               chmod go-rwx $PGDATA
-        if [ $? -ne 0 ]; then exit 5; fi
+        echo "Creating database system directory $PGDATA"
+        mkdir $PGDATA || exit_nicely
+    else
+        echo "Fixing permissions on pre-existing data directory $PGDATA"
+       chmod go-rwx $PGDATA || exit_nicely
     fi
+
     if [ ! -d $PGDATA/base ]; then
-        echo "Creating Postgres database system directory $PGDATA/base"
-        echo
-        mkdir $PGDATA/base
-        if [ $? -ne 0 ]; then exit 5; fi
+        echo "Creating database system directory $PGDATA/base"
+        mkdir $PGDATA/base || exit_nicely
     fi
     if [ ! -d $PGDATA/pg_xlog ]; then
-        echo "Creating Postgres database XLOG directory $PGDATA/pg_xlog"
-        echo
-        mkdir $PGDATA/pg_xlog
-        if [ $? -ne 0 ]; then exit 5; fi
+        echo "Creating database XLOG directory $PGDATA/pg_xlog"
+        mkdir $PGDATA/pg_xlog || exit_nicely
     fi
 fi
 
@@ -330,8 +323,8 @@ fi
 # Create the template1 database
 #----------------------------------------------------------------------------
 
-rm -rf $PGDATA/base/template1
-mkdir $PGDATA/base/template1
+rm -rf $PGDATA/base/template1 || exit_nicely
+mkdir $PGDATA/base/template1 || exit_nicely
 
 if [ "$debug" -eq 1 ]; then
     BACKEND_TALK_ARG="-d"
@@ -343,82 +336,51 @@ BACKENDARGS="-boot -C -F -D$PGDATA $BACKEND_TALK_ARG"
 FIRSTRUN="-boot -x -C -F -D$PGDATA $BACKEND_TALK_ARG"
 
 echo "Creating template database in $PGDATA/base/template1"
-[ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1"
+[ "$debug" -ne 0 ] && echo "Running: $PGPATH/postgres $FIRSTRUN template1"
 
 cat $TEMPLATE \
-| sed -e "s/postgres PGUID/$POSTGRES_SUPERUSERNAME $POSTGRES_SUPERUID/" \
-      -e "s/PGUID/$POSTGRES_SUPERUID/" \
-| postgres $FIRSTRUN template1
+| sed -e "s/PGUID/$POSTGRES_SUPERUSERID/g" \
+| $PGPATH/postgres $FIRSTRUN template1 \
+|| exit_nicely
 
-if [ $? -ne 0 ]; then
-    echo "$CMDNAME: could not create template database"
-    if [ $noclean -eq 0 ]; then
-        echo "$CMDNAME: cleaning up by wiping out $PGDATA/base/template1"
-        rm -rf $PGDATA/base/template1
-    else
-        echo "$CMDNAME: cleanup not done because noclean options was used."
-    fi
-    exit 1;
-fi
-
-echo
-
-pg_version $PGDATA/base/template1
+$PGPATH/pg_version $PGDATA/base/template1 || exit_nicely
 
 #----------------------------------------------------------------------------
 # Create the global classes, if requested.
 #----------------------------------------------------------------------------
 
 if [ $template_only -eq 0 ]; then
-    echo "Creating global classes in $PGDATA/base"
-    [ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1"
+    echo "Creating global relations in $PGDATA/base"
+    [ "$debug" -ne 0 ] && echo "Running: $PGPATH/postgres $BACKENDARGS template1"
 
     cat $GLOBAL \
-    | sed -e "s/postgres PGUID/$POSTGRES_SUPERUSERNAME $POSTGRES_SUPERUID/" \
-        -e "s/PGUID/$POSTGRES_SUPERUID/" \
-    | postgres $BACKENDARGS template1
-
-    if (test $? -ne 0)
-    then
-        echo "$CMDNAME: could not create global classes."
-        if (test $noclean -eq 0); then
-            echo "$CMDNAME: cleaning up."
-            rm -rf $PGDATA
-        else
-            echo "$CMDNAME: cleanup not done (noclean mode set)."
-        fi
-        exit 1;
-    fi
+    | sed -e "s/POSTGRES/$POSTGRES_SUPERUSERNAME/g" \
+          -e "s/PGUID/$POSTGRES_SUPERUSERID/g" \
+          -e "s/PASSWORD/$Password/g" \
+    | $PGPATH/postgres $BACKENDARGS template1 \
+    || exit_nicely
 
-    echo
-
-    pg_version $PGDATA
-
-    cp $PG_HBA_SAMPLE $PGDATA/pg_hba.conf
-    cp $PG_GEQO_SAMPLE $PGDATA/pg_geqo.sample
+    $PGPATH/pg_version $PGDATA || exit_nicely
 
-    echo "Adding template1 database to pg_database..."
+    cp $PG_HBA_SAMPLE $PGDATA/pg_hba.conf     || exit_nicely
+    cp $PG_GEQO_SAMPLE $PGDATA/pg_geqo.sample || exit_nicely
 
-    echo "open pg_database" > /tmp/create.$$
-    echo "insert (template1 $POSTGRES_SUPERUID $MULTIBYTEID template1)" >> /tmp/create.$$
-    #echo "show" >> /tmp/create.$$
-    echo "close pg_database" >> /tmp/create.$$
+    echo "Adding template1 database to pg_database"
 
-    [ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1 < /tmp/create.$$"
+    echo "open pg_database" > $TEMPFILE
+    echo "insert (template1 $POSTGRES_SUPERUSERID $MULTIBYTEID template1)" >> $TEMPFILE
+    #echo "show" >> $TEMPFILE
+    echo "close pg_database" >> $TEMPFILE
 
-    postgres $BACKENDARGS template1 < /tmp/create.$$ 
+    [ "$debug" -ne 0 ] && echo "Running: $PGPATH/postgres $BACKENDARGS template1 < $TEMPFILE"
 
-    if [ $? -ne 0 ]; then
-        echo "$CMDNAME: could not log template database"
-        if [ $noclean -eq 0 ]; then
-            echo "$CMDNAME: cleaning up."
-            rm -rf $PGDATA
-        else
-            echo "$CMDNAME: cleanup not done (noclean mode set)."
-        fi
-        exit 1;
+    $PGPATH/postgres $BACKENDARGS template1 < $TEMPFILE
+    # Gotta remove that temp file before exiting on error.
+    retval=$?
+    if [ $noclean -eq 0 ]; then
+            rm -f $TEMPFILE || exit_nicely
     fi
-    rm -f /tmp/create.$$
+    [ $retval -ne 0 ] && exit_nicely
 fi
 
 echo
@@ -427,102 +389,103 @@ PGSQL_OPT="-o /dev/null -O -F -Q -D$PGDATA"
 
 # Create a trigger so that direct updates to pg_shadow will be written
 # to the flat password file pg_pwd
-echo "CREATE TRIGGER pg_sync_pg_pwd AFTER INSERT OR UPDATE OR DELETE ON pg_shadow FOR EACH ROW EXECUTE PROCEDURE update_pg_pwd()" | postgres $PGSQL_OPT template1 > /dev/null
+echo "CREATE TRIGGER pg_sync_pg_pwd AFTER INSERT OR UPDATE OR DELETE ON pg_shadow" \
+     "FOR EACH ROW EXECUTE PROCEDURE update_pg_pwd()" \
+     | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
 
 # Create the initial pg_pwd (flat-file copy of pg_shadow)
-echo "COPY pg_shadow TO '$PGDATA/pg_pwd' USING DELIMITERS '\\t'" | \
-       postgres $PGSQL_OPT template1 > /dev/null
+echo "Writing password file."
+echo "COPY pg_shadow TO '$PGDATA/pg_pwd' USING DELIMITERS '\\t'" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
 # An ordinary COPY will leave the file too loosely protected.
-chmod go-rw $PGDATA/pg_pwd
-
-echo "Creating public pg_user view"
-echo "CREATE TABLE pg_user (           \
-           usename     name,           \
-           usesysid    int4,           \
-           usecreatedb bool,           \
-           usetrace    bool,           \
-           usesuper    bool,           \
-           usecatupd   bool,           \
-           passwd              text,           \
-           valuntil    abstime);" | postgres $PGSQL_OPT template1 > /dev/null
-
-
-echo "CREATE RULE \"_RETpg_user\" AS ON SELECT TO pg_user DO INSTEAD   \
-           SELECT usename, usesysid, usecreatedb, usetrace,            \
-                  usesuper, usecatupd, '********'::text as passwd,     \
-                  valuntil FROM pg_shadow;" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "REVOKE ALL on pg_shadow FROM public" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-
-echo "Creating view pg_rules"
-echo "CREATE TABLE pg_rules (          \
-           tablename   name,           \
-           rulename    name,           \
-           definition  text);" | postgres $PGSQL_OPT template1 > /dev/null
-
-echo "CREATE RULE \"_RETpg_rules\" AS ON SELECT TO pg_rules DO INSTEAD \
-           SELECT C.relname AS tablename,                              \
-                  R.rulename AS rulename,                              \
-                  pg_get_ruledef(R.rulename) AS definition             \
-             FROM pg_rewrite R, pg_class C                             \
-                  WHERE R.rulename !~ '^_RET'                          \
-                  AND C.oid = R.ev_class;" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-
-echo "Creating view pg_views"
-echo "CREATE TABLE pg_views (          \
-           viewname    name,           \
-           viewowner   name,           \
-           definition  text);" | postgres $PGSQL_OPT template1 > /dev/null
-
-echo "CREATE RULE \"_RETpg_views\" AS ON SELECT TO pg_views DO INSTEAD \
-           SELECT C.relname AS viewname,                               \
-                  pg_get_userbyid(C.relowner) AS viewowner,            \
-                  pg_get_viewdef(C.relname) AS definition              \
-             FROM pg_class C WHERE C.relhasrules AND                   \
-                  EXISTS (SELECT rulename FROM pg_rewrite R    \
-                                               WHERE ev_class = C.oid AND ev_type = '1');" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-
-echo "Creating view pg_tables"
-echo "CREATE TABLE pg_tables (         \
-           tablename   name,           \
-           tableowner  name,           \
-           hasindexes  bool,           \
-           hasrules    bool,           \
-           hastriggers bool);" | postgres $PGSQL_OPT template1 > /dev/null
-
-echo "CREATE RULE \"_RETpg_tables\" AS ON SELECT TO pg_tables DO INSTEAD       \
-           SELECT C.relname AS tablename,                              \
-                  pg_get_userbyid(C.relowner) AS tableowner,           \
-                  C.relhasindex AS hasindexes,                         \
-                  C.relhasrules AS hasrules,                           \
-                  (C.reltriggers > 0) AS hastriggers                   \
-             FROM pg_class C WHERE C.relkind IN ('r', 's')                     \
-                  AND NOT EXISTS (SELECT rulename FROM pg_rewrite      \
-                                                               WHERE ev_class = C.oid AND ev_type = '1');" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-
-echo "Creating view pg_indexes"
-echo "CREATE TABLE pg_indexes (        \
-           tablename   name,           \
-           indexname   name,           \
-           indexdef    text);" | postgres $PGSQL_OPT template1 > /dev/null
-
-echo "CREATE RULE \"_RETpg_indexes\" AS ON SELECT TO pg_indexes DO INSTEAD     \
-           SELECT C.relname AS tablename,                              \
-                  I.relname AS indexname,                              \
-                  pg_get_indexdef(X.indexrelid) AS indexdef            \
-             FROM pg_index X, pg_class C, pg_class I                   \
-                  WHERE C.oid = X.indrelid                             \
-                  AND I.oid = X.indexrelid;" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-
-echo "Loading pg_description"
-echo "copy pg_description from '$TEMPLATE_DESCR'" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "copy pg_description from '$GLOBAL_DESCR'" | \
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "vacuum analyze" | \
-       postgres $PGSQL_OPT template1 > /dev/null
+# Note: If you lied above and specified a --username different from the one
+# you really are, this will manifest itself in this command failing because
+# of a missing file, since the COPY command above failed. It would perhaps
+# be better if postgres returned an error code.
+chmod go-rw $PGDATA/pg_pwd || exit_nicely
+
+echo "Creating view pg_user."
+echo "CREATE VIEW pg_user AS
+        SELECT
+            usename,
+            usesysid,
+            usecreatedb,
+            usetrace,
+            usesuper,
+            usecatupd,
+            '********'::text as passwd,
+            valuntil
+        FROM pg_shadow" \
+        | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo "REVOKE ALL on pg_shadow FROM public" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo "Creating view pg_rules."
+echo "CREATE VIEW pg_rules AS
+        SELECT
+            C.relname AS tablename,
+            R.rulename AS rulename,
+           pg_get_ruledef(R.rulename) AS definition
+       FROM pg_rewrite R, pg_class C
+       WHERE R.rulename !~ '^_RET'
+            AND C.oid = R.ev_class;" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo "Creating view pg_views."
+echo "CREATE VIEW pg_views AS
+        SELECT
+            C.relname AS viewname,
+            pg_get_userbyid(C.relowner) AS viewowner,
+            pg_get_viewdef(C.relname) AS definition
+        FROM pg_class C
+        WHERE C.relhasrules
+            AND        EXISTS (
+                SELECT rulename FROM pg_rewrite R
+                    WHERE ev_class = C.oid AND ev_type = '1'
+            )" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo "Creating view pg_tables."
+echo "CREATE VIEW pg_tables AS
+        SELECT
+            C.relname AS tablename,
+           pg_get_userbyid(C.relowner) AS tableowner,
+           C.relhasindex AS hasindexes,
+           C.relhasrules AS hasrules,
+           (C.reltriggers > 0) AS hastriggers
+        FROM pg_class C
+        WHERE C.relkind IN ('r', 's')
+            AND NOT EXISTS (
+                SELECT rulename FROM pg_rewrite
+                    WHERE ev_class = C.oid AND ev_type = '1'
+            )" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo "Creating view pg_indexes."
+echo "CREATE VIEW pg_indexes AS
+        SELECT
+            C.relname AS tablename,
+           I.relname AS indexname,
+            pg_get_indexdef(X.indexrelid) AS indexdef
+        FROM pg_index X, pg_class C, pg_class I
+       WHERE C.oid = X.indrelid
+            AND I.oid = X.indexrelid" \
+        | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo "Loading pg_description."
+echo "COPY pg_description FROM '$TEMPLATE_DESCR'" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+echo "COPY pg_description FROM '$GLOBAL_DESCR'" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+echo "Vacuuming database."
+echo "VACUUM ANALYZE" \
+       | $PGPATH/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+
+echo
+echo "$CMDNAME completed successfully. You can now start the database server."
+echo "($PGPATH/postmaster -D $PGDATA)"
+echo
+
+exit 0
index 1a54a92070ff06ff195f5758c5c048ecc32438d4..781caca899b7a655f034de8c41230b3c9e24fa7b 100644 (file)
@@ -8,7 +8,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_shadow.h,v 1.4 1999/02/13 23:21:14 momjian Exp $
+ * $Id: pg_shadow.h,v 1.5 1999/12/17 01:05:31 momjian Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -67,39 +67,11 @@ typedef FormData_pg_shadow *Form_pg_shadow;
 
 /* ----------------
  *             initial contents of pg_shadow
+ *
+ * The uppercase quantities will be replaced at initdb time with
+ * user choices.
  * ----------------
  */
-DATA(insert OID = 0 ( postgres PGUID t t t t _null_ 2116994400 ));
-
-BKI_BEGIN
-#ifdef ALLOW_PG_GROUP
-BKI_END
-
-DATA(insert OID = 0 ( mike 799 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( mao 1806 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( hellers 1089 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( joey 5209 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( jolly 5443 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( sunita 6559 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( paxson 3029 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( marc 2435 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( jiangwu 6124 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( aoki 2360 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( avi 31080 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( kristin 1123 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( andrew 5229 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( nobuko 5493 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( hartzell 6676 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( devine 6724 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( boris 6396 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( sklower 354 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( marcel 31113 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( ginger 3692 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( woodruff 31026 t t t t _null_ 2116994400 ));
-DATA(insert OID = 0 ( searcher 8261 t t t t _null_ 2116994400 ));
-
-BKI_BEGIN
-#endif  /* ALLOW_PG_GROUP */
-BKI_END
+DATA(insert OID = 0 ( POSTGRES PGUID t t t t PASSWORD _null_ ));
 
 #endif  /* PG_SHADOW_H */