move description of databaseName option to the Connection section
[yaz-moved-to-github.git] / doc / zoom.xml
index 1a4efe0..ccad2b0 100644 (file)
@@ -1,6 +1,5 @@
-<!-- $Id: zoom.xml,v 1.16 2002-01-03 12:18:37 adam Exp $ -->
- <chapter id="zoom"><title>Building clients with ZOOM</title>
-  
+<!-- $Id: zoom.xml,v 1.24 2003-05-12 13:34:00 mike Exp $ -->
+ <chapter id="zoom"><title>ZOOM</title>
   <para>
     &zoom; is an acronym for 'Z39.50 Object-Orientation Model' and is
    an initiative started by Mike Taylor (Mike is from the UK, which
@@ -8,28 +7,37 @@
    provide a common Z39.50 client API not bound to a particular
    programming language or toolkit.
   </para>
+
+  <note>
+   <para>
+    A recent addition to &yaz; is SRW support. You can now make
+    SRW ZOOM connections by specifying another scheme for the
+    hostname for a connection.
+   </para>
+  </note>
+
   <para>
    The lack of a simple Z39.50 client API for &yaz; has become more
    and more apparent over time. So when the first &zoom; specification
    became available,
    an implementation for &yaz; was quickly developed. For the first time, it is
    now as easy (or easier!) to develop clients than servers with &yaz;. This
-   chapter describes the &zoom; C binding. Before going futher, please
+   chapter describes the &zoom; C binding. Before going further, please
    reconsider whether C is the right programming language for the job.
    There are other language bindings available for &yaz;, and still
    more
    are in active development. See the
-   <ulink url="http://zoom.z3950.org/">ZOOM website</ulink> for
+   <ulink url="http://zoom.z3950.org/">ZOOM web-site</ulink> for
    more information.
   </para>
-
+  
   <para>
    In order to fully understand this chapter you should read and
    try the example programs <literal>zoomtst1.c</literal>,
    <literal>zoomtst2.c</literal>, .. in the <literal>zoom</literal>
    directory.
   </para>
-
+  
   <para>
    The C language misses features found in object oriented languages
    such as C++, Java, etc. For example, you'll have to manually,
@@ -42,7 +50,7 @@
   </para>
   <para>
    In each of the sections below you'll find a sub section called
-   protocol behavior, that descries how the API maps to the Z39.50
+   protocol behavior, that describes how the API maps to the Z39.50
    protocol.
   </para>
   <sect1 id="zoom.connections"><title>Connections</title>
    <para>The Connection object is a session with a target.
    </para>
    <synopsis>
-   #include &lt;yaz/zoom.h>
+    #include &lt;yaz/zoom.h>
     
-   ZOOM_connection ZOOM_connection_new (const char *host, int portnum);
+    ZOOM_connection ZOOM_connection_new (const char *host, int portnum);
     
-   ZOOM_connection ZOOM_connection_create (ZOOM_options options);
-
-   void ZOOM_connection_connect(ZOOM_connection c, const char *host,
+    ZOOM_connection ZOOM_connection_create (ZOOM_options options);
+    
+    void ZOOM_connection_connect(ZOOM_connection c, const char *host,
                                  int portnum);
-   void ZOOM_connection_destroy (ZOOM_connection c);
+    void ZOOM_connection_destroy (ZOOM_connection c);
    </synopsis>
    <para>
     Connection objects are created with either function
     a connection immediately, thus allowing you to specify options
     before establishing network connection using the function
     <function>ZOOM_connection_connect</function>. 
-    If the portnumber, <literal>portnum</literal>, is zero, the
+    If the port number, <literal>portnum</literal>, is zero, the
     <literal>host</literal> is consulted for a port specification.
     If no port is given, 210 is used. A colon denotes the beginning of
     a port number in the host string. If the host string includes a
     slash, the following part specifies a database for the connection.
    </para>
    <para>
+    You can prefix the host with a scheme followed by colon. The
+    default scheme is <literal>tcp</literal> (Z39.50 protocol).
+    The scheme <literal>http</literal> selects SRW over HTTP.
+   </para>
+   <para>
     Connection objects should be destroyed using the function
     <function>ZOOM_connection_destroy</function>.
    </para>
     The <function>ZOOM_connection_option_set</function> allows you to
     set an option given by <parameter>key</parameter> to the value
     <parameter>value</parameter> for the connection.
-     Function <function>ZOOM_connection_option_get</function> returns
+    Function <function>ZOOM_connection_option_get</function> returns
     the value for an option given by <parameter>key</parameter>.
    </para>
-   <table frame="sides" colsep="1"><title>ZOOM Connection Options</title>
+   <table frame="top"><title>ZOOM Connection Options</title>
     <tgroup cols="3">
      <colspec colwidth="4*" colname="name"></colspec>
      <colspec colwidth="7*" colname="description"></colspec>
        </entry><entry>none</entry></row>
       <row><entry>
         pass</entry><entry>Authentication password
-      </entry><entry>none</entry></row>
+       </entry><entry>none</entry></row>
       <row><entry>
         host</entry><entry>Target host. This setting is "read-only".
         It's automatically set internally when connecting to a target.
       <row><entry>
         preferredMessageSize</entry><entry> Maximum size of multiple records.
        </entry><entry>1 MB</entry></row>
+      <row><entry>
+        lang</entry><entry> Language for negotiation.
+       </entry><entry>none</entry></row>
+      <row><entry>
+        charset</entry><entry> Character set for negotiation.
+       </entry><entry>none</entry></row>
+      <row><entry>
+        targetImplementationId</entry><entry> Implementation ID of target.
+       </entry><entry>none</entry></row>
+      <row><entry>
+        targetImplementationName</entry><entry> Implementation Name of target.
+       </entry><entry>none</entry></row>
+      <row><entry>
+        targetImplementationVersion</entry><entry> Implementation Version
+        of target.
+       </entry><entry>none</entry></row>
+      <row><entry>
+        databaseName</entry><entry>One or more database names
+        separated by character plus (<literal>+</literal>), which to
+        be used by subsequent search requests on this Connection.
+       </entry><entry>Default</entry></row>
      </tbody>
     </tgroup>
    </table>
+   <para>
+    If either option <literal>lang</literal> or <literal>charset</literal>
+    is set, then 
+    <ulink url="http://lcweb.loc.gov/z3950/agency/defns/charneg-3.html">
+     Character Set and Language Negotiation</ulink> is in effect.
+   </para>
    <synopsis>
      int ZOOM_connection_error (ZOOM_connection c, const char **cp,
-                                 const char **addinfo);
+                                const char **addinfo);
+     int ZOOM_connection_error_x (ZOOM_connection c, const char **cp,
+                                  const char **addinfo, const char **dset);
    </synopsis>
    <para>
-    Use <function>ZOOM_connection_error</function> to check for
+    Function <function>ZOOM_connection_error</function> checks for
     errors for the last operation(s) performed. The function returns
     zero if no errors occurred; non-zero otherwise indicating the error.
     Pointers <parameter>cp</parameter> and <parameter>addinfo</parameter>
     holds messages for the error and additional-info if passed as
-    non-<literal>NULL</literal>.
+    non-<literal>NULL</literal>. Function
+    <function>ZOOM_connection_error_x</function> is an extended version
+    of <function>ZOOM_connection_error</function> that is capable of
+    returning name of diagnostic set in <parameter>dset</parameter>.
    </para>
-   <sect2><title>Protocol behavior</title>
+   <sect2><title>Z39.50 Protocol behavior</title>
     <para>
      The calls <function>ZOOM_connection_new</function> and
-     <function>ZOOM_connection_connect</function> establises a TCP/IP
+     <function>ZOOM_connection_connect</function> establishes a TCP/IP
       connection and sends an Initialize Request to the target if
       possible. In addition, the calls waits for an Initialize Response
       from the target and the result is inspected (OK or rejected).
      API cannot tell the outcome (yet).
     </para>
     </sect2>
+   <sect2><title>SRW Protocol behavior</title>
+    <para>
+     The SRW protocol doesn't feature an Init Request, so
+     the connection phase merely establishes a TCP/IP connection
+     with the SOAP service.
+    </para>
+    <para>None of the ZOOM connection options
+     affect SRW and they are ignored. However, future versions
+     of &yaz; might honor <literal>implementationName</literal> and
+     put that as part of User-Agent header for HTTP requests.
+     The <literal>charset</literal>, and <literal>lang</literal>
+     might also affect HTTP headers in future releases.
+    </para>
+   </sect2>
   </sect1>
   <sect1 id="zoom.query"><title>Queries</title>
    <para>
 
      int ZOOM_query_prefix(ZOOM_query q, const char *str);
 
+     int ZOOM_query_cql(ZOOM_query s, const char *str);
+
      int ZOOM_query_sortby(ZOOM_query q, const char *criteria);
    </synopsis>
    <para>
     and destroy them by calling <function>ZOOM_query_destroy</function>.
     RPN-queries can be specified in <link linkend="PQF">PQF</link>
     notation by using the
-    function <function>ZOOM_query_prefix</function>. More
-    query types will be added later, such as
+    function <function>ZOOM_query_prefix</function>.
+    The <function>ZOOM_query_cql</function> specifies a CQL
+    query to be sent to the server/target.
+    More query types will be added in future versions of &yaz;, such as
     <link linkend="CCL">CCL</link> to RPN-mapping, native CCL query,
     etc. In addition to a search, a sort criteria may be set. Function
     <function>ZOOM_query_sortby</function> specifies a 
         value, then target will return all records using small element set name
        </entry><entry>0</entry></row>
       <row><entry>
-        largeSetLowerBound</entry><entry>If hits is greator than this
+        largeSetLowerBound</entry><entry>If hits is greater than this
         value, the target will return no records.
        </entry><entry>1</entry></row>
       <row><entry>
         mediumSetPresentNumber</entry><entry>This value represents
         the number of records to be returned as part of a search when when
         hits is less than or equal to large set lower bound and if hits
-        is greator than small set upper bound.
+        is greater than small set upper bound.
        </entry><entry>0</entry></row>
       <row><entry>
         smallSetElementSetName</entry><entry>
         The element set name to be for medium-sized result sets.
        </entry><entry>none</entry></row>
       <row><entry>
-        databaseName</entry><entry>One or more database names
-        separated by character plus (<literal>+</literal>).
-       </entry><entry>Default</entry></row>
-      <row><entry>
         setname</entry><entry>Name of Result Set (Result Set ID).
         If this option isn't set, the ZOOM module will automatically
         allocate a result set name.
     </tgroup>
    </table>
    <sect2>
-    <title>Protocol behavior</title>
+    <title>Z39.50 Protocol behavior</title>
     <para>
      The creation of a result set involves at least a SearchRequest
      - SearchResponse protocol handshake. Following that, if a sort
-     critieria was specified as part of the query, a sortRequest -
+     criteria was specified as part of the query, a SortRequest -
      SortResponse handshake takes place. Note that it is necessary to
      perform sorting before any retrieval takes place, so no records will
      be returned from the target as part of the SearchResponse because these
-     would be unsorted. Hence, piggyback is disabled when sort critieria
+     would be unsorted. Hence, piggyback is disabled when sort criteria
      is set. Following Search - and a Possible sort, Retrieval takes
      place - as one or more Present Requests - Present Response being
      transferred.
      because of a record size limit, etc. the client will repeat sending
      present requests. As an example, if option <literal>start</literal>
      is 0 (default) and <literal>count</literal> is 4, and
-     <literal>piggyback</literal> is 1 (default) and no sorting critieria
+     <literal>piggyback</literal> is 1 (default) and no sorting criteria
      is specified, then the client will attempt to retrieve the 4
      records as part the search response (using piggyback). On the other
      hand, if either <literal>start</literal> is positive or if
      to specify one elementSetName option rather than three.
      </para>
    </sect2>
+   <sect2>
+    <title>SRW Protocol behavior</title>
+    <para>
+     Current version of &yaz; does not take advantage of a result set id
+     returned by the SRW server. Future versions might do, however.
+     Since, the ZOOM driver does not save result set IDs any
+     present (retrieval) is transformed to a SRW SearchRetrieveRequest
+     with same query but, possibly, different offsets.
+    </para>
+    <para>
+     Option <literal>schema</literal> specifies SRW schema
+     for retrieval. However, options <literal>elementSetName</literal> and
+     <literal>preferredRecordSyntax</literal> are ignored.
+    </para>
+    <para>
+     Options <literal>start</literal> and <literal>count</literal> 
+     are supported by SRW.
+     The remaining options
+     <literal>piggyback</literal>, 
+     <literal>smallSetUpperBound</literal>, 
+     <literal>largeSetLowerBound</literal>, 
+     <literal>mediumSetPresentNumber</literal>, 
+     <literal>mediumSetElementSetName</literal>,
+      <literal>smallSetElementSetName</literal> are
+     unsupported.
+    </para>
+    <para>
+     SRW supports CQL queries, <emphasis>not</emphasis> PQF.
+     If PQF is used, however, the PQF query is transferred anyway
+     using non-standard element <literal>pQuery</literal> in
+     SRW SearchRetrieveRequest.
+    </para>
+    <para>
+     Unfortunately, SRW does not define a database setting. Hence,
+     <literal>databaseName</literal> is unsupported and ignored.
+     However, the path part in host parameter for functions 
+     <function>ZOOM_connecton_new</function> and
+     <function>ZOOM_connection_connect</function> acts as a
+     database (at least for the &yaz; SRW server).
+    </para>
+   </sect2>
   </sect1>
   <sect1 id="zoom.records"><title>Records</title>
    <para>
-    A record object is a retrival record on the client side -
+    A record object is a retrieval record on the client side -
     created from result sets.
    </para>
    <synopsis>
                                   size_t start, size_t count);
      ZOOM_record ZOOM_resultset_record (ZOOM_resultset s, size_t pos);
 
