genbki.sh.in
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
- #!/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: /usr/local/cvsroot/pgsql/src/backend/catalog/genbki.sh.in,v 1.3 1999/06/04 21:12:06 tgl 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 /tmp/genbkitmp.c" 0 1 2 3 15
- # make sure it is empty
- >/tmp/genbki.tmp
- if [ $? != 0 ]
- then
- echo `basename $0`: Bad option
- exit 1
- fi
- BKIOPTS=''
- 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 from postgres_ext.h
- NAMEDATALEN=`grep '#define.*NAMEDATALEN' ../../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"
- | 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 %sn", 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;
- }
- }
- ' >/tmp/genbkitmp.c
- @CPP@ $BKIOPTS /tmp/genbkitmp.c |
- 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