Thread DBI: Exception Model RaiseError (15 answers)
Opened by rosti at 2011-03-23 10:21

rosti
 2011-05-06 05:54
#148285 #148285
User since
2011-03-19
3279 Artikel
BenutzerIn
[Homepage]
user image
Hallo,

Quote
sondern als Text in einer Variablen zwischenzuspeichern.


Damit geht der Sinn einer Callbackfunktion verloren, der darin besteht, die Datenmengen im Hauptspeicher klein zu halten. Es gibt prizipiell zwei Möglichkeiten:

1 wie Du schreibst, das Abfrageergebnis wird als Variable verarbeitet, als Array-Ref, oder Hash-Ref, z.B. eine Tabelle, die Daten liegen komplett im RAM

2 es wird eine Callbackfunktion gerufen, die Record für Record sofort auf die Ausgabe schreibt, im RAM liegt dann jeweils nur ein Record

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# URL-Details als Callback
sub cb_urldetails{
        my $self = shift;   # in der DB Klasse
        my $cbref = shift;  # CodeRef CallbackFunktion
        my $url = shift;
        my $q = q(SELECT ref, FROM_UNIXTIME(ts) as date, hugo FROM log WHERE url=? ORDER BY date DESC);
        my $st = $self->{DBH}->prepare($q);
        eval{
                $st->execute($url);
        };
        if($@){
                $self->{EVE} = $@;
                return $@;
        }
        else{
                if(ref $cbref eq 'CODE'){
                        while(my $ref = $st->fetchrow_hashref){
                                &$cbref($ref); # Callback
                        }
                }
        }
}


Das Statement wird getestet und ausgeführt. Ab Zeitpunkt der Ausführung wird die CB-Funktion gerufen.

Wenn die auszugebende Datenmenge feststeht, bevorzuge ich Variante (1). Hier ist die Fehlerbehandlung einfach.

Ist es so, dass die Datenmenge variiert, bevorzuge ich die Ausgabe mit einer Callbackfunktion.

Viele Grüße,
Rolf

View full thread DBI: Exception Model RaiseError