-
Bruce Momjian authored
(Mark or Bruce?) It fixes a problem when cpp gives a warning when precompiling /dev/null like: "/dev/null", line 1: 1506-229 (W) File is empty. This leads to a hangup when doing the description load during initdb, since stderr also ends up in the global1.description and local1_template1.description stderr has to be redirected to /dev/null: Andreas Zeugswetter
Bruce Momjian authored(Mark or Bruce?) It fixes a problem when cpp gives a warning when precompiling /dev/null like: "/dev/null", line 1: 1506-229 (W) File is empty. This leads to a hangup when doing the description load during initdb, since stderr also ends up in the global1.description and local1_template1.description stderr has to be redirected to /dev/null: Andreas Zeugswetter
genbki.sh 5.95 KiB
#!/bin/sh
#-------------------------------------------------------------------------
#
# genbki.sh--
# shell script which generates .bki files from specially formatted .h
# files. These .bki files are used to initialize the postgres template
# database.
#
# Copyright (c) 1994, Regents of the University of California
#
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/backend/catalog/Attic/genbki.sh,v 1.13 1998/08/25 17:36:18 momjian Exp $
#
# NOTES
# non-essential whitespace is removed from the generated file.
# if this is ever a problem, then the sed script at the very
# end can be changed into another awk script or something smarter..
#
#-------------------------------------------------------------------------
trap "rm -f /tmp/genbki.tmp" 0 1 2 3 15
# make sure it is empty
>/tmp/genbki.tmp
PATH=$PATH:/lib:/usr/ccs/lib:/usr/ccs/lbin # to find cpp
cpp /dev/null >/dev/null 2>&1
if [ "$?" -ne 0 ]
then echo "Can't find cpp. Exiting." 1>&2
exit 1
fi
BKIOPTS=''
if [ $? != 0 ]
then
echo `basename $0`: Bad option
exit 1
fi
for opt in $*
do
case $opt in
-D) BKIOPTS="$BKIOPTS -D$2"; shift; shift;;
-D*) BKIOPTS="$BKIOPTS $1";shift;;
--) shift; break;;
esac
done
# ----------------
# collect nodefiles
# ----------------
SYSFILES=''
x=1
numargs=$#
while test $x -le $numargs ; do
SYSFILES="$SYSFILES $1"
x=`expr $x + 1`
shift
done
# Get NAMEDATALEN and OIDNAMELEN from postgres_ext.h
NAMEDATALEN=`grep '#define.*NAMEDATALEN' ../../include/postgres_ext.h | awk '{ print $3 }'`
OIDNAMELEN=`grep '#define.*OIDNAMELEN' ../../include/postgres_ext.h | awk '{ print $3 }'`
# ----------------
# strip comments and trash from .h before we generate
# the .bki file...
# ----------------
# also, change Oid to oid. -- AY 8/94.
# also, change NameData to name. -- jolly 8/21/95.
# put multi-line start/end comments on a separate line
#
cat $SYSFILES | \
sed -e 's;/\*.*\*/;;g' \
-e 's;/\*;\
/*\
;g' \
-e 's;\*/;\
*/\
;g' | # we must run a new sed here to see the newlines we added
sed -e "s/;[ ]*$//g" \
-e "s/^[ ]*//" \
-e "s/[ ]Oid/\ oid/g" \
-e "s/[ ]NameData/\ name/g" \
-e "s/^Oid/oid/g" \
-e "s/^NameData/\name/g" \
-e "s/(NameData/(name/g" \
-e "s/(Oid/(oid/g" \
-e "s/NAMEDATALEN/$NAMEDATALEN/g" \
-e "s/OIDNAMELEN/$OIDNAMELEN/g" | \
awk '
# ----------------
# now use awk to process remaining .h file..
#
# nc is the number of catalogs
# inside is a variable set to 1 when we are scanning the
# contents of a catalog definition.
# inserting_data is a flag indicating when we are processing DATA lines.
# (i.e. have a relation open and need to close it)
# ----------------
BEGIN {
inside = 0;
raw = 0;
bootstrap = 0;
nc = 0;
reln_open = 0;
comment_level = 0;
}
# ----------------
# Anything in a /* .. */ block should be ignored.
# Blank lines also go.
# Note that any /* */ comment on a line by itself was removed from the line
# by the sed above.
# ----------------
/^\/\*/ { comment_level += 1; next; }
/^\*\// { comment_level -= 1; next; }
comment_level > 0 { next; }
/^[ ]*$/ { next; }
# ----------------
# anything in a BKI_BEGIN .. BKI_END block should be passed
# along without interpretation.
# ----------------
/^BKI_BEGIN/ { raw = 1; next; }
/^BKI_END/ { raw = 0; next; }
raw == 1 { print; next; }
# ----------------
# DATA() statements should get passed right through after
# stripping off the DATA( and the ) on the end.
# ----------------
/^DATA\(/ {
data = substr($0, 6, length($0) - 6);
print data;
nf = 1;
oid = 0;
while (nf <= NF-3)
{
if ($nf == "OID" && $(nf+1) == "=")
{
oid = $(nf+2);
break;
}
nf++;
}
next;
}
/^DESCR\(/ {
if (oid != 0)
{
data = substr($0, 8, length($0) - 9);
if (data != "")
printf "%d %s\n", oid, data >> "/tmp/genbki.tmp";
}
next;
}
/^DECLARE_INDEX\(/ {
# ----
# end any prior catalog data insertions before starting a define index
# ----
if (reln_open == 1) {
# print "show";
print "close " catalog;
reln_open = 0;
}
data = substr($0, 15, length($0) - 15);
print "declare index " data
}
/^BUILD_INDICES/ { print "build indices"; }
# ----------------
# CATALOG() definitions take some more work.
# ----------------
/^CATALOG\(/ {
# ----
# end any prior catalog data insertions before starting a new one..
# ----
if (reln_open == 1) {
# print "show";
print "close " catalog;
reln_open = 0;
}
# ----
# get the name of the new catalog
# ----
pos = index($1,")");
catalog = substr($1,9,pos-9);
if ($0 ~ /BOOTSTRAP/) {
bootstrap = 1;
}
i = 1;
inside = 1;
nc++;
next;
}
# ----------------
# process the contents of the catalog definition
#
# attname[ x ] contains the attribute name for attribute x
# atttype[ x ] contains the attribute type fot attribute x
# ----------------
inside == 1 {
# ----
# ignore a leading brace line..
# ----
if ($1 ~ /\{/)
next;
# ----
# if this is the last line, then output the bki catalog stuff.
# ----
if ($1 ~ /}/) {
if (bootstrap) {
print "create bootstrap " catalog;
} else {
print "create " catalog;
}
print "\t(";
for (j=1; j<i-1; j++) {
print "\t " attname[ j ] " = " atttype[ j ] " ,";
}
print "\t " attname[ j ] " = " atttype[ j ] ;
print "\t)";
if (! bootstrap) {
print "open " catalog;
}
i = 1;
reln_open = 1;
inside = 0;
bootstrap = 0;
next;
}
# ----
# if we are inside the catalog definition, then keep sucking up
# attibute names and types
# ----
if ($2 ~ /\[.*\]/) { # array attribute
idlen = index($2,"[") - 1;
atttype[ i ] = $1 "[]"; # variable-length only..
attname[ i ] = substr($2,1,idlen);
} else {
atttype[ i ] = $1;
attname[ i ] = $2;
}
i++;
next;
}
END {
if (reln_open == 1) {
# print "show";
print "close " catalog;
reln_open = 0;
}
}
' | \
cpp $BKIOPTS | \
sed -e '/^[ ]*$/d' \
-e 's/[ ][ ]*/ /g' || exit 1
# send pg_description file contents to standard error
cat /tmp/genbki.tmp 1>&2
# ----------------
# all done
# ----------------
exit 0