Databaseaccess via ODBC in perl
Hier entsteht ein Konzeptentwurf für die Persistenzfunktionen eines
HTTP-ApplicationServers
Datenbankanbindung
Grundlage der Evaluierung ist die Perl-Distribution ActivePerl
von Active State Tool Corp..
Die Datenbankanbindung ist mit dem Package Win32::ODBC
von Dave Roth realisiert.
Dieses Package beschreibt die grundlegenden Funktionen zum Zugriff auf
ODBC-Datenquellen.
Datenstrukturen
Für die Einbindung in den ApplicationServer habe ich die Klassen REC und COL
definiert, die das Zusammenspiel zwischen Speicherstrukturen, Records, Tables,
Columns und ihren korrenspondierenden HTML-Darstellungen implementieren.
Ziel der Entwicklung ist die einfache Beschreibung von
Präsentations- und Persistenzfunktionen zu den in einer Anwendung genutzten
Datenobjekten.
Definitionsbeispiel
Folgend ist die Datenstruktur füd eine Anwendung zur Auswertung von
Logginginformation eines Webservers beispielhaft beschrieben.
# Definition des Recordsets mit allen Kolumnen
$logs = new REC(
('ID' ,'number',''),
('IP' ,'text' ,''),
('DATUM' ,'time' ,''),
('DOCUMENT' ,'longtext' ,''),
('REFERRER' ,'longtext' ,''),
('CLIENT' ,'longtext' ,''),
'httplog',
);
# Festlegung des Primärschlüssels
$logs->setid('ID');
# Beschreibung der zugeordneten Führunstexte
$logs->cols->{'ID'}->prettyname('<b>LogID</b>');
$logs->cols->{'IP'}->prettyname('<b>IP</b>');
$logs->cols->{'DATUM'}->prettyname('<b>Time</b>');
$logs->cols->{'DOCUMENT'}->prettyname('<font color=blue><b>Document</b></font>');
$logs->cols->{'REFERRER'}->prettyname('<b>referred by</b>');
$logs->cols->{'CLIENT'}->prettyname('<b>Client-<br>system</b>');
# Beschreibung der zugeordneten Datumsrepräsentation
$logs->cols->{'DATUM'}->{datecode}="{d\'%s\'}";
und ein weiterer Recordset
$stat = new REC(
('ERKLAERUNG' ,'text' ,''),
('SUMME' ,'number' ,''),
('ANZAHL' ,'number' ,''),
('BEDEUT' ,'longtext' ,''),
'httplog',
);
$stat->cols->{'ERKLAERUNG'}->prettyname('Summe zu
');
$stat->cols->{'SUMME'}->prettyname('Summe');
$stat->cols->{'ANZAHL'}->prettyname('Anzahl');
$stat->cols->{'BEDEUT'}->prettyname('Bedeutung');
Anfrageform
<FORM METHOD="GET" ACTION="suche_allg"
ENCTYPE="application/x-www-form-urlencoded" TARGET="right">
<INPUT TYPE="hidden" NAME="search" VALUE="referrer">
<INPUT TYPE="text" NAME="ename" >
<INPUT TYPE="submit" NAME="name" VALUE="referrer">
</FORM>
so sieht's aus
Zugriffsmethoden
Hier ist zu sehen, wie ein bestimmter Auszug aus der Logginginformation selektiert wird.
#------------------------------suche_allg
sub suche_allg
{
my $self = shift;
my $qry=' ';
print start_html(-title=>'LogApp:QueryResult',
-background=>$self->{BGIMAGE}),hr;
$qry=sprintf("select '\"%s\"' as ERKLAERUNG ,
count(*) as ANZAHL
from httplog
where %s like %s%s%s ",param('ename'),
param('search'),
"\'\%",param('ename'),"\%\'");
$rc=$self->db->Sql($qry);
if ($rc){
print "<font color=red>Fehler<br>";
print $qry,'<br>';
print "Sql(): " , $O->Error(),"</font><br>";
}
else
{$self->ShowRecs($self->db,'lst','stat');
}
print '
';
$qry=sprintf("select ID,IP,DATUM,DOCUMENT, REFERRER, CLIENT
from httplog
where %s like %s%s%s order by DATUM",param('search') ,
"\'\%",param('ename'),"\%\'");
$rc=$self->db->Sql($qry);
if ($rc){
print "<font color=red>Fehler<br>";
print $qry,'<br>';
print "Sql(): " , $O->Error(),"</font><br>";
}
else
{$self->ShowRecs($self->db,'lst','logs');
}
print end_html;
}
Quelltext mit HTML-Anteilen in HTML anzuzeigen ist nicht ganz einfach :).
Ergebnisanzeige
Hierzu werden die Memberfunktionen der Recordsetklasse genutzt.
$self->ShowRecs($self->db,'lst','logs');
Die Recordklasse ist in der Applikationsklasse (hier "$self") enthalten.
ShowRecs ist die Funktion zur Ausgabe einer Treffermenge.
$self->db ist die ODBC-Schnittstelleninstanz der Applikation.
'lst' ist der Visualisierungsmodus für die Treffermenge (nur Ausgabe).
Weitere Modi sind:
'upd' (update)
'ins' (insert)
logs ist die Instanz des Recordsets.
Und so gehts:
URL=http://localhost/cgi-bin/suche_allg?search=referrer&ename=vista