projects
/
spider.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
write DXLog stuff
[spider.git]
/
perl
/
Spot.pm
diff --git
a/perl/Spot.pm
b/perl/Spot.pm
index e86354d77b01fe7b8017a225f557c54a25109dfd..82bbc7ddb0dfa76408fffc07940724c439428457 100644
(file)
--- a/
perl/Spot.pm
+++ b/
perl/Spot.pm
@@
-11,17
+11,31
@@
package Spot;
use FileHandle;
use DXVars;
use DXDebug;
use FileHandle;
use DXVars;
use DXDebug;
+use DXUtil;
+use DXLog;
use Julian;
use Julian;
-
-
@ISA = qw(Julian)
;
+use Prefix;
+
use Carp
;
use strict;
use strict;
+use vars qw($fp $maxspots $defaultspots $maxdays $dirprefix);
+
+$fp = undef;
+$maxspots = 50; # maximum spots to return
+$defaultspots = 10; # normal number of spots to return
+$maxdays = 35; # normal maximum no of days to go back
+$dirprefix = "spots";
-my $fp;
-my $maxspots = 50; # maximum spots to return
-my $defaultspots = 10; # normal number of spots to return
-my $maxdays = 35; # normal maximum no of days to go back
-my $prefix = "$main::data/spots";
+sub init
+{
+ mkdir "$dirprefix", 0777 if !-e "$dirprefix";
+ $fp = DXLog::new($dirprefix, "dat", 'd')
+}
+
+sub prefix
+{
+ return $fp->{prefix};
+}
# add a spot to the data file (call as Spot::add)
sub add
# add a spot to the data file (call as Spot::add)
sub add
@@
-32,14
+46,21
@@
sub add
$spot[0] = 0 + $spot[0];
$spot[2] = 0 + $spot[2];
$spot[0] = 0 + $spot[0];
$spot[2] = 0 + $spot[2];
+ # remove ssid if present on spotter
+ $spot[4] =~ s/-\d+$//o;
+
+ # add the 'dxcc' country on the end
+ my @dxcc = Prefix::extract($spot[1]);
+ push @spot, (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 0;
+
+ my $buf = join("\^", @spot);
+
# compare dates to see whether need to open another save file (remember, redefining $fp
# compare dates to see whether need to open another save file (remember, redefining $fp
- # automagically closes the output file (if any))
+ # automagically closes the output file (if any))
.
my @date = Julian::unixtoj($spot[2]);
my @date = Julian::unixtoj($spot[2]);
- $fp = Spot->open(@date, ">>") if (!$fp || Julian::cmp(@date, $fp->{year}, $fp->{day}));
-
- # save it
- my $fh = $fp->{fh};
- $fh->print(join("\^", @spot), "\n");
+ $fp->write(@date, $buf);
+
+ return $buf;
}
# search the spot database for records based on the field no and an expression
}
# search the spot database for records based on the field no and an expression
@@
-53,6
+74,7
@@
sub add
# $f2 = date in unix format
# $f3 = comment
# $f4 = spotter
# $f2 = date in unix format
# $f3 = comment
# $f4 = spotter
+# $f5 = dxcc country
#
# In addition you can specify a range of days, this means that it will start searching
# from <n> days less than today to <m> days less than today
#
# In addition you can specify a range of days, this means that it will start searching
# from <n> days less than today to <m> days less than today
@@
-93,17
+115,15
@@
sub search
$to = $defaultspots;
}
$to = $defaultspots;
}
- $expr =~ s/\$f(\d)/zzzref->[$1]/g; # swap the letter n for the correct field name
- $expr =~ s/[\@\$\%\{\}]//g; # remove any other funny characters
- $expr =~ s/\&\w+\(//g; # remove subroutine calls
- $expr =~ s/eval//g; # remove eval words
- $expr =~ s/zzzref/\$ref/g; # put back the $ref
- $expr =~ s|(/.+/)|$1oi|g; # add oi characters to /ccc/
+ $expr =~ s/\$f(\d)/\$ref->[$1]/g; # swap the letter n for the correct field name
+# $expr =~ s/\$f(\d)/\$spots[$1]/g; # swap the letter n for the correct field name
-
print "expr=($expr), from=$from, to=$to\n"
;
+
dbg("search", "expr='$expr', spotno=$from-$to, day=$dayfrom-$dayto\n")
;
# build up eval to execute
# build up eval to execute
- $eval = qq(my \$c;
+ $eval = qq(
+ my \$c;
+ my \$ref;
for (\$c = \$#spots; \$c >= 0; \$c--) {
\$ref = \$spots[\$c];
if ($expr) {
for (\$c = \$#spots; \$c >= 0; \$c--) {
\$ref = \$spots[\$c];
if ($expr) {
@@
-112,42
+132,47
@@
sub search
push(\@out, \$ref);
last LOOP if \$count >= \$to; # stop after to
}
push(\@out, \$ref);
last LOOP if \$count >= \$to; # stop after to
}
- });
+ }
+ );
+
+ $fp->close; # close any open files
LOOP:
LOOP:
- for ($i = 0; $i <
60; ++$i) {
- my @now = Julian::sub(@fromdate, $i);
+ for ($i = 0; $i <
$maxdays; ++$i) { # look thru $maxdays worth of files only
+ my @now = Julian::sub(@fromdate, $i);
# but you can pick which $maxdays worth
last if Julian::cmp(@now, @todate) <= 0;
my @spots = ();
last if Julian::cmp(@now, @todate) <= 0;
my @spots = ();
- my $fp = Spot->open(@now); # get the next file
- if ($fp) {
- my $fh = $fp->{fh};
+ my $fh = $fp->open(@now); # get the next file
+ if ($fh) {
my $in;
my $in;
-
foreach $in
(<$fh>) {
-
chomp $in
;
-
push @spots, [ split('\^', $in)
];
+
while
(<$fh>) {
+
chomp
;
+
push @spots, [ split '\^'
];
}
}
- my $ref;
eval $eval; # do the search on this file
eval $eval; # do the search on this file
- return ("error", $@) if $@;
+ return ("
Spot search
error", $@) if $@;
}
}
return @out;
}
}
}
return @out;
}
-#
open a spot file of the Julian day
-sub
open
+#
format a spot for user output in 'broadcast' mode
+sub
formatb
{
{
- my $pkg = shift;
- return Julian::open("spot", $prefix, @_);
+ my @dx = @_;
+ my $t = ztime($dx[2]);
+ return sprintf "DX de %-7.7s: %13.1f %-12.12s %-30s<%s>", $dx[4], $dx[0], $dx[1], $dx[3], $t ;
}
}
-#
close a spot fil
e
-sub
close
+#
format a spot for user output in list mod
e
+sub
formatl
{
{
- # do nothing, unreferencing or overwriting the $self will close it
+ my @dx = @_;
+ my $t = ztime($dx[2]);
+ my $d = cldate($dx[2]);
+ return sprintf "%9.1f %-12s %s %s %-30s<%s>", $dx[0], $dx[1], $d, $t, $dx[3], $dx[4] ;
}
1;
}
1;