Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  2/2003
suche: 

ORDIX News Archiv

Das IT-Magazin der ORDIX AG mit Fachbeiträgen zu Datenbanken, Unix und Java/XML.

Rätseln mit Larry Ratlos???

Larry Ratlos

Entweder war die Aufgabe zu schwer oder sie hat zu wenig Informix Interessenten angesprochen.

Nur zwei brauchbare Lösungen bekam Larry Ratlos auf sein Problem aus der letzten ORDIX News zugesandt. Die beiden Gewinner sind Herr Dieter Brandt, T-Systems Nova GmbH und Herr Andreas Wagener, Hutchison Telecom GmbH. Herzlichen Glückwunsch!

Sie wurden von uns bereits mit einem kleinen Geschenk und einem Gutschein für unsere Schulungen honoriert. Einer von beiden hat den Gutschein übrigens schon eingelöst und am Oracle-Seminar für Informix Umsteiger teilgenommen. Unsere Musterlösung sowie die beiden eingesendeten, ebenfalls korrekten Leser-Lösungen, finden Sie unten stehend.

Von der geringen Resonanz wenig beeindruckt, widmet sich Larry wieder seinen eigentlichen Aufgaben als JAVA Entwickler. Dabei ist er nun ziemlich schnell auf folgendes Problem gestoßen:

Die neue Aufgabe

In seinem Java-Programm hat er eine hierarchische Datenstruktur aufgebaut, die aus ineinander verschachtelten Listen aufgebaut ist. Die Listenelemente sind also entweder selbst Listen oder einfache String-Objekte. Diese Datenstruktur möchte er gerne als Baum auf der Kommandozeile ausgeben. Leider fehlt ihm die Idee, wie man (frau) das elegant anstellen kann?

Die Vorlage

In der Datei TreeOutput.java finden Sie Larrys Java-Programm mit der (noch) leeren printData-Methode. Eine Beispiel-Kommandozeilenausgabe, die Larry als Vorlage gefunden hat, sieht folgendermaßen aus:

Wurzel
  |--Die
  |  |--Ausgabe
  |  |--scheint
  |  |  |--so
  |  |--richtig
  |--programmiert
  |  |--zu
  |--sein ;)

Genau so stellt er sich das Ergebnis vor!

Können Sie Larry helfen?

Bevor Larry Ratlos sich die Lösung selbst erarbeitet - nachdem er an unserem JAVA Kurs teilgenommen hat - sollten Sie ihm schnell unter die Arme greifen. Auch dieses Mal werden wir neben der Lösung eines Java-Spezialisten aus dem Hause ORDIX die drei besten, eingesendeten Lösungen vorstellen. Für die Gewinner gibt es wieder etwas Interessantes zu gewinnen. Schicken Sie die Lösung einfach an kniffel@ordix.de.

Viel Spaß beim Rätseln!
Die Redaktion

 Auflösung aus Ausgabe 1/2003
 Kurz und schmerzlos:
# Funktion list_datenbanken() ermittelt alle DB Namen
list_datenbanken() {
dbaccess sysmaster - <<EOF
output to PIPE "cat" without headings
select name from sysdatabases where name not in (‘sysmaster’,
‘sysutils’); EOF } # Na jetzt gehts los fuer jede Datenbank (mit obiger Funktion) for db in ‘list_datenbanken‘ do # sh -v zeigt die Zeile an, als dbschema -d <DBNAME> -f <Prozedur> # Wir filtern <DBNAME>:<Prozedur> heraus (mittels sed) dbaccess $db - <<-EOF output to PIPE "sh -v 2>&1 | sed -e ‘s/^dbschema -d //’ -e ‘s/\-f/:/’" without headings select "dbschema -d $db -f ", TRIM(owner) || "." || procname from sysprocedures where UPPER(mode) in (‘O’, ‘D’); EOF done >list_procedures

Die eingesendeten Gewinner-Skripte

Zur Erinnerung: In der letzten Ausgabe stand Larry Ratlos vor dieser Aufgabe:

Erstellen Sie ein Shellskript, das auf einfache Art eine Liste aller Stored Procedures, die Datenbank, in der sie liegen, den Eigentümer und natürlich den jeweiligen Stored Procedure Source Code ausgibt, mit Ausnahme der "Systemdatenbanken".

Larry wollte aber auf keinen Fall mehr als 30 Zeilen verwenden und hatte den Anspruch, es so aufzubauen, dass es leicht zu lesen ist - schließlich will er ja auch in ein paar Monaten nochmal drauf gucken können und gleich wieder wissen, wie es funktioniert ;^).

 Dieses Skript wurde eingesandt von Dieter Brandt aus Bielefeld.
#!/usr/bin/ksh
TEMP=/tmp/$(basename $0)$$
# Datenbanken zusammenstellen
dbaccess sysmaster - > $TEMP.out 2>
$TEMP.err <<dbaccess!
 UNLOAD TO $TEMP.dblist DELIMITER ’ ’
 SELECT name FROM ‘informix’.sysdatabases WHERE owner != ‘informix’;
dbaccess!
while read dbname
do
  # Stored Procedures zusammenstellen
  dbaccess $dbname - > $TEMP.out 2> $TEMP.err <<-dbaccess!
    UNLOAD TO $TEMP.procidlist DELIMITER ‘ ‘
    SELECT procid, procname, owner FROM ‘informix’.sysprocedures;
  dbaccess!
  while read procid procname owner
  do
   # Source Code zusammenstellen
   dbaccess $dbname - > $TEMP.out 2> $TEMP.err <<-dbaccess!
    UNLOAD TO $TEMP.datalist SELECT data FROM ‘informix’.sysprocbody
   WHERE procid = $procid AND datakey = ‘T’
   dbaccess!
   awk ’{l=substr($0,1,length-1);
	  if(/\|$/){printf l}
	  else{print l}
	}END{printf "\n"}’ $TEMP.datalist > $TEMP.data
    print database=$dbname
    print procedure=$procname
    print owner=$owner
    cat $TEMP.data
  done < $TEMP.procidlist
done < $TEMP.dblist
rm -f $TEMP.*
print "Ende"

 Dieses Skript wurde eingesandt von Andreas Wagener aus Münster.
#!/bin/ksh

TMPFILE=/tmp/dbname.$$
TMPFILE2=/tmp/procname.$$

echo "unload to $TMPFILE select name from sysdatabases
  where name not like ‘sys%’"
  | dbaccess sysmaster 2>/dev/null
sed ‘s/|$//’ $TMPFILE | while read DBName
do
  echo
  echo "Datenbank : "$DBName
  echo "unload to $TMPFILE2 select procname, owner from sysprocedures
    where procname<>’systdist’;"
	| dbaccess $DBName 2>/dev/null
  sed ‘s/|/ /g’ $TMPFILE2 | while read ProcName ProcOwner
  do
    echo
    echo "Procedure : "$ProcName
    echo "Owner     : "$ProcOwner
    echo "Code      :"
    dbschema -d $DBName -f $ProcName | tail +5
  done
done

rm $TMPFILE $TMPFILE2