--- zoom.sql 2007/04/26 20:21:36 3 +++ zoom.sql 2007/04/26 21:45:09 8 @@ -7,7 +7,11 @@ ); -- insert sample -insert into servers values ( 'NSK', '161.53.240.27', 8090, 'voyager' ); +insert into servers values ( 'nsk', '161.53.240.27', 8090, 'voyager' ); +insert into servers values ( 'nsk-en', '161.53.240.27', 8190, 'voyager' ); +insert into servers values ( 'loc', 'z3950.loc.gov', 7090, 'Voyager' ); +insert into servers values ( 'ucs', 'library.usc.edu', 2200, 'unicorn' ); +--insert into servers values ( '', '', , '' ); create type item as ( title text, @@ -16,15 +20,27 @@ date text ); -create or replace function search(text) +create or replace function search(text,text) returns setof item language plperlu as $$ -my ( $query ) = @_; +my $debug = 0; +my $max_res = 100; -my ( $host, $port, $database ) = - ( '161.53.240.27', 8090, 'voyager' ); +my ( $server, $query ) = @_; + +my $rv = spi_exec_query(qq{ + select host,port,database from servers where name ilike '$server' +},1); + +die "can't find server $server in table servers\n" unless ( $rv->{processed} == 1 ); + +my ( $host, $port, $database ) = ( + $rv->{rows}[0]->{host}, + $rv->{rows}[0]->{port}, + $rv->{rows}[0]->{database}, +); use ZOOM; use MARC::Record; @@ -52,15 +68,28 @@ $conn->option(preferredRecordSyntax => "usmarc"); -my $cqf = q2cqf( $query ); +my $rs; -my $rs = $conn->search_pqf( $cqf ); +my $notice; + +if ( $query =~ m/[\s="]|(and|or|not)/ ) { + $rs = $conn->search( new ZOOM::Query::CQL( $query ) ); + $notice = 'CQL'; +} else { + my $cqf = q2cqf( $query ); + $notice = "CQF: $cqf"; + $rs = $conn->search_pqf( $cqf ); +} my $n = $rs->size(); +if ( $n > $max_res ) { + warn "query returned $n results, fetching first $max_res\n"; + $n = $max_res; +} # fetch all results $rs->records(0, $n - 1, 0); -warn "$n results for '$query' [$cqf]\n"; +warn "$n results for '$query' $notice\n"; sub strip_non_digit { my $d = shift; @@ -82,7 +111,7 @@ $t =~ s/éZ/®/g; $t =~ s/éS/©/g; $t =~ s/£/Ð/g; - warn "## $t\n"; + warn "## $t\n" if $debug; # $t = decode('iso-8859-2', $t); # return encode('utf-8',$t); return $t; @@ -110,5 +139,8 @@ -- select * from search('title:djece'); -- select * from search('osman'); -select * from search('title:mor'); -select * from search('grada'); +--select * from search('nsk','title:mor'); +--select * from search('nsk','grada'); +--select * from search('nsk-en','restrictions'); + +--select * from search('ucs','human');