Zero is a valid value for an tag. bug #3399
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy / Utils.pm
index 7853d20..2f76045 100644 (file)
@@ -1,4 +1,3 @@
-# $Id: Utils.pm,v 1.38 2009-04-15 18:16:45 wosch Exp $
 
 package ZOOM::IRSpy::Utils;
 
@@ -6,8 +5,12 @@ use 5.008;
 use strict;
 use warnings;
 
+use Scalar::Util;
+
 use Exporter 'import';
 our @EXPORT_OK = qw(utf8param
+                   trimField
+                   utf8paramTrim
                    isodate
                    xml_encode 
                    cql_quote
@@ -18,7 +21,9 @@ our @EXPORT_OK = qw(utf8param
                    irspy_identifier2target
                    modify_xml_document
                    bib1_access_point
-                   render_record);
+                   render_record
+                   calc_reliability_string
+                   calc_reliability_stats);
 
 use XML::LibXML;
 use XML::LibXML::XPathContext;
@@ -79,7 +84,6 @@ sub utf8param {
     return $cooked;
 }
 
-
 # Utility functions follow, exported for use of web UI
 sub utf8param_apache1 {
     my($r, $key, $value) = @_;
@@ -101,6 +105,26 @@ sub isodate {
                   $year+1900, $mon+1, $mday, $hour, $min, $sec);
 }
 
+# strips whitespaces at start and ends of a field
+sub trimField {
+    my $field  = shift;
+
+    $field =~ s/^\s+//;
+    $field =~ s/\s+$//;
+
+    return $field;
+}
+
+# utf8param() with trim
+sub utf8paramTrim {
+    my $result = utf8param(@_);
+
+    if (defined $result) {
+       $result = trimField($result);   
+    }
+
+    return $result;
+}
 
 # I can't -- just can't, can't, can't -- believe that this function
 # isn't provided by one of the core XML modules.  But the evidence all
@@ -260,7 +284,7 @@ sub _irspy_identifier2target {
        if !defined $id;
 
     my($protocol, $target) = ($id =~ /(.*?):(.*)/);
-    if (uc($protocol) eq "Z39.50") {
+    if (uc($protocol) eq "Z39.50" || uc($protocol) eq "TCP") {
        return "tcp:$target";
     } elsif (uc($protocol) eq "SRU") {
        return "sru=get,http:$target";
@@ -273,6 +297,11 @@ sub _irspy_identifier2target {
 }
 
 
+# Modifies the XML document for which $xc is an XPath context by
+# inserting or replacing the values specified in the hash %$data.  The
+# keys are fieldnames, which are looked up in the register
+# $fieldsByKey to determine, among other things, what their XPath is.
+
 sub modify_xml_document {
     my($xc, $fieldsByKey, $data) = @_;
 
@@ -323,7 +352,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'<br/>\n";
@@ -770,4 +799,26 @@ sub render_record {
 }
 
 
+sub calc_reliability_string {
+    my($xc) = @_;
+
+    my($nok, $nall, $percent) = calc_reliability_stats($xc);
+    return "[untested]" if $nall == 0;
+    return "$nok/$nall = " . $percent . "%";
+}
+
+
+sub calc_reliability_stats {
+    my($xc) = @_;
+
+    my @allpings = $xc->findnodes("i:status/i:probe");
+    my $nall = @allpings;
+    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 + 0.5);
+    return ($nok, $nall, $percent);
+}
+
+
 1;