Add support for Type-1's proximity operator
[simpleserver-moved-to-github.git] / SimpleServer.pm
index 05d90f7..77ad19e 100644 (file)
@@ -1,31 +1,28 @@
+## This file is part of simpleserver
+## 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:
 ##
-##  Copyright (c) 2000-2006, Index Data.
-##
-##  Permission to use, copy, modify, distribute, and sell this software and
-##  its documentation, in whole or in part, for any purpose, is hereby granted,
-##  provided that:
-##
-##  1. This copyright and permission notice appear in all copies of the
-##  software and its documentation. Notices of copyright or attribution
-##  which appear at the beginning of any file must remain unchanged.
-##
-##  2. The name of Index Data or the individual authors may not be used to
-##  endorse or promote products derived from this software without specific
-##  prior written permission.
-##
-##  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
-##  EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
-##  WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-##  IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
-##  INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
-##  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
-##  NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
-##  LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-##  OF THIS SOFTWARE.
-##
+##     * Redistributions of source code must retain the above copyright
+##       notice, this list of conditions and the following disclaimer.
+##     * Redistributions in binary form must reproduce the above copyright
+##       notice, this list of conditions and the following disclaimer in the
+##       documentation and/or other materials provided with the distribution.
+##     * Neither the name of Index Data nor the names of its contributors
+##       may be used to endorse or promote products derived from this
+##       software without specific prior written permission.
 ##
-
-## $Id: SimpleServer.pm,v 1.50 2010-02-04 16:30:40 mike Exp $
+## THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+## DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+## DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+## THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 package Net::Z3950::SimpleServer;
 
@@ -39,7 +36,7 @@ require AutoLoader;
 
 @ISA = qw(Exporter AutoLoader DynaLoader);
 @EXPORT = qw( );
-$VERSION = '1.13';
+$VERSION = '1.19';
 
 bootstrap Net::Z3950::SimpleServer $VERSION;
 
@@ -99,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);
 }
 
@@ -115,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
@@ -141,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") {
@@ -241,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
@@ -263,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,
@@ -306,6 +317,23 @@ application invocation: <http://indexdata.com/yaz/doc/server.invocation.tkl>
 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
@@ -882,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-2009 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,