Merge branch 'master' of ssh://git.indexdata.com:222/home/git/pub/irspy
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy.pm
index bc37164..0dc97c2 100644 (file)
@@ -1,4 +1,3 @@
-
 package ZOOM::IRSpy;
 
 use 5.008;
@@ -65,6 +64,7 @@ BEGIN {
     ZOOM::Log::mask_str("irspy_unhandled");
     ZOOM::Log::mask_str("irspy_test");
     ZOOM::Log::mask_str("irspy_task");
+    ZOOM::Log::mask_str("irspy_data");
 }
 
 sub new {
@@ -77,7 +77,7 @@ sub new {
        if defined $user;
 
     my $conn = new ZOOM::Connection($dbname, 0, @options)
-       or die "$0: can't connection to IRSpy database 'dbname'";
+       or die "$0: can't connect to IRSpy database 'dbname'";
 
     my $xslt = new XML::LibXSLT;
 
@@ -141,7 +141,7 @@ sub var {
 sub connect_to_registry {
     my %args = @_;
 
-    # XXX: we could also handle her: user, password, elementSetName
+    # XXX: we could also handle here: user, password, elementSetName
 
     my $database = $ENV{IRSpyDbName} || "localhost:8018/IR-Explain---1";
 
@@ -365,10 +365,13 @@ sub _rewrite_irspy_record {
 }
 
 
-my $_reliabilityField = {
+my $_specialFields = {
     reliability => [ reliability => 0,
-                     "Calculated reliability of server",
-                     "e:serverInfo/e:reliability" ],
+                    "Calculated reliability of server",
+                    "e:serverInfo/e:reliability" ],
+    udb => [ udb => 0,
+            "Access Name (Unique DB)",
+            "e:databaseInfo/i:udb" ],
 };
 
 sub _rewrite_zeerex_record {
@@ -377,7 +380,14 @@ sub _rewrite_zeerex_record {
     # Add reliability score
     my $xc = irspy_xpath_context($rec);
     my($nok, $nall, $percent) = calc_reliability_stats($xc);
-    modify_xml_document($xc, $_reliabilityField, { reliability => $percent });
+    modify_xml_document($xc, $_specialFields, { reliability => $percent });
+
+    my $xpath = $_specialFields->{udb}->[3];
+    my $value = $xc->findvalue($xpath);
+    if (!defined $oldid && (!defined $value || $value eq '')) {
+       # New record with no explicit UDB: generate a UDB for it.
+       modify_xml_document($xc, $_specialFields, { udb => _next_udb() });
+    }
 
     my $p = $conn->package();
     $p->option(action => "specialUpdate");
@@ -406,6 +416,19 @@ sub _rewrite_zeerex_record {
 }
 
 
+sub _next_udb {
+    use IndexData::Utils::PersistentCounter;
+
+    my $file = $ENV{IRSPY_COUNTER_FILE}
+       or die "no IRSPY_COUNTER_FILE in environment";
+    my $counter = new IndexData::Utils::PersistentCounter($file)
+       or die "can't open counter file '$file': $!";
+    my $val = $counter->next()
+       or die "can't get counter value from '$file': $!";
+    return "irspy-$val";
+}
+
+
 sub _delete_record {
     my($conn, $id) = @_;
 
@@ -643,7 +666,7 @@ sub check {
                       length($node->next()->address()) >= length($address)) {
                    $conn->log("irspy_test", "skipping from '",
                               $node->address(), "' to '",
-                              $node->next()->address(), "'");
+                              $node->next()->address(), "' (", $node->next()->name(), ")");
                    $node = $node->next();
                    $skipcount++;
                }