w3opac mit allegro auf Linux

Wolfgang Glaser glaser at tumx2.biblio.tu-muenchen.de
Di Aug 27 15:57:12 CEST 1996


#!/usr/bin/perl

# Die erste Zeile muss auf das Perl-Programm zeigen

# CGI-Script in Perl fuer die Suche in einem allegro-Katalog.
# Version vom 26.10.1995 Dierk Hoeppner TU Braunschweig
#
# Dem Script muessen diese CGI-Parameter uebergeben werden:
#       wert     = Indexzeile fuer die Anzeige
#       recnums  = Nummer(n) des/der anzuzeigenden Datensaetze
# oder  num1 bis numn fuer die Datensatznummern aus Kurztitelliste
#       index    = indexnummer 1,2,3,4,5,6,7,8 oder 9
#       db       = Datenbankkuerzel
#       printapr = Parameterdatei fuer die Ausgabe
#       sortierung = Codierung der Sortierung;
#                    keine Angabe: default-Einstellung
#
# Es werden der oder die Datensaetze extrahiert und formatiert ausgegeben.
#
# Aenderungen:
#   06.06.95    Umstellung auf das neue QRIX und SRCH (Extraktion der
#               Datensaetze ueber die Nummern
#   26.10.1995  Erweiterung um Reaktion auf Kurztitellisten und Verwendung
#               von mehreren Parameterdateien fuer das Ausgabeformat!
#   10.11.1995  Umstellung auf Kleinschreibung der Dateinamen

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
require 'cgi-lib.pl';               # Eine Standardbibliothek

require 'acinfo.pl';                # Grundeinstellungen zu den
                                    # recherchierbaren Datenbanken

# Im Querystring muss zunaechst ~ durch = ersetzt werden
$ENV{'QUERY_STRING'} =~ s/\~/\=/g;

&ReadParse;                         # Suchbegriffe einlesen. Sie stehen
                                    # im Array %in zur Verfuegung
                                    # ReadParse ist in cgi-lib.pl definiert

# Pfad zu den datenbankspezifischen Scripten und Parameterdateien
$scriptpfad = $dbscripte{ $in{'db'} };

# Datenbankspezifische Einstellungen einlesen:
require $scriptpfad . 'dbinfo.pl';

# Sortierung feststellen
($bla, $SortAPR ) = split( /\|/, $Sortierung{'DEFAULT'} );
($bla, $SortAPR ) = split( /\|/, $Sortierung{$in{'sortierung'}} )
                        if( $in{'sortierung'} );

# Ausgabeparameterdatei
($bla, $PrintAPR ) = split( /\|/, $Parameterdateien{'DEFAULT'} );
($bla, $PrintAPR ) = split( /\|/, $Parameterdateien{$in{'printapr'}} )
                        if( $in{'printapr'} );

# Codierung
($bla, $PrintAPT ) = split( /\|/, $Codierung{'DEFAULT'} );
($bla, $PrintAPT ) = split( /\|/, $Codierung{$in{'codierung'}} )
                        if( $in{'codierung'} );

if( $in{'wert'} )
{
    $wert_zeige = $in{'wert'};    # fuer die Anzeige

    # Zeichenumsetzung fuer die Anzeige
    $wert_zeige =~ s/\\x3E/>/g;
    $wert_zeige =~ s/\\x3C/</g;
    $wert_zeige =~ s/\\x2D/-/g;
    $wert_zeige =~ s/>/>/g;
    $wert_zeige =~ s/</</g;
    $wert_zeige =~ s/\\x7C/\|/g;
    $wert_zeige =~ s/\\x10/\>/g;
    $wert_zeige =~ s/\\x23/\#/g;
    $wert_zeige =~ s/\\x15/§/g;
    $wert_zeige =~ s/\\xAA//g;      # '.25' ausblenden
    $wert_zeige =~ s/\\xC2//g;      # ' ' ausblenden
}

