Improved history.
[egate.git] / www / z39util.tcl
index 216784c..1de9d26 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $Id: z39util.tcl,v 1.11 1995/11/14 16:01:52 adam Exp $
+# $Id: z39util.tcl,v 1.17 1996/01/03 15:19:52 adam Exp $
 #
 proc saveState {} {
     uplevel #0 {
@@ -43,6 +43,18 @@ proc search-response {zz} {
     }
 }
 
+proc scan-response {zz} {
+    global sessionWait
+
+    set status [$zz scanStatus]
+    if {$status == 6} {
+        displayError "Scan fail" ""
+        set sessionWait -2
+    } else {
+        set sessionWait 1
+    }
+}
+
 proc ok-response {} {
     global sessionWait
     set sessionWait 1
@@ -58,6 +70,8 @@ proc display-brief {zset no tno} {
     global setNo
     global sessionId
 
+
+    html {<li>}
     set type [$zset type $no]
     if {$type == "SD"} {
         set err [lindex [$zset diag $no] 1]
@@ -71,7 +85,6 @@ proc display-brief {zset no tno} {
     if {$type != "DB"} {
         return
     }
-    html "${no}"
     set rtype [$zset recordType $no]
     if {$rtype == "SUTRS"} {
         html [join [$zset getSutrs $no]]
@@ -79,12 +92,29 @@ proc display-brief {zset no tno} {
         return
     } 
     if {![catch {
+        set author [$zset getMarc $no field 100 * a]
         set title [lindex [$zset getMarc $no field 245 * a] 0]
         set year [lindex [$zset getMarc $no field 260 * c] 0]
     } ] } {
+        set p 0
+        foreach a $author {
+            if {$p} {
+                html ", "
+            }
+            html $a
+            set p 1
+        }
+        if {$p} {
+            html ": "
+        }
         html {<a href="http:} $env(SCRIPT_NAME) /
-        html $sessionId {/showfull.egw/} $setNo + $tno + $no + full 
-        html {"> } $title {</a>} " <i> ${year} </i>"
+        html $sessionId {/showfull.egw/} $setNo + $tno + $no + full {">}
+        if {[string length $title] == 0} {
+            html {No title}
+        } else {
+            html $title
+        }
+        html {</a>} " <i> ${year} </i>"
     }
     html "<br>\n"
 }
@@ -118,7 +148,7 @@ proc display-raw {zset no tno} {
         set indicator [lindex $line 1]
         set fields [lindex $line 2]
         set l [string length $indicator]
-        html "$tag "
+        html "<tt>$tag "
         if {$l > 0} {
             for {set i 0} {$i < $l} {incr i} {
                 if {[string index $indicator $i] == " "} {
@@ -128,6 +158,7 @@ proc display-raw {zset no tno} {
                 }
             }
         }
+        html "</tt>"
         foreach field $fields {
             set id [lindex $field 0]
             set data [lindex $field 1]
@@ -155,7 +186,7 @@ proc put-marc-contents {cc} {
     }
     html $cc
     if {$ref != ""} {
-        html {">} $urltype { reference</a>}
+        html {">} $cc {</a>}
     }
 }
 
@@ -318,7 +349,7 @@ proc display-full {zset no tno} {
     if {"x$url" != "x"} {
         html "<dt><b>URL</b>\n"
         if {"x$sp" == "x"} {
-            set sp reference
+            set sp $url
         }
         html {<dd><a href="} $url {">} [join $sp] "</a>\n"
     }
@@ -348,14 +379,30 @@ proc display-rec {from to dfunc tno} {
     }
 }
 
-proc build-query {t} {
+proc build-scan {t i} {
+    global targets
+
+    set term [wform entry$i]
+    if {$term != ""} {
+        set field [wform menu$i]
+        foreach x [lindex $targets($t) 2] {
+            if {[lindex $x 0] == $field} {
+                set attr [lindex $x 1]
+            }
+        }
+        return [list $term $attr]
+    }
+    return ""
+}
+
+proc build-query {t ilines} {
     global targets
 
     set op {}
     set q {}
-    for {set i 1} {$i < 4} {incr i} {
+    for {set i 1} {$i <= $ilines} {incr i} {
         set term [wform entry$i]
-        if {$term != ""} {
+        if {[string length $term] > 0} {
             set field [wform menu$i]
             foreach x [lindex $targets($t) 2] {
                 if {[lindex $x 0] == $field} {
@@ -378,6 +425,151 @@ proc build-query {t} {
     return $q
 }
 
+proc z39scan {setNo scanNo tno scanLines scanPos cache} {
+    global hist
+    global sessionWait
+    global targets
+
+    if {$tno > 0} {
+        set zz z39$tno
+        set host $hist($setNo,$tno,host)
+        set idAuth $hist($setNo,$tno,idAuthentication)
+        set database $hist($setNo,$tno,database)
+        set scanAttr $hist($setNo,$tno,scanAttr)
+        set scanTerm $hist($setNo,$tno,$scanNo,scanTerm)
+    } else {
+        set zz z39
+        set host $hist($setNo,host)
+        set idAuth $hist($setNo,idAuthentication)
+        set database $hist($setNo,database)
+        set scanAttr $hist($setNo,scanAttr)
+        set scanTerm $hist($setNo,$scanNo,scanTerm)
+    }
+    if {[catch [list $zz failback fail-response]]} {
+        ir $zz
+    }
+    if {[catch [list set oldHost [$zz connect]]]} {
+        set oldHost ""
+    }
+    set zs $zz.s$scanNo.$setNo
+    $zz callback ok-response
+    $zz failback fail-response
+    if {$oldHost != $host} {
+        catch [list $zz disconnect]
+
+        set sessionWait 0
+        if {[catch [list $zz connect $host]]} {
+            displayError "Cannot connect to target" $host
+            return 0
+        } elseif {$sessionWait == 0} {
+            if {[catch {zwait sessionWait 300}]} {
+               $zz disconnect
+                displayError "Cannot connect to target" $host
+                return 0
+            }
+            if {$sessionWait != 1} {
+                displayError "Cannot connect to target" $host
+                return 0
+            }
+        }
+        $zz idAuthentication $idAuth
+        set sessionWait 0
+        if {[catch {$zz init}]} {
+            displayError "Cannot initialize target" $host
+           $zz disconnect
+            return 0
+        }
+        if {[catch {zwait sessionWait 60}]} {
+            displayError "Cannot initialize target" $host
+           $zz disconnect
+            return 0
+        }
+        if {$sessionWait != "1"} {
+            displayError "Cannot initialize target" $host
+           $zz disconnect
+            return 0
+        }
+        if {![$zz initResult]} {
+            set u [$zz userInformationField]
+            $zz disconnect
+            displayError "Cannot initialize target $host" $u
+            return 0
+        }
+    } else {
+        if {$cache && ![catch [list $zs numberOfTermsRequested 5]]} {
+            return 1
+        }
+    }
+    eval $zz databaseNames $database
+
+    ir-scan $zs $zz
+
+    $zs numberOfTermsRequested $scanLines
+    $zs preferredPositionInResponse $scanPos
+
+    $zz callback [list scan-response $zs]
+
+    set sessionWait 0
+    $zs scan "${scanAttr} ${scanTerm}"
+
+    if {[catch {zwait sessionWait 600}]} {
+        wlog debug "timeout/cancel in scan"
+        displayError "Timeout in scan" {}
+        html "</body></html>\n"
+        $zz disconnect
+        return 0
+    }
+    if {$sessionWait == -1} {
+        displayError "Scan fail" "Connection closed"
+        html "</body></html>\n"
+        $zz disconnect
+    }
+    if {$sessionWait != 1} {
+       return 0
+    }
+    return 1
+}
+
+proc display-scan {setNo scanNo tno} {
+    global hist
+    global targets
+    global env
+    global sessionId
+
+    if {$tno > 0} {
+        set zz z39$tno
+    } else {
+        set zz z39
+    }
+    set zs $zz.s$scanNo.$setNo
+    set m [$zs numberOfEntriesReturned]
+        
+    if {$m > 0} {
+        set t [lindex [$zs scanLine 0] 1]
+        if {$tno > 0} {
+            set hist($setNo,$tno,[expr $scanNo - 1],scanTerm) $t
+        } else {
+            set hist($setNo,[expr $scanNo - 1],scanTerm) $t
+        }
+        set t [lindex [$zs scanLine [expr $m - 1]] 1]
+        if {$tno > 0} {
+            set hist($setNo,$tno,[expr $scanNo + 1],scanTerm) $t
+        } else {
+            set hist($setNo,[expr $scanNo + 1],scanTerm) $t
+        }
+    }
+    for {set i 0} {$i < $m} {incr i} {
+        regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm
+        html {<a href="http:} $env(SCRIPT_NAME)
+        html / $sessionId {/query.egw/} $hist($setNo,host) + $setNo +
+        html $hist($setNo,scan) +  $tterm {">}
+        html [lindex [$zs scanLine $i] 1]
+        html {</a>: <em>}
+        html [lindex [$zs scanLine $i] 2]
+        html "</em><br>\n"
+    }
+}
+
 proc z39search {setNo piggy tno elements} {
     global hist
     global sessionWait
@@ -446,9 +638,11 @@ proc z39search {setNo piggy tno elements} {
             return 0
         }
     } else {
-        if {![catch [list $zz.$setNo smallSetUpperBound 0]]} {
+        if {[info exists hist($setNo,hits)] && \
+                ![catch [list $zz.$setNo smallSetUpperBound 0]]} {
             return 1
         }
+        
     }
     ir-set $zz.$setNo $zz
     
@@ -697,8 +891,9 @@ proc z39history {} {
     if {![info exists nextSetNo]} {
         return
     }
-    html "<hr><h3>History</h3><dl>\n"
+    html "<h2>History</h2><dl><br>\n"
     for {set setNo 1} {$setNo < $nextSetNo} {incr setNo} {
+        if {$hist($setNo,scan) > 0} continue
         html {<dt> <a href="http:} $env(SCRIPT_NAME)
         html / $sessionId {/search.egw/} $setNo + 1
         html + $hist($setNo,maxPresent)
@@ -709,24 +904,109 @@ proc z39history {} {
                 html " $b"
             }
         }
-        html "</a>\n"
-        html "<dd> "
+        html "</a> -- "
         if {[info exists hist($setNo,hits)]} {
             html $hist($setNo,hits) " hits"
         } else {
             html failed
         }
-        html "\n"
+        html "<dd>\n"
+        set op {}
+        for {set i 1} {$i <= 3} {incr i} {
+            if {[string length $hist($setNo,form,entry$i)] > 0} {
+                html " <b>" [join $op " "] "</b> "
+                html $hist($setNo,form,menu$i) "=" $hist($setNo,form,entry$i)
+                set op $hist($setNo,form,logic$i)
+            }
+        }
     }
     html "</dl>\n"
 }
 
 proc displayError {msga msgb} {
     html "<p><center>\n"
-    html {<img src="/gif/noway.gif">}
+    html {<img src="/gif/noway.gif" alt="Error">}
     html "<h2>" $msga "</h2>\n"
     if {$msgb != ""} {
         html "<h3>" $msgb "</h3>\n"
     }
     html "</center><p>\n"
 }
+
+proc button-europagate {} {
+    global useIcons
+    if {$useIcons} {
+        html {<img src="/gif/button-egw.gif" alt="Europagate" border=0></a>}
+    } else {
+        html {Europagate | }
+    }
+}
+
+proc button-new-target {more} {
+    global useIcons
+    global env
+    global sessionId
+
+    html {<a href="http:} $env(SCRIPT_NAME)
+    html / $sessionId {/targets.egw}
+    if {$useIcons} {
+        html {"><img src="/gif/button-new-target.gif" }
+       html {alt="New Target" border=0></a>}
+    } else {
+        html {">New Target</a>}
+        if {$more} {
+            html " | \n"
+        } else {
+            html "\n"
+        }
+    }
+}
+
+proc button-view-history {more} {
+    global useIcons
+    global env
+    global sessionId
+
+    html {<a href="http:} $env(SCRIPT_NAME)
+    html / $sessionId {/history.egw}
+    if {$useIcons} {
+        html {"><img src="/gif/button-view-history.gif" alt="View History" }
+        html {border=0></a>}
+    } else {
+        html {">View History</a>}
+        if {$more} {
+            html " | \n"
+        } else {
+            html "\n"
+        }
+    }
+}
+
+proc button-new-query {more setNo} {
+    global useIcons
+    global env
+    global sessionId
+    global hist
+
+    html {<a href="http:} $env(SCRIPT_NAME)
+    html / $sessionId {/query.egw/} $hist($setNo,host) + $setNo {">}
+    if {$useIcons} {
+        html {<img src="/gif/button-new-query.gif" }
+       html {alt="New Query" border=0></a>}
+    } else {
+        html {New Query</a>}
+        if {$more} {
+            html " | \n"
+        } else {
+            html "\n"
+        }
+    }
+}
+
+proc maintenance {} {
+    html {<hr>This page is maintained by }
+    html {<a href="mailto:pwh@dtv.dk"> Peter Wad Hansen </a>.}
+    html {Last modified 3. january 1996. <br>}
+    html {<em> This and the following pages are under construction and }
+    html {will continue to be so until the end of January 1996.</em>}
+}
\ No newline at end of file