
| Current Path : /var/www/web-klick.de/dsh/10_customer2017/1204__intel/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/10_customer2017/1204__intel/BlackBoard.pm |
package BlackBoard;
use Time::HiRes;
use Data::Dumper;
use strict;
use DBI;
use DBD::SQLite;
# Dieses Modul implementiert ein BlackBoard, ein Schwarzes Brett.
# Nachrichten koennen eingetragen werden mit $self->msg(<nachricht>),
# wobei <nachricht> ein beliebiger ASCII-Text ist. Ausgelesen werden
# koennen Nachrichten mit $self->get().
#
# Das Schwarze Brett ist als SQLite-Datenbank implementiert. Der
# Name des entsprechenden Files im Filesystem ist im Konstruktor
# mit zu uebergeben. Diese Implementierung gestattet eine gemeinsame
# Nutzung des BlackBoards fuer alle Prozesse, die auf dieses File
# zugreifen koennen. Damit sind asynchrone Ueberwachungen und
# Meldungen moeglich.
#
# ACHTUNG: Das Modul Time::HiRes muss zur Verfuegung stehen, ggfs.
# mit ppm bzw cpan laden.
sub new {
my $class = shift;
my $dbfile = shift; # Datenbankfile
my $self = {};
$self->{'LAST'} = shift; # ROWID der als letztes gelesenen Meldung
my $db = 1;
$db = 0 if (!(-f $dbfile));
bless($self,$class);
return($self) if (!($dbfile));
my $dbh = DBI->connect("dbi:SQLite:$dbfile");
$self->{'DBH'} = $dbh;
if (!$db) { # Datenbankfile wird erzeugt, falls es nicht da ist
$dbh->do("create table channel (datetime longint, message vartext)");
$self->{'LAST'} = 0;
}
elsif (!($self->{'LAST'})) { # wenn es $self->{'LAST'} nicht gibt,
# dann wird diejenige Meldung als LAST genommen
# die als letzte vor dem gegenwaertigen
# Zeitpunkt eingegangen ist
my $akttime = Time::HiRes::time() * 100000;
my $sth = $dbh->prepare("select ROWID from channel where datetime > $akttime");
$sth->execute();
my @ee = $sth->fetchrow();
$self->{'LAST'} = $ee[0] - 1;
if ($self->{'LAST'} < 0) {
$sth = $dbh->prepare(
"select count (*) from channel");
$sth->execute();
my @ee = $sth->fetchrow();
$self->{'LAST'} = $ee[0];
}
}
return($self);
}
#*******************************************************************
sub msg { # Message anbringen
my $self = shift;
my $text = shift;
return() if (!($self->{'DBH'}));
my $akttime = Time::HiRes::time() * 100000;
my $sth = $self->{'DBH'}->prepare(
"insert into channel values (\"$akttime\",?)");
$sth->bind_param(1,$text);
$sth->execute();
}
#*******************************************************************
sub get { # Message abholen
my $self = shift;
return([]) if (!($self->{'DBH'}));
my $sth = $self->{'DBH'}->prepare(
"select ROWID,datetime,message from channel where ROWID > " .
$self->{'LAST'});
$sth->execute();
my $erg = [];
my @ee;
while (@ee = $sth->fetchrow()) {
$self->{'LAST'} = $ee[0];
push(@$erg,[$ee[1],$ee[2]]);
}
return($erg);
}
#*******************************************************************
sub _test_get { # Test-Routine zum Ueberwachen eingehender Nachrichten
my $self = shift;
my $o;
while (0 == 0) {
my $erg = $self->get();
print Dumper($erg);
sleep 1;
}
}
#*******************************************************************
sub last { # gibt den LAST-Wert zurueck, um in einem neuen Handler
# erneut verwendet werden zu koennen. So gehen dann keine
# Meldungen verloren, auch wenn der Handler gerade nicht laeuft.
my $self = shift;
return($self->{'LAST'});
}
#*******************************************************************
1;