Add support for Type-1's proximity operator
[simpleserver-moved-to-github.git] / SimpleServer.pm
index b3cdd48..77ad19e 100644 (file)
@@ -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: <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
@@ -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<query>
 
-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<attributeValue>
 
 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,