# Falls die Datensaetze aus einer Kurztitelliste ausgewaehlt wurden, liegen
# sie als einzelne Parameter mit Namen num1 bis numN vor. Falls die
# Titelproduktion ueber einen Link aktiviert wurde, liegen die Datensatznummern
# in $in{'recnums'} vor
if( $in{'recnums'} )
{
    @nums = split( /N/, $in{'recnums'} );
}
foreach( keys %in )
{
    if( /^num/ )
    {
        push( @nums, $in{$_} );
    }
}
# HTML-Header ausgeben. Siehe cgi-lib.pl
print &PrintHeader;

# Zeitstempel
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime(time);
$mon = $mon + 1;

# Einleitung fuer die Ergebnisseite:
print <<"EINLEITUNG_HTML";
<HTML>
<HEAD>
<title>
$Organisation{'Kurzform'}, allegro-W3-OPAC: Titelanzeige
</title>
</HEAD>
<BODY>
<center>
<h2>Rechercheergebnis im allegro-W3-OPAC der $Organisation{'Kurzform'}</h2>
<h1>$DatenbankName-Datenbank</h1>
</center>
EINLEITUNG_HTML

# Falls ein Haupteintrag angeklickt wurde, moechte man wissen. zu welchem
# Register-Eintrag das Ergebnis passt
if( $in{'wert'} )
{
    print "<h3>\n<br>Einträge zu <i>$wert_zeige</i> im Register ";
    print "<i>$RegisterAnzeige{$in{'index'}}</i>:\n</h3>";
}

print "<p>(erzeugt am $mday.$mon.$year um $hour:$min)</p>";

# ggf. Hinweis auf anderes Ausgabeformat
$SortForm = 0;
$sort = 1;
$format = 2;
$code = 4;
if( ( keys %Sortierung ) > 1 && @nums > 1 )
{
    $SortForm |= $sort;
}
if( ( keys %Parameterdateien ) > 1 )
{
    $SortForm |= $format;
}
if( ( keys %Codierung ) > 1 )
{
    $SortForm |= $code;
}
if( $SortForm > 0 )
{
    $hinweis = sprintf( "%s", "Sie können am Ende der Liste ein anderes Ausgabeformat wählen!" );
    $SortFormTitel = sprintf( "%s", "Anderes Ausgabeformat" );
    print "<p><strong>$hinweis</strong></p>\n";
}

if( $construction =~ /yes/i )
{
    print "<h2>An dieser Funktion wird zur Zeit gebastelt. Deshalb ";
    print "gibt es nur diese Fehlermeldung!<\/h2>\n";
    exit;
}

# einige wichtige Voreinstellungen. Es sollte sich alles in einem Verzeichnis
# unterhalb des Verzeichnisses, in dem das Script sich befindet, abspielen.
# Damit werden Kollisionen mit anderen Anfragen vermieden

