/[pg-zoom]/zoom.sql
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /zoom.sql

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (hide annotations)
Thu Apr 26 20:57:14 2007 UTC (17 years ago) by dpavlin
File size: 3215 byte(s)
limit maximum number of records fetched from Z39.50 server to $max_res (100 by
default)
1 dpavlin 1 create table servers (
2     name text not null,
3     host text not null,
4     port int not null default 210,
5     database text default 'Default',
6     primary key(name)
7     );
8    
9     -- insert sample
10 dpavlin 5 insert into servers values ( 'nsk', '161.53.240.27', 8090, 'voyager' );
11     insert into servers values ( 'nsk-en', '161.53.240.27', 8190, 'voyager' );
12     insert into servers values ( 'loc', 'z3950.loc.gov', 7090, 'Voyager' );
13     insert into servers values ( 'ucs', 'library.usc.edu', 2200, 'unicorn' );
14     insert into servers values ( 'tera', 'z3950.inquirion.com', 210, 'Marc' );
15     insert into servers values ( 'cosmo', 'rlw.savba.sk', 8888, 'test_un_cat' );
16     insert into servers values ( 'copac', 'z3950.copac.ac.uk', 2020, 'xxdefault' );
17     --insert into servers values ( 'wcat', 'tikal.dev.oclc.org', 210, 'WorldCat' );
18     --insert into servers values ( '', '', , '' );
19 dpavlin 1
20     create type item as (
21     title text,
22     author text,
23     edition text,
24     date text
25     );
26    
27 dpavlin 4 create or replace function search(text,text)
28 dpavlin 1 returns setof item
29     language plperlu
30     as $$
31    
32 dpavlin 4 my $debug = 0;
33 dpavlin 6 my $max_res = 100;
34 dpavlin 1
35 dpavlin 4 my ( $server, $query ) = @_;
36 dpavlin 1
37 dpavlin 4 my $rv = spi_exec_query(qq{
38     select host,port,database from servers where name ilike '$server'
39     },1);
40    
41     die "can't find database $database\n" unless ( $rv->{processed} == 1 );
42    
43     my ( $host, $port, $database ) = (
44     $rv->{rows}[0]->{host},
45     $rv->{rows}[0]->{port},
46     $rv->{rows}[0]->{database},
47     );
48    
49 dpavlin 1 use ZOOM;
50     use MARC::Record;
51 dpavlin 2 use Encode qw/encode decode/;
52 dpavlin 1
53     my $pqf = {
54     isbn => '@attr 1=7 @attr 4=1 "%s"',
55     title => '@attr 1=4 @attr 4=1 "%s"',
56     author => '@attr 1=1003 @attr 4=1 "%s"',
57     issn => '@attr 1=8 @attr 4=1 "%s"',
58     };
59    
60     sub q2cqf {
61     my $q = shift;
62     if ($q =~ m/^(\w+):\s*(.*)$/) {
63     my ( $k,$v ) = ( $1,$2 );
64     return sprintf( $pqf->{ $k }, $v ) if ( defined( $pqf->{ $k } ) );
65     }
66     return $q;
67     }
68    
69     my $conn = new ZOOM::Connection($host, $port,
70     databaseName => $database) or
71     die "can't connect to ${host}:${port}/${database}\n";
72    
73     $conn->option(preferredRecordSyntax => "usmarc");
74    
75 dpavlin 2 my $cqf = q2cqf( $query );
76 dpavlin 1
77 dpavlin 2 my $rs = $conn->search_pqf( $cqf );
78    
79 dpavlin 1 my $n = $rs->size();
80 dpavlin 6 if ( $n > $max_res ) {
81     warn "query returned $n results, fetching first $max_res\n";
82     $n = $max_res;
83     }
84 dpavlin 1 # fetch all results
85     $rs->records(0, $n - 1, 0);
86    
87 dpavlin 2 warn "$n results for '$query' [$cqf]\n";
88 dpavlin 1
89 dpavlin 2 sub strip_non_digit {
90     my $d = shift;
91     $d =~ s/^\D+//;
92     $d =~ s/\D+$//;
93     return $d;
94     }
95    
96     # fix encoding
97     sub e {
98     my $t = shift;
99     $t =~ s/éc/è/g;
100     $t =~ s/âc/æ/g;
101 dpavlin 3 $t =~ s/éz/¾/g;
102 dpavlin 2 $t =~ s/és/¹/g;
103 dpavlin 3 $t =~ s/³/ð/g;
104 dpavlin 2 $t =~ s/éC/È/g;
105     $t =~ s/âC/Æ/g;
106 dpavlin 3 $t =~ s/éZ/®/g;
107 dpavlin 2 $t =~ s/éS/©/g;
108     $t =~ s/£/Ð/g;
109 dpavlin 4 warn "## $t\n" if $debug;
110 dpavlin 2 # $t = decode('iso-8859-2', $t);
111     # return encode('utf-8',$t);
112     return $t;
113     }
114    
115 dpavlin 1 foreach my $i ( 1 .. $n ) {
116     my $marc = new_from_usmarc MARC::Record( $rs->record( $i - 1 )->raw() );
117    
118     return_next({
119 dpavlin 2 title => e( $marc->title ),
120     author => e( $marc->author ),
121     edition => e( $marc->edition ),
122     date => strip_non_digit( $marc->publication_date ),
123 dpavlin 1 });
124     }
125    
126     return undef;
127    
128     $$;
129    
130     -- if your terminal isn't iso-8859-2, change this!
131 dpavlin 2 -- set client_encoding = 'iso-8859-2';
132 dpavlin 1
133 dpavlin 2 -- example
134     -- select * from search('title:djece');
135     -- select * from search('osman');
136    
137 dpavlin 4 select * from search('NSK','title:mor');
138     select * from search('NSK','grada');
139     select * from search('nsk-en','restrictions');

  ViewVC Help
Powered by ViewVC 1.1.26