Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7262[/thread]

Perl-OO und Vererbung



<< >> 7 Einträge, 1 Seite
nepos
 2005-09-08 13:19
#57747 #57747
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo zusammen!

Also, ich habe bei mir folgendes Problem: fuer eine Anwendung die auf ner DB arbeitet habe ich mir eine eigene Database-Klasse geschrieben, die von DBI.pm erbt (our @ISA = ("DBI")). Sinn und Zweck des ganzen ist es, fuer die Anwedung transparent die DBI-Funktionen zu nutzen, dabei allerdings die ausgefuehrten SQL-Kommandos mitzuprotokollieren. Bis auf eine Sache klappt das auch ganz gut. Problematisch wirds bei der Benutzung von $sth = $dbh->prepare() mit einem anschliessenden $sth->execute. Das von prepare zurueckgegebene Statement Handle ist natuerlich nicht mehr von meiner Klasse sondern von DBD::st. Deshalb wird der Aufruf von execute momentan am Logging vorbeigeschleust.
Meine Problem ist nun, wie ich es hinbekomme, dass beim Aufruf von $sth->execute erst meine execute aufgerufen wird, die die Parameter mitloggt und dann die echte execute-Funktion aufruft.
Vielen Dank fuer eure Hilfe!

Ciao,
Nepos
renee
 2005-09-08 13:35
#57748 #57748
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mach noch eine Hilfsklasse...

in etwas so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package YourClass;

[... use strict etc ...]]
our @ISA = qw(DBI);

[... andere Methoden ...]

sub prepare{
my ($self,@params) = @_;
my $sth = SUPER::prepare(@params);
my $nr = ++$self->{nr};
push(@{$self->{sth}},$sth);
my $tmpObj = HelperClass->new($self,$sth,$nr);
return $tmpObj;
}

sub execute{
my ($self,$nr,@params) = @_;
[... logging ...]
$self->{sth}->[$nr]->execute(@params);
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
package HelperClass;
sub new{
my ($class,$parent,$nr) = @_;
my $self = {};
bless $self,$class;
$self->{parent} = $parent;
$self->{nr} = $nr;
}

sub execute{
my ($self,@params) = @_;
$self->{parent}->execute($nr,@params);
}


ungetestet!

edit: so ähnlich musst Du das dann halt mit allen DBD::st-Methoden machen...\n\n

<!--EDIT|renee|1126172228-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2005-09-08 14:43
#57749 #57749
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=nepos,08.09.2005, 11:19]Sinn und Zweck des ganzen ist es, fuer die Anwedung transparent die DBI-Funktionen zu nutzen, dabei allerdings die ausgefuehrten SQL-Kommandos mitzuprotokollieren.[/quote]
DBI kann sowas schon:
perldoc DBI
stichwort trace
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2005-09-08 14:54
#57750 #57750
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
von DBI wuerde ich eher nicht direkt erben, sondern besser eine has-a-relationship verwenden (ev. die DBI-Methoden, die 1:1 aufgerufen werden sollen, mit einem AUTOLOAD-Wrapper (+ ev. verankerung in Symboltabelle) nachbilden
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
nepos
 2005-09-08 15:13
#57751 #57751
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
@pq: So ausfuehrlich wie das DBI-trace wollte ich das nicht :) Mich interessiert nur, wann wurde welches Kommando ausgefuehrt, war es erfolgreich, wie lange hats gebraucht und von wo aus wurde es abgesetzt.

@Strat: Was spricht dagegen von DBI zu erben?

Generell, wenns zu aufwendig wird, lass ich das weg. Ich denke, ich werd eh recht wenig mit prepare+execute machen muessen.
Strat
 2005-09-08 18:55
#57752 #57752
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich wuerde deshalb nicht direkt von DBI erben, weil es recht aufwendig ist (bzw. sein kann), an all die methoden dran zu kommen, weil die in verschiedenen packages liegen (DBI::db, DBI::st, ...), und da muesste man von diesen ganzen klassen erben. Ich weiss nicht, ob es da nicht mal bei einem update von DBI aenderungen geben kann (ist wohl aber eher unwahrscheinlich).

Deshalb bevorzuge ich da eine has-a-relationship mit optionalem wrapper (autoload mit can funktionierte bei mir recht gut)\n\n

<!--EDIT|Strat|1126191413-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
nepos
 2005-09-08 21:19
#57753 #57753
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ach so. Naja, fuer die Sachen, die ich in dem Fall brauche klappts einwandfrei. Das einzige Problem ist wie gesagt die Sache mit den Statement Handles und das scheint wohl eines der Probleme zu sein, die du ansprichst.
<< >> 7 Einträge, 1 Seite



View all threads created 2005-09-08 13:19.