if ( $os =~ /UNIX/i )
{
    # Name des temporaeren Katalogverzeichnisses setzt sich aus
    # 'katalogrecherche' und einer Zahl zusammen
    $zahl = 0;
    $verzeichnis = "katalogrecherche.$zahl";
    while( -e $verzeichnis )
    {
        $zahl += 1;
        $verzeichnis = "katalogrecherche.$zahl";
    }
    $verzeichnis = "dierk" if( $ENV{'REMOTE_ADDR'} =~ /dierk/i );
                                                # zum testen
    $cgiRoot = "/usr/httpd/cgi-bin";
    $arbverz = $cgiRoot . "/" . $verzeichnis;
    mkdir( $verzeichnis, 0777 );

    # wichtige Dateien kopieren
    # Parameterdateien kopieren
    &copy_param( "${scriptpfad}$PrintAPR", "$verzeichnis/$PrintAPR" );

    # Sortier- und Extraktions-Parameterdatei
    &copy_param( "${scriptpfad}$SortAPR", "$verzeichnis/$SortAPR" );

    # Codierungstabelle
    &copy_param( "${scriptpfad}$PrintAPT", "$verzeichnis/printer.${k1}pt" );

    &copy_param( "${scriptpfad}$copycfg", "$verzeichnis/$copycfg" );
    &copy_param( "${scriptpfad}s.${k1}pt", "$verzeichnis/s.${k1}pt" );
    &copy_param( "${scriptpfad}s1.asp",  "$verzeichnis/s1.asp" );
    &copy_param( "${scriptpfad}uif0ger", "$verzeichnis/uif0ger" );
    &copy_param( "${scriptpfad}uif1ger", "$verzeichnis/uif1ger" );
    &copy_param( "${scriptpfad}uif4ger", "$verzeichnis/uif4ger" );
    &copy_param( "${scriptpfad}uif7ger", "$verzeichnis/uif7ger" );
    &copy_param( "${scriptpfad}uifqger", "$verzeichnis/uifqger" );

    chdir( $verzeichnis );
    # diese Umgebungsvariablen braucht SRCH undbedingt
    $ENV{'USER'} = $ENV{'REMOTE_HOST'};
    $ENV{'DRUCKER'} =  "XXXX";
#    $ENV{'TERM'} = "xterm";
    $ENV{'TERM'} = "ansi";
    # Noch einige Verzeichnisse:
    $srchpfad = "/usr/home/opac/";      # hier findet man das srch-Programm
}
if ( $os =~ /MSDOS/i )
{
    # Arbeitsverzeichnis erstellen
    $z = $ENV{'OUTPUT_FILE'};
    $anf = rindex( $z, "\\") + 1;
    $ende = rindex( $z, "." ) - $anf;
    $verzeichnis = substr( $z, $anf, $ende );
    $cgiRoot = "c:\\httpd\\cgi-dos";
    mkdir( $verzeichnis, 777 );

    # Parameterdateien kopieren
    &copy_param( "${scriptpfad}$PrintAPR", "$verzeichnis/$PrintAPR" );

    # Sortier- und Extraktions-Parameterdatei
    &copy_param( "${scriptpfad}$SortAPR", "$verzeichnis/$SortAPR" );

    # Codierungstabelle
    &copy_param( "${scriptpfad}$PrintAPT", "$verzeichnis/PRINTER.${k1}PT" );

    &copy_param( "${scriptpfad}$copycfg", "$verzeichnis/$copycfg" );
    &copy_param( "${scriptpfad}s.${k1}pt", "$verzeichnis/s.${k1}pt" );
    chdir( $verzeichnis );
    # Noch einige Verzeichnisse:
    $srchpfad = "c:\\allegro\\";      # hier findet man das srch-Programm
}

# fuer beide gilt:
$nummern = "nummern.${k1}lg";

# Bei den Parameterdateien muss noch die Endung gekappt werden
$SortAPR =~ s/\..pr//gi;
$PrintAPR =~ s/\..pr//gi;
chdir( $verzeichnis );

# ****** bis hierher Voreinstellungen

# Aufbereitung der Datensatznummern als Grunddatei fuer SRCH
open( NUMS, ">$nummern" );
foreach ( @nums )
{
    print NUMS "\x0100 $_\x00\n";
 }
close NUMS;

# Extraktion der Datensaetze mit ggf. mit Sortiervorbereitung
if( $os =~ /MSDOS/i )
{
    $befehl = "${srchpfad}srch -k$cfg -s0 ".
            "-m0 -e$SortAPR/uuu.${k1}lg ".
            "-f4 -d$nummern -v0 ".
            "-b${DBPfad}$DBName ".
            "-P$ProgrammPfad >srchuuu.err";
}
#  ------------------ Hier ist die fragliche Stelle ------------
if( $os =~ /UNIX/i )
{
    $befehl = "${srchpfad}srchb -k$cfg -f4 -s0 -m0 ".
        "-e$SortAPR=uuu.alg -d$nummern ".
        "-b${DBPfad}$DBName -P${ProgrammPfad} ".
        ">srchuuu.err";
}

