genbki.sh.in
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. #!/bin/sh
  2. #-------------------------------------------------------------------------
  3. #
  4. # genbki.sh--
  5. #    shell script which generates .bki files from specially formatted .h
  6. #    files.  These .bki files are used to initialize the postgres template
  7. #    database.
  8. #
  9. # Copyright (c) 1994, Regents of the University of California
  10. #
  11. #
  12. # IDENTIFICATION
  13. #    $Header: /usr/local/cvsroot/pgsql/src/backend/catalog/genbki.sh.in,v 1.3 1999/06/04 21:12:06 tgl Exp $
  14. #
  15. # NOTES
  16. #    non-essential whitespace is removed from the generated file.
  17. #    if this is ever a problem, then the sed script at the very
  18. #    end can be changed into another awk script or something smarter..
  19. #
  20. #-------------------------------------------------------------------------
  21. trap "rm -f /tmp/genbki.tmp /tmp/genbkitmp.c" 0 1 2 3 15
  22. # make sure it is empty
  23. >/tmp/genbki.tmp
  24. if [ $? != 0 ]
  25. then
  26.     echo `basename $0`: Bad option
  27.     exit 1
  28. fi
  29. BKIOPTS=''
  30. for opt in $*
  31. do
  32.     case $opt in
  33.     -D) BKIOPTS="$BKIOPTS -D$2"; shift; shift;;
  34.     -D*) BKIOPTS="$BKIOPTS $1";shift;;
  35.     --) shift; break;;
  36.     esac
  37. done
  38. # ----------------
  39. #  collect nodefiles
  40. # ----------------
  41. SYSFILES=''
  42. x=1
  43. numargs=$#
  44. while test $x -le $numargs ; do
  45.     SYSFILES="$SYSFILES $1"
  46.     x=`expr $x + 1`
  47.     shift
  48. done
  49. # Get NAMEDATALEN from postgres_ext.h
  50. NAMEDATALEN=`grep '#define.*NAMEDATALEN' ../../include/postgres_ext.h | awk '{ print $3 }'`
  51. # ----------------
  52. #  strip comments and trash from .h before we generate
  53. # the .bki file...
  54. # ----------------
  55. # also, change Oid to oid. -- AY 8/94.
  56. # also, change NameData to name. -- jolly 8/21/95.
  57. # put multi-line start/end comments on a separate line
  58. #
  59. cat $SYSFILES | 
  60. sed -e 's;/*.**/;;g' 
  61.     -e 's;/*;
  62. /*
  63. ;g' 
  64.     -e 's;*/;
  65. */
  66. ;g' | # we must run a new sed here to see the newlines we added
  67. sed -e "s/;[  ]*$//g" 
  68.     -e "s/^[  ]*//" 
  69.     -e "s/[  ]Oid/ oid/g" 
  70.     -e "s/[  ]NameData/ name/g" 
  71.     -e "s/^Oid/oid/g" 
  72.     -e "s/^NameData/name/g" 
  73.     -e "s/(NameData/(name/g" 
  74.     -e "s/(Oid/(oid/g" 
  75.     -e "s/NAMEDATALEN/$NAMEDATALEN/g" 
  76. | awk '
  77. # ----------------
  78. # now use awk to process remaining .h file..
  79. #
  80. # nc is the number of catalogs
  81. # inside is a variable set to 1 when we are scanning the
  82. #    contents of a catalog definition.
  83. # inserting_data is a flag indicating when we are processing DATA lines.
  84. # (i.e. have a relation open and need to close it)
  85. # ----------------
  86. BEGIN {
  87. inside = 0;
  88. raw = 0;
  89. bootstrap = 0;
  90. nc = 0;
  91. reln_open = 0;
  92.         comment_level = 0;
  93. }
  94. # ----------------
  95. # Anything in a /* .. */ block should be ignored.
  96. # Blank lines also go.
  97. # Note that any /* */ comment on a line by itself was removed from the line
  98. # by the sed above.
  99. # ----------------
  100. /^/*/           { comment_level += 1; next; }
  101. /^*//           { comment_level -= 1; next; }
  102. comment_level > 0 { next; }
  103. /^[  ]*$/      { next; }
  104. # ----------------
  105. # anything in a BKI_BEGIN .. BKI_END block should be passed
  106. # along without interpretation.
  107. # ----------------
  108. /^BKI_BEGIN/  { raw = 1; next; }
  109. /^BKI_END/  { raw = 0; next; }
  110. raw == 1  { print; next; }
  111. # ----------------
  112. # DATA() statements should get passed right through after
  113. # stripping off the DATA( and the ) on the end.
  114. # ----------------
  115. /^DATA(/ {
  116. data = substr($0, 6, length($0) - 6);
  117. print data;
  118. nf = 1;
  119. oid = 0;
  120. while (nf <= NF-3)
  121. {
  122. if ($nf == "OID" && $(nf+1) == "=")
  123. {
  124. oid = $(nf+2);
  125. break;
  126. }
  127. nf++;
  128. }
  129. next;
  130. }
  131. /^DESCR(/ {
  132. if (oid != 0)
  133. {
  134. data = substr($0, 8, length($0) - 9);
  135. if (data != "")
  136. printf "%d %sn", oid, data >> "/tmp/genbki.tmp";
  137. }
  138. next;
  139. }
  140. /^DECLARE_INDEX(/ {
  141. # ----
  142. #  end any prior catalog data insertions before starting a define index
  143. # ----
  144. if (reln_open == 1) {
  145. # print "show";
  146. print "close " catalog;
  147. reln_open = 0;
  148. }
  149. data = substr($0, 15, length($0) - 15);
  150. print "declare index " data
  151. }
  152. /^BUILD_INDICES/ { print "build indices"; }
  153. # ----------------
  154. # CATALOG() definitions take some more work.
  155. # ----------------
  156. /^CATALOG(/ { 
  157. # ----
  158. #  end any prior catalog data insertions before starting a new one..
  159. # ----
  160. if (reln_open == 1) {
  161. # print "show";
  162. print "close " catalog;
  163. reln_open = 0;
  164. }
  165. # ----
  166. #  get the name of the new catalog
  167. # ----
  168. pos = index($1,")");
  169. catalog = substr($1,9,pos-9); 
  170. if ($0 ~ /BOOTSTRAP/) {
  171. bootstrap = 1;
  172. }
  173.         i = 1;
  174. inside = 1;
  175.         nc++;
  176. next;
  177. }
  178. # ----------------
  179. # process the contents of the catalog definition
  180. #
  181. # attname[ x ] contains the attribute name for attribute x
  182. # atttype[ x ] contains the attribute type fot attribute x
  183. # ----------------
  184. inside == 1 {
  185. # ----
  186. #  ignore a leading brace line..
  187. # ----
  188.         if ($1 ~ /{/)
  189. next;
  190. # ----
  191. #  if this is the last line, then output the bki catalog stuff.
  192. # ----
  193. if ($1 ~ /}/) {
  194. if (bootstrap) {
  195. print "create bootstrap " catalog;
  196. } else {
  197. print "create " catalog;
  198. }
  199. print "t(";
  200. for (j=1; j<i-1; j++) {
  201. print "t " attname[ j ] " = " atttype[ j ] " ,";
  202. }
  203. print "t " attname[ j ] " = " atttype[ j ] ;
  204. print "t)";
  205. if (! bootstrap) {
  206. print "open " catalog;
  207. }
  208. i = 1;
  209. reln_open = 1;
  210. inside = 0;
  211. bootstrap = 0;
  212. next;
  213. }
  214. # ----
  215. #  if we are inside the catalog definition, then keep sucking up
  216. #  attibute names and types
  217. # ----
  218. if ($2 ~ /[.*]/) { # array attribute
  219. idlen = index($2,"[") - 1;
  220. atttype[ i ] = $1 "[]"; # variable-length only..
  221. attname[ i ] = substr($2,1,idlen);
  222. } else {
  223. atttype[ i ] = $1;
  224. attname[ i ] = $2;
  225. }
  226. i++;
  227. next;
  228. }
  229. END {
  230. if (reln_open == 1) {
  231. # print "show";
  232. print "close " catalog;
  233. reln_open = 0;
  234. }
  235. }
  236. ' >/tmp/genbkitmp.c
  237. @CPP@ $BKIOPTS /tmp/genbkitmp.c | 
  238. sed -e '/^[  ]*$/d' 
  239.     -e 's/[  ][  ]*/ /g' || exit 1
  240. # send pg_description file contents to standard error
  241. cat /tmp/genbki.tmp 1>&2
  242. # ----------------
  243. # all done
  244. # ----------------
  245. exit 0