Rolling, so Seb can have all my recent changes.
[ZOOM-Perl-moved-to-github.git] / lib / ZOOM.pod
index b626bf6..f4220d6 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: ZOOM.pod,v 1.12 2005-11-26 16:59:53 mike Exp $
+# $Id: ZOOM.pod,v 1.17 2005-12-13 14:40:47 mike Exp $
 
 use strict;
 use warnings;
@@ -247,27 +247,9 @@ Objects of the Connection, ResultSet, ScanSet and Package classes
 carry with them a set of named options which affect their behaviour in
 certain ways.  See the ZOOM-C options documentation for details:
 
-=over 4
-
-=item *
-
 Connection options are listed at
 http://indexdata.com/yaz/doc/zoom.tkl#zoom.connections
 
-=item *
-
-ScanSet options are listed at
-http://indexdata.com/yaz/doc/zoom.scan.tkl
-I<### move this obvservation down to the appropriate place>
-
-=item *
-
-Package options are listed at
-http://indexdata.com/yaz/doc/zoom.ext.html
-I<### move this obvservation down to the appropriate place>
-
-=back
-
 These options are set and fetched using the C<option()> method, which
 may be called with either one or two arguments.  In the two-argument
 form, the option named by the first argument is set to the value of
@@ -424,9 +406,9 @@ http://zoom.z3950.org/api/zoom-current.html#3.4
 
 =head4 option()
 
- $conn->option(elementSetName => "f");
+ $rs->option(elementSetName => "f");
 
-Allows options to be set into, and read from a ResultSet, just like
+Allows options to be set into, and read from, a ResultSet, just like
 the Connection class's C<option()> method.  There is no
 C<option_binary()> method for ResultSet objects.
 
@@ -439,7 +421,7 @@ http://indexdata.com/yaz/doc/zoom.resultsets.tkl
 
 Returns the number of records in the result set.
 
-=head4 record(), record_immediate()
+=head4 record() / record_immediate()
 
  $rec = $rs->record(0);
  $rec2 = $rs->record_immediate(0);
@@ -489,7 +471,7 @@ efficiency gain to be had by passing 0.)
 Once the records have been retrieved from the server
 (i.e. C<records()> has completed without throwing an exception), they
 can be fetched much more efficiently using C<record()> - or
-C<record_immediate(), which is then guaranteed to succeed.
+C<record_immediate()>, which is then guaranteed to succeed.
 
 =head4 cache_reset()
 
@@ -726,29 +708,233 @@ http://zoom.z3950.org/api/zoom-current.html#3.6
 
  print "Found ", $ss->size(), " terms\n";
 
-Returns the number of terms in the scan set.
-### describe option that affects this.
+Returns the number of terms in the scan set.  In general, this will be
+the scan-set size requested by the C<number> option in the Connection
+on which the scan was performed [default 10], but it may be fewer if
+the scan is close to the end of the index.
 
 =head4 term() / display_term()
 
-I<###>
+ $ss = $conn->scan('@attr 1=1004 whatever');
+ ($term, $occurrences) = $ss->term(0);
+ ($displayTerm, $occurrences2) = $ss->display_term(0);
+ assert($occurrences == $occurrences2);
+ if (user_likes_the_look_of($displayTerm)) {
+     $rs = $conn->search_pqf('@attr 1=4 "' . $term . '"');
+     assert($rs->size() == $occurrences);
+ }
+
+These methods return the scanned terms themselves.  C<term()> returns
+the term is a form suitable for submitting as part of a query, whereas
+C<display_term()> returns it in a form suitable for displaying to a
+user.  Both versions also return the number of occurrences of the term
+in the index, i.e. the number of hits that will be found if the term
+is subsequently used in a query.
+
+In most cases, the term and display term will be identical; however,
+they may be different in cases where punctuation or case is
+normalised, or where identifiers rather than the original document
+terms are indexed.
 
 =head4 option()
 
-I<###>
+ print "scan status is ", $ss->option("scanStatus");
+
+Allows options to be set into, and read from, a ScanSet, just like
+the Connection class's C<option()> method.  There is no
+C<option_binary()> method for ScanSet objects.
+
+ScanSet options are also described, though not particularly
+informatively, at
+http://indexdata.com/yaz/doc/zoom.scan.tkl
 
 =head4 destroy()
 
-I<###>
+ $ss->destroy()
+
+Destroys a ScanSet object, freeing its resources.  It is an error to
+reuse a ScanSet that has been C<destroy()>ed.
 
 =head2 ZOOM::Package
 
