X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy%2FUtils.pm;h=53e53fc033060711888dcf04c922243958eb48c3;hp=233222ed92a1027ac71d580f53237c640ee37606;hb=a9264efe4efe3c63cbeda1b481e98a5a149c9f1c;hpb=e583f8824cff48ab89bfb96f2fb3f4b0941ee9ff diff --git a/lib/ZOOM/IRSpy/Utils.pm b/lib/ZOOM/IRSpy/Utils.pm index 233222e..53e53fc 100644 --- a/lib/ZOOM/IRSpy/Utils.pm +++ b/lib/ZOOM/IRSpy/Utils.pm @@ -22,6 +22,7 @@ our @EXPORT_OK = qw(utf8param modify_xml_document bib1_access_point render_record + validate_record calc_reliability_string calc_reliability_stats); @@ -180,6 +181,7 @@ sub cql_target { } return "rec.id=" . cql_quote($id); + #return "rec.id_raw=" . cql_quote($id); } @@ -283,13 +285,14 @@ sub _irspy_identifier2target { confess "_irspy_identifier2target(): id is undefined" if !defined $id; - my($protocol, $target) = ($id =~ /(.*?):(.*)/); + my($prefix, $protocol, $target) = ($id =~ /([^:]*,)?(.*?):(.*)/); + $prefix ||= ""; if (uc($protocol) eq "Z39.50" || uc($protocol) eq "TCP") { - return "tcp:$target"; + return "${prefix}tcp:$target"; } elsif (uc($protocol) eq "SRU") { - return "sru=get,http:$target"; + return "${prefix}sru=get,http:$target"; } elsif (uc($protocol) eq "SRW") { - return "sru=srw,http:$target"; + return "${prefix}sru=srw,http:$target"; } warn "_irspy_identifier2target($id): unrecognised protocol '$protocol'"; @@ -352,7 +355,7 @@ sub modify_xml_document { } } else { - next if !$value; # No need to create a new empty node + next if !defined $value; # No need to create a new empty node my($ppath, $selector) = $xpath =~ /(.*)\/(.*)/; dom_add_node($xc, $ppath, $selector, $value, @addAfter); #print "New $key ($xpath) = '$value'
\n"; @@ -811,14 +814,74 @@ sub calc_reliability_string { sub calc_reliability_stats { my($xc) = @_; + my $sixtyDaysAgo = time() - 60*24*60*60; + my $iso60DA = isodate($sixtyDaysAgo); my @allpings = $xc->findnodes("i:status/i:probe"); - my $nall = @allpings; + + my($nall, $nok) = (0, 0); + foreach my $node (@allpings) { + my $ok = $xc->findvalue('@ok', $node); + my $when = $node->to_literal(); + #warn "$when cmp $iso60DA == ", ($when cmp $iso60DA), "\n"; + next if $when lt $iso60DA; + $nall++; + $nok += !!$ok; + } + return (0, 0, 0) if $nall == 0; - my @okpings = $xc->findnodes('i:status/i:probe[@ok = "1"]'); - my $nok = @okpings; - my $percent = int(100*$nok/$nall); + my $percent = int(100*$nok/$nall + 0.5); return ($nok, $nall, $percent); } +# +# validate_record( record, ( "port" => 1, "database" => 1, "country" => 0, ... )) +# +sub validate_record { + my $rec = shift; + my %args = @_; + + my %required = map { $_ => 1 } qw/port host database protocol/; + my %optional = map { $_ => 1 } qw/country type hosturl contact language/; + my %tests = ( %required, %args ); + + my $xc = irspy_xpath_context($rec); + + my $protocol = $xc->findnodes("e:serverInfo/\@protocol") || ""; + my $port = $xc->findnodes("e:serverInfo/e:port") || ""; + my $host = $xc->findnodes("e:serverInfo/e:host") || ""; + my $dbname = $xc->findnodes("e:serverInfo/e:database") || ""; + + my $id = irspy_make_identifier($protocol, $host, $port, $dbname); + + if ($protocol =~ /\s+$/ || $dbname =~ /\s+$/) { + warn "xxx: $protocol:$host:$port:$dbname: whitespaces\n"; + } + + my @errors = $id; + + if ($tests{'protocol'}) { + push(@errors, 'protocol number is not valid') if $protocol !~ /^(z39\.50|sru|srw|tcp)$/i; + } + + if ($tests{'port'}) { + push(@errors, 'port number is not valid') if $port !~ /^\d+$/; + } + + if ($tests{'host'}) { + push(@errors, 'host name is not valid') if $host !~ /^[0-9a-z]+[0-9a-z\.\-]*\.[0-9a-z]+$/i; + } + + if ($tests{'database'}) { + push(@errors, 'database name is not valid') if $dbname =~ m,/,i; + push(@errors, 'database has trailing spaces') if $dbname =~ /^\s+|\s+$/; + } + + if ($tests{'hosturl'}) { + my $hosturl = $xc->findnodes("i:status/i:hostURL") || ""; + push(@errors, 'This hosturl name is not valid') if $hosturl !~ /^\w+$/i; + } + + return ( !$#errors, \@errors ); +} 1;