/[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 2 - (hide annotations)
Thu Apr 26 19:25:45 2007 UTC (17 years ago) by dpavlin
File size: 2147 byte(s)
first try at (partly) fixing broken NSK encoding
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     $t =~ s/és/¹/g;
78     $t =~ s/éz/¾/g;
79     $t =~ s/éC/È/g;
80     $t =~ s/âC/Æ/g;
81     $t =~ s/éS/©/g;
82     $t =~ s/éZ/®/g;
83     $t =~ s/£/Ð/g;
84     warn "## $t\n";
85     # $t = decode('iso-8859-2', $t);
86     # return encode('utf-8',$t);
87     return $t;
88     }
89    
90 dpavlin 1 foreach my $i ( 1 .. $n ) {
91     my $marc = new_from_usmarc MARC::Record( $rs->record( $i - 1 )->raw() );
92    
93     return_next({
94 dpavlin 2 title => e( $marc->title ),
95     author => e( $marc->author ),
96     edition => e( $marc->edition ),
97     date => strip_non_digit( $marc->publication_date ),
98 dpavlin 1 });
99     }
100    
101     return undef;
102    
103     $$;
104    
105     -- if your terminal isn't iso-8859-2, change this!
106 dpavlin 2 -- set client_encoding = 'iso-8859-2';
107 dpavlin 1
108 dpavlin 2 -- example
109     -- select * from search('title:djece');
110     -- select * from search('osman');
111    
112     select * from search('title:mor');

  ViewVC Help
Powered by ViewVC 1.1.26