Bonjour,
J'essaie de créer un écouteur d’événements en perl. Le fonctionnement est très simple, une requête select est envoyée dans une base *sql (mysql en l'occurrence pour le moment), le contenu de la table est récupérée, puis chaque événement est vidé à l'aide d'un DROP.
Le problème est que j'ai ce message qui apparaît à chaque fois qu'il trouve un enregistrement:
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at ./daemon_pl line 44.
Voici mon code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #!/usr/bin/perl
use DBD::mysql;
use Device::SerialPort;
use Switch;
sub dbConnect {
my $dbh = DBI->connect('DBI:mysql:xxxx', 'xxxxx', 'xxxxx' )
or print "Could not connect to database: $DBI::errstr";
return $dbh;
}
# Serial init
# my $serial = Device::SerialPort->new("/dev/ttyUSB0") or die "Could not open device /dev/ttyUSB0";
# $serial->databits(8);
# $serial->baudrate(9600);
# $serial->parity("none");
# $serial->stopbits(1);
#switch ($cmd) {
# case /^serial/ { print "serial - " . $cmd; }
# case /^ring/ { print "ring - " . $cmd; }
# case /^sys/ { print "sys - " . $cmd; }
# case /^initserial/ { print "initserial - " . $cmd; }
# else { print "command not recognized - " . $cmd; }
#}
while (1) {
while (! $dbh) {
print "Initialization of connection to DB" . "\n";
$dbh = &dbConnect();
if ($dbh) { print "Connection to DB initialized" . "\n"; }
else { print "Failed to initialize DB connection" . "\n"; }
}
$sth = $dbh->prepare('SELECT * FROM evt WHERE type="Send" ORDER BY tstamp')
or print $dbh->errstr;
$sth->execute() or print "Can't execute SQl request: $dbh->errstr" . "\n";
while ( my $res = $sth->fetchrow_hashref ) {
my $idEvt = $res->{idEvt};
my $type = $res->{type};
my $action = $res->{action};
my $hardName = $res->{hardName};
my $idHard = $res->{idHard};
my $hardKey = $res->{hardKey};
my $serial = $res->{serial};
print "One evt has been poped : $idEvt" . "\n";
print "\t- $type" . "\n";
print "\t- $action" . "\n";
print "\t- $hardName" . "\n";
print "\t- $idHard" . "\n";
print "\t- $hardKey" . "\n";
print "\t- $serial" . "\n";
print "\n";
print "Deleting evt id $idEvt from DB" . "\n";
$sth = $dbh->prepare('DELETE FROM evt WHERE idEvt=' . $idEvt)
or print $dbh->errstr;
$sth->execute() or print "Can't execute SQl request" . "\n";
print "evt $idEvt has been deleted from DB";
}
$sth->finish();
}
$dbh->disconnect(); |
Ce qui donne quand il trouve un événement:
1 2 3 4 5 6 7 8 9 10 11 12
| root@rasp [ ~ ] :: ./daemon_pl
Connection to DB initialized
One evt has been poped : 6
- Send
- test
- test
- 1234
- 134dqqaa543184qzesd84fd5341
- 123151851
Deleting evt id 6 from DB
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at ./daemon_pl line 45. |
J'ai essayé de mettre l'init de dbh à l'extérieur de la boucle, et ce n'est pas la cause. J'ai également essayé de mettre en commentaire le finish ou de le mettre en dehors de la boucle, juste avant le disconnect, mais idem, ce n'est pas la cause du message.
L'outil fonctionne bien, même si le message apparaît, mais je veux faire les choses proprement pour ne pas avoir à me poser 50000 questions le jour où j'aurai un bug.
Vous auriez une petite idée ?
Partager