-I<###>
+ $p = $conn->package();
+ $p->option(action => "specialUpdate");
+ $p->option(recordIdOpaque => 145);
+ $p->option(record => content_of("/tmp/record.xml"));
+ $p->send("update");
+ $p->destroy();
+
+This class represents an Extended Services Package: an instruction to
+the server to do something not covered by the core parts of the Z39.50
+standard (or the equivalent in SRW or SRU).  Since the core protocols
+are read-only, such requests are often used to make changes to the
+database, such as in the record update example above.
+
+Requesting an extended service is a four-step process: first, create a
+package associated with the connection to the relevant database;
+second, set options on the package to instruct the server on what to
+do; third, send the package (which may result in an exception being
+thrown if the server cannot execute the requested operations; and
+finally, destroy the package.
+
+Package options are listed at
+http://indexdata.com/yaz/doc/zoom.ext.html
+
+The particular options that have meaning are determined by the
+top-level operation string specified as the argument to C<send()>.
+For example, when the operation is C<update> (the most commonly used
+extended service), the C<action> option may be set to any of
+C<recordInsert>
+(add a new record, failing if that record already exists),
+C<recordDelete>
+(delete a record, failing if it is not in the database).
+C<recordReplace>
+(replace a record, failing if an old version is not already present)
+or
+C<specialUpdate>
+(add a record, replacing any existing version that may be present).
+
+For update, the C<record> option should be set to the full text of the
+XML record to added, deleted or replaced.  Depending on how the server
+is configured, it may extract the record's unique ID from the text
+(i.e. from a known element such as the C<001> field of a MARCXML
+record), or it may require the unique ID to passed in explicitly using
+the C<recordIdOpaque> option.
+
+Extended services packages are B<not currently described> in the ZOOM
+Abstract API at
+http://zoom.z3950.org/api/zoom-current.html
+They will be added in a forthcoming version, and will function much
+as those implemented in this module.
+
+=head3 Methods
+
+=head4 option()
+
+ $p->option(recordIdOpaque => "46696f6e61");
+
+Allows options to be set into, and read from, a Package, just like
+the Connection class's C<option()> method.  There is no
+C<option_binary()> method for Package objects.
+
+Package options are listed at
+http://indexdata.com/yaz/doc/zoom.ext.tkl
+
+=head4 send()
+
+ $p->send("createdb");
+
+Sends a package to the server associated with the Connection that
+created it.  Problems are reported by throwing an exception.  The
+single parameter indicates the operation that the server is being
+requested to perform, and controls the interpretation of the package's
+options.  Valid operations include:
+
+=over 4
+
+=item itemorder
+
+Request a copy of a nominated object, e.g. place an ILL request.
+
+=item create
+
+Create a new database, the name of which is specified by the
+C<databaseName> option.
+
+=item drop
+
+Drop an existing database, the name of which is specified by the
+C<databaseName> option.
+
+=item commit
+
+Commit changes made to the database within a transaction.
+
+=item update
+
+Modify the contents of the database by adding, deleting or replacing
+records (as described above in the overview of the C<ZOOM::Package>
+class).
+
+=item xmlupdate
+
+I have no idea what this does.
+
+=back
+
+Although the module is capable of I<making> all these requests, not
+all servers are capable of I<executing> them.  Refusal is indicated by
+throwing an exception.  Problems may also be caused by lack of
+privileges; so C<send()> must be used with caution, and is perhaps
+best wrapped in a clause that checks for execptions, like so:
+
+ eval { $p->send("create") };
+ if ($@ && $@->isa("ZOOM::Exception")) {
+     print "Oops!  ", $@->message(), "\n";
+     return $@->code();
+ }
+
+=head4 destroy()
+
+ $p->destroy()
+
+Destroys a Package object, freeing its resources.  It is an error to
+reuse a Package that has been C<destroy()>ed.
 
 =head2 ZOOM::Query
 
+ $q = new ZOOM::Query::CQL("creator=pike and subject=unix");
+ $rs = $conn->search($q);
+ $q->destroy();
+
+C<ZOOM::Query> is a virtual base class from which various concrete
+subclasses can be derived.  Different subclasses implement different
+types of query.  The sole purpose of a Query object is to be used in a
+C<search()> on a Connection; because PQF is such a common special
+case, the shortcut Connection method C<search_pqf()> is provided.
+
+The following Query subclasses are provided, both of the providing the
+same set of methods described below:
+
+=over 4
+
+=item ZOOM::Query::PQF
+
+Implements Prefix Query Format (PQF), also sometimes known as Prefix
+Query Notation (PQN).  This esoteric but rigorous and expressive
+format is described in the YAZ Manual at
+http://indexdata.com/yaz/doc/tools.tkl#PQF
+
+=item ZOOM::Query::CQL
+
+Implements the Common Query Language (CQL) of SRU, the Search/Retrieve
+URL.  CQL is a much friendlier notation than PQF, using a simple infix
+notation.  The queries are passed ``as is'' to the server rather than
+being compiled into a Z39.50 Type-1 query, so only CQL-compliant
+servers can support such querier.  CQL is described at
+http://www.loc.gov/standards/sru/cql/
+and in a slight out-of-date but nevertheless useful tutorial at
+http://zing.z3950.org/cql/intro.html
+
+=back
+
+=head3 Methods
+
+=head4 new()
+
+Creates a new query object, 
+
+=head4 sortby()
+
 I<###>
 
+=head4 destroy()
+
+ $p->destroy()
+
+Destroys a Query object, freeing its resources.  It is an error to
+reuse a Query that has been C<destroy()>ed.
+
 =head2 ZOOM::Options
 
 I<###>