diff --git a/scripts/sql-to-dot.sed b/scripts/sql-to-dot.sed index 99b8b17..07b2989 100755 --- a/scripts/sql-to-dot.sed +++ b/scripts/sql-to-dot.sed @@ -1,39 +1,79 @@ -#! /bin/sed -f +#! /bin/sed -nf 1i\ /** @page database Database Schema\ \ @dot\ digraph schema { -# remove newlines -:a;N;$!ba;s/\n/ /g +# get everithing on one single line +H;$!d;$x + +# remove all single-line comment lines +s/\n--[^\n]*//g + # reduce spaces -s, \+, ,g +s,\t\| \+, ,g + +# remove multiline comments +:f;s,\(.*\)/\*.*\*/[ \n]*;*,\1,g;tf + +# remove empty lines +s,\n\+,\n,g + +# remove unknown commands +s,\(;\|\n\) *\(DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig + +# convert special characters within quotes +:a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta +:c;s/^\(\([^']*'[^',]*'\)*[^']*'[^']*\),\([^']*'.*\)/\1\##COMMA##\3/g;tc + +# backup everything to the buffer +# then analyze only on one create table +:i +h +s,.*\(create[ \n]\+table[^;]*;\).*,\1,ig + +# start html table node +s|CREATE[ \n]\+TABLE[ \n]\+\(if[ \n]\+not[ \n]\+exists[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n \n |ig -s| *CREATE *TABLE *\(if *not *exists\)\? *`\?\([a-z]\+\)`\? *|\n \2\n [shape=none, margin=0, label=<\n
\2
\n \n|ig +# remove key definitions +s/[),][\n ]*\(PRIMARY[ \n]\+\)\?KEY[ \n]\+[^(]*([^)]*)//gi -s/varchar *( *\([0-9]\+\) *)/varchar[\1]/ig +# move foreign keys as relation to the end +:b;s/\(\w\+\)\([^;]*\)FOREIGN[\n ]\+KEY[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*REFERENCES[ \n]*`\?\([a-z]\+\)`\?[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*\([^,)]*\)\([,)].*\)/\1\2\7\n \1:\3 -> \4:\5 [label="\6"]##SEMICOLON##/ig;tb -s/ *PRIMARY KEY *( *`\?\([a-z]\+\)`\? *) *[,)]//ig +# create table rows +s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)[ \n]\+COMMENT[ \n]*["']\([^"']*\)["'][ \n]*|\n |gi +s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n |g -:b;s/\([a-z]\+\)\([^;]*\)FOREIGN KEY *( *`\?\([a-z]\+\)`\? *) *REFERENCES *`\?\([a-z]\+\)`\? *( *`\?\([a-z]\+\)`\? *) *\([^,)]*\)[,)]\(.*\)/\1\2\7\n \1:\3 -> \4:\5/ig;tb +# add line breaks for long lines +s|\(]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g +#:d;s|\(
[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g;td -:c;s|\n[(,] *`\?\([a-z]\+\)`\? *\([^ ]\+\)*\([^,)]*\) *COMMENT *[`"']\([^`"']*\)[`"'] *[,)]|\n
\n,|ig;tc +# add table comment below +:k;tk +s|[ \n]*)[^)]*COMMENT[ \n]*=[ \n]*["']\?\([^"']*\)["']\?[^;]*|\n |ig;th +s|)[^);]*;|\n;|ig +:h -s| \+||g -s|\)|\1
\2|g -:d;s|\(
[^<]\{30,40\}\) \+\([^<]\{20,\}\)|\1
\2|g;td +# cleanup comment below, add line breaksfor long lines +s|\(]*>[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}\)|\1
\2|g +#:e;s|\(
[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}\)|\1
\2|g;te -s| *COMMENT *= *["']\?\([^"']*\)["']\?|\n
|ig +# close table +s|;|\n
\2
\1\2\4\5
\1\2\4
\1\2\3\4
\1
\+||g -s|\(]*>[^<]\{30,40\}\) \+\([^<]\{20,\}
\1
\n >];|ig -s| \+||g -s| \+||g -s|\(]*>[^<]\{60,80\}\) \+\([^<]\{30,\}\)|\1
\2|g -:e;s|\(
[^<]\{60,80\}\) \+\([^<]\{30,\}\)|\1
\2|g;te +# convert ##COMMA## to , +s|##COMMA##|,|g +# convert ##SEMICOLON## to ; +s,##SEMICOLON##,;,g -s/\n,[^\n]*/\n/g -s|;|\n \n >];\n|ig +# print one table +p +# get buffer back and remove the table that has just been analyzed +x +s,\(.*\)create[ \n]\+table[^;]*;\(.*\),\1\2,ig +ti $a\ }\