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
©_param( "${scriptpfad}$PrintAPR", "$verzeichnis/$PrintAPR" );
# Sortier- und Extraktions-Parameterdatei
©_param( "${scriptpfad}$SortAPR", "$verzeichnis/$SortAPR" );
# Codierungstabelle
©_param( "${scriptpfad}$PrintAPT", "$verzeichnis/printer.${k1}pt" );
©_param( "${scriptpfad}$copycfg", "$verzeichnis/$copycfg" );
©_param( "${scriptpfad}s.${k1}pt", "$verzeichnis/s.${k1}pt" );
©_param( "${scriptpfad}s1.asp", "$verzeichnis/s1.asp" );
©_param( "${scriptpfad}uif0ger", "$verzeichnis/uif0ger" );
©_param( "${scriptpfad}uif1ger", "$verzeichnis/uif1ger" );
©_param( "${scriptpfad}uif4ger", "$verzeichnis/uif4ger" );
©_param( "${scriptpfad}uif7ger", "$verzeichnis/uif7ger" );
©_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
©_param( "${scriptpfad}$PrintAPR", "$verzeichnis/$PrintAPR" );
# Sortier- und Extraktions-Parameterdatei
©_param( "${scriptpfad}$SortAPR", "$verzeichnis/$SortAPR" );
# Codierungstabelle
©_param( "${scriptpfad}$PrintAPT", "$verzeichnis/PRINTER.${k1}PT" );
©_param( "${scriptpfad}$copycfg", "$verzeichnis/$copycfg" );
©_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