-     void *ZOOM_record_get (ZOOM_record rec, const char *type,
-                            size_t *len);
+     const char *ZOOM_record_get (ZOOM_record rec, const char *type,
+                                  size_t *len);
 
      ZOOM_record ZOOM_record_clone (ZOOM_record rec);
 
     <variablelist>
      <varlistentry><term><literal>database</literal></term>
       <listitem><para>Database of record is returned
-        as a C null-terminated string. Return type <literal>char *</literal>. 
+        as a C null-terminated string. Return type
+        <literal>const char *</literal>. 
        </para></listitem>
       </varlistentry>
      <varlistentry><term><literal>syntax</literal></term>
       <listitem><para>The transfer syntax (OID) of the record is returned
-        as a C null-terminated string. Return type <literal>char *</literal>. 
+        as a C null-terminated string. Return type is
+        <literal>const char *</literal>. 
        </para></listitem>
       </varlistentry>
      <varlistentry><term><literal>render</literal></term>
       <listitem><para>The record is returned in a display friendly
         format. Upon completion buffer is returned
-        (type <literal>char *</literal>) and length is stored in
+        (type <literal>const char *</literal>) and length is stored in
         <literal>*len</literal>.
        </para></listitem>
       </varlistentry>
      <varlistentry><term><literal>raw</literal></term>
       <listitem><para>The record is returned in the internal