system ( $befehl );
 
print "<hr>\n";
print "Suchbefehl unsortiert=$befehl<br>\n";
print "Konfiguration=$cfg<br>\n";
open (DAT, "./nummern.alg"); while (<DAT>){ print "Recnums=$_<br>\n";}
print "SortierAPR=$SortAPR<br>\n";
print "PrintAPR=$PrintAPR<br>\n";
print "Datenbankpfad=${DBPfad}<br>\n";
print "ProgrammPfad=$ProgrammPfad<br>\n";

print "srchpfad=${srchpfad}<br>\n";
print "TERM=$ENV{'TERM'}<br>\n";

open (UUU, "./uuu.alg"); while (<UUU>){ print "unsortiert=$_<br>\n";}
print "ScriptPfad=${ScriptPfad}<br>\n";
print "scriptpfad=${scriptpfad}<br>\n";

print "<hr>\n";
print "Environment<br>\n";
require "pwd.pl";
&initpwd;
while (($key,$value)= each %ENV) {print "$key=$value<br>\n";}
print "<hr>\n";
print "Working directory=$ENV{'PWD'}<br>\n";


# system ( "/usr/home/opac/srch -ka -s0 -m0 -f4 -d<nummern.alg -b</usr/home2/katalog/kat -P/usr/home/opac -es-verfjahr=>uuu.alg" );

# ------------ Hier Ende der zusaetzlichen Ausgaben --------------------

# ggf sortieren
open( UNSORTED, "<uuu.${k1}lg" );
@saetze = <UNSORTED>;
close UNSORTED;
if( $in{'sortierung'} )
{
    @saetze = sort @saetze;             # ggf. sortieren
}
open( SORTIERT, ">sss.${k1}lg" );
foreach( @saetze )
{
    print SORTIERT;
}
close SORTIERT;

# Formatierung. Ergebnis wird in Datei "liste" geschrieben.
if( $os =~ /MSDOS/i )
{
    $befehl = "${srchpfad}srch -k$cfg -s0 ".
            "-m0 -e$PrintAPR/liste ".
            "-f4 -dsss.${k1}lg -v0 ".
            "-b${DBPfad}$DBName ".
            "-P$ProgrammPfad >liste.err";
}
if( $os =~ /UNIX/i )
{
    $befehl = "${srchpfad}srch -k$cfg -f4 -s0 -m0 ".
        "-e$PrintAPR=liste -duuu.${k1}lg ".
        "-e$PrintAPR=liste ".
        "-b${DBPfad}$DBName -P$Programmpfad ".
        ">liste.err";
}

system( $befehl );      # Datensaetze extrahieren und formatieren

# Das formatierte Ergebnis befindet sich in der Datei "liste"
# Ausgabe durch die Routine &PrintErgebnis, die im datenbankspezifischen
# Teil in DBINFO.PL definiert sein muss!
&PrintErgebnis( "liste" );

&AndereForm;        # ggf. anderes Ausgabeformat anbieten

&fuss;      # Abspann  ... und Tschuess

&delverzeichnis if( !($verzeichnis =~ /dierk/i));
                # die if-Bedingung dient nur zu Testzwecken
1;  # ENDE

#==========================================================================
# Unterprogramme
#

# Abspann fuer die Seite
sub fuss
{
   print <<"HTML_FUSS1";
<HR>
<P>
<B>Weitere Seiten:</B>
</P>
<MENU>
<LI>
<A HREF="/cgi-bin/maske.pl?db=$in{'db'}">
[Suchmaske]
</A>
</LI>
HTML_FUSS1

    foreach( keys %AndereDBs )
    {
        print <<"AndereDBs";
<li>
$AndereDBs{$_}
</li>
AndereDBs
    }

    print <<"HTML_FUSS2";
<LI>
<A HREF="/acrecher.html">
[allegro-W3-OPAC]
</A>
</LI>
<LI>
<A HREF="http://www.tu-bs.de/ub-tubs/biblio.html">
[UB Braunschweig]
</A>
</LI>
<LI>
<A HREF="http://www.tu-bs.de">
[TU Braunschweig]
</A>
</LI>
</MENU>
<HR>
<p>
$version, © $year $Organisation{'Langform'}
</P>
<address>
Dierk H\öppner (d.hoeppner\@tu-bs.de)
<\/address>
</BODY>
</HTML>
HTML_FUSS2
}

