X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXUtil.pm;h=baa041d42bce04d1c232d2e4edf7cfb79ec2e8d0;hb=f18ba64dd93bbf7c47e6b5143bfc99af817888e8;hp=b9afba12d29dba40bfea78cde38b570642551d70;hpb=65f4d068c56ddb6e25d1f62b7ca6fd43741386b3;p=spider.git diff --git a/perl/DXUtil.pm b/perl/DXUtil.pm index b9afba12..baa041d4 100644 --- a/perl/DXUtil.pm +++ b/perl/DXUtil.pm @@ -13,7 +13,7 @@ use Date::Parse; use IO::File; use File::Copy; use Data::Dumper; - +use Time::HiRes qw(gettimeofday tv_interval); use strict; @@ -27,6 +27,7 @@ require Exporter; print_all_fields cltounix unpad is_callsign is_latlong is_qra is_freq is_digits is_pctext is_pcflag insertitem deleteitem is_prefix dd is_ipaddr $pi $d2r $r2d localdata localdata_mv + diffms _diffms ahour piplist mindate adate ); @@ -53,6 +54,24 @@ sub atime return $buf; } +# just the hour +sub ahour +{ + my $t = shift; + my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time); + my $buf = sprintf "%02d:%02d:%02d", $hour, $min, $sec; + return $buf; +} + +sub adate +{ + my $t = shift; + my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time); + $year += 1900; + my $buf = sprintf "%02d%s%04d", $mday, $month[$mon], $year; + return $buf; +} + # get a zulu time in cluster format (2300Z) sub ztime { @@ -192,7 +211,7 @@ sub ptimelist sub parray { my $ref = shift; - return ref $ref ? join(', ', @{$ref}) : $ref; + return ref $ref ? join(',', @{$ref}) : $ref; } # take the arg as an array reference and print as a list of pairs @@ -219,13 +238,58 @@ sub phash my $out; while (my ($k,$v) = each %$ref) { - $out .= "${k}=>$v, "; + if (ref $v eq 'ARRAY') { + $out = "${k}=>[" . parray($v) . "],"; + } elsif (ref $v eq 'HASH') { + $out = "${k}=>{" . phash($v) . "},"; + } else { + $out .= "${k}=>$v,"; + } } - chop $out; # remove last space chop $out; # remove last comma return $out; } +sub mindate +{ + my $t = shift; + my $out; + + if ($main::system-$t < 86400 ) { + $out = ahour($t); + } elsif ($main::system-$t < 365*86400) { + $out = adate($t); + chop $out for (1..4); + $out .= ' ' . atime($t); + chop $out for (1..3); + } else { + $out = atime($t); + $out =~ s/\@/ /; + } + return $out; +} + +# like phash but prints dates and times +sub piplist +{ + my $ref = shift; + my $out; + + return $ref unless ref $ref; + + while (my ($k,$v) = each %$ref) { + if (ref $v eq 'HASH') { + $out .= piplist($v); + } elsif (ref $v eq 'ARRAY') { + $out .= join(',', map { sprintf "$_->[0]@%s", mindate($_->[1]) } ref $v->[0] eq 'ARRAY' ? @$v : $v); + } else { + $out .= $v; + } + } + $out =~ s/,+$//; # remove last comma + return $out; +} + sub _sort_fields { my $ref = shift; @@ -471,15 +535,15 @@ sub deleteitem sub localdata { my $ifn = shift; - my $ofn = "$main::data/$ifn"; + my $ofn = "$main::local_data/$ifn"; my $tfn; if (-e "$main::local_data") { - $tfn = "$main::local_data/$ifn"; - if (-e $tfn && -e $ofn) { - $ofn = $tfn if -M $tfn < -M $ofn; - } elsif (-e $tfn) { - $ofn = $tfn; + $tfn = "$main::data/$ifn"; + if ((-e $tfn) && (-e $ofn)) { + $ofn = $tfn if -M $ofn < -M $tfn; + } else { + $ofn = $tfn if -e $tfn; } } @@ -497,3 +561,27 @@ sub localdata_mv } } +# measure the time taken for something to happen; use Time::HiRes qw(gettimeofday tv_interval); +sub _diffms +{ + my $ta = shift; + my $tb = shift || [gettimeofday]; + my $a = int($ta->[0] * 1000) + int($ta->[1] / 1000); + my $b = int($tb->[0] * 1000) + int($tb->[1] / 1000); + return $b - $a; +} + +sub diffms +{ + my $call = shift; + my $line = shift; + my $ta = shift; + my $no = shift; + my $tb = shift; + my $msecs = _diffms($ta, $tb); + + $line =~ s|\s+$||; + my $s = "subprocess stats cmd: '$line' $call ${msecs}mS"; + $s .= " $no lines" if $no; + DXDebug::dbg($s); +}