X-Git-Url: http://git.indexdata.com/?p=simpleserver-moved-to-github.git;a=blobdiff_plain;f=SimpleServer.pm;h=77ad19e1786cb81a9e1bcca7c2e368ddc7e416bf;hp=b3cdd485f85bf30903caf5bc9a84ea611ab7ec0d;hb=8a007211f150a8f0752a0226efb340ccbfdbdf6b;hpb=cdc764afd8ddc92658f972fdccfa3349be97d403 diff --git a/SimpleServer.pm b/SimpleServer.pm index b3cdd48..77ad19e 100644 --- a/SimpleServer.pm +++ b/SimpleServer.pm @@ -1,5 +1,5 @@ ## This file is part of simpleserver -## Copyright (C) 2000-2011 Index Data. +## Copyright (C) 2000-2014 Index Data. ## All rights reserved. ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions are met: @@ -36,7 +36,7 @@ require AutoLoader; @ISA = qw(Exporter AutoLoader DynaLoader); @EXPORT = qw( ); -$VERSION = '1.13'; +$VERSION = '1.19'; bootstrap Net::Z3950::SimpleServer $VERSION; @@ -96,7 +96,9 @@ sub launch_server { if (defined($self->{DELETE})) { set_delete_handler($self->{DELETE}); } - + if (defined($self->{START})) { + set_start_handler($self->{START}); + } start_server(@args); } @@ -112,12 +114,19 @@ package Net::Z3950::RPN::Or; our @ISA = qw(Net::Z3950::RPN::Node); package Net::Z3950::RPN::AndNot; our @ISA = qw(Net::Z3950::RPN::Node); +package Net::Z3950::RPN::Prox; +our @ISA = qw(Net::Z3950::RPN::Node); package Net::Z3950::RPN::Term; our @ISA = qw(Net::Z3950::RPN::Node); package Net::Z3950::RPN::RSID; our @ISA = qw(Net::Z3950::RPN::Node); package Net::Z3950::RPN::Attributes; package Net::Z3950::RPN::Attribute; +package Net::Z3950::RPN::Prox::Attributes; +package Net::Z3950::FacetList; +package Net::Z3950::FacetField; +package Net::Z3950::FacetTerms; +package Net::Z3950::FacetTerm; # Utility method for re-rendering Type-1 query back down to PQF @@ -138,6 +147,9 @@ sub toPQF { return '@and ' . $this->[0]->toPQF() . ' ' . $this->[1]->toPQF(); } elsif ($class eq "Net::Z3950::RPN::AndNot") { return '@not ' . $this->[0]->toPQF() . ' ' . $this->[1]->toPQF(); + } elsif ($class eq "Net::Z3950::RPN::Prox") { + my $pattrs = $this->[3]; + return '@prox ' . $pattrs->{exclusion} . ' ' . $pattrs->{distance} . ' ' . $pattrs->{ordered} . ' ' . $pattrs->{relationType} . (defined $pattrs->{known} ? ' k ' . $pattrs->{known} : ' p ' . $pattrs->{zprivate}) . ' ' . $this->[0]->toPQF() . ' ' . $this->[1]->toPQF(); } elsif ($class eq "Net::Z3950::RPN::RSID") { return '@set ' . $this->{id}; } elsif ($class ne "Net::Z3950::RPN::Term") { @@ -223,7 +235,7 @@ Z39.50 is a network protocol for searching remote databases and retrieving the results in the form of structured "records". It is widely used in libraries around the world, as well as in the US Federal Government. In addition, it is generally useful whenever you wish to integrate a number -of different database systems around a shared, asbtract data model. +of different database systems around a shared, abstract data model. The model of the module is simple: It implements a "generic" Z39.50 server, which invokes callback functions supplied by you to search @@ -238,6 +250,7 @@ environments) whenever a new connection is received. The programmer can specify subroutines to take care of the following type of events: + - Start service (called once). - Initialize request - Search request - Present request @@ -260,6 +273,7 @@ The Perl programmer specifies the event handlers for the server by means of the SimpleServer object constructor my $z = new Net::Z3950::SimpleServer( + START => \&my_start_handler, INIT => \&my_init_handler, CLOSE => \&my_close_handler, SEARCH => \&my_search_handler, @@ -303,6 +317,23 @@ application invocation: In particular, you need to use the -T switch to start your SimpleServer in threaded mode. +=head2 Start handler + +The start handler is called when service is started. The argument hash +passed to the start handler has the form + + $args = { + CONFIG => "default-config" ## GFS config (as given by -c) + }; + + +The purpose of the start handler is to read the configuration file +for the Generic Frontend Server . This is specified by option -c. +If -c is omitted, the configuration file is set to "default-config". + +The start handler is optional. It is supported in Simpleserver 1.16 and +later. + =head2 Init handler The init handler is called whenever a Z39.50 client is attempting @@ -368,7 +399,7 @@ mous hash. The structure is the following: ## Response parameters: - ERR_CODE => 0, ## Error code (0=Succesful search) + ERR_CODE => 0, ## Error code (0=Successful search) ERR_STR => "", ## Error string HITS => 0 ## Number of matches }; @@ -433,7 +464,7 @@ representing the OID of the query's top-level attribute set. =item C -Mandatory: a refererence to the RPN tree itself. +Mandatory: a reference to the RPN tree itself. =back @@ -514,8 +545,8 @@ a ``relation'' attribute, etc. =item C An integer or string indicating the value of the attribute - for example, under -BIB-1, if the attribute type is 1, then value 4 indictates a title -search and 7 indictates an ISBN search; but if the attribute type is +BIB-1, if the attribute type is 1, then value 4 indicates a title +search and 7 indicates an ISBN search; but if the attribute type is 2, then value 4 indicates a ``greater than or equal'' search, and 102 indicates a relevance match. @@ -564,7 +595,7 @@ records are expected to be retrieved. If on the other hand, large result sets are likely to occur, the implementation of a reasonable present handler can gain performance significantly. -The informations exchanged between client and present handle are: +The information exchanged between client and present handle is: $args = { ## Client/server request: @@ -577,7 +608,7 @@ The informations exchanged between client and present handle are: NUMBER => yyy, ## Number of requested records - ## Respons parameters: + ## Response parameters: HITS => zzz, ## Number of returned records ERR_CODE => 0, ## Error code @@ -695,7 +726,7 @@ between two adjacent entries in the response. A better alternative to the TERM member is the the RPN member, which is a reference to a Net::Z3950::RPN::Term object -representing the scan cloause. The structure of that object is the +representing the scan clause. The structure of that object is the same as for Term objects included as part of the RPN tree passed to search handlers. This is more useful than the simple TERM because it includes attributes (e.g. access points associated with the term), @@ -703,7 +734,7 @@ which are discarded by the TERM element. =head2 Close handler -The argument hash recieved by the close handler has two elements only: +The argument hash received by the close handler has two elements only: $args = { ## Server provides: @@ -718,7 +749,7 @@ or something similar, this is the place to do it. =head2 Delete handler -The argument hash recieved by the delete handler has the following elements: +The argument hash received by the delete handler has the following elements: $args = { ## Client request: @@ -742,7 +773,7 @@ http://www.loc.gov/z3950/agency/markup/05.html#Delete-list-statuses1 =head2 Sort handler -The argument hash recieved by the sort handler has the following elements: +The argument hash received by the sort handler has the following elements: $args = { ## Client request: @@ -812,7 +843,7 @@ sort of title is requested. Precisely why all of the above is so is not clear, but goes some way to explain why, in the Z39.50 world, the developers of the standard -are not so much worshipped as blamed. +are not so much worshiped as blamed. The backend function should set STATUS to 0 on success, 1 for "partial success" (don't ask) or 2 on failure, in which case ERR_CODE and @@ -879,13 +910,13 @@ http://search.cpan.org/~esummers/CQL-Parser/ =head1 AUTHORS -Anders Sønderberg (sondberg@indexdata.dk), +Anders Sønderberg (sondberg@indexdata.dk), Sebastian Hammer (quinn@indexdata.dk), Mike Taylor (indexdata.com). =head1 COPYRIGHT AND LICENCE -Copyright (C) 2000-2011 by Index Data. +Copyright (C) 2000-2014 by Index Data. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.4 or,