Finished section on the Connection class
[ZOOM-Perl-moved-to-github.git] / lib / ZOOM.pod
index da85d4a..a57b3b9 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: ZOOM.pod,v 1.4 2005-11-16 14:54:43 mike Exp $
+# $Id: ZOOM.pod,v 1.9 2005-11-17 15:31:06 mike Exp $
 
 use strict;
 use warnings;
@@ -109,7 +109,6 @@ relevant section of the ZOOM Abstract API.
  $conn = new ZOOM::Connection("indexdata.dk:210/gils");
  print("server is '", $conn->option("serverImplementationName"), "'\n");
  $conn->option(preferredRecordSyntax => "usmarc");
- $conn->option_binary(iconBlob => "foo\0bar");
  $rs = $conn->search_pqf('@attr 1=4 mineral');
  $ss = $conn->scan('@attr 1=1003 a');
  if ($conn->errcode() != 0) {
@@ -136,25 +135,244 @@ http://zoom.z3950.org/api/zoom-current.html#3.2
 =head4 new()
 
  $conn = new ZOOM::Connection("indexdata.dk", 210);
- $conn = new ZOOM::Connection("indexdata.dk/gils:210");
- $conn = new ZOOM::Connection("tcp:indexdata.dk/gils:210");
- $conn = new ZOOM::Connection("http:indexdata.dk/gils:210");
+ $conn = new ZOOM::Connection("indexdata.dk:210/gils");
+ $conn = new ZOOM::Connection("tcp:indexdata.dk:210/gils");
+ $conn = new ZOOM::Connection("http:indexdata.dk:210/gils");
 
-I<###>
+Creates a new Connection object, and immediately connects it to the
+specified server.  If you want to make a new Connection object but
+delay forging the connection, use the C<create()> and C<connect()>
+methods instead.
+
+This constructor can be called with two arguments or a single
+argument.  In the former case, the arguments are the name and port
+number of the Z39.50 server to connect to; in the latter case, the
+single argument is a YAZ service-specifier string of the form
+
+=over 4
+
+=item
+
+[I<scheme>:]I<host>[:I<port>][/I<databaseName>]
+
+=back
+
+In which the I<host> and I<port> parts are as in the two-argument
+form, the I<databaseName> if provided specifies the name of the
+database to be used in subsequent searches on this connection, and the
+optional I<scheme> (default C<tcp>) indicates what protocol should be
+used.  At present, the following schemes are supported:
+
+=over 4
+
+=item tcp
+
+Z39.50 connection.
+
+=item ssl
+
+Z39.50 connection encrypted using SSL (Secure Sockets Layer).  Not
+many servers support this, but Index Data's Zebra is one that does.
+
+=item unix
+
+Z39.50 connection on a Unix-domain (local) socket, in which case the
+I<hostname> portion of the string is instead used as a filename in the
+local filesystem.
+
+=item http
+
+SRW connection using SOAP over HTTP.
+
+=back
+
+Support for SRU will follow in the fullness of time.
+
+If an error occurs, an exception is thrown.  This may indicate a
+networking problem (e.g. the host is not found or unreachable), or a
+protocol-level problem (e.g. a Z39.50 server rejected the Init
+request).
+
+=head4 create() / connect()
+
+ $options = new ZOOM::Options();
+ $options->option(implementationName => "my client");
+ $conn = create ZOOM::Connection($options)
+ $conn->connect($host, 0);
+
+The usual Connection constructor, C<new()> brings a new object into
+existence and forges the connection to the server all in one
+operation, which is often what you want.  For applications that need
+more control, however, these two method separate the two steps,
+allowing additional steps in between such as the setting of options.
+
+C<create()> creates and returns a new Connection object, which is
+I<not> connected to any server.  It may be passed an options block, of
+type C<ZOOM::Options> (see below), into which options may be set
+before or after the creation of the Connection.  The connection to the
+server may then be forged by the C<connect()> method, the arguments of
+which are the same as those of the C<new()> constructor.
+
+=head4 error_x() / errcode() / errmsg() / addinfo() / diagset()
+
+ ($errcode, $errmsg, $addinfo, $diagset) = $conn->error_x();
+ $errcode = $conn->errcode();
+ $errmsg = $conn->errmsg();
+ $addinfo = $conn->addinfo();
+ $diagset = $conn->diagset();
+
+These methods may be used to obtain information about the last error
+to have occurred on a connection - although typically they will not
+been used, as the same information is available through the
+C<ZOOM::Exception> that is thrown when the error occurs.  The
+C<errcode()>,
+C<errmsg()>,
+C<addinfo()>
+and
+C<diagset()>
+methods each return one element of the diagnostic, and
+C<error_x()>
+returns all four at once.
+
+See the C<ZOOM::Exception> for the interpretation of these elements.
+
+=head4 option() / option_binary()
+
+ print("server is '", $conn->option("serverImplementationName"), "'\n");
+ $conn->option(preferredRecordSyntax => "usmarc");
+ $conn->option_binary(iconBlob => "foo\0bar");
+ die if length($conn->option_binary("iconBlob") != 7);
+
+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 *
 
-create
-connect
-error_x
-errcode
-errmsg
-addinfo
-option
-option_binary
-search
-search_pqf
-scan
-package
-destroy
+Connection options are listed at
+http://indexdata.com/yaz/doc/zoom.tkl#zoom.connections
+
+=item *
+
+ResultSet options are listed at
+http://indexdata.com/yaz/doc/zoom.resultsets.tkl
+I<### move this obvservation down to the appropriate place>
+
+=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
+the second argument, and its old value is returned.  In the
+one-argument form, the value of the specified option is returned.
+
+For historical reasons, option values are not binary-clean, so that a
+value containing a NUL byte will be returned in truncated form.  The
+C<option_binary()> method behaves identically to C<option()> except
+that it is binary-clean, so that values containing NUL bytes are set
+and returned correctly.
+
+=head4 search() / search_pqf()
+
+ $rs = $conn->search(new ZOOM::Query::CQL('title=dinosaur'));
+ # The next two lines are equivalent
+ $rs = $conn->search(new ZOOM::Query::PQF('@attr 1=4 dinosaur'));
+ $rs = $conn->search_pqf('@attr 1=4 dinosaur');
+
+The principal purpose of a search-and-retrieve protocol is searching
+(and, er, retrieval), so the principal method used on a Connection
+object is C<search()>.  It accepts a single argument, a C<ZOOM::Query>
+object (or, more precisely, an object of a subclass of this class);
+and it creates and returns a new ResultSet object representing the set
+of records resulting from the search.
+
+Since queries using PQF (Prefix Query Format) are so common, we make
+them a special case by providing a C<search_prefix()> method.  This is
+identical to C<search()> except that it accepts a string containing
+the query rather than an object, thereby obviating the need to create
+a C<ZOOM::Query::PQF> object.  See the documentation of that class for
+information about PQF.
+
+=head4 scan()
+
+Many Z39.50 servers allow you to browse their indexes to find terms to
+search for.  This is done using the C<scan> method, which creates and
+returns a new ScanSet object representing the set of terms resulting
+from the scan.
+
+C<scan()> takes a single argument, but it has to work hard: it
+specifies both what index to scan for terms, and where in the index to
+start scanning.  What's more, the specification of what index to scan
+includes multiple facets, such as what database fields it's an index
+of (author, subject, title, etc.) and whether to scan for whole fields
+or single words (e.g. the title ``I<The Empire Strikes Back>'', or the
+four words ``Back'', ``Empire'', ``Strikes'' and ``The'', interleaved
+with words from other titles in the same index.
+
+All of this is done by using a single term from the PQF query as the
+C<scan()> argument.  (At present, only PQF is supported, although
+there is no reason in principle why CQL and other query syntaxes
+should not be supported in future).  The attributes associated with
+the term indicate which index is to be used, and the term itself
+indicates the point in the index at which to start the scan.  For
+example, if the argument is C<@attr 1=4 fish>, then
+
+=over 4
+
+=item @attr 1=4
+
+This is the BIB-1 attribute with type 1 (meaning access-point, which
+specifies an index), and type 4 (which means ``title'').  So the scan
+is in the title index.
+
+=item fish
+
+Start the scan from the lexicographically earliest term that is equal
+to or falls after ``fish''.
+
+=back
+
+The argument C<@attr 1=4 @attr 6=3 fish> would behave similarly; but
+the BIB-1 attribute 6=3 mean completeness=``complete field'', so the
+scan would be for complete titles rather than for words occurring in
+titles.
+
+This takes a bit of getting used to.
+
+I<###> discuss how the values of options affect scanning.
+
+=head4 package()
+
+ $p = $conn->package();
+ $o = new ZOOM::Options();
+ $o->option(databaseName => "newdb");
+ $p = $conn->package($o);
+
+Creates and returns a new C<ZOOM::Package>, to be used in invoking an
+Extended Service.  An options block may optionally be passed in.  See
+the C<ZOOM::Package> documentation.
+
+=head4 destroy()
+
+ $conn->destroy()
+
+Destroys a Connection object, tearing down any low-level connection
+associated with it and freeing its resources.  It is an error to reuse
+a Connection that has been C<destroy()>ed.
 
 =head2 ZOOM::ResultSet
 
@@ -172,7 +390,19 @@ for success after each call.  Exceptions are caught by enclosing the
 main code in an C<eval{}> block and checking C<$@> on exit from that
 block, as in the code-sample above.
 
-There are a small number of exceptions to this rule.
+There are a small number of exceptions to this rule: the three
+record-fetching methods in the C<ZOOM::ResultSet> class,
+C<record()>,
+C<record_immediate()>,
+and
+C<records()>
+can all return undefined values for legitimate reasons, under
+circumstances that do not merit throwing an exception.  For this
+reason, the return values of these methods should be checked.  See the
+individual methods' documentation for details.
+
+=head3 Methods
+
 I<###>
 
 =head2 ZOOM::ScanSet
@@ -228,9 +458,10 @@ C<CREATE_QUERY>,
 C<QUERY_CQL>,
 C<QUERY_PQF>,
 C<SORTBY>,
-C<CLONE>
+C<CLONE>,
+C<PACKAGE>
 and
-C<PACKAGE>,
+C<SCANTERM>,
 each of which specifies a client-side error.  Since errors may also be
 diagnosed by the server, and returned to the client, error codes may
 also take values from the BIB-1 diagnostic set of Z39.50, listed at
@@ -267,6 +498,11 @@ http://zoom.z3950.org/api/zoom-current.html
 The C<Net::Z3950::ZOOM> module, included in the same distribution as this one.
 
 The C<Net::Z3950> module, which this one supersedes.
+http://perl.z3950.org/
+
+The documentation for the ZOOM-C module of the YAZ Toolkit, which this
+module is built on.  Specifically, its lists of options are useful.
+http://indexdata.com/yaz/doc/zoom.tkl
 
 The BIB-1 diagnostic set of Z39.50,
 http://www.loc.gov/z3950/agency/defns/bib1diag.html