#!/usr/bin/perl -w

use utf8;
use strict;
use warnings;

BEGIN {
	unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
		unless $ENV{'KUNDE_NO_PERLPATH'};
}

use Umlaut qw(textmodus);

$|=1;

sub Usage() {
        my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';

	textmodus(\*STDERR);
    die <<END;
Usage: $0 -- generiere einen Graphen "welche Tabelle hängt unter welcher"
          -f DB   Datenbeschreibung aus dieser Datei holen

Version: $vers
END
  exit 1;
}

##
# Dieses Tool interpretiert die "!^"-Einträge in der POP-Datenbank-Datei
# und bastelt daraus einen rudimentären Graphen.
# 
# In der Grundform malen wir aus
#
# Tabelle: bla
# fasel int4 !^!>laber gerede
#
# einen Pfeil laber => bla.
#
# Ein zweites ^ kehrt die Richtung des Pfeils um.
# Unterstriche hinter dem ^ verlängern den Pfeil, damit der Graph netter
# aussieht.
# Steht ein Text hinter dem !^, dann wird dieser statt "bla" verwendet.
# Ansonsten: Steht das !^ bei einem Eintrag ohne !>, wird stattdessen
# "START" verwendet.
#
# Der Output dieser Prozedur kann an "dotty" oder ähnliche graphviz-
# Programme verfüttert werden und ist mit Sicherheit noch verbesserungs-
# fähig.
#
# Das Resultat ist, zumindest laut Stand 2007-04-03, eine einigermaßen
# verkraftbare (will sagen, zu mehr als 80% richtige) Darstellung der
# direkten Abhängigkeiten unserer Datenbanktabellen, ausgehend von der
# Menustruktur wie wir sie im Moment in kunde haben.

use Getopt::Std;
use Cf qw($POPHOME);
use vars qw( $opt_f $opt_h );
getopts("f:h") or Usage;
Usage if $opt_h or @ARGV;

($opt_f ? open(SCHEMA,$opt_f) : (
 open(SCHEMA,"POP-Datenbank") or 
 open(SCHEMA,"$POPHOME/POP-Datenbank"))) or 
die "keine Datenbeschreibungstabelle gefunden.\n";

print "digraph Datenbank {\n";

my $tabelle;
while (<SCHEMA>) {
	next if /^\s*#/ || !/\S/ || /^(?:Verwendung|Index):\s/ || /^\s/;
	if (/^Tabelle:\s+(\S+)\s*$/) {
		$tabelle = $1;
		print "$tabelle;\n";
	} elsif (/^Aufbau:\s*$/) {
		while (<SCHEMA>) {
			last unless /\S/;
			next if /^\s*#/;
			my ( $spalte, $typ, $flags, $descr ) = split /\t/, $_, 4;
			next unless defined $flags;
			next unless $flags =~ /!\^(\^)?(_+)?(\w+)?/;
			my $rev; $rev=1 if $1;
			my $w=$2;
			my $f=$3;

			if(defined $w) {
				$w=" [ minlen=".(length($w)+1)." ] ";
			} else {
				$w="";
			}

			unless(defined $f) {
				if($flags =~ /!(?:>(\w+))/) {
					$f = $1;
				} else {
					$f = "START";
				}
			}
			if($rev) {
				print "$tabelle -> $f $w;\n";
			} else {
				print "$f -> $tabelle $w;\n";
			}
		}
	}
}
print "}\n";
