X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fz39util.tcl;h=451fb70af4e1c44487b44c1c021747b187c2216c;hb=2e38b5dbea87903010208d15a8a9073d2049bbae;hp=216784c52d0fcec67c9cea0cf873ad42d56337e4;hpb=a6e5ecf2a6d6dedf266c5f9d6bc2447a528b199e;p=egate.git diff --git a/www/z39util.tcl b/www/z39util.tcl index 216784c..451fb70 100644 --- a/www/z39util.tcl +++ b/www/z39util.tcl @@ -1,5 +1,5 @@ # -# $Id: z39util.tcl,v 1.11 1995/11/14 16:01:52 adam Exp $ +# $Id: z39util.tcl,v 1.29 1996/01/31 15:56:37 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,60 @@ 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} " + 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 + } + if {$nope} { + set v [join $cover ""] + if {[string length $v] > 40} { + html [string range $v 0 38] "..." + } else { + html $v + } + } + html { } } html "
    \n" } @@ -118,7 +179,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 +189,7 @@ proc display-raw {zset no tno} { } } } + html "" foreach field $fields { set id [lindex $field 0] set data [lindex $field 1] @@ -136,7 +198,7 @@ proc display-raw {zset no tno} { } html $data } - htmlr {
    } + html "
    \n" } } @@ -155,7 +217,7 @@ proc put-marc-contents {cc} { } html $cc if {$ref != ""} { - html {">} $urltype { reference} + html {">} $cc {} } } @@ -255,8 +317,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 +389,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 +419,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 +452,182 @@ 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] + + 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 + + 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 + } + } + html {} + html {} \n + + for {set i 0} {$i < $m} {incr i} { + html {} \n + } + html {\n" $zz disconnect @@ -501,7 +755,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 @@ -511,7 +765,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 @@ -523,20 +777,53 @@ 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] != "DBOSD"} { + egw_log debug "search-m-response2" + incr zleft -1 + set zstatus($i) 2 + return + } + set nor [z39$i.$setNo numberOfRecordsReturned] + 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" + 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 @@ -546,13 +833,12 @@ proc z39msearch {setNo piggy elements} { for {set i 1} {$i <= $not} {incr i} { set host $hist($setNo,$i,host) - if {[catch {z39 failback fail-response}]} { + if {[catch [list z39$i failback fail-m-response $i]]} { ir z39$i } - if {[catch {set oldHost [z39$i connect]}]} { - set oldHost "" - } - if {$oldHost != $host} { + set oldHost [z39$i connect] + set thisHost [splitHostSpec $host] + if {$oldHost != $thisHost} { catch {z39$i disconnect} } z39$i callback [list connect-m-response $i] @@ -562,28 +848,34 @@ 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 {$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" + html "host " [splitHostSpec $hist($setNo,$i,host)] ": " + egw_log debug "i=$i zstatus=$zstatus($i)" + if {$zstatus($i) < 1} { + html "fail
    \n" + continue + } + if {[catch [list z39$i.$setNo preferredRecordSyntax USMARC]]} { + html "ok
    \n" ir-set z39$i.$setNo z39$i set hist($setNo,$i,offset) 0 eval z39$i.$setNo databaseNames $hist($setNo,$i,database) @@ -595,38 +887,74 @@ proc z39msearch {setNo piggy 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) + incr zleft + egw_log debug "setNo=$setNo msearch " $hist($setNo,$i,query) z39$i.$setNo search $hist($setNo,$i,query) + } 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 type [expr $start + $n]] == ""} { + if {$n > 0} { + egw_log debug "failed on $n" + } + break + } + } + if {$n == $tnumber} { + html "cached
    \n" + continue + } + + html "present
    \n" + z39$i.$setNo preferredRecordSyntax USMARC + 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" + 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] } } @@ -664,8 +992,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 } @@ -683,7 +1011,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 } } @@ -693,40 +1021,248 @@ proc z39history {} { global env global sessionId global targets + global html3 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 {$hist($setNo,scan) > 0} continue + set host $hist($setNo,host) + if {$html3} { + html {
    } "\n" } - html "\n" } - html "\n" + if {$html3} { + html {
    Target} + html {Database} + html {Hits} + html {Query} + html {
    } + } else { + html {
    } + } + html [lindex $targets($host) 0] + if {$html3} { + html {
    } [join $hist($setNo,database)] + } else { + if {[llength [lindex $targets($host) 1]] > 1} { + html ": " + foreach b $hist($setNo,database) { + html " $b" + } } + html {. } + } + if {$html3} { + html {} } - html "\n" - html "
    " if {[info exists hist($setNo,hits)]} { - html $hist($setNo,hits) " hits" + html { } $hist($setNo,hits) {} + } else { + html {">Result: } $hist($setNo,hits) { hits.} + } + } else { + if {$html3} { + html {Failed} + } else { + html {Search failed.} + } + } + if {$html3} { + html {
    } + } else { + html "
    \n" + } + html { } } else { - html failed + 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 [join $hist($setNo,form,menu$i)] "=" + html $hist($setNo,form,entry$i) + set op $hist($setNo,form,logic$i) + } + } + if {$html3} { + html {

    } + } else { + html {} + } + 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 + html {} + if {$useIcons} { + html {Europagate} + } else { + html {Europagate | } + } +} + +proc button-define-target {more} { + global useIcons + global env + global sessionId + + html {} + } else { + html {">Define Target} + if {$more} { + html " | \n" + } else { + html "\n" + } + } +} + +proc button-new-target {more} { + global useIcons + global env + global sessionId + global mMode + + 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 + global mMode + + 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 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 last . $host] + if {$i > 1} { + incr i -1 + return [string range $host 0 $i] + } + return $host +} + +proc mergeHostSpec {host databases} { + return ${host}.[join $databases -] +}