new helper function trimFields()
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy / Utils.pm
index 9c5f951..4f2580c 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,6 +5,8 @@ use 5.008;
 use strict;
 use warnings;
 
+use Scalar::Util;
+
 use Exporter 'import';
 our @EXPORT_OK = qw(utf8param
                    isodate
@@ -19,7 +20,8 @@ our @EXPORT_OK = qw(utf8param
                    modify_xml_document
                    bib1_access_point
                    render_record
-                   calc_reliability);
+                   calc_reliability_string
+                   calc_reliability_stats);
 
 use XML::LibXML;
 use XML::LibXML::XPathContext;
@@ -102,6 +104,15 @@ sub isodate {
                   $year+1900, $mon+1, $mday, $hour, $min, $sec);
 }
 
+# strips whitespaces and start and ends of fields
+sub trimFields {
+    my $field  = shift;
+
+    $field =~ s/^\s+//;
+    $field =~ s/\s+$//;
+
+    return $field;
+}
 
 # 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
@@ -261,7 +272,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";
@@ -274,6 +285,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) = @_;
 
@@ -771,15 +787,25 @@ sub render_record {
 }
 
 
-sub calc_reliability {
+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 "[untested]" if $nall == 0;
+    return (0, 0, 0) if $nall == 0;
     my @okpings = $xc->findnodes('i:status/i:probe[@ok = "1"]');
     my $nok = @okpings;
-    return "$nok/$nall = " . int(100*$nok/$nall) . "%";
+    my $percent = int(100*$nok/$nall);
+    return ($nok, $nall, $percent);
 }