X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FQSL.pm;h=3d228d39685992166ec292c8b42a3c221b362ec4;hb=770092d94f96b6d22a38fb33e0056b4779a8a1ab;hp=20d5c6143f139e656ab3a4c325fa7a1872fa78da;hpb=75987f0dbcbba4fc2bb5a378d14e2fbdb2e30e34;p=spider.git diff --git a/perl/QSL.pm b/perl/QSL.pm index 20d5c614..3d228d39 100644 --- a/perl/QSL.pm +++ b/perl/QSL.pm @@ -14,9 +14,10 @@ use DB_File; use DXDebug; use Prefix; -use vars qw($qslfn $dbm); +use vars qw($qslfn $dbm $maxentries); $qslfn = 'qsl'; $dbm = undef; +$maxentries = 50; sub init { @@ -37,6 +38,7 @@ sub init } import Storable qw(nfreeze freeze thaw); my %u; + undef $dbm; if ($mode) { $dbm = tie (%u, 'DB_File', $ufn, O_CREAT|O_RDWR, 0666, $DB_BTREE) or confess "can't open qsl file: $qslfn ($!)"; } else { @@ -65,19 +67,24 @@ sub update my $t = shift; my $by = shift; my $changed; - + + return unless length $line && $line =~ /\b(?:QSL|VIA)\b/i; foreach my $man (split /\b/, uc $line) { my $tok; - if (is_callsign($man)) { + if (is_callsign($man) && !is_qra($man)) { my @pre = Prefix::extract($man); $tok = $man if @pre && $pre[0] ne 'Q'; } elsif ($man =~ /^BUR/) { $tok = 'BUREAU'; + } elsif ($man =~ /^LOTW/) { + $tok = 'LOTW'; } elsif ($man eq 'HC' || $man =~ /^HOM/ || $man =~ /^DIR/) { $tok = 'HOME CALL'; } elsif ($man =~ /^QRZ/) { $tok = 'QRZ.com'; + } else { + next; } if ($tok) { my ($r) = grep {$_->[0] eq $tok} @{$self->[1]}; @@ -93,6 +100,8 @@ sub update unshift @{$self->[1]}, $r; $changed++; } + # prune the number of entries + pop @{$self->[1]} while (@{$self->[1]} > $maxentries); } } $self->put if $changed; @@ -106,9 +115,17 @@ sub get my $r = $dbm->get($key, $value); return undef if $r; - return thaw($value); + my $v; + eval { $v = thaw($value) }; + if ($@) { + LogDbg("Error thawing DXQSL key '$key' (now deleted): $@"); + eval {$dbm->del($key)}; + return undef; + } + return $v; } + sub put { return unless $dbm; @@ -118,4 +135,9 @@ sub put $dbm->put($key, $value); } +sub active +{ + return $dbm; +} + 1;