X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FQSL.pm;h=d10345eda2ebbf70166ca9c42d91beae4e1e9acc;hb=431c8a14cdecd0ec455b6619380687dbe84e2a35;hp=6649c7a76f9f30b68c78b876fe1f4dd0fd283e34;hpb=95be5049b5a7f326ddee6e09d520d336acbde794;p=spider.git diff --git a/perl/QSL.pm b/perl/QSL.pm index 6649c7a7..d10345ed 100644 --- a/perl/QSL.pm +++ b/perl/QSL.pm @@ -8,37 +8,35 @@ package QSL; use strict; -use DXVars; +use SysVar; use DXUtil; use DB_File; use DXDebug; use Prefix; +use JSON; +use Data::Structure::Util qw(unbless); -use vars qw($qslfn $dbm); -$qslfn = 'qsl'; +use vars qw($qslfn $dbm $maxentries); +$qslfn = 'dxqsl'; $dbm = undef; +$maxentries = 50; -localdata_mv("$qslfn.v1"); +my %u; +my $json; + +localdata_mv("$qslfn.v1j"); sub init { my $mode = shift; - my $ufn = localdata("$qslfn.v1"); + my $ufn = localdata("$qslfn.v1j"); - Prefix::load() unless Prefix::loaded(); + $json = JSON->new->canonical(1); - eval { - require Storable; - }; + Prefix::load() unless Prefix::loaded(); + + finish() if $dbm; - if ($@) { - dbg("Storable appears to be missing"); - dbg("In order to use the QSL feature you must"); - dbg("load Storable from CPAN"); - return undef; - } - import Storable qw(nfreeze freeze thaw); - my %u; if ($mode) { $dbm = tie (%u, 'DB_File', $ufn, O_CREAT|O_RDWR, 0666, $DB_BTREE) or confess "can't open qsl file: $qslfn ($!)"; } else { @@ -49,7 +47,9 @@ sub init sub finish { + $dbm->sync; undef $dbm; + untie %u; } sub new @@ -69,19 +69,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]}; @@ -97,6 +102,8 @@ sub update unshift @{$self->[1]}, $r; $changed++; } + # prune the number of entries + pop @{$self->[1]} while (@{$self->[1]} > $maxentries); } } $self->put if $changed; @@ -110,7 +117,7 @@ sub get my $r = $dbm->get($key, $value); return undef if $r; - return thaw($value); + return decode($value); } sub put @@ -118,8 +125,40 @@ sub put return unless $dbm; my $self = shift; my $key = $self->[0]; - my $value = nfreeze($self); + my $value = encode($self); $dbm->put($key, $value); } +sub remove_files +{ + unlink "$main::data/$qslfn.v1j"; + unlink "$main::local_data/$qslfn.v1j"; +} + +# thaw the user +sub decode +{ + my $s = shift; + my $ref; + eval { $ref = $json->decode($s) }; + if ($ref && !$@) { + return bless $ref, 'QSL'; + } + return undef; +} + +# freeze the user +sub encode +{ + my $ref = shift; + unbless($ref); + my $s; + + eval {$s = $json->encode($ref) }; + if ($s && !$@) { + bless $ref, 'QSL'; + return $s; + } +} + 1;