X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fz39util.tcl;h=36a28a1588133b7fc54bf8ff06cc06e48cb382a5;hb=8bafbc608e1ffba9ee87f4856e586dffa57901b8;hp=bfbe03b7c3993de464ce77cc5e59744dc2d3be03;hpb=b52740e82ab92e99a6982bf5c99a30ac404bd557;p=egate.git diff --git a/www/z39util.tcl b/www/z39util.tcl index bfbe03b..36a28a1 100644 --- a/www/z39util.tcl +++ b/www/z39util.tcl @@ -1,5 +1,5 @@ # -# $Id: z39util.tcl,v 1.8 1995/11/13 15:41:46 adam Exp $ +# $Id: z39util.tcl,v 1.41 1996/03/14 11:50:51 adam Exp $ # proc saveState {} { uplevel #0 { @@ -26,16 +26,29 @@ proc saveState {} { } } -proc search-response {sno} { +proc search-response {zz} { global sessionWait - set status [z39.$sno responseStatus] + set status [$zz responseStatus] if {[lindex $status 0] == "NSD"} { - z39.$sno nextResultSetPosition 0 + $zz nextResultSetPosition 0 set code [lindex $status 1] set msg [lindex $status 2] set addinfo [lindex $status 3] - html "

Error NSD$code: $msg: $addinfo


