/[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 3 - (hide annotations)
Thu Apr 26 20:21:36 2007 UTC (17 years ago) by dpavlin
File size: 2194 byte(s)
added missing letter
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     insert into servers values ( 'NSK', '161.53.240.27', 8090, 'voyager' );
11    
12     create type item as (
13     title text,
14     author text,
15     edition text,
16     date text
17     );
18    
19     create or replace function search(text)
20     returns setof item
21     language plperlu
22     as $$
23    
24     my ( $query ) = @_;
25    
26     my ( $host, $port, $database ) =
27     ( '161.53.240.27', 8090, 'voyager' );
28    
29     use ZOOM;
30     use MARC::Record;
31 dpavlin 2 use Encode qw/encode decode/;
32 dpavlin 1
33     my $pqf = {
34     isbn => '@attr 1=7 @attr 4=1 "%s"',
35     title => '@attr 1=4 @attr 4=1 "%s"',
36     author => '@attr 1=1003 @attr 4=1 "%s"',
37     issn => '@attr 1=8 @attr 4=1 "%s"',
38     };
39    
40     sub q2cqf {
41     my $q = shift;
42     if ($q =~ m/^(\w+):\s*(.*)$/) {
43     my ( $k,$v ) = ( $1,$2 );
44     return sprintf( $pqf->{ $k }, $v ) if ( defined( $pqf->{ $k } ) );
45     }
46     return $q;
47     }
48    
49     my $conn = new ZOOM::Connection($host, $port,
50     databaseName => $database) or
51     die "can't connect to ${host}:${port}/${database}\n";
52    
53     $conn->option(preferredRecordSyntax => "usmarc");
54    
55 dpavlin 2 my $cqf = q2cqf( $query );
56 dpavlin 1
57 dpavlin 2 my $rs = $conn->search_pqf( $cqf );
58    
59 dpavlin 1 my $n = $rs->size();
60     # fetch all results
61     $rs->records(0, $n - 1, 0);
62    
63 dpavlin 2 warn "$n results for '$query' [$cqf]\n";
64 dpavlin 1
65 dpavlin 2 sub strip_non_digit {
66     my $d = shift;
67     $d =~ s/^\D+//;
68     $d =~ s/\D+$//;
69     return $d;
70     }
71    
72     # fix encoding
73     sub e {
74     my $t = shift;
75     $t =~ s/éc/è/g;
76     $t =~ s/âc/æ/g;
77 dpavlin 3 $t =~ s/éz/¾/g;
78 dpavlin 2 $t =~ s/és/¹/g;
79 dpavlin 3 $t =~ s/³/ð/g;
80 dpavlin 2 $t =~ s/éC/È/g;
81     $t =~ s/âC/Æ/g;
82 dpavlin 3 $t =~ s/éZ/®/g;
83 dpavlin 2 $t =~ s/éS/©/g;
84     $t =~ s/£/Ð/g;
85     warn "## $t\n";
86     # $t = decode('iso-8859-2', $t);
87     # return encode('utf-8',$t);
88     return $t;
89     }
90    
91 dpavlin 1 foreach my $i ( 1 .. $n ) {
92     my $marc = new_from_usmarc MARC::Record( $rs->record( $i - 1 )->raw() );
93    
94     return_next({
95 dpavlin 2 title => e( $marc->title ),
96     author => e( $marc->author ),
97     edition => e( $marc->edition ),
98     date => strip_non_digit( $marc->publication_date ),
99 dpavlin 1 });
100     }
101    
102     return undef;
103    
104     $$;
105    
106     -- if your terminal isn't iso-8859-2, change this!
107 dpavlin 2 -- set client_encoding = 'iso-8859-2';
108 dpavlin 1
109 dpavlin 2 -- example
110     -- select * from search('title:djece');
111     -- select * from search('osman');
112    
113     select * from search('title:mor');
114 dpavlin 3 select * from search('grada');

  ViewVC Help
Powered by ViewVC 1.1.26