Document ZOOM_connection_last_event and the event types
[yaz-moved-to-github.git] / doc / zoom.xml
1 <!-- $Id: zoom.xml,v 1.38 2005-09-07 11:53:25 adam Exp $ -->
2  <chapter id="zoom"><title>ZOOM</title>
3   <para>
4     &zoom; is an acronym for 'Z39.50 Object-Orientation Model' and is
5    an initiative started by Mike Taylor (Mike is from the UK, which
6    explains the peculiar name of the model). The goal of &zoom; is to
7    provide a common Z39.50 client API not bound to a particular
8    programming language or toolkit.
9   </para>
10
11   <note>
12    <para>
13     A recent addition to &yaz; is SRW support. You can now make
14     SRW ZOOM connections by specifying scheme <literal>http://</literal>
15     for the hostname for a connection.
16    </para>
17   </note>
18
19   <para>
20    The lack of a simple Z39.50 client API for &yaz; has become more
21    and more apparent over time. So when the first &zoom; specification
22    became available,
23    an implementation for &yaz; was quickly developed. For the first time, it is
24    now as easy (or easier!) to develop clients than servers with &yaz;. This
25    chapter describes the &zoom; C binding. Before going further, please
26    reconsider whether C is the right programming language for the job.
27    There are other language bindings available for &yaz;, and still
28    more
29    are in active development. See the
30    <ulink url="http://zoom.z3950.org/">ZOOM web-site</ulink> for
31    more information.
32   </para>
33   
34   <para>
35    In order to fully understand this chapter you should read and
36    try the example programs <literal>zoomtst1.c</literal>,
37    <literal>zoomtst2.c</literal>, .. in the <literal>zoom</literal>
38    directory.
39   </para>
40   
41   <para>
42    The C language misses features found in object oriented languages
43    such as C++, Java, etc. For example, you'll have to manually,
44    destroy all objects you create, even though you may think of them as
45    temporary. Most objects has a <literal>_create</literal> - and a
46    <literal>_destroy</literal> variant.
47    All objects are in fact pointers to internal stuff, but you don't see
48    that because of typedefs. All destroy methods should gracefully ignore a
49    <literal>NULL</literal> pointer.
50   </para>
51   <para>
52    In each of the sections below you'll find a sub section called
53    protocol behavior, that describes how the API maps to the Z39.50
54    protocol.
55   </para>
56   <sect1 id="zoom.connections"><title>Connections</title>
57    
58    <para>The Connection object is a session with a target.
59    </para>
60    <synopsis>
61     #include &lt;yaz/zoom.h>
62     
63     ZOOM_connection ZOOM_connection_new (const char *host, int portnum);
64     
65     ZOOM_connection ZOOM_connection_create (ZOOM_options options);
66     
67     void ZOOM_connection_connect(ZOOM_connection c, const char *host,
68                                  int portnum);
69     void ZOOM_connection_destroy (ZOOM_connection c);
70    </synopsis>
71    <para>
72     Connection objects are created with either function
73     <function>ZOOM_connection_new</function> or 
74     <function>ZOOM_connection_create</function>.
75     The former creates and automatically attempts to establish a network
76     connection with the target. The latter doesn't establish
77     a connection immediately, thus allowing you to specify options
78     before establishing network connection using the function
79     <function>ZOOM_connection_connect</function>. 
80     If the port number, <literal>portnum</literal>, is zero, the
81     <literal>host</literal> is consulted for a port specification.
82     If no port is given, 210 is used. A colon denotes the beginning of
83     a port number in the host string. If the host string includes a
84     slash, the following part specifies a database for the connection.
85    </para>
86    <para>
87     You can prefix the host with a scheme followed by colon. The
88     default scheme is <literal>tcp</literal> (Z39.50 protocol).
89     The scheme <literal>http</literal> selects SRW over HTTP.
90    </para>
91    <para>
92     Connection objects should be destroyed using the function
93     <function>ZOOM_connection_destroy</function>.
94    </para>
95    <synopsis>
96     void ZOOM_connection_option_set (ZOOM_connection c,
97                                      const char *key,
98                                      const char *val);
99
100     const char *ZOOM_connection_option_get (ZOOM_connection c,
101                                             const char *key);
102    </synopsis>
103    <para>
104     The <function>ZOOM_connection_option_set</function> allows you to
105     set an option given by <parameter>key</parameter> to the value
106     <parameter>value</parameter> for the connection.
107     Function <function>ZOOM_connection_option_get</function> returns
108     the value for an option given by <parameter>key</parameter>.
109    </para>
110    <table frame="top"><title>ZOOM Connection Options</title>
111     <tgroup cols="3">
112      <colspec colwidth="4*" colname="name"></colspec>
113      <colspec colwidth="7*" colname="description"></colspec>
114      <colspec colwidth="3*" colname="default"></colspec>
115      <thead>
116       <row>
117        <entry>Option</entry>
118        <entry>Description</entry>
119        <entry>Default</entry>
120       </row>
121      </thead>
122      <tbody>
123       <row><entry>
124         implementationName</entry><entry>Name of Your client
125        </entry><entry>none</entry></row>
126       <row><entry>
127         user</entry><entry>Authentication user name
128        </entry><entry>none</entry></row>
129       <row><entry>
130         group</entry><entry>Authentication group name
131        </entry><entry>none</entry></row>
132       <row><entry>
133         password</entry><entry>Authentication password.
134        </entry><entry>none</entry></row>
135       <row><entry>
136         host</entry><entry>Target host. This setting is "read-only".
137         It's automatically set internally when connecting to a target.
138        </entry><entry>none</entry></row>
139       <row><entry>
140         proxy</entry><entry>Proxy host
141        </entry><entry>none</entry></row>
142       <row><entry>
143         async</entry><entry>If true (1) the connection operates in 
144         asynchronous operation which means that all calls are non-blocking
145         except
146         <link linkend="zoom.events"><function>ZOOM_event</function></link>.
147        </entry><entry>0</entry></row>
148       <row><entry>
149         maximumRecordSize</entry><entry> Maximum size of single record.
150        </entry><entry>1 MB</entry></row>
151       <row><entry>
152         preferredMessageSize</entry><entry> Maximum size of multiple records.
153        </entry><entry>1 MB</entry></row>
154       <row><entry>
155         lang</entry><entry> Language for negotiation.
156        </entry><entry>none</entry></row>
157       <row><entry>
158         charset</entry><entry> Character set for negotiation.
159        </entry><entry>none</entry></row>
160       <row><entry>
161         serverImplementationId</entry><entry>
162         Implementation ID of server.  (The old targetImplementationId
163         option is also supported for the benefit of old applications.)
164        </entry><entry>none</entry></row>
165       <row><entry>
166         targetImplementationName</entry><entry>
167         Implementation Name of server.  (The old
168         targetImplementationName option is also supported for the
169         benefit of old applications.)
170        </entry><entry>none</entry></row>
171       <row><entry>
172         serverImplementationVersion</entry><entry>
173         Implementation Version of server.  (the old
174         targetImplementationVersion option is also supported for the
175         benefit of old applications.)
176        </entry><entry>none</entry></row>
177       <row><entry>
178         databaseName</entry><entry>One or more database names
179         separated by character plus (<literal>+</literal>), which to
180         be used by subsequent search requests on this Connection.
181        </entry><entry>Default</entry></row>
182       <row><entry>
183         piggyback</entry><entry>True (1) if piggyback should be
184         used in searches; false (0) if not.
185        </entry><entry>1</entry></row>
186       <row><entry>
187         smallSetUpperBound</entry><entry>If hits is less than or equal to this
188         value, then target will return all records using small element set name
189        </entry><entry>0</entry></row>
190       <row><entry>
191         largeSetLowerBound</entry><entry>If hits is greater than this
192         value, the target will return no records.
193        </entry><entry>1</entry></row>
194       <row><entry>
195         mediumSetPresentNumber</entry><entry>This value represents
196         the number of records to be returned as part of a search when when
197         hits is less than or equal to large set lower bound and if hits
198         is greater than small set upper bound.
199        </entry><entry>0</entry></row>
200       <row><entry>
201         smallSetElementSetName</entry><entry>
202         The element set name to be used for small result sets.
203        </entry><entry>none</entry></row>
204       <row><entry>
205         mediumSetElementSetName</entry><entry>
206         The element set name to be for medium-sized result sets.
207        </entry><entry>none</entry></row>
208      </tbody>
209     </tgroup>
210    </table>
211    <para>
212     If either option <literal>lang</literal> or <literal>charset</literal>
213     is set, then 
214     <ulink url="http://lcweb.loc.gov/z3950/agency/defns/charneg-3.html">
215      Character Set and Language Negotiation</ulink> is in effect.
216    </para>
217    <synopsis>
218      int ZOOM_connection_error (ZOOM_connection c, const char **cp,
219                                 const char **addinfo);
220      int ZOOM_connection_error_x (ZOOM_connection c, const char **cp,
221                                   const char **addinfo, const char **dset);
222    </synopsis>
223    <para>
224     Function <function>ZOOM_connection_error</function> checks for
225     errors for the last operation(s) performed. The function returns
226     zero if no errors occurred; non-zero otherwise indicating the error.
227     Pointers <parameter>cp</parameter> and <parameter>addinfo</parameter>
228     holds messages for the error and additional-info if passed as
229     non-<literal>NULL</literal>. Function
230     <function>ZOOM_connection_error_x</function> is an extended version
231     of <function>ZOOM_connection_error</function> that is capable of
232     returning name of diagnostic set in <parameter>dset</parameter>.
233    </para>
234    <sect2><title>Z39.50 Protocol behavior</title>
235     <para>
236      The calls <function>ZOOM_connection_new</function> and
237      <function>ZOOM_connection_connect</function> establishes a TCP/IP
238       connection and sends an Initialize Request to the target if
239       possible. In addition, the calls waits for an Initialize Response
240       from the target and the result is inspected (OK or rejected).
241     </para>
242     <para>
243      If <literal>proxy</literal> is set then the client will establish
244      a TCP/IP connection with the peer as specified by the
245      <literal>proxy</literal> host and the hostname as part of the
246      connect calls will be set as part of the Initialize Request.
247      The proxy server will then "forward" the PDU's transparently
248      to the target behind the proxy.
249     </para>
250     <para>
251      For the authentication parameters, if option <literal>user</literal>
252      is set and both options <literal>group</literal> and
253      <literal>pass</literal> are unset, then Open style
254      authentication is used (Version 2/3) in which case the username
255      is usually followed by a slash, then by a password.
256      If either <literal>group</literal>
257      or <literal>pass</literal> is set then idPass authentication
258      (Version 3 only) is used. If none of the options are set, no
259      authentication parameters are set as part of the Initialize Request
260      (obviously).
261     </para>
262     <para>
263      When option <literal>async</literal> is 1, it really means that
264      all network operations are postponed (and queued) until the
265      function <literal>ZOOM_event</literal> is invoked. When doing so
266      it doesn't make sense to check for errors after
267      <literal>ZOOM_connection_new</literal> is called since that
268      operation "connecting - and init" is still incomplete and the
269      API cannot tell the outcome (yet).
270     </para>
271     </sect2>
272    <sect2><title>SRW Protocol behavior</title>
273     <para>
274      The SRW protocol doesn't feature an Inititialize Request, so
275      the connection phase merely establishes a TCP/IP connection
276      with the SOAP service.
277     </para>
278     <para>Most of the ZOOM connection options do not
279      affect SRW and they are ignored. However, future versions
280      of &yaz; might honor <literal>implementationName</literal> and
281      put that as part of User-Agent header for HTTP requests.
282      </para>
283     <para>
284      The <literal>charset</literal> is used in the Content-Type header
285      of HTTP requests.
286     </para>
287    </sect2>
288   </sect1>
289   <sect1 id="zoom.query"><title>Queries</title>
290    <para>
291     Query objects represents queries.
292    </para>
293    <synopsis>
294      ZOOM_query ZOOM_query_create(void);
295
296      void ZOOM_query_destroy(ZOOM_query q);
297
298      int ZOOM_query_prefix(ZOOM_query q, const char *str);
299
300      int ZOOM_query_cql(ZOOM_query s, const char *str);
301
302      int ZOOM_query_sortby(ZOOM_query q, const char *criteria);
303    </synopsis>
304    <para>
305     Create query objects using <function>ZOOM_query_create</function>
306     and destroy them by calling <function>ZOOM_query_destroy</function>.
307     RPN-queries can be specified in <link linkend="PQF">PQF</link>
308     notation by using the
309     function <function>ZOOM_query_prefix</function>.
310     The <function>ZOOM_query_cql</function> specifies a CQL
311     query to be sent to the server/target.
312     More query types will be added in future versions of &yaz;, such as
313     <link linkend="CCL">CCL</link> to RPN-mapping, native CCL query,
314     etc. In addition to a search, a sort criteria may be set. Function
315     <function>ZOOM_query_sortby</function> specifies a 
316     sort criteria using the same string notation for sort as offered by
317     the <link linkend="sortspec">YAZ client</link>.
318    </para>
319    <sect2><title>Protocol behavior</title>
320     <para>
321      The query object is just an interface for the member Query
322      in the SearchRequest. The sortby-function is an interface to the
323      sortSequence member of the SortRequest.
324     </para>
325    </sect2>
326   </sect1>
327   <sect1 id="zoom.resultsets"><title>Result sets</title>
328    <para>
329     The result set object is a container for records returned from
330     a target.
331    </para>
332    <synopsis>
333      ZOOM_resultset ZOOM_connection_search(ZOOM_connection,
334                                            ZOOM_query q);
335
336      ZOOM_resultset ZOOM_connection_search_pqf(ZOOM_connection c,
337                                                const char *q);
338
339      void ZOOM_resultset_destroy(ZOOM_resultset r);
340    </synopsis>
341    <para>
342     Function <function>ZOOM_connection_search</function> creates
343      a result set given a connection and query.
344     Destroy a result set by calling
345     <function>ZOOM_resultset_destroy</function>.
346     Simple clients may using PQF only may use function
347     <function>ZOOM_connection_search_pqf</function> in which case
348     creating query objects is not necessary.
349    </para>
350    <synopsis>
351      void ZOOM_resultset_option_set (ZOOM_resultset r,
352                                       const char *key,
353                                       const char *val);
354
355      const char *ZOOM_resultset_option_get (ZOOM_resultset r,
356                                              const char *key);
357
358      size_t ZOOM_resultset_size (ZOOM_resultset r);
359    </synopsis>
360    <para>
361     Functions <function>ZOOM_resultset_options_set</function> and
362     <function>ZOOM_resultset_get</function> sets and gets an option
363     for a result set similar to <function>ZOOM_connection_option_get</function>
364     and <function>ZOOM_connection_option_set</function>.
365    </para>
366    <para>
367     The number of hits also called result-count is returned by
368     function <function>ZOOM_resultset_size</function>.
369    </para>
370    <table frame="top"><title>ZOOM Result set Options</title>
371     <tgroup cols="3">
372      <colspec colwidth="4*" colname="name"></colspec>
373      <colspec colwidth="7*" colname="description"></colspec>
374      <colspec colwidth="2*" colname="default"></colspec>
375      <thead>
376       <row>
377        <entry>Option</entry>
378        <entry>Description</entry>
379        <entry>Default</entry>
380       </row>
381      </thead>
382      <tbody>
383       <row><entry>
384         start</entry><entry>Offset of first record to be 
385         retrieved from target. First record has offset 0 unlike the
386         protocol specifications where first record has position 1.
387        </entry><entry>0</entry></row>
388       <row><entry>
389         count</entry><entry>Number of records to be retrieved.
390        </entry><entry>0</entry></row>
391       <row><entry>
392         presentChunk</entry><entry>The number of records to be
393         requested from the server in each chunk (present requst).  The
394         value 0 means to request all the records in a single chunk.
395         (The old <literal>step</literal>
396         option is also supported for the benefit of old applications.)
397        </entry><entry>0</entry></row>
398       <row><entry>
399         elementSetName</entry><entry>Element-Set name of records. 
400         Most targets should honor element set name <literal>B</literal>
401         and <literal>F</literal> for brief and full respectively.
402        </entry><entry>none</entry></row>
403       <row><entry>
404         preferredRecordSyntax</entry><entry>Preferred Syntax, such as
405         <literal>USMARC</literal>, <literal>SUTRS</literal>, etc.
406        </entry><entry>none</entry></row>
407       <row><entry>
408         schema</entry><entry>Schema for retrieval, such as
409         <literal>Gils-schema</literal>, <literal>Geo-schema</literal>, etc.
410        </entry><entry>none</entry></row>
411       <row><entry>
412         setname</entry><entry>Name of Result Set (Result Set ID).
413         If this option isn't set, the ZOOM module will automatically
414         allocate a result set name.
415        </entry><entry>default</entry></row>
416      </tbody>
417     </tgroup>
418    </table>
419    <sect2>
420     <title>Z39.50 Protocol behavior</title>
421     <para>
422      The creation of a result set involves at least a SearchRequest
423      - SearchResponse protocol handshake. Following that, if a sort
424      criteria was specified as part of the query, a SortRequest -
425      SortResponse handshake takes place. Note that it is necessary to
426      perform sorting before any retrieval takes place, so no records will
427      be returned from the target as part of the SearchResponse because these
428      would be unsorted. Hence, piggyback is disabled when sort criteria
429      are set. Following Search - and a possible sort - Retrieval takes
430      place - as one or more Present Requests/Response pairs being
431      transferred.
432      </para>
433     <para>
434      The API allows for two different modes for retrieval. A high level
435      mode which is somewhat more powerful and a low level one.
436      The low level is enabled when searching on a Connection object
437      for which the settings
438      <literal>smallSetUpperBound</literal>,
439      <literal>mediumSetPresentNumber</literal> and
440      <literal>largeSetLowerBound</literal> are set. The low level mode
441      thus allows you to precisely set how records are returned as part
442      of a search response as offered by the Z39.50 protocol.
443      Since the client may be retrieving records as part of the
444      search response, this mode doesn't work well if sorting is used.
445      </para>
446     <para>
447      The high-level mode allows you to fetch a range of records from
448      the result set with a given start offset. When you use this mode
449      the client will automatically use piggyback if that is possible
450      with the target and perform one or more present requests as needed.
451      Even if the target returns fewer records as part of a present response
452      because of a record size limit, etc. the client will repeat sending
453      present requests. As an example, if option <literal>start</literal>
454      is 0 (default) and <literal>count</literal> is 4, and
455      <literal>piggyback</literal> is 1 (default) and no sorting criteria
456      is specified, then the client will attempt to retrieve the 4
457      records as part the search response (using piggyback). On the other
458      hand, if either <literal>start</literal> is positive or if
459      a sorting criteria is set, or if <literal>piggyback</literal>
460      is 0, then the client will not perform piggyback but send Present
461      Requests instead.
462     </para>
463     <para>
464      If either of the options <literal>mediumSetElementSetName</literal> and
465      <literal>smallSetElementSetName</literal> are unset, the value
466      of option <literal>elementSetName</literal> is used for piggyback
467      searches. This means that for the high-level mode you only have
468      to specify one elementSetName option rather than three.
469      </para>
470    </sect2>
471    <sect2>
472     <title>SRW Protocol behavior</title>
473     <para>
474      Current version of &yaz; does not take advantage of a result set id
475      returned by the SRW server. Future versions might do, however.
476      Since, the ZOOM driver does not save result set IDs any
477      present (retrieval) is transformed to a SRW SearchRetrieveRequest
478      with same query but, possibly, different offsets.
479     </para>
480     <para>
481      Option <literal>schema</literal> specifies SRW schema
482      for retrieval. However, options <literal>elementSetName</literal> and
483      <literal>preferredRecordSyntax</literal> are ignored.
484     </para>
485     <para>
486      Options <literal>start</literal> and <literal>count</literal> 
487      are supported by SRW.
488      The remaining options
489      <literal>piggyback</literal>, 
490      <literal>smallSetUpperBound</literal>, 
491      <literal>largeSetLowerBound</literal>, 
492      <literal>mediumSetPresentNumber</literal>, 
493      <literal>mediumSetElementSetName</literal>,
494       <literal>smallSetElementSetName</literal> are
495      unsupported.
496     </para>
497     <para>
498      SRW supports CQL queries, <emphasis>not</emphasis> PQF.
499      If PQF is used, however, the PQF query is transferred anyway
500      using non-standard element <literal>pQuery</literal> in
501      SRW SearchRetrieveRequest.
502     </para>
503     <para>
504      Unfortunately, SRW does not define a database setting. Hence,
505      <literal>databaseName</literal> is unsupported and ignored.
506      However, the path part in host parameter for functions 
507      <function>ZOOM_connecton_new</function> and
508      <function>ZOOM_connection_connect</function> acts as a
509      database (at least for the &yaz; SRW server).
510     </para>
511    </sect2>
512   </sect1>
513   <sect1 id="zoom.records"><title>Records</title>
514    <para>
515     A record object is a retrieval record on the client side -
516     created from result sets.
517    </para>
518    <synopsis>
519      void ZOOM_resultset_records (ZOOM_resultset r,
520                                   ZOOM_record *recs,
521                                   size_t start, size_t count);
522      ZOOM_record ZOOM_resultset_record (ZOOM_resultset s, size_t pos);
523
524      const char *ZOOM_record_get (ZOOM_record rec, const char *type,
525                                   size_t *len);
526
527      ZOOM_record ZOOM_record_clone (ZOOM_record rec);
528
529      void ZOOM_record_destroy (ZOOM_record rec);
530    </synopsis>
531    <para>
532     References to temporary records are returned by functions 
533     <function>ZOOM_resultset_records</function> or
534     <function>ZOOM_resultset_record</function>.
535     </para>
536    <para>
537     If a persistent reference to a record is desired
538     <function>ZOOM_record_clone</function> should be used.
539     It returns a record reference that should be destroyed
540     by a call to <function>ZOOM_record_destroy</function>.
541    </para>
542    <para>
543     A single record is returned by function
544     <function>ZOOM_resultset_record</function> that takes a 
545     position as argument. First record has position zero.
546     If no record could be obtained <literal>NULL</literal> is returned.
547    </para>
548    <para>
549     Function <function>ZOOM_resultset_records</function> retrieves
550     a number of records from a result set. Parameter <literal>start</literal>
551     and <literal>count</literal> specifies the range of records to
552     be returned. Upon completion array
553     <literal>recs[0], ..recs[count-1]</literal>
554     holds record objects for the records. The array of records
555      <literal>recs</literal> should be allocated prior the call
556     <function>ZOOM_resultset_records</function>. Note that for those
557     records that couldn't be retrieved from the target
558     <literal>recs[ ..]</literal> is set to <literal>NULL</literal>.
559    </para>
560    <para id="zoom.record.get">
561     In order to extract information about a single record,
562     <function>ZOOM_record_get</function> is provided. The
563     function returns a pointer to certain record information. The
564     nature (type) of the pointer depends on the parameter,
565     <parameter>type</parameter>.
566    </para>
567    <para>
568     The <parameter>type</parameter> is a string of the format:
569    </para>
570    <para>
571     <replaceable>form</replaceable>[; charset=<replaceable>from</replaceable>[,<replaceable>to</replaceable>]]
572    </para>
573    <para>
574     where <replaceable>form</replaceable> specifies the format of the
575     returned record, <replaceable>from</replaceable>
576     specifies the character set of the record in its original form
577     (as returned by the server), <replaceable>to</replaceable> specifies
578     the output (returned)
579     character set encoding.
580     If charset is not given, then no character set conversion takes place.
581     If <replaceable>to</replaceable> is omitted UTF-8 is assumed.
582    </para>
583    <para>
584     In addition, for certain types, the length
585     <literal>len</literal> passed will be set to the size in bytes of
586     the returned information. 
587     </para>
588    <para>
589     The following are the supported values for <replaceable>form</replaceable>.
590     <variablelist>
591      <varlistentry><term><literal>database</literal></term>
592       <listitem><para>Database of record is returned
593         as a C null-terminated string. Return type
594         <literal>const char *</literal>. 
595        </para></listitem>
596      </varlistentry>
597      <varlistentry><term><literal>syntax</literal></term>
598       <listitem><para>The transfer syntax of the record is returned
599         as a C null-terminated string containing the symbolic name of
600         the record syntax, e.g. <literal>Usmarc</literal>. Return type
601         is
602         <literal>const char *</literal>. 
603        </para></listitem>
604      </varlistentry>
605      <varlistentry><term><literal>render</literal></term>
606       <listitem><para>The record is returned in a display friendly
607         format. Upon completion buffer is returned
608         (type <literal>const char *</literal>) and length is stored in
609         <literal>*len</literal>.
610        </para></listitem>
611      </varlistentry>
612      <varlistentry><term><literal>raw</literal></term>
613       <listitem><para>The record is returned in the internal
614         YAZ specific format. For GRS-1, Explain, and others, the
615         raw data is returned as type 
616         <literal>Z_External *</literal> which is just the type for
617         the member <literal>retrievalRecord</literal> in
618         type <literal>NamePlusRecord</literal>.
619         For SUTRS and octet aligned record (including all MARCs) the
620         octet buffer is returned and the length of the buffer.
621        </para></listitem>
622      </varlistentry>
623      <varlistentry><term><literal>xml</literal></term>
624       <listitem><para>The record is returned in XML if possible.
625         SRW/SRU and Z39.50 records with transfer syntax XML are
626         returned verbatim. MARC records are returned in
627         <ulink url="http://www.loc.gov/standards/marcxml/">
628          MARCXML
629          </ulink> 
630         (converted from ISO2709 to MARCXML by YAZ).
631         GRS-1 and OPAC records are not supported for this form.
632         Upon completion, the XML buffer is returned
633         (type <literal>const char *</literal>) and length is stored in
634         <literal>*len</literal>.
635        </para></listitem>
636      </varlistentry>
637      <varlistentry><term><literal>opac</literal></term>
638       <listitem><para>OPAC for record is returned in XML.
639        </para></listitem>
640      </varlistentry>
641     </variablelist>
642    </para>
643    <para>
644     Most
645     <ulink url="http://www.loc.gov/marc/">
646      MARC21
647     </ulink>
648     records uses the 
649     <ulink url="http://www.loc.gov/marc/specifications/speccharmarc8.html">
650      MARC-8
651     </ulink>
652     character set encoding.
653     An application that wishes to display in Latin-1 would use
654     <screen>
655      render; charset=marc8,iso-8859-1
656     </screen>
657    </para>
658    <sect2><title>Z39.50 Protocol behavior</title>
659     <para>
660      The functions <function>ZOOM_resultset_record</function> and
661      <function>ZOOM_resultset_records</function> inspects the client-side
662      record cache. Records not found in cache are fetched using
663      Present.
664      The functions may block (and perform network I/O)  - even though option
665      <literal>async</literal> is 1, because they return records objects.
666      (and there's no way to return records objects without retrieving them!).
667      </para>
668     <para>
669      There is a trick, however, in the usage of function
670      <function>ZOOM_resultset_records</function> that allows for
671      delayed retrieval (and makes it non-blocking). By using
672      a null pointer for <parameter>recs</parameter> you're indicating
673      you're not interested in getting records objects
674      <emphasis>now</emphasis>.
675     </para>
676    </sect2>
677    <sect2><title>SRW Protocol behavior</title>
678     <para>
679      The ZOOM driver for SRW treats records returned by a SRW server
680      as if they where Z39.50 records with transfer syntax XML and
681      no element set name or database name.
682     </para>
683    </sect2>
684   </sect1>
685   <sect1 id="zoom.scan"><title>Scan</title>
686    <para>
687     This section describes an interface for Scan. Scan is not an
688     official part of the ZOOM model yet. The result of a scan operation
689     is the <literal>ZOOM_scanset</literal> which is a set of terms
690     returned by a target.
691    </para>
692
693    <para>
694     The Scan interface is Z39.50 only. SRW version 1.0 does not
695     support this.
696    </para>
697
698    <synopsis>
699     ZOOM_scanset ZOOM_connection_scan (ZOOM_connection c,
700                                        const char *startterm);
701
702     size_t ZOOM_scanset_size(ZOOM_scanset scan);
703
704     const char * ZOOM_scanset_term(ZOOM_scanset scan, size_t pos,
705                                    int *occ, size_t *len);
706
707     const char * ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos,
708                                            int *occ, size_t *len);
709
710     void ZOOM_scanset_destroy (ZOOM_scanset scan);
711
712     const char *ZOOM_scanset_option_get (ZOOM_scanset scan,
713                                          const char *key);
714
715     void ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key,
716                                   const char *val);
717     </synopsis>
718    <para>
719     The scan set is created by function
720     <function>ZOOM_connection_scan</function> which performs a scan
721     operation on the connection using the specified startterm.
722     If the operation was successful, the size of the scan set can be
723     retrieved by a call to <function>ZOOM_scanset_size</function>.
724     Like result sets, the items are numbered 0,..size-1.
725     To obtain information about a particular scan term, call function
726     <function>ZOOM_scanset_term</function>. This function takes
727     a scan set offset <literal>pos</literal> and returns a pointer
728     to a <emphasis>raw term</emphasis> or <literal>NULL</literal> if
729     non-present.
730     If present, the <literal>occ</literal> and <literal>len</literal> 
731     are set to the number of occurrences and the length
732     of the actual term respectively.
733     <function>ZOOM_scanset_display_term</function> is similar to
734     <function>ZOOM_scanset_term</function> except that it returns
735     the <emphasis>display term</emphasis> rather than the raw term.
736     In a few cases, the term is different from display term. Always
737     use the display term for display and the raw term for subsequent
738     scan operations (to get more terms, next scan result, etc).
739    </para>
740    <para>
741     A scan set may be freed by a call to function
742     <function>ZOOM_scanset_destroy</function>.
743     Functions <function>ZOOM_scanset_option_get</function> and
744     <function>ZOOM_scanset_option_set</function> retrieves and sets
745     an option respectively.
746    </para>
747    
748    <table frame="top"><title>ZOOM Scan Set Options</title>
749     <tgroup cols="3">
750      <colspec colwidth="4*" colname="name"></colspec>
751      <colspec colwidth="7*" colname="description"></colspec>
752      <colspec colwidth="2*" colname="default"></colspec>
753      <thead>
754       <row>
755        <entry>Option</entry>
756        <entry>Description</entry>
757        <entry>Default</entry>
758       </row>
759      </thead>
760      <tbody>
761       <row><entry>
762         number</entry><entry>Number of Scan Terms requested in next scan.
763         After scan it holds the actual number of terms returned.
764        </entry><entry>10</entry></row>
765       <row><entry>
766         position</entry><entry>Preferred Position of term in response
767         in next scan; actual position after completion of scan.
768        </entry><entry>1</entry></row>
769       <row><entry>
770         stepSize</entry><entry>Step Size
771        </entry><entry>0</entry></row>
772       <row><entry>
773         scanStatus</entry><entry>An integer indicating the Scan Status
774         of last scan.
775        </entry><entry>0</entry></row>
776      </tbody>
777     </tgroup>
778    </table>
779    
780   </sect1>
781   <sect1 id="zoom.options"><title>Options</title>
782    <para>
783     Most &zoom; objects provide a way to specify options to change behavior.
784     From an implementation point of view a set of options is just like
785     an associative array / hash array, etc.
786    </para>
787    <synopsis>
788      ZOOM_options ZOOM_options_create (void);
789
790      ZOOM_options ZOOM_options_create_with_parent (ZOOM_options parent);
791
792      void ZOOM_options_destroy (ZOOM_options opt);
793    </synopsis>
794    <synopsis>
795      const char *ZOOM_options_get (ZOOM_options opt, const char *name);
796
797      void ZOOM_options_set (ZOOM_options opt, const char *name,
798                             const char *v);
799    </synopsis>
800    <synopsis>
801      typedef const char *(*ZOOM_options_callback)
802                                      (void *handle, const char *name);
803
804      ZOOM_options_callback
805              ZOOM_options_set_callback (ZOOM_options opt,
806                                         ZOOM_options_callback c,
807                                         void *handle);
808    </synopsis>
809   </sect1>
810   <sect1 id="zoom.events"><title>Events</title>
811    <para>
812     If you're developing non-blocking applications, you have to deal 
813     with events.
814    </para>
815    <synopsis>
816     int ZOOM_event (int no, ZOOM_connection *cs);
817    </synopsis>
818    <para>
819     The <function>ZOOM_event</function> executes pending events for
820     a number of connections. Supply the number of connections in
821     <literal>no</literal> and an array of connections in
822     <literal>cs</literal> (<literal>cs[0] ... cs[no-1]</literal>).
823     A pending event could be a sending a search, receiving a response,
824     etc.
825     When an event has occurred for one of the connections, this function
826     returns a positive integer <literal>n</literal> denoting that an event
827     occurred for connection <literal>cs[n-1]</literal>.
828     When no events are pending for the connections, a value of zero is
829     returned.
830     To ensure that all outstanding requests are performed call this function
831     repeatedly until zero is returned.
832    </para>
833    <para>
834     If <function>ZOOM_event</function> returns and returns non-zero, the
835     last event that occurred can be expected.
836    </para>
837    <synopsis>
838     int ZOOM_connection_last_event(ZOOM_connection cs);
839    </synopsis>
840    <para>
841     <function>ZOOM_connection_last_event</function> returns an event type
842     (integer) for the last event.
843    </para>
844
845    <table frame="top"><title>ZOOM Event IDs</title>
846     <tgroup cols="2">
847      <colspec colwidth="4*" colname="name"></colspec>
848      <colspec colwidth="7*" colname="description"></colspec>
849      <thead>
850       <row>
851        <entry>Event</entry>
852        <entry>Description</entry>
853       </row>
854      </thead>
855      <tbody>
856       <row>
857        <entry>ZOOM_EVENT_NONE</entry>
858        <entry>No event has occurred</entry>
859       </row>
860       <row>
861        <entry>ZOOM_EVENT_CONNECT</entry>
862        <entry>TCP/IP connect has initiated</entry>
863       </row>
864       <row>
865        <entry>ZOOM_EVENT_SEND_DATA</entry>
866        <entry>Data has been transmitted (sending)</entry>
867       </row>
868       <row>
869        <entry>ZOOM_EVENT_RECV_DATA</entry>
870        <entry>Data has been received)</entry>
871       </row>
872       <row>
873        <entry>ZOOM_EVENT_TIMEOUT</entry>
874        <entry>Timeout</entry>
875       </row>
876       <row>
877        <entry>ZOOM_EVENT_UNKNOWN</entry>
878        <entry>Unknown event</entry>
879       </row>
880       <row>
881        <entry>ZOOM_EVENT_SEND_APDU</entry>
882        <entry>An APDU has been transmitted (sending)</entry>
883       </row>
884       <row>
885        <entry>ZOOM_EVENT_RECV_APDU</entry>
886        <entry>An APDU has been received</entry>
887       </row>
888       <row>
889        <entry>ZOOM_EVENT_RECV_RECORD</entry>
890        <entry>A result-set record has been received</entry>
891       </row>
892       <row>
893        <entry>ZOOM_EVENT_RECV_SEARCH</entry>
894        <entry>A search result been received</entry>
895       </row>
896      </tbody>
897     </tgroup>
898    </table>
899   </sect1>
900  </chapter>
901  
902  <!-- Keep this comment at the end of the file
903  Local variables:
904  mode: sgml
905  sgml-omittag:t
906  sgml-shorttag:t
907  sgml-minimize-attributes:nil
908  sgml-always-quote-attributes:t
909  sgml-indent-step:1
910  sgml-indent-data:t
911  sgml-parent-document: "yaz.xml"
912  sgml-local-catalogs: nil
913  sgml-namecase-general:t
914  End:
915  -->
916