X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?p=spider.git;a=blobdiff_plain;f=perl%2FQSL.pm;fp=perl%2FQSL.pm;h=5101f25f6c561ca3ebfc67a6acf62a467bb0d536;hp=67bffc3252004e44631fd3efb3d017e94ef7f16c;hb=846aa525969cab9b37936fb33b8705a68fd52886;hpb=f0af07edebdfe705c66a50a4ccfa56d5663773d7 diff --git a/perl/QSL.pm b/perl/QSL.pm index 67bffc32..5101f25f 100644 --- a/perl/QSL.pm +++ b/perl/QSL.pm @@ -2,7 +2,7 @@ # # Local 'autoqsl' module for DXSpider # -# Copyright (c) 2003 Dirk Koopman G1TLH +# Copyright (c) 2003-2020 Dirk Koopman G1TLH # package QSL; @@ -13,14 +13,17 @@ use DXUtil; use DB_File; use DXDebug; use Prefix; + use JSON; +use Data::Structure::Util qw(unbless); use vars qw($qslfn $dbm $maxentries); -$qslfn = 'qsl'; +$qslfn = 'dxqsl'; $dbm = undef; -$maxentries = 50; +$maxentries = 10; -localdata_mv("$qslfn.v2"); +my $json; +my %u; sub init { @@ -28,8 +31,9 @@ sub init my $ufn = localdata("$qslfn.v2"); Prefix::load() unless Prefix::loaded(); - - my %u; + $json = JSON->new->canonical(1); + + untie %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 ($!)"; @@ -41,12 +45,14 @@ sub init sub finish { + untie %u; undef $dbm; } sub new { my ($pkg, $call) = @_; + return undef if $call =~ /INFO|QSL|VIA/; return bless [uc $call, []], $pkg; } @@ -62,7 +68,7 @@ sub update my $by = shift; my $changed; - return unless length $line && $line =~ /\b(?:QSL|VIA)\b/i; + return unless length $line && $line =~ /\b(?:QSL|VIA|BUR[OE]?A?U?|OQRS|LOTW)\b/i; foreach my $man (split /\b/, uc $line) { my $tok; @@ -73,6 +79,8 @@ sub update $tok = 'BUREAU'; } elsif ($man =~ /^LOTW/) { $tok = 'LOTW'; + } elsif ($man =~ /^OQRS/) { + $tok = 'OQRS'; } elsif ($man eq 'HC' || $man =~ /^HOM/ || $man =~ /^DIR/) { $tok = 'HOME CALL'; } elsif ($man =~ /^QRZ/) { @@ -105,11 +113,11 @@ sub get { return undef unless $dbm; my $key = uc shift; + my $value; - my $r = $dbm->get($key, $value); return undef if $r; - return thaw($value); + return json_decode($value); } sub put @@ -117,8 +125,30 @@ sub put return unless $dbm; my $self = shift; my $key = $self->[0]; - my $value = nfreeze($self); + my $value = json_encode($self); $dbm->put($key, $value); } +sub json_decode +{ + my $s = shift; + my $ref; + eval { $ref = $json->decode($s) }; + if ($ref && !$@) { + return bless $ref, __PACKAGE__; + } else { + LogDbg('DXUser', "__PACKAGE_::json_decode: on '$s' $@"); + } + return undef; +} + +sub json_encode +{ + my $ref = shift; + unbless($ref); + my $s = $json->encode($ref); + bless $ref, __PACKAGE__; + return $s; +} + 1;