Databaseaccess via ODBC in perl

Hier entsteht ein Konzeptentwurf für die Persistenzfunktionen eines HTTP-ApplicationServers

Datenbankanbindung
Datenstrukturen
Definitionsbeispiel
Anfrageform
Zugriffsmethoden
Ergebnisanzeige

zum Anfang 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.

zum Anfang 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.

zum Anfang 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');

zum Anfang 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

zum Anfang 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 :).

zum Anfang 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