\n" + displayError "Diagnostic message" \ + "$msg: $addinfo
\n(error code $code)" + set sessionWait -2 + } else { + set sessionWait 1 + } +} + +proc scan-response {zz} { + global sessionWait + + set status [$zz scanStatus] + if {$status == 6} { + displayError "Scan fail" "" set sessionWait -2 } else { set sessionWait 1 @@ -52,11 +65,11 @@ proc fail-response {} { set sessionWait -1 } -proc display-brief {zset no tno} { +proc display-medium {zset no setNo targetNo} { global env - global setNo global sessionId + html {
  • } set type [$zset type $no] if {$type == "SD"} { set err [lindex [$zset diag $no] 1] @@ -70,25 +83,103 @@ 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]] - html "
    \n" - return - } + switch $rtype { + SUTRS { + html { } + html [join [$zset getSutrs $no]] + html "
    \n" + return + } + WAIS { + html { } + html [join [$zset getWAIS $no headline]] + html {} + html "
    \n" + html {Score: } [$zset getWAIS $no score] + set lines [$zset getWAIS $no lines] + if {$lines > 0} { + html {, } $lines { lines} + } + html "
    \n" + return + } + } if {![catch { - set title [lindex [$zset getMarc $no field 245 * a] 0] - set year [lindex [$zset getMarc $no field 260 * c] 0] - } ] } { - html { } $title {} " ${year} " + 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] + set score [$zset getMarc $no field 999 * r] + } dispError ] } { + html { } + 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 ": " + } + set nope 1 + foreach v $title { + html $v + set nope 0 + } + set v [join $cover ""] + if {[string length $v] > 0} { + set nope 0 + html $v + } elseif {$nope} { + html "No Title" + } + html { } + if {[scan $score %d nscore]} { + html "; Score " $nscore + } + } else { + html { } + html {No Title} + html { } + html "Error: " $dispError "\n" } html "
    \n" } -proc display-raw {zset no tno} { +proc display-brief {zset no setNo targetNo} { + global env + global sessionId + + html {
  • } set type [$zset type $no] if {$type == "SD"} { set err [lindex [$zset diag $no] 1] @@ -96,18 +187,134 @@ proc display-raw {zset no tno} { if {$add != {}} { set add " :${add}" } - html "

    ${no}

    \n" - html "Error ${err}${add}
    \n" + html "${no} Error ${err}${add}
    \n" return } if {$type != "DB"} { return } set rtype [$zset recordType $no] - if {$rtype == "SUTRS"} { - html [join [$zset getSutrs $no]] "
    \n" - return - } + switch $rtype { + SUTRS { + html { } + html [string range [join [$zset getSutrs $no]] 0 70] + html "
    \n" + return + } + WAIS { + html { } + html [string range [join [$zset getWAIS $no headline]] 0 70] + + html {} + set score [$zset getWAIS $no score] + html { Score } $score + html "
    \n" + return + } + } + if {![catch { + 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] + } dispError ] } { + html { } + 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 + } + html {} + if {$nope} { + set v [join $cover ""] + if {[string length $v] > 40} { + set nope 0 + html [string range $v 0 38] "..." + } elseif {[string length $v] > 0} { + set nope 0 + html $v + } else { + html "No Title" + } + } + html { } + } else { + html { } + html {No Title} + html { } + html "Error: " $dispError "\n" + } + html "
    \n" +} + +proc display-raw {zset no setNo targetNo} { + set type [$zset type $no] + switch $type { + SD { + set err [lindex [$zset diag $no] 1] + set add [lindex [$zset diag $no] 2] + if {$add != {}} { + set add " :${add}" + } + html "

    ${no}

    \n" + html "Error ${err}${add}
    \n" + return + } + DB { + } + default { + return + } + } + set rtype [$zset recordType $no] + switch $rtype { + SUTRS { + html "\n" [join [$zset getSutrs $no]] "\n\n" + return + } + WAIS { + html "\n" [join [$zset getWAIS $no text]] "\n\n" + return + } + } if {[catch {set r [$zset getMarc $no line * * *]}]} { html "Unknown record type: $rtype
    \n" return @@ -117,7 +324,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] == " "} { @@ -127,6 +334,7 @@ proc display-raw {zset no tno} { } } } + html "" foreach field $fields { set id [lindex $field 0] set data [lindex $field 1] @@ -135,7 +343,7 @@ proc display-raw {zset no tno} { } html $data } - htmlr {
    } + html "
    \n" } } @@ -154,7 +362,7 @@ proc put-marc-contents {cc} { } html $cc if {$ref != ""} { - html {">} $urltype { reference} + html {">} $cc {} } } @@ -224,29 +432,11 @@ proc dl-marc-field-rec {zset no tag lead start stop startid sep} { } } -proc display-full {zset no tno} { - set type [$zset type $no] - if {$type == "SD"} { - set err [lindex [$zset diag $no] 1] - set add [lindex [$zset diag $no] 2] - if {$add != {}} { - set add " :${add}" - } - html "Error ${err}${add}
    \n" - return - } - if {$type != "DB"} { - return - } - set rtype [$zset recordType $no] - if {$rtype == "SUTRS"} { - html [join [$zset getSutrs $no]] "
    \n" - return - } - if {[catch {set r [$zset getMarc $no line * * *]}]} { - html "Unknown record type: $rtype
    \n" - return - } +proc display-full-marc {zset no setNo targetNo} { + global env + global hist + global sessionId + html "
    \n" set n [dl-marc-field $zset $no 700 a "Author" "Authors" "
    \n"] if {$n == 0} { @@ -254,8 +444,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 "" "" @@ -317,141 +516,466 @@ 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" + html {
    } [join $sp] "\n" } dl-marc-field $zset $no 037 {[abc]} "Acquisition" {} "
    \n" dl-marc-field $zset $no 037 {[f6]} "Form of issue" {} "
    \n" dl-marc-field $zset $no 537 * "Source of data" {} "
    \n" dl-marc-field $zset $no 538 * "System details" {} "
    \n" dl-marc-field $zset $no 787 {[rstw6]} "Related information" {} "
    \n" + dl-marc-field $zset $no 999 r "Score" {} ", " dl-marc-field $zset $no 001 * "Local control number" {} ", " html "
    \n" } +proc display-full-wais {zset no setNo targetNo} { + global env + global hist + global sessionId -proc display-rec {from to dfunc tno} { - global setNo - - if {$tno > 0} { - while {$from <= $to} { - eval "$dfunc z39${tno}.${setNo} $from $tno" - incr from + set i 0 + set element junk + htmlToken l [join [$zset getWAIS $no text]] { + if {[string compare [string index $l 0] {<}]} { + if {[info exist data($element)]} { + set data($element) $data($element)$l + } else { + set data($element) $l + } + continue + } + switch -- $l { + { + set element title + } + { + set element dateOfLastModification + } + { + set element controlIdentifier + } + { + set element lastChecked + } + { + set element bytes + } + { + set element linkage + } + { + incr i + } +
  • { + set element "$i,linkage" + } + { + set element "$i,title" + } + { + set element ip + } + default { + set element junk + } } + } + if {![info exists data(title)] || ![info exists data(linkage)]} { + set nwi 0 } else { - while {$from <= $to} { - eval "$dfunc z39.${setNo} $from 0" - incr from + set nwi 1 + } + html "
    \n" + html {
    Title} + if {$nwi} { + html {
    } $data(title) "" + html {
    URL} + html {
    } $data(linkage) "
    \n" + } else { + html {
    } [join [$zset getWAIS $no headline]] + } + html {
    Score
    } [$zset getWAIS $no score] + set lines [$zset getWAIS $no lines] + if {$lines > 0} { + html {
    Lines
    } $lines "
    \n" + } + if {!$nwi} { + html "
    \n" [join [$zset getWAIS $no text]] "\n
    \n" + return + } + if {[info exists data(bytes)]} { + html {
    Bytes
    } $data(bytes) + } + if {[info exists data(dateOfLastModification)]} { + html {
    Last modified
    } $data(dateOfLastModification) + } + if {[info exists data(lastChecked)]} { + html {
    Last checked
    } $data(lastChecked) "
    \n" + } + if {[info exists data(ip)]} { + html {
    Initial text
    } $data(ip) "
    \n" + } + if {0} { + html {} + html {Similar WAIS record
    } + } + if {[info exists data($i,linkage)]} { + html "
    References\n" + } + for {set i 1} {[info exists data($i,linkage)]} {incr i} { + html {
    } + if {[info exists data($i,title)]} { + html $data($i,title) + } else { + html Untitled + } + html "
    \n" + } + html "\n" +} + +proc display-full {zset no setNo targetNo} { + set type [$zset type $no] + switch $type { + SD { + set err [lindex [$zset diag $no] 1] + set add [lindex [$zset diag $no] 2] + if {$add != {}} { + set add " :${add}" + } + html "Error ${err}${add}
    \n" + return + } + DB { + } + default { + return + } + } + set rtype [$zset recordType $no] + switch $rtype { + SUTRS { + html "
    " [join [$zset getSutrs $no]] "

    \n" + return + } + WAIS { + display-full-wais $zset $no $setNo $targetNo + return + } + } + if {[catch {set r [$zset getMarc $no line * * *]}]} { + html "Unknown record type: $rtype
    \n" + return + } + display-full-marc $zset $no $setNo $targetNo +} + + +proc display-rec {from to dfunc setNo targetNo} { + while {$from <= $to} { + eval "$dfunc z39${targetNo}.${setNo} $from $setNo $targetNo" + incr from + } +} + +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} { +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} continue + if {![string compare [lindex $targets($t) 1] WAIS]} { + if {[string length $q] == 0} { + set q $term + } else { + set q "$term $q" + } + set op [egw_form logic$i] + continue + } else { + set field [join [egw_form menu$i]] + catch {unset attr} foreach x [lindex $targets($t) 2] { - if {[lindex $x 0] == $field} { + if {![string compare [lindex $x 0] $field]} { set attr [lindex $x 1] } } + if {![info exists attr]} { + egw_log debug "attr failed for $t" + set attr [lindex [lindex [lindex $targets($t) 2] 0] 1] + } switch $op { - And - { set q "@and $q ${attr} \{${term}\}" } - Or - { set q "@or $q ${attr} \{${term}\}" } - {And not} - { set q "@not $q ${attr} \{${term}\}" } - {} - { set q "${attr} \{${term}\}" } + And + { set q "@and $q ${attr} \"${term}\"" } + Or + { set q "@or $q ${attr} \"${term}\"" } + {And not} + { set q "@not $q ${attr} \"${term}\"" } + {} + { set q "${attr} \"${term}\"" } } - set op [wform logic$i] + set op [egw_form logic$i] } } return $q } -proc z39search {setNo piggy tno elements} { +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 query $hist($setNo,$tno,query) + 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,scanAttr) + set scanTerm $hist($setNo,$scanNo,scanTerm) + + mkAssoc $zz $host + 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 {[string compare $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 { - set zz z39 - set host $hist($setNo,host) - set idAuth $hist($setNo,idAuthentication) - set database $hist($setNo,database) - set query $hist($setNo,query) + 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] + + egw_log debug "scan: ${scanAttr} ${scanTerm}" + 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 + global scriptQuery + + set zz z39$tno + 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 + } } - if {[catch [list $zz failback fail-response]]} { - ir $zz + html {} + html {} \n + + for {set i 0} {$i < $m} {incr i} { + html {} \n } + html {\n" + 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} { - html "Cannot connect to target ${host}
    \n" + displayError "Cannot connect to target" $thisHost return 0 } } $zz idAuthentication $idAuth set sessionWait 0 - if {[catch [list $zz init]]} { - html "Cannot initialize with target ${host}
    \n" + if {[catch {$zz init}]} { + displayError "Cannot initialize target" $thisHost + $zz disconnect return 0 } - if {[catch {zwait sessionWait 60}]} { - html "Cannot initialize with target ${host}
    \n" + if {$sessionWait == 0 && [catch {egw_wait sessionWait 60}]} { + displayError "Cannot initialize target" $thisHost $zz disconnect return 0 } if {$sessionWait != "1"} { - html "Cannot initialize with target ${host}
    \n" + displayError "Cannot initialize target" $thisHost $zz disconnect return 0 } if {![$zz initResult]} { set u [$zz userInformationField] $zz disconnect - html "Connection rejected by target: $u
    \n" + displayError "Cannot initialize target $thisHost" $u return 0 } + } elseif {![catch [list $zz.$setNo smallSetUpperBound 0]]} { + if {[info exists hist($setNo,$tno,hits)]} { + return 1 + } } - if {![catch [list $zz.$setNo smallSetUpperBound 0]]} { - return 1 + + if {![string compare [lindex $targets($host) 1] WAIS]} { + wais-set $zz.$setNo $zz + } else { + ir-set $zz.$setNo $zz + $zz.$setNo preferredRecordSyntax [lindex $targets($host) 1] + egw_log debug "set syntax to [lindex $targets($host) 1]" + } + if {![lindex $targets($host) 5]} { + set elements {} } - ir-set $zz.$setNo $zz $zz.$setNo smallSetElementSetNames $elements $zz.$setNo mediumSetElementSetNames $elements $zz.$setNo recordElements $elements - eval $zz.$setNo databaseNames $database + egw_log debug "database=$database" + eval $zz.$setNo databaseNames $database - $zz.$setNo preferredRecordSyntax USMARC - - $zz callback search-response $setNo + $zz callback [list search-response $zz.$setNo] if {$piggy} { $zz.$setNo largeSetLowerBound 999999 $zz.$setNo smallSetUpperBound 0 @@ -462,28 +986,31 @@ proc z39search {setNo piggy tno elements} { $zz.$setNo mediumSetPresentNumber 0 } set sessionWait 0 - $zz.$setNo search $query + egw_log debug "search: $query" + + if {[info exists docId]} { + $zz.$setNo search $query $docId + } else { + $zz.$setNo search $query + } - if {[catch {zwait sessionWait 600}]} { + if {!$sessionWait && [catch {egw_wait sessionWait 60}]} { + 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] - html "

    Error NSD$code: $msg: $addinfo


    \n" - return 0 + if {$sessionWait != 1} { + return 0 } - set hist($setNo,hits) [$zz.$setNo resultCount] + set hist($setNo,$tno,hits) [$zz.$setNo resultCount] return 1 } @@ -491,17 +1018,22 @@ 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 + if {![z39$i initResult]} { + set zstatus($i) -1 + z39$i disconnect + return + } + set zstatus($i) 1 } 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 @@ -513,35 +1045,72 @@ 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 } -proc search-m-response {setNo i} { +proc search-m-response {setNo i start number} { global zleft global zstatus + global hist - incr zleft -1 - set zstatus($i) 2 + egw_log debug "search-m-response" + set status [z39$i.$setNo responseStatus] + egw_log debug "search-m-response1" + if {[lindex $status 0] == "OK"} { + set nor 0 + } elseif {[lindex $status 0] == "DBOSD"} { + set nor [z39$i.$setNo numberOfRecordsReturned] + } else { + egw_log debug "search-m-response2" + incr zleft -1 + set zstatus($i) 2 + return + } + set hist($setNo,$i,hits) [z39$i.$setNo resultCount] + egw_log debug "search-m-response3" + set hist($setNo,$i,offset) [expr $start + $nor -1] + if {[expr $nor + $start] > [z39$i.$setNo resultCount]} { + egw_log debug "search-m-response4" + incr zleft -1 + set zstatus($i) 2 + return + } + egw_log debug "search-m-response5" + if {$nor >= $number} { + egw_log debug "search-m-response6 nor=$nor number=$number" + incr zleft -1 + set zstatus($i) 2 + return + } + egw_log debug "search-m-response7" + set start [expr $start + $nor] + set number [expr $number - $nor] + if {[expr $start + $number - 1] > [z39$i.$setNo resultCount]} { + set number [expr [z39$i.$setNo resultCount] - $start + 1] + } + z39$i callback [list search-m-response $setNo $i $start $number] + egw_log debug "mpresent start=$number number=$number" + z39$i.$setNo present $start $number } -proc z39msearch {setNo piggy elements} { +proc z39msearch {setNo elements start number cache} { global zleft global zstatus global hist + global targets + global debug set not $hist($setNo,0,host) + egw_log debug "z39msearch start=$start number=$number elements=$elements" for {set i 1} {$i <= $not} {incr i} { set host $hist($setNo,$i,host) - if {[catch {z39 failback fail-response}]} { - ir z39$i - } - if {[catch {set oldHost [z39$i connect]}]} { - set oldHost "" - } - if {$oldHost != $host} { + mkAssoc z39$i $host + set oldHost [z39$i connect] + set thisHost [splitHostSpec $host] + if {[string compare $oldHost $thisHost]} { catch {z39$i disconnect} } z39$i callback [list connect-m-response $i] @@ -551,66 +1120,137 @@ 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 zstatus($i) 1 + set thisHost [splitHostSpec $host] + if {![string compare $oldHost $thisHost]} { continue } + egw_log debug "old=$oldHost this=$thisHost" 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 20}]} { break } } set zleft 0 for {set i 1} {$i <= $not} {incr i} { - html "host " $hist($setNo,$i,host) ": " - if {$zstatus($i) >= 1} { - html "ok
    \n" - ir-set z39$i.$setNo z39$i + set host $hist($setNo,$i,host) + if {$debug} { + html "host " [splitHostSpec $host] ": " + } + egw_log debug "i=$i zstatus=$zstatus($i)" + if {$zstatus($i) < 1} { + if {$debug} { + html "fail
    \n" + } + continue + } + if {[catch [list z39$i.$setNo preferredRecordSyntax]]} { + if {$debug} { + html "ok
    \n" + } + + if {![string compare [lindex $targets($host) 1] WAIS]} { + wais-set z39$i.$setNo z39$i + } else { + ir-set z39$i.$setNo z39$i + z39$i.$setNo preferredRecordSyntax [lindex $targets($host) 1] + egw_log debug "set syntax to [lindex $targets($host) 1]" + } set hist($setNo,$i,offset) 0 eval z39$i.$setNo databaseNames $hist($setNo,$i,database) - z39$i.$setNo smallSetElementSetNames $elements - z39$i.$setNo mediumSetElementSetNames $elements - z39$i.$setNo recordElements $elements + if {![lindex $targets($hist($setNo,$i,host)) 5]} { + set thisElements {} + } else { + set thisElements $elements + } + z39$i.$setNo smallSetElementSetNames $thisElements + z39$i.$setNo mediumSetElementSetNames $thisElements + z39$i.$setNo elementSetNames $thisElements + z39$i.$setNo recordElements $thisElements - z39$i.$setNo preferredRecordSyntax USMARC - z39$i callback [list search-m-response $setNo $i] + z39$i callback [list search-m-response $setNo $i $start $number] - if {$piggy} { + if {$start == 1} { z39$i.$setNo largeSetLowerBound 999999 z39$i.$setNo smallSetUpperBound 0 - z39$i.$setNo mediumSetPresentNumber $hist($setNo,maxPresent) + z39$i.$setNo mediumSetPresentNumber $number } else { z39$i.$setNo largeSetLowerBound 2 z39$i.$setNo smallSetUpperBound 0 z39$i.$setNo mediumSetPresentNumber 0 } set zstatus($i) 1 - wlog debug "search " $hist($setNo,$i,query) - z39$i.$setNo search $hist($setNo,$i,query) incr zleft + egw_log debug "msearch host=" $hist($setNo,$i,host) + egw_log debug "setNo=$setNo query=" $hist($setNo,$i,query) "=" + if {[catch {z39$i.$setNo search $hist($setNo,$i,query)}]} { + set zstatus($i) -1 + incr zleft -1 + } + } elseif {[z39$i.$setNo resultCount] >= $start} { + if {[expr $start + $number - 1] > [z39$i.$setNo resultCount]} { + set tnumber [expr [z39$i.$setNo resultCount] - $start + 1] + } else { + set tnumber $number + } + if {![lindex $targets($hist($setNo,$i,host)) 5]} { + set thisElements {} + } else { + set thisElements $elements + } + z39$i.$setNo smallSetElementSetNames $thisElements + z39$i.$setNo mediumSetElementSetNames $thisElements + z39$i.$setNo elementSetNames $thisElements + z39$i.$setNo recordElements $thisElements + + for {set n 0} {$n < $tnumber} {incr n} { + if {[z39$i.$setNo recordType [expr $start + $n]] == ""} { + if {$n > 0} { + egw_log debug "failed on $n" + } + if {$debug} { + html "no record at #" [expr $start + $n] + html " el=-" $thisElements "-" + } + break + } + } + if {$n == $tnumber} { + if {$debug} { + html "cached
    \n" + } + continue + } + + html "present
    \n" + z39$i callback [list search-m-response $setNo $i $start $tnumber] + incr zleft + egw_log debug "mpresent start=$start number=$tnumber" + z39$i.$setNo present $start $tnumber } else { - html "fail
    \n" + if {$debug} { + html "ok
    \n" + } } } while {$zleft > 0} { - wlog debug "Waiting for search response" - if {[catch {zwait zleft 30}]} { + egw_log debug "Waiting for search/present response" + if {[catch {egw_wait zleft 60}]} { break } } for {set i 1} {$i <= $not} {incr i} { if {$zstatus($i) != 2} continue set status [z39$i.$setNo responseStatus] - if {[lindex $status 0] != "NSD"} { + if {0 && [lindex $status 0] != "NSD"} { set hist($setNo,$i,offset) [z39$i.$setNo numberOfRecordsReturned] } } @@ -619,29 +1259,38 @@ proc z39msearch {setNo piggy elements} { proc z39present {setNo tno setOffset setMax dfunc elements} { global hist global sessionWait + global targets - if {$tno > 0} { - set zz z39$tno - } else { - set zz z39 + set zz z39$tno + set host $hist($setNo,$tno,host) + + if {![lindex $targets($host) 5]} { + set elements {} } $zz.$setNo elementSetNames $elements $zz.$setNo recordElements $elements set toGet [expr 1 + $setMax - $setOffset] + + $zz callback [list search-response $zz.$setNo] + while {$setMax > 0 && $toGet > 0} { for {set got 0} {$got < $toGet} {incr got} { - if {[$zz.$setNo type [expr $setOffset + $got]] == ""} { + if {[$zz.$setNo recordType [expr $setOffset + $got]] == ""} { break } } if {$got < $toGet} { set sessionWait 0 $zz.$setNo present $setOffset $toGet - if {[catch {zwait sessionWait 300}]} { + if {[catch {egw_wait sessionWait 300}]} { + egw_log debug "timeout/cancel in present" $zz disconnect break } + if {$sessionWait == "0"} { + $zz disconnect + } if {$sessionWait != "1"} { break } @@ -650,11 +1299,237 @@ proc z39present {setNo tno setOffset setMax dfunc elements} { break } } - display-rec $setOffset [expr $got + $setOffset - 1] $dfunc $tno + display-rec $setOffset [expr $got + $setOffset - 1] $dfunc $setNo $tno set setOffset [expr $got + $setOffset] set toGet [expr 1 + $setMax - $setOffset] - wflush + egw_flush + } +} + +proc buttons-result-set-s {setNo targetNo setMax startPos after} { + global sessionId + global useIcons + global env + global hist + + set zz z39$targetNo + html "

    \n" + button-main + if {$setMax > 0 && $setMax < [$zz.$setNo resultCount]} { + if {!$useIcons} { + html "\n | " + } + html {} + } else { + html {">Next Records} + } + } + if {$setMax > 0 && $startPos != "" && $startPos != "1"} { + if {!$useIcons} { + html "\n | " + } + html {} + } else { + html {">Previous Records} + } + } + if {$targetNo > 0} { + button-result-set $setNo $targetNo + } + button-new-query $setNo + button-new-target + button-view-history + + html "

    \n" +} + +proc score-sort {l r} { + return [expr [lindex $r 0] - [lindex $l 0]] +} + +proc display-result-set-m-score {setNo} { + global hist + global useIcons + global zstatus + global targets + + set not $hist($setNo,0,host) + for {set i 1} {$i <= $not} {incr i} { + if {$zstatus($i) != 2} continue + set status [z39$i.$setNo responseStatus] + if {[lindex $status 0] != "DBOSD"} continue + set nor $hist($setNo,$i,offset) + for {set j 1} {$j <= $nor} {incr j} { + if {![string compare [z39$i.$setNo recordType $j] WAIS]} { + set score [z39$i.$setNo getWAIS $j score] + } elseif {![string compare [z39$i.$setNo recordType $j] USmarc]} { + set score [z39$i.$setNo getMarc $j field 999 * r] + if {[scan $score %d score] != 1} { + set score 10 + } + } else { + set score 10 + } + if {$score > 0} { + lappend scoreArray [list $score $i $j] + } + } + } + if {![info exists scoreArray]} { + html "

    Search produced no result


    \n" + } else { + html "
      \n" + set scoreSorted [lsort -command score-sort $scoreArray] + foreach r $scoreSorted { + set i [lindex $r 1] + set j [lindex $r 2] + display-$hist($setNo,format) z39$i.$setNo $j $setNo $i + } + html "
    \n" + } + for {set i 1} {$i <= $not} {incr i} { + if {$zstatus($i) != 2} continue + set status [z39$i.$setNo responseStatus] + if {[lindex $status 0] == "NSD"} { + z39$i.$setNo nextResultSetPosition 0 + set code [lindex $status 1] + set msg [lindex $status 2] + set addinfo [lindex $status 3] + html {
    } [lindex $targets($hist($setNo,$i,host)) 0] + html "
    Error: $msg: $addinfo (code $code)
    \n" + } + } + html "\n
    " +} + +proc display-result-set-m-server {setNo} { + global hist + global useIcons + global zstatus + global targets + global env + global sessionId + + set not $hist($setNo,0,host) + html "
    \n" + for {set i 1} {$i <= $not} {incr i} { + if {$zstatus($i) != 2} continue + set status [z39$i.$setNo responseStatus] + if {[lindex $status 0] == "NSD"} { + html "

    " [lindex $targets($hist($setNo,$i,host)) 0] ": " + z39$i.$setNo nextResultSetPosition 0 + set code [lindex $status 1] + set msg [lindex $status 2] + set addinfo [lindex $status 3] + html "Error

    \n
    NSD$code: $msg: $addinfo" + } else { + html {
    } + html "

    " [lindex $targets($hist($setNo,$i,host)) 0] ": " + set r [z39$i.$setNo resultCount] + html "$r hits

    \n
    \n" + + if {$hist($setNo,$i,offset) > $hist($setNo,maxPresent)} { + set nor $hist($setNo,maxPresent) + } else { + set nor $hist($setNo,$i,offset) + } + display-rec 1 $nor display-$hist($setNo,format) $setNo $i + } + html "\n" } + html "
    \n" +} + +proc display-result-set-m {setNo} { + global hist + global useIcons + global zstatus + global targets + + egw_log debug "sort=$hist($setNo,sort)" + switch $hist($setNo,sort) { + score { + display-result-set-m-score $setNo + } + default { + display-result-set-m-server $setNo + } + } +} + +proc display-result-set-s {setNo targetNo startPos endPos} { + global hist + global useIcons + + set zz z39$targetNo + set host $hist($setNo,$targetNo,host) + set idAuth $hist($setNo,$targetNo,idAuthentication) + set database $hist($setNo,$targetNo,database) + set query $hist($setNo,$targetNo,query) + + set useIcons 1 + + if {$startPos == ""} { + if {[z39search $setNo 1 $targetNo B] != "1"} { + return + } + set r [$zz.$setNo resultCount] + + set setMax [$zz.$setNo resultCount] + if {$setMax > $hist($setNo,maxPresent)} { + set setMax $hist($setNo,maxPresent) + } + buttons-result-set-s $setNo $targetNo $setMax $startPos 0 + + set setOffset [$zz.$setNo numberOfRecordsReturned] + if {$setMax > 0} { + html {

    Records 1-} $setMax " out of $r

    \n" + } else { + html "

    No hits

    \n" + } + egw_flush + html "
      \n" + display-rec 1 $setMax display-brief $setNo $targetNo + incr setOffset + + } else { + if {[z39search $setNo 0 $targetNo B] != "1"} { + return + } + set r [$zz.$setNo resultCount] + set setOffset $startPos + set setMax [$zz.$setNo resultCount] + if {$setMax > $endPos} { + set setMax $endPos + } + buttons-result-set-s $setNo $targetNo $setMax $startPos 0 + if {$setMax > 0} { + html {

      Records } $startPos {-} $setMax " out of $r

      \n" + } else { + html "

      No hits

      \n" + } + egw_flush + html "
        \n" + } + if {$setMax > 0} { + z39present $setNo $targetNo $setOffset $setMax display-brief B + } + html "
      \n" + set useIcons 0 + buttons-result-set-s $setNo $targetNo $setMax $startPos 1 } proc z39history {} { @@ -663,30 +1538,356 @@ proc z39history {} { global env global sessionId global targets + global html3 + global scriptQuery if {![info exists nextSetNo]} { return } - html "

      History

      \n" + html "

      History


      \n" + if {$html3} { + html {
    Scan term} + html {Hits} + html {
    } + if {0} { + regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm + html {} + } else { + regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm + html {} + } + html [lindex [$zs scanLine $i] 1] + html {} + html {} + html [lindex [$zs scanLine $i] 2] + html {
    } + html {} "\n" + } else { + html {
    } "\n" + } for {set setNo 1} {$setNo < $nextSetNo} {incr setNo} { - html {
    } [lindex $targets($hist($setNo,host)) 0] - if {[llength $hist($setNo,database)] > 1} { - html ": " - foreach b $hist($setNo,database) { - html " $b" + if {[info exists hist($setNo,scan)]} { + if {$hist($setNo,scan) > 0} continue + } + if {[info exists hist($setNo,1,host)]} { + set start 1 + set end $hist($setNo,0,host) + } else { + set start 0 + set end 0 + } + for {set i $start} {$i <= $end} {incr i} { + if {$html3} { + html {
    } "\n" } } - html "\n" - html "
    " - if {[info exists hist($setNo,hits)]} { - html $hist($setNo,hits) " hits" + } + if {$html3} { + html {
    Target} + html {Database} + html {Hits} + html {Query} + html {
    } + } else { + html {
    } + } + set host $hist($setNo,$i,host) + html [lindex $targets($host) 0] + if {$html3} { + html {
    } [join $hist($setNo,$i,database)] + } else { + if {[llength [lindex $targets($host) 1]] > 1} { + html ": " + foreach b $hist($setNo,$i,database) { + html " $b" + } + } + html {. } + } + if {$html3} { + html {} + } + if {[info exists hist($setNo,$i,hits)]} { + html { } $hist($setNo,$i,hits) {} + } else { + if {$html3} { + html {Failed} + } else { + html {Search failed.} + } + } + if {$html3} { + html {} + } else { + html "
    \n" + } + html { } + } else { + html {">Query: } + } + set op {} + for {set j 1} {$j <= 3} {incr j} { + if {[string length $hist($setNo,form,entry$j)] > 0} { + html " " [join $op " "] " " + set pre [join $hist($setNo,form,menu$j)] + if {[string length $pre] > 0} { + html $pre "=" + } + html $hist($setNo,form,entry$j) + set op $hist($setNo,form,logic$j) + } + } + if {$html3} { + html {

    } + } else { + html {} + } + html "\n" +} + +proc displayError {msga msgb} { + html "

    \n" + html {Error} + html "

    " $msga "

    \n" + if {[string length $msgb] > 0} { + html "

    " $msgb "

    \n" + } + html "

    \n" +} + +proc button-main {} { + global useIcons + html {} + if {$useIcons} { + html {Europagate} + } else { + html {Europagate} + } +} + +proc button-define-target {} { + global useIcons + global env + global sessionId + + if {!$useIcons} { + html "\n | " + } + html {} + } else { + html {">Define Target} + } +} + +proc button-new-target {} { + global useIcons + global env + global sessionId + global scriptTarget + + if {[string length $scriptTarget] == 0} return + + if {!$useIcons} { + html "\n | " + } + html {} + } else { + html {">New Target} + } +} + +proc button-view-history {} { + global useIcons + global env + global sessionId + global nextSetNo + + if {!$useIcons} { + html "\n | " + } + html {View History} + } else { + html {">View History} + } +} + +proc button-new-query {setNo} { + global useIcons + global env + global sessionId + global hist + global scriptQuery + + if {!$useIcons} { + html "\n | " + } + html {} + + if {$useIcons} { + html {} + } else { + html {New Query} + } +} + +proc button-result-set {setNo tno} { + global useIcons + global env + global sessionId + global hist + + if {!$useIcons} { + html "\n | " + } + html {} + } else { + html {">Result Set} + } +} + +proc button-scan-window {setNo} { + global useIcons + global env + global sessionId + global hist + + if {!$useIcons} { + html "\n | " + } + set targetNo 0 + html {} + if {$useIcons} { + html {} + } else { + html {Scan} + } +} + +proc maintenance {} { + html {


    This page is maintained by } + html { Peter Wad Hansen .} + html {Last modified 29. 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 first / $host] + if {$i > 1} { + incr i -1 + return [string range $host 0 $i] + } + return $host +} + +proc splitDatabaseSpec {host} { + set i [string first / $host] + if {$i > 1} { + incr i + regsub -all -- - [string range $host $i end] { } res + return $res + } + regsub -all -- - $host {} res + return $res +} + +proc mergeHostSpec {host databases} { + return ${host}/[join $databases -] +} + +proc mkAssoc {assoc host} { + global targets + + if {[catch {$assoc failback fail-response}]} { + if {![string compare [lindex $targets($host) 1] WAIS]} { + wais $assoc } else { - html failed + ir $assoc + } + } else { + if {![string compare [lindex $targets($host) 1] WAIS]} { + if {[$assoc comstack] == "wais"} return + wais $assoc + } else { + if {[$assoc comstack] == "tcpip"} return + ir $assoc } - html "\n" } - html "\n" } + +proc serverList {headlineProc targetProc} { + global targets + global groupsDescription + + proc targetsCmp {l r} { + global targets + return [string compare [string tolower [lindex $targets($l) 0]] \ + [string tolower [lindex $targets($r) 0]]] + } + proc groupCmp {l r} { + global groupsOrder + if {[catch {set lo $groupsOrder($l)}]} { + set lo 10 + } + if {[catch {set ro $groupsOrder($r)}]} { + set ro 10 + } + return [expr $lo - $ro] + } + + foreach tt [array names targets] { + lappend groupsTmp([lindex $targets($tt) 6]) $tt + } + set gts [lsort -command groupCmp [array names groupsTmp]] + foreach gt $gts { + if {[info exists groupsDescription($gt)]} { + eval $headlineProc [list $groupsDescription($gt)] + } else { + eval $headlineProc $gt + } + set tn [lsort -command targetsCmp $groupsTmp($gt)] + foreach t $tn { + eval $targetProc $t + } + } + + rename targetsCmp {} +} + +proc session-lost {} { + global useIcons + + html {WWW/Z39.50 Gateway: Session Expired} + html \n {} + set useIcons 1 + button-main + html {

    Session Expired

    } + html {Your session has expired. Please reload the gateways' } + html {front page.

    } \n + set useIcons 0 + button-main + html {} +} + +if {[info exists utilExtension]} { + source $utilExtension +} +