# ggf. anderes Format anbieten
sub AndereForm
{
    # Falls andere Sortierung oder Ausgabeformate moeglich sind
    if( $SortForm > 0 )
    {
        $subtitles = 0;
        if( $sort != $SortForm && $format != $SortForm && $code != $SortForm )
        {
            $subtitles = 1;
        }
        $rnum = sprintf( "%s", join( "N", @nums ) );
        print <<"AndereFormAnfang";
<HR>
<h3>$SortFormTitel</h3>
<FORM ACTION="$ScriptPfad/regsrch.pl" METHOD="POST">
<INPUT TYPE="HIDDEN" NAME="recnums" VALUE="$rnum">
<INPUT TYPE="HIDDEN" NAME="db" VALUE="$in{'db'}">
AndereFormAnfang

        # Sortierung
        if( $SortForm & $sort )
        {
            print "<h4>Sortierung</h4>\n<p>\n" if( $subtitles > 0 );
            foreach( sort keys %Sortierung )
            {
                ( $prompt, $wert ) = split( /\|/, $Sortierung{$_} );
                if( $_ =~ /DEFAULT/ )
                {
                    # DEFAULT wird geCHECKED
                    print "<INPUT TYPE=\"RADIO\" NAME=\"sortierung\" VALUE=\"$_\" CHECKED=\"CHECKED\"> ";
                }
                else
                {
                    print "<INPUT TYPE=\"RADIO\" NAME=\"sortierung\" VALUE=\"$_\"> ";
                }
                print $prompt, "<br>\n";
            }
            print "\n</p>\n";
        }

        # Ausgabeformat
        if( $SortForm & $format )
        {
            print "<h4>Ausgabeformat</h4>\n" if( $subtitles > 0 );
            print "<p>\n";
            foreach( sort keys %Parameterdateien )
            {
                ( $prompt, $wert ) = split( /\|/, $Parameterdateien{$_} );
                if( $_ =~ /DEFAULT/ )
                {
                    # default wird geCHECKED
                    print "<INPUT TYPE=\"RADIO\" NAME=\"printapr\" VALUE=\"$_\" CHECKED=\"CHECKED\"> ";
                }
                else
                {
                    print "<INPUT TYPE=\"RADIO\" NAME=\"printapr\" VALUE=\"$_\"> ";
                }
                print $prompt, "<br>\n";
            }
            print "\n</p>\n";
        }

        # Codierung
        if( $SortForm & $code )
        {
            print "<h4>Codierung</h4>\n" if( $subtitles > 0 );
            print "<p>\n";
            foreach( sort keys %Codierung )
            {
                ( $prompt, $wert ) = split( /\|/, $Codierung{$_} );
                if( $_ =~ /DEFAULT/ )
                {
                    # default wird geCHECKED
                    print "<INPUT TYPE=\"RADIO\" NAME=\"codierung\" VALUE=\"$_\" CHECKED=\"CHECKED\"> ";
                }
                else
                {
                    print "<INPUT TYPE=\"RADIO\" NAME=\"codierung\" VALUE=\"$_\"> ";
                }
                print $prompt, "<br>\n";
            }
            print "\n</p>\n";
        }

        print <<"AndereFormEnde";
<dl>
<dd>
<INPUT TYPE="submit" VALUE="Anderes Format ausgeben"> <INPUT TYPE="RESET" VALUE="Zuruecksetzen">
</dd>
</dl>
</FORM>
AndereFormEnde
    }
    return 1;
}





Mehr Informationen über die Mailingliste Allegro