]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm
added login session param for authentication
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Search / Z3950.pm
1 #!/usr/bin/perl
2 package OpenILS::Application::Search::Z3950;
3 use strict; use warnings;
4 use base qw/OpenSRF::Application/;
5
6
7 use Net::Z3950;
8 use MARC::Record;
9 use MARC::File::XML;
10 use OpenSRF::Utils::SettingsClient;
11
12 use OpenILS::Utils::FlatXML;
13 use OpenILS::Application::Cat::Utils;
14 use OpenILS::Application::AppUtils;
15
16 my $utils = "OpenILS::Application::Cat::Utils";
17 my $apputils = "OpenILS::Application::AppUtils";
18
19 use OpenILS::Utils::ModsParser;
20
21 my $output = "USMARC"; # only support output for now
22 my $host;
23 my $port;
24 my $database;
25 my $attr;
26 my $username;
27 my $password;
28
29 my $settings_client;
30
31 sub initialize {
32         $settings_client = OpenSRF::Utils::SettingsClient->new();
33         $host                   = $settings_client->config_value("z3950", "oclc", "host");
34         $port                   = $settings_client->config_value("z3950", "oclc", "port");
35         $database       = $settings_client->config_value("z3950", "oclc", "db");
36         $attr                   = $settings_client->config_value("z3950", "oclc", "attr");
37         $username       = $settings_client->config_value("z3950", "oclc", "username");
38         $password       = $settings_client->config_value("z3950", "oclc", "password");
39 }
40
41
42 __PACKAGE__->register_method(
43         method  => "z39_search_by_string",
44         api_name        => "open-ils.search.z3950.raw_string",
45 );
46
47 sub z39_search_by_string {
48
49         my( $self, $client, $server, 
50                         $port, $db, $search, $user, $pw ) = @_;
51
52         throw OpenSRF::EX::InvalidArg unless( 
53                         $server and $port and $db and $search);
54
55
56         warn "Z39.50 search for $search\n";
57
58         $user ||= "";
59         $pw     ||= "";
60
61         my $conn = new Net::Z3950::Connection(
62                 $server, $port, 
63                 databaseName                            => $db, 
64                 user                                                    => $user,
65                 password                                                => $pw,
66                 preferredRecordSyntax   => $output, 
67         );
68
69
70         my $rs = $conn->search( $search );
71         if(!$rs) {
72                 throw OpenSRF::EX::ERROR ("z39 search failed"); 
73         }
74
75         my $records = [];
76         my $hash = {};
77
78         $hash->{count} =  $rs->size();
79         warn "Z3950 Search recovered " . $hash->{count} . " records\n";
80
81         # until there is a more graceful way to handle this
82         if($hash->{count} > 20) { return $hash; }
83
84
85         for( my $x = 0; $x != $hash->{count}; $x++ ) {
86                 my $rec = $rs->record($x+1);
87                 my $marc = MARC::Record->new_from_usmarc($rec->rawdata());
88
89                 my $nodes = OpenILS::Utils::FlatXML->new()->xml_to_nodeset( $marc->as_xml() ); 
90                 warn "turning nodeset into tree\n";
91                 my $tree = $utils->nodeset2tree( $nodes->nodeset );
92
93                 push @$records, $tree;
94         }
95
96         $hash->{records} = $records;
97         return $hash;
98
99 }
100
101
102 __PACKAGE__->register_method(
103         method  => "import_search",
104         api_name        => "open-ils.search.z3950.import",
105 );
106
107 sub import_search {
108         my($self, $client, $user_session, $string) = @_;
109
110         my $user_obj = 
111                 $apputils->check_user_session( $user_session ); #throws EX on error
112
113         return $self->z39_search_by_string(
114                 $client, $host, $port, $database, 
115                         "\@attr 1=$attr \"$string\"", $username, $password );
116 }
117
118
119
120
121 1;