{ # $Id: search.egw,v 1.7 1995/11/02 16:35:36 adam Exp $ proc search-response {sno} { global sessionWait set status [z39.$sno responseStatus] if {[lindex $status 0] == "NSD"} { z39.$sno nextResultSetPosition 0 set code [lindex $status 1] set msg [lindex $status 2] set addinfo [lindex $status 3] htmlr {Error} $code {: } $msg {: } $addinfo {
} set sessionWait -2 } else { set sessionWait 1 } } proc ok-response {} { global sessionWait set sessionWait 1 } proc fail-response {} { global sessionWait set sessionWait -1 } proc display-brief {zset no} { global env global setNo global sessionId 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}" } htmlr "${no} Error ${err}${add}
" return } if {$type != "DB"} { return } html "${no} " set rtype [$zset recordType $no] if {$rtype == "SUTRS"} { html [join [$zset getSutrs $no]] htmlr {
} 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 {} html " ${year} " } htmlr {
} } proc display-full {zset no} { 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}" } htmlr "
${no}
" htmlr "Error ${err}${add}
" return } if {$type != "DB"} { return } htmlr "
${no}
" set rtype [$zset recordType $no] if {$rtype == "SUTRS"} { htmlr [join [$zset getSutrs $no]] return } if {[catch {set r [$zset getMarc $no line * * *]}]} { htmlr "Unknown record type: $rtype" return } foreach line $r { set tag [lindex $line 0] set indicator [lindex $line 1] set fields [lindex $line 2] set l [string length $indicator] html "$tag " if {$l > 0} { for {set i 0} {$i < $l} {incr i} { if {[string index $tag $i] == " "} { html "_" } else { html [string index $tag $i] } } } foreach field $fields { set id [lindex $field 0] set data [lindex $field 1] if {$id != ""} { html " \$$id " } html $data } htmlr {
} } } proc display-rec {from to} { global setNo while {$from <= $to} { display-brief z39.$setNo $from incr from } } proc build-query {} { global targets global t set op {} set q {} for {set i 1} {$i < 4} {incr i} { 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] } } 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}" } } set op [wform logic$i] } } return $q } proc research {setNo oldHost piggy} { global hist global sessionWait set host $hist($setNo,host) if {[catch {z39 failback fail-response}]} { ir z39 } if {[catch {set oldHost [z39 connect]}]} { set oldHost "" } z39 callback ok-response z39 failback fail-response if {$oldHost != $host} { catch {z39 disconnect} html "Connecting to target " $host "
\n" set sessionWait 0 if {[catch {z39 connect $host}]} { htmlr "Cannot connect to target ${host}
" htmlr "" wabort } elseif {$sessionWait == 0} { zwait sessionWait if {$sessionWait != 1} { htmlr "Cannot connect to target ${host}
" htmlr "" wabort } } set sessionWait 0 z39 init zwait sessionWait if {$sessionWait != "1"} { htmlr "Cannot initialize with target ${host}
" htmlr "" wabort } } if {![catch {z39.$setNo smallSetUpperBound 0}]} { return } ir-set z39.$setNo z39 eval z39.$setNo databaseNames $hist($setNo,database) z39.$setNo preferredRecordSyntax USMARC z39 callback search-response $setNo if {$piggy} { z39.$setNo largeSetLowerBound 999999 z39.$setNo smallSetUpperBound 0 z39.$setNo mediumSetPresentNumber $hist($setNo,maxPresent) } else { z39.$setNo largeSetLowerBound 2 z39.$setNo smallSetUpperBound 0 z39.$setNo mediumSetPresentNumber 0 } set sessionWait 0 z39.$setNo search $hist($setNo,query) zwait sessionWait if {$sessionWait != 1} { htmlr {} wabort } } global sessionWait global nextSetNo global setNo global hist set oldHost $hist($setNo,host) if {[wform menu1] == ""} { html "state 1
\n" set setNo [lindex $sessionParms 0] } else { html "state 2
\n" if {![info exists hist($nextSetNo,host)]} { set hist($nextSetNo,host) $oldHost } set setNo $nextSetNo html "using host " $hist($setNo,host) " WWW/Z39.50 Gateway Search } $host { } htmlr {} html "

Search result

\n" wflush set startPos [lindex $sessionParms 1] set endPos [lindex $sessionParms 2] if {$startPos == ""} { research $setNo $oldHost 1 set r [z39.$setNo resultCount] html "

$r hits


\n" set setOffset [z39.$setNo numberOfRecordsReturned] display-rec 1 $setOffset wflush incr setOffset set setMax [z39.$setNo resultCount] if {$setMax > $hist($setNo,maxPresent)} { set setMax $hist($setNo,maxPresent) } } else { research $setNo $oldHost 0 set setOffset $startPos set setMax [z39.$setNo resultCount] if {$setMax > $endPos} { set setMax $endPos } } set toGet [expr 1 + $setMax - $setOffset] while {$toGet > 0} { for {set got 0} {$got < $toGet} {incr got} { if {[z39.$setNo type [expr $setOffset + $got]] == ""} { break } } if {$got < $toGet} { set sessionWait 0 z39.$setNo present $setOffset $toGet zwait sessionWait if {$sessionWait != "1"} { break } set got [z39.$setNo numberOfRecordsReturned] } display-rec $setOffset [expr $got + $setOffset - 1] set setOffset [expr $got + $setOffset] set toGet [expr 1 + $setMax - $setOffset] wflush } } { html "
\n" html "Debug information
\n" html "sessionId: $sessionId
\n" html "sessionParms: $sessionParms
\n" foreach e {SERVER_NAME PATH_INFO SCRIPT_NAME} { html $e {: } $env($e) {
} \n } html "form: " [wform] "
\n" html "target: " $host "
\n" html "databases: " $hist($setNo,database) "
\n" html "selected: " [wform base] "
\n" html "query: ->" $hist($setNo,query) "<-
" html "setNo: " $setNo "
\n" html "nextSetNo: " $nextSetNo "
\n" }
{ if {$setMax < [z39.$setNo resultCount]} { html { Next } "| \n" } if {$startPos != ""} { html { Prev } "| \n" } html { New target } " | \n" html { New query } }