X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fz39util.tcl;h=7903fd4773e40b20457945f2129371a2cdc866e1;hb=84081f9782ee28f9236b0974891f1d6b865992be;hp=23fabd6bc6b7fb7bbb3d7393625dcf4b823f14ea;hpb=5bbe4c302d2d105aea7806317e9f31d5773a9536;p=egate.git diff --git a/www/z39util.tcl b/www/z39util.tcl index 23fabd6..7903fd4 100644 --- a/www/z39util.tcl +++ b/www/z39util.tcl @@ -1,5 +1,5 @@ # -# $Id: z39util.tcl,v 1.10 1995/11/14 09:53:16 adam Exp $ +# $Id: z39util.tcl,v 1.25 1996/01/24 16:59:29 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 {
  • } 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,70 @@ proc display-brief {zset no tno} { return } if {![catch { - set title [lindex [$zset getMarc $no field 245 * a] 0] - set year [lindex [$zset getMarc $no field 260 * c] 0] + set author [$zset getMarc $no field 100 * a] + set corp [$zset getMarc $no field 110 * a] + set meet [$zset getMarc $no field 111 * a] + set title [$zset getMarc $no field 245 * a] + if {[llength $author] == 0} { + set cover [$zset getMarc $no field 245 * {[bc]}] + } else { + set cover [$zset getMarc $no field 245 * b] + } + set location [$zset getMarc $no field 260 * a] + set publisher [$zset getMarc $no field 260 * b] + set year [$zset getMarc $no field 260 * c] } ] } { - html { } $title {} " ${year} " + set p 0 + foreach a $author { + if {$p} { + html ", " + } + html $a + set p 1 + } + foreach a $corp { + if {$p} { + html ", " + } + html $a + set p 1 + } + foreach a $meet { + if {$p} { + html ", " + } + html $a + set p 1 + } + if {$p} { + html ": " + } + html { } + set nope 1 + foreach v $title { + html $v + set nope 0 + } + if {$nope} { + html {No title} + } + html { } + foreach v $cover { + html $v + } + if {0} { + html {
    } + foreach v $location { + html " $v" + } + foreach v $publisher { + html " $v" + } + foreach v $year { + html " $v" + } + } } html "
    \n" } @@ -118,7 +189,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 "$tag " if {$l > 0} { for {set i 0} {$i < $l} {incr i} { if {[string index $indicator $i] == " "} { @@ -128,6 +199,7 @@ proc display-raw {zset no tno} { } } } + html "" foreach field $fields { set id [lindex $field 0] set data [lindex $field 1] @@ -136,7 +208,7 @@ proc display-raw {zset no tno} { } html $data } - htmlr {
    } + html "
    \n" } } @@ -155,7 +227,7 @@ proc put-marc-contents {cc} { } html $cc if {$ref != ""} { - html {">} $urltype { reference} + html {">} $cc {} } } @@ -255,8 +327,17 @@ proc display-full {zset no tno} { } set n [dl-marc-field $zset $no 710 a "Corporate Name" {} ", "] if {$n == 0} { - set n [dl-marc-field $zset $no 710 a "Corporate Name" {} ", "] + set n [dl-marc-field $zset $no 110 a "Corporate Name" {} ", "] } + set n [dl-marc-field $zset $no 711 a "Meeting Name" {} ", "] + if {$n > 0} { + dd-marc-field $zset $no 711 {[bndc]} " " "" + } else { + set n [dl-marc-field $zset $no 111 a "Meeting Name" {} ", "] + if {$n > 0} { + dd-marc-field $zset $no 111 {[bndc]} " " " " + } + } set n [dl-marc-field $zset $no 245 {a} "Title" {} " "] if {$n > 0} { dd-marc-field $zset $no 245 b "" "" @@ -318,7 +399,7 @@ proc display-full {zset no tno} { if {"x$url" != "x"} { html "
    URL\n" if {"x$sp" == "x"} { - set sp reference + set sp $url } html {
    } [join $sp] "\n" } @@ -348,15 +429,32 @@ proc display-rec {from to dfunc tno} { } } -proc build-query {t} { +proc build-scan {t i} { + global targets + + set term [egw_form entry$i] + if {$term != ""} { + set field [join [egw_form menu$i]] + set attr {Title} + 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} { - set term [wform entry$i] - if {$term != ""} { - set field [wform menu$i] + for {set i 1} {$i <= $ilines} {incr i} { + set term [join [egw_form entry$i]] + if {[string length $term] > 0} { + set field [join [egw_form menu$i]] foreach x [lindex $targets($t) 2] { if {[lindex $x 0] == $field} { set attr [lindex $x 1] @@ -364,20 +462,166 @@ proc build-query {t} { } switch $op { And - { set q "@and $q ${attr} ${term}" } + { set q "@and $q ${attr} \"${term}\"" } Or - { set q "@or $q ${attr} ${term}" } + { set q "@or $q ${attr} \"${term}\"" } {And not} - { set q "@not $q ${attr} ${term}" } + { set q "@not $q ${attr} \"${term}\"" } {} - { set q "${attr} ${term}" } + { set q "${attr} \"${term}\"" } } - set op [wform logic$i] + set op [egw_form logic$i] } } 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 + set thisHost [splitHostSpec $host] + if {$oldHost != $thisHost} { + catch [list $zz disconnect] + + set sessionWait 0 + if {[catch [list $zz connect $thisHost]]} { + displayError "Cannot connect to target" $thisHost + return 0 + } elseif {$sessionWait == 0} { + if {[catch {egw_wait sessionWait 300}]} { + $zz disconnect + displayError "Cannot connect to target" $thisHost + return 0 + } + if {$sessionWait != 1} { + displayError "Cannot connect to target" $thisHost + return 0 + } + } + $zz idAuthentication $idAuth + set sessionWait 0 + if {[catch {$zz init}]} { + displayError "Cannot initialize target" $thisHost + $zz disconnect + return 0 + } + if {[catch {egw_wait sessionWait 60}]} { + displayError "Cannot initialize target" $thisHost + $zz disconnect + return 0 + } + if {$sessionWait != "1"} { + displayError "Cannot initialize target" $thisHost + $zz disconnect + return 0 + } + if {![$zz initResult]} { + set u [$zz userInformationField] + $zz disconnect + displayError "Cannot initialize target $thisHost" $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 {egw_wait sessionWait 60}]} { + egw_log debug "timeout/cancel in scan" + displayError "Timeout in scan" {} + html "\n" + $zz disconnect + return 0 + } + if {$sessionWait == -1} { + displayError "Scan fail" "Connection closed" + 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 {} + html [lindex [$zs scanLine $i] 1] + html {: } + html [lindex [$zs scanLine $i] 2] + html "
    \n" + } +} + proc z39search {setNo piggy tno elements} { global hist global sessionWait @@ -404,46 +648,54 @@ proc z39search {setNo piggy tno elements} { } $zz callback ok-response $zz failback fail-response - if {$oldHost != $host} { + set thisHost [splitHostSpec $host] + if {$oldHost != $thisHost} { catch [list $zz disconnect] set sessionWait 0 - if {[catch [list $zz connect $host]]} { - displayError "Cannot connect to target" $host + if {[catch [list $zz connect $thisHost]]} { + displayError "Cannot connect to target" $thisHost return 0 } elseif {$sessionWait == 0} { - zwait sessionWait + if {[catch {egw_wait sessionWait 300}]} { + $zz disconnect + displayError "Cannot connect to target" $thisHost + return 0 + } if {$sessionWait != 1} { - displayError "Cannot connect to target" $host + displayError "Cannot connect to target" $thisHost return 0 } } $zz idAuthentication $idAuth set sessionWait 0 if {[catch {$zz init}]} { - displayError "Cannot initialize target" $host + displayError "Cannot initialize target" $thisHost + $zz disconnect return 0 } - if {[catch {zwait sessionWait 60}]} { - displayError "Cannot initialize target" $host + if {[catch {egw_wait sessionWait 60}]} { + displayError "Cannot initialize target" $thisHost $zz disconnect return 0 } if {$sessionWait != "1"} { - displayError "Cannot initialize target" $host + displayError "Cannot initialize target" $thisHost $zz disconnect return 0 } if {![$zz initResult]} { set u [$zz userInformationField] $zz disconnect - displayError "Cannot initialize target $host" $u + displayError "Cannot initialize target $thisHost" $u 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 @@ -454,6 +706,7 @@ proc z39search {setNo piggy tno elements} { $zz.$setNo mediumSetElementSetNames $elements $zz.$setNo recordElements $elements + egw_log debug "database=$database" eval $zz.$setNo databaseNames $database $zz.$setNo preferredRecordSyntax USMARC @@ -469,30 +722,24 @@ proc z39search {setNo piggy tno elements} { $zz.$setNo mediumSetPresentNumber 0 } set sessionWait 0 + egw_log debug "search: $query" $zz.$setNo search $query - if {[catch {zwait sessionWait 600}]} { - wlog debug "timeout/cancel in present" + if {[catch {egw_wait sessionWait 600}]} { + egw_log debug "timeout/cancel in search" displayError "Timeout in search" {} html "\n" $zz disconnect return 0 } - if {$sessionWait != 1} { + if {$sessionWait == -1} { displayError "Search fail" "Connection closed" html "\n" $zz disconnect - return 0 } - set status [$zz.$setNo responseStatus] - if {[lindex $status 0] == "NSD"} { - set code [lindex $status 1] - set msg [lindex $status 2] - set addinfo [lindex $status 3] - displayError "Diagnostic message" \ - "$msg: $addinfo\n
    (error code $code)" - return 0 + if {$sessionWait != 1} { + return 0 } set hist($setNo,hits) [$zz.$setNo resultCount] return 1 @@ -502,7 +749,7 @@ proc init-m-response {i} { global zstatus global zleft - wlog debug "init-m-response" + egw_log debug "init-m-response" set zstatus($i) 1 incr zleft -1 @@ -512,7 +759,7 @@ proc connect-m-response {i} { global zstatus global zleft - wlog debug "connect-m-response" + egw_log debug "connect-m-response" z39$i callback [list init-m-response $i] if {[catch {z39$i init}]} { set zstatus($i) -1 @@ -524,7 +771,7 @@ proc fail-m-response {i} { global zstatus global zleft - wlog debug "fail-m-response" + egw_log debug "fail-m-response" set zstatus($i) -1 incr zleft -1 } @@ -553,7 +800,8 @@ proc z39msearch {setNo piggy elements} { if {[catch {set oldHost [z39$i connect]}]} { set oldHost "" } - if {$oldHost != $host} { + set thisHost [splitHostSpec $host] + if {$oldHost != $thisHost} { catch {z39$i disconnect} } z39$i callback [list connect-m-response $i] @@ -563,26 +811,27 @@ proc z39msearch {setNo piggy elements} { for {set i 1} {$i <= $not} {incr i} { set oldHost [z39$i connect] set host $hist($setNo,$i,host) - if {$oldHost == $host} { + set thisHost [splitHostSpec $host] + if {$oldHost == $thisHost} { set zstatus($i) 1 continue } z39$i idAuthentication $hist($setNo,$i,idAuthentication) - html "Connecting to target " $host "
    \n" + html "Connecting to target " $thisHost "
    \n" set zstatus($i) -1 - if {![catch {z39$i connect $host}]} { + if {![catch {z39$i connect $thisHost}]} { incr zleft } } while {$zleft > 0} { - wlog debug "Waiting for init response" - if {[catch {zwait zleft 10}]} { + egw_log debug "Waiting for init response" + if {[catch {egw_wait zleft 10}]} { break } } set zleft 0 for {set i 1} {$i <= $not} {incr i} { - html "host " $hist($setNo,$i,host) ": " + html "host " [splitHostSpec $hist($setNo,$i,host)] ": " if {$zstatus($i) >= 1} { html "ok
    \n" ir-set z39$i.$setNo z39$i @@ -611,7 +860,7 @@ proc z39msearch {setNo piggy elements} { z39$i.$setNo mediumSetPresentNumber 0 } set zstatus($i) 1 - wlog debug "search " $hist($setNo,$i,query) + egw_log debug "search " $hist($setNo,$i,query) z39$i.$setNo search $hist($setNo,$i,query) incr zleft } else { @@ -619,8 +868,8 @@ proc z39msearch {setNo piggy elements} { } } while {$zleft > 0} { - wlog debug "Waiting for search response" - if {[catch {zwait zleft 30}]} { + egw_log debug "Waiting for search response" + if {[catch {egw_wait zleft 30}]} { break } } @@ -665,8 +914,8 @@ proc z39present {setNo tno setOffset setMax dfunc elements} { if {$got < $toGet} { set sessionWait 0 $zz.$setNo present $setOffset $toGet - if {[catch {zwait sessionWait 300}]} { - wlog debug "timeout/cancel in present" + if {[catch {egw_wait sessionWait 300}]} { + egw_log debug "timeout/cancel in present" $zz disconnect break } @@ -684,7 +933,7 @@ proc z39present {setNo tno setOffset setMax dfunc elements} { display-rec $setOffset [expr $got + $setOffset - 1] $dfunc $tno set setOffset [expr $got + $setOffset] set toGet [expr 1 + $setMax - $setOffset] - wflush + egw_flush } } @@ -698,36 +947,183 @@ proc z39history {} { if {![info exists nextSetNo]} { return } - html "

    History

    \n" + html "

    History


    \n" for {set setNo 1} {$setNo < $nextSetNo} {incr setNo} { - html {
    } [lindex $targets($hist($setNo,host)) 0] - if {[llength $hist($setNo,database)] > 1} { + if {$hist($setNo,scan) > 0} continue + set host $hist($setNo,host) + html {
    } [lindex $targets($host) 0] + if {[llength [lindex $targets($host) 1]] > 1} { html ": " foreach b $hist($setNo,database) { html " $b" } } - html "\n" - html "
    " + html {. } + if {[info exists hist($setNo,hits)]} { - html $hist($setNo,hits) " hits" + html { Result: } $hist($setNo,hits) { hits.} } else { - html failed + html {Search failed.} + } + html "
    \n" + html { Query: } + set op {} + for {set i 1} {$i <= 3} {incr i} { + if {[string length $hist($setNo,form,entry$i)] > 0} { + html " " [join $op " "] " " + html $hist($setNo,form,menu$i) "=" $hist($setNo,form,entry$i) + set op $hist($setNo,form,logic$i) + } } - html "\n" } html "
    \n" } proc displayError {msga msgb} { html "

    \n" - html {} + html {Error} html "

    " $msga "

    \n" if {$msgb != ""} { html "

    " $msgb "

    \n" } html "

    \n" } + +proc button-europagate {} { + global useIcons + if {$useIcons} { + html {Europagate} + } else { + html {Europagate | } + } +} + +proc button-define-target {more} { + global useIcons + global env + global sessionId + + html {} + } else { + html {">New Target} + if {$more} { + html " | \n" + } else { + html "\n" + } + } +} + +proc button-new-target {more} { + global useIcons + global env + global sessionId + + html {} + } else { + html {">New Target} + if {$more} { + html " | \n" + } else { + html "\n" + } + } +} + +proc button-view-history {more} { + global useIcons + global env + global sessionId + global nextSetNo + + html {View History} + } else { + html {">View History} + if {$more} { + html " | \n" + } else { + html "\n" + } + } +} + +proc button-new-query {more setNo} { + global useIcons + global env + global sessionId + global hist + + html {} + if {$useIcons} { + html {} + } else { + html {New Query} + if {$more} { + html " | \n" + } else { + html "\n" + } + } +} + +proc button-scan-window {more setNo} { + global useIcons + global env + global sessionId + global hist + + html {} + if {$useIcons} { + html {} + } else { + html {Scan} + if {$more} { + html " | \n" + } else { + html "\n" + } + } +} + +proc maintenance {} { + html {


    This page is maintained by } + html { Peter Wad Hansen .} + html {Last modified 24. january 1996.
    } + html { This and the following pages are under construction and } + html {will continue to be so until the end of January 1996.} +} + +proc splitHostSpec {host} { + set i [string last . $host] + if {$i > 1} { + incr i -1 + return [string range $host 0 $i] + } + return $host +} + +proc mergeHostSpec {host databases} { + return ${host}.[join $databases -] +}