-        YAZ specific format. The raw data is returned as type 
+        YAZ specific format. For GRS-1, Explain, and others, the
+        raw data is returned as type 
         <literal>Z_External *</literal> which is just the type for
         the member <literal>retrievalRecord</literal> in
         type <literal>NamePlusRecord</literal>.
+        For SUTRS and octet aligned record (including all MARCs) the
+        octet buffer is returned and the length of the buffer.
        </para></listitem>
       </varlistentry>
     </variablelist>
    </para>
-   <sect2><title>Protocol behavior</title>
+   <sect2><title>Z39.50 Protocol behavior</title>
     <para>
      The functions <function>ZOOM_resultset_record</function> and
      <function>ZOOM_resultset_records</function> inspects the client-side
      <emphasis>now</emphasis>.
     </para>
    </sect2>
+   <sect2><title>SRW Protocol behavior</title>
+    <para>
+     The ZOOM driver for SRW treats records returned by a SRW server
+     as if they where Z39.50 records with transfer syntax XML and
+     no element set name or database name.
+    </para>
+   </sect2>
   </sect1>
   <sect1 id="zoom.scan"><title>Scan</title>
    <para>
     is the <literal>ZOOM_scanset</literal> which is a set of terms
     returned by a target.
    </para>
+
+   <para>
+    The Scan interface is Z39.50 only. SRW version 1.0 does not
+    support this.
+   </para>
+
    <synopsis>
     ZOOM_scanset ZOOM_connection_scan (ZOOM_connection c,
                                        const char *startterm);
     <function>ZOOM_connection_scan</function> which performs a scan
     operation on the connection and start term given.
     If the operation was successful, the size of the scan set can be
-    retrived by a call to <function>ZOOM_scanset_size</function>.
+    retrieved by a call to <function>ZOOM_scanset_size</function>.
     Like result sets, the items are numbered 0,..size-1.
     To obtain information about a particular scan term, call function
     <function>ZOOM_scanset_term</function>. This function takes
      <tbody>
       <row><entry>
         number</entry><entry>Number of Scan Terms requested in next scan.
-        After scan it holds the actual number of terms returend.
+        After scan it holds the actual number of terms returned.
        </entry><entry>10</entry></row>
       <row><entry>
         position</entry><entry>Preferred Position of term in response
     <literal>cs</literal> (<literal>cs[0] ... cs[no-1]</literal>).
     A pending event could be a sending a search, receiving a response,
     etc.
-    When an event has occured for one of the connections, this function
+    When an event has occurred for one of the connections, this function
     returns a positive integer <literal>n</literal> denoting that an event
     occurred for connection <literal>cs[n-1]</literal>.
     When no events are pending for the connections, a value of zero is