bf892478b9a8c0800194bf6925e33f3aac39f291
[yaz-moved-to-github.git] / doc / zoom.xml
1 <!-- $Id: zoom.xml,v 1.35 2003-11-24 11:27:57 mike 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         pass</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         step</entry><entry>Number of records to be retrieved in
393         one chunk. The value, 0 means unchunked.
394        </entry><entry>0</entry></row>
395       <row><entry>
396         elementSetName</entry><entry>Element-Set name of records. 
397         Most targets should honor element set name <literal>B</literal>
398         and <literal>F</literal> for brief and full respectively.
399        </entry><entry>none</entry></row>
400       <row><entry>
401         preferredRecordSyntax</entry><entry>Preferred Syntax, such as
402         <literal>USMARC</literal>, <literal>SUTRS</literal>, etc.
403        </entry><entry>none</entry></row>
404       <row><entry>
405         schema</entry><entry>Schema for retrieval, such as
406         <literal>Gils-schema</literal>, <literal>Geo-schema</literal>, etc.
407        </entry><entry>none</entry></row>
408       <row><entry>
409         setname</entry><entry>Name of Result Set (Result Set ID).
410         If this option isn't set, the ZOOM module will automatically
411         allocate a result set name.
412        </entry><entry>default</entry></row>
413      </tbody>
414     </tgroup>
415    </table>
416    <sect2>
417     <title>Z39.50 Protocol behavior</title>
418     <para>
419      The creation of a result set involves at least a SearchRequest
420      - SearchResponse protocol handshake. Following that, if a sort
421      criteria was specified as part of the query, a SortRequest -
422      SortResponse handshake takes place. Note that it is necessary to
423      perform sorting before any retrieval takes place, so no records will
424      be returned from the target as part of the SearchResponse because these
425      would be unsorted. Hence, piggyback is disabled when sort criteria
426      are set. Following Search - and a possible sort - Retrieval takes
427      place - as one or more Present Requests/Response pairs being
428      transferred.
429      </para>
430     <para>
431      The API allows for two different modes for retrieval. A high level
432      mode which is somewhat more powerful and a low level one.
433      The low level is enabled when searching on a Connection object
434      for which the settings
435      <literal>smallSetUpperBound</literal>,
436      <literal>mediumSetPresentNumber</literal> and
437      <literal>largeSetLowerBound</literal> are set. The low level mode
438      thus allows you to precisely set how records are returned as part
439      of a search response as offered by the Z39.50 protocol.
440      Since the client may be retrieving records as part of the
441      search response, this mode doesn't work well if sorting is used.
442      </para>
443     <para>
444      The high-level mode allows you to fetch a range of records from
445      the result set with a given start offset. When you use this mode
446      the client will automatically use piggyback if that is possible
447      with the target and perform one or more present requests as needed.
448      Even if the target returns fewer records as part of a present response
449      because of a record size limit, etc. the client will repeat sending
450      present requests. As an example, if option <literal>start</literal>
451      is 0 (default) and <literal>count</literal> is 4, and
452      <literal>piggyback</literal> is 1 (default) and no sorting criteria
453      is specified, then the client will attempt to retrieve the 4
454      records as part the search response (using piggyback). On the other
455      hand, if either <literal>start</literal> is positive or if
456      a sorting criteria is set, or if <literal>piggyback</literal>
457      is 0, then the client will not perform piggyback but send Present
458      Requests instead.
459     </para>
460     <para>
461      If either of the options <literal>mediumSetElementSetName</literal> and
462      <literal>smallSetElementSetName</literal> are unset, the value
463      of option <literal>elementSetName</literal> is used for piggyback
464      searches. This means that for the high-level mode you only have
465      to specify one elementSetName option rather than three.
466      </para>
467    </sect2>
468    <sect2>
469     <title>SRW Protocol behavior</title>
470     <para>
471      Current version of &yaz; does not take advantage of a result set id
472      returned by the SRW server. Future versions might do, however.
473      Since, the ZOOM driver does not save result set IDs any
474      present (retrieval) is transformed to a SRW SearchRetrieveRequest
475      with same query but, possibly, different offsets.
476     </para>
477     <para>
478      Option <literal>schema</literal> specifies SRW schema
479      for retrieval. However, options <literal>elementSetName</literal> and
480      <literal>preferredRecordSyntax</literal> are ignored.
481     </para>
482     <para>
483      Options <literal>start</literal> and <literal>count</literal> 
484      are supported by SRW.
485      The remaining options
486      <literal>piggyback</literal>, 
487      <literal>smallSetUpperBound</literal>, 
488      <literal>largeSetLowerBound</literal>, 
489      <literal>mediumSetPresentNumber</literal>, 
490      <literal>mediumSetElementSetName</literal>,
491       <literal>smallSetElementSetName</literal> are
492      unsupported.
493     </para>
494     <para>
495      SRW supports CQL queries, <emphasis>not</emphasis> PQF.
496      If PQF is used, however, the PQF query is transferred anyway
497      using non-standard element <literal>pQuery</literal> in
498      SRW SearchRetrieveRequest.
499     </para>
500     <para>
501      Unfortunately, SRW does not define a database setting. Hence,
502      <literal>databaseName</literal> is unsupported and ignored.
503      However, the path part in host parameter for functions 
504      <function>ZOOM_connecton_new</function> and
505      <function>ZOOM_connection_connect</function> acts as a
506      database (at least for the &yaz; SRW server).
507     </para>
508    </sect2>
509   </sect1>
510   <sect1 id="zoom.records"><title>Records</title>
511    <para>
512     A record object is a retrieval record on the client side -
513     created from result sets.
514    </para>
515    <synopsis>
516      void ZOOM_resultset_records (ZOOM_resultset r,
517                                   ZOOM_record *recs,
518                                   size_t start, size_t count);
519      ZOOM_record ZOOM_resultset_record (ZOOM_resultset s, size_t pos);
520
521      const char *ZOOM_record_get (ZOOM_record rec, const char *type,
522                                   size_t *len);
523
524      ZOOM_record ZOOM_record_clone (ZOOM_record rec);
525
526      void ZOOM_record_destroy (ZOOM_record rec);
527    </synopsis>
528    <para>
529     References to temporary records are returned by functions 
530     <function>ZOOM_resultset_records</function> or
531     <function>ZOOM_resultset_record</function>.
532     </para>
533    <para>
534     If a persistent reference to a record is desired
535     <function>ZOOM_record_clone</function> should be used.
536     It returns a record reference that should be destroyed
537     by a call to <function>ZOOM_record_destroy</function>.
538    </para>
539    <para>
540     A single record is returned by function
541     <function>ZOOM_resultset_record</function> that takes a 
542     position as argument. First record has position zero.
543     If no record could be obtained <literal>NULL</literal> is returned.
544    </para>
545    <para>
546     Function <function>ZOOM_resultset_records</function> retrieves
547     a number of records from a result set. Parameter <literal>start</literal>
548     and <literal>count</literal> specifies the range of records to
549     be returned. Upon completion array
550     <literal>recs[0], ..recs[count-1]</literal>
551     holds record objects for the records. The array of records
552      <literal>recs</literal> should be allocated prior the call
553     <function>ZOOM_resultset_records</function>. Note that for those
554     records that couldn't be retrieved from the target
555     <literal>recs[ ..]</literal> is set to <literal>NULL</literal>.
556    </para>
557    <para id="zoom.record.get">
558     In order to extract information about a single record,
559     <function>ZOOM_record_get</function> is provided. The
560     function returns a pointer to certain record information. The
561     nature (type) of the pointer depends on the parameter,
562     <parameter>type</parameter>.
563    </para>
564    <para>
565     The <parameter>type</parameter> is a string of the format:
566    </para>
567    <para>
568     <replaceable>form</replaceable>[; charset=<replaceable>from</replaceable>[,<replaceable>to</replaceable>]]
569    </para>
570    <para>
571     where <replaceable>form</replaceable> specifies the format of the
572     returned record, <replaceable>from</replaceable>
573     specifies the character set of the record in its original form
574     (as returned by the server), <replaceable>to</replaceable> specifies
575     the output (returned)
576     character set encoding.
577     If charset is not given, then no character set conversion takes place.
578     If <replaceable>to</replaceable> is omitted UTF-8 is assumed.
579    </para>
580    <para>
581     In addition, for certain types, the length
582     <literal>len</literal> passed will be set to the size in bytes of
583     the returned information. 
584     </para>
585    <para>
586     The following are the supported values for <replaceable>form</replaceable>.
587     <variablelist>
588      <varlistentry><term><literal>database</literal></term>
589       <listitem><para>Database of record is returned
590         as a C null-terminated string. Return type
591         <literal>const char *</literal>. 
592        </para></listitem>
593      </varlistentry>
594      <varlistentry><term><literal>syntax</literal></term>
595       <listitem><para>The transfer syntax of the record is returned
596         as a C null-terminated string containing the symbolic name of
597         the record syntax, e.g. <literal>Usmarc</literal>. Return type
598         is
599         <literal>const char *</literal>. 
600        </para></listitem>
601      </varlistentry>
602      <varlistentry><term><literal>render</literal></term>
603       <listitem><para>The record is returned in a display friendly
604         format. Upon completion buffer is returned
605         (type <literal>const char *</literal>) and length is stored in
606         <literal>*len</literal>.
607        </para></listitem>
608      </varlistentry>
609      <varlistentry><term><literal>raw</literal></term>
610       <listitem><para>The record is returned in the internal
611         YAZ specific format. For GRS-1, Explain, and others, the
612         raw data is returned as type 
613         <literal>Z_External *</literal> which is just the type for
614         the member <literal>retrievalRecord</literal> in
615         type <literal>NamePlusRecord</literal>.
616         For SUTRS and octet aligned record (including all MARCs) the
617         octet buffer is returned and the length of the buffer.
618        </para></listitem>
619      </varlistentry>
620      <varlistentry><term><literal>xml</literal></term>
621       <listitem><para>The record is returned in XML if possible.
622         SRW/SRU and Z39.50 records with transfer syntax XML are
623         returned verbatim. MARC records are returned in
624         <ulink url="http://www.loc.gov/standards/marcxml/">
625          MARCXML
626          </ulink> 
627         (converted from ISO2709 to MARCXML by YAZ).
628         GRS-1 and OPAC records are not supported for this form.
629         Upon completion, the XML buffer is returned
630         (type <literal>const char *</literal>) and length is stored in
631         <literal>*len</literal>.
632        </para></listitem>
633      </varlistentry>
634      <varlistentry><term><literal>opac</literal></term>
635       <listitem><para>OPAC for record is returned in XML.
636        </para></listitem>
637      </varlistentry>
638     </variablelist>
639    </para>
640    <para>
641     Most
642     <ulink url="http://www.loc.gov/marc/">
643      MARC21
644     </ulink>
645     records uses the 
646     <ulink url="http://www.loc.gov/marc/specifications/speccharmarc8.html">
647      MARC-8
648     </ulink>
649     character set encoding.
650     An application that wishes to display in Latin-1 would use
651     <screen>
652      render; charset=marc8,iso-8859-1
653     </screen>
654    </para>
655    <sect2><title>Z39.50 Protocol behavior</title>
656     <para>
657      The functions <function>ZOOM_resultset_record</function> and
658      <function>ZOOM_resultset_records</function> inspects the client-side
659      record cache. Records not found in cache are fetched using
660      Present.
661      The functions may block (and perform network I/O)  - even though option
662      <literal>async</literal> is 1, because they return records objects.
663      (and there's no way to return records objects without retrieving them!).
664      </para>
665     <para>
666      There is a trick, however, in the usage of function
667      <function>ZOOM_resultset_records</function> that allows for
668      delayed retrieval (and makes it non-blocking). By using
669      a null pointer for <parameter>recs</parameter> you're indicating
670      you're not interested in getting records objects
671      <emphasis>now</emphasis>.
672     </para>
673    </sect2>
674    <sect2><title>SRW Protocol behavior</title>
675     <para>
676      The ZOOM driver for SRW treats records returned by a SRW server
677      as if they where Z39.50 records with transfer syntax XML and
678      no element set name or database name.
679     </para>
680    </sect2>
681   </sect1>
682   <sect1 id="zoom.scan"><title>Scan</title>
683    <para>
684     This section describes an interface for Scan. Scan is not an
685     official part of the ZOOM model yet. The result of a scan operation
686     is the <literal>ZOOM_scanset</literal> which is a set of terms
687     returned by a target.
688    </para>
689
690    <para>
691     The Scan interface is Z39.50 only. SRW version 1.0 does not
692     support this.
693    </para>
694
695    <synopsis>
696     ZOOM_scanset ZOOM_connection_scan (ZOOM_connection c,
697                                        const char *startterm);
698
699     size_t ZOOM_scanset_size(ZOOM_scanset scan);
700
701     const char * ZOOM_scanset_term(ZOOM_scanset scan, size_t pos,
702                                    int *occ, size_t *len);
703
704     const char * ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos,
705                                            int *occ, size_t *len);
706
707     void ZOOM_scanset_destroy (ZOOM_scanset scan);
708
709     const char *ZOOM_scanset_option_get (ZOOM_scanset scan,
710                                          const char *key);
711
712     void ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key,
713                                   const char *val);
714     </synopsis>
715    <para>
716     The scan set is created by function
717     <function>ZOOM_connection_scan</function> which performs a scan
718     operation on the connection using the specified startterm.
719     If the operation was successful, the size of the scan set can be
720     retrieved by a call to <function>ZOOM_scanset_size</function>.
721     Like result sets, the items are numbered 0,..size-1.
722     To obtain information about a particular scan term, call function
723     <function>ZOOM_scanset_term</function>. This function takes
724     a scan set offset <literal>pos</literal> and returns a pointer
725     to a <emphasis>raw term</emphasis> or <literal>NULL</literal> if
726     non-present.
727     If present, the <literal>occ</literal> and <literal>len</literal> 
728     are set to the number of occurrences and the length
729     of the actual term respectively.
730     <function>ZOOM_scanset_display_term</function> is similar to
731     <function>ZOOM_scanset_term</function> except that it returns
732     the <emphasis>display term</emphasis> rather than the raw term.
733     In a few cases, the term is different from display term. Always
734     use the display term for display and the raw term for subsequent
735     scan operations (to get more terms, next scan result, etc).
736    </para>
737    <para>
738     A scan set may be freed by a call to function
739     <function>ZOOM_scanset_destroy</function>.
740     Functions <function>ZOOM_scanset_option_get</function> and
741     <function>ZOOM_scanset_option_set</function> retrieves and sets
742     an option respectively.
743    </para>
744    
745    <table frame="top"><title>ZOOM Scan Set Options</title>
746     <tgroup cols="3">
747      <colspec colwidth="4*" colname="name"></colspec>
748      <colspec colwidth="7*" colname="description"></colspec>
749      <colspec colwidth="2*" colname="default"></colspec>
750      <thead>
751       <row>
752        <entry>Option</entry>
753        <entry>Description</entry>
754        <entry>Default</entry>
755       </row>
756      </thead>
757      <tbody>
758       <row><entry>
759         number</entry><entry>Number of Scan Terms requested in next scan.
760         After scan it holds the actual number of terms returned.
761        </entry><entry>10</entry></row>
762       <row><entry>
763         position</entry><entry>Preferred Position of term in response
764         in next scan; actual position after completion of scan.
765        </entry><entry>1</entry></row>
766       <row><entry>
767         stepSize</entry><entry>Step Size
768        </entry><entry>0</entry></row>
769       <row><entry>
770         scanStatus</entry><entry>An integer indicating the Scan Status
771         of last scan.
772        </entry><entry>0</entry></row>
773      </tbody>
774     </tgroup>
775    </table>
776    
777   </sect1>
778   <sect1 id="zoom.options"><title>Options</title>
779    <para>
780     Most &zoom; objects provide a way to specify options to change behavior.
781     From an implementation point of view a set of options is just like
782     an associative array / hash array, etc.
783    </para>
784    <synopsis>
785      ZOOM_options ZOOM_options_create (void);
786
787      ZOOM_options ZOOM_options_create_with_parent (ZOOM_options parent);
788
789      void ZOOM_options_destroy (ZOOM_options opt);
790    </synopsis>
791    <synopsis>
792      const char *ZOOM_options_get (ZOOM_options opt, const char *name);
793
794      void ZOOM_options_set (ZOOM_options opt, const char *name,
795                             const char *v);
796    </synopsis>
797    <synopsis>
798      typedef const char *(*ZOOM_options_callback)
799                                      (void *handle, const char *name);
800
801      ZOOM_options_callback
802              ZOOM_options_set_callback (ZOOM_options opt,
803                                         ZOOM_options_callback c,
804                                         void *handle);
805    </synopsis>
806   </sect1>
807   <sect1 id="zoom.events"><title>Events</title>
808    <para>
809     If you're developing non-blocking applications, you have to deal 
810     with events.
811    </para>
812    <synopsis>
813     int ZOOM_event (int no, ZOOM_connection *cs);
814    </synopsis>
815    <para>
816     The <function>ZOOM_event</function> executes pending events for
817     a number of connections. Supply the number of connections in
818     <literal>no</literal> and an array of connections in
819     <literal>cs</literal> (<literal>cs[0] ... cs[no-1]</literal>).
820     A pending event could be a sending a search, receiving a response,
821     etc.
822     When an event has occurred for one of the connections, this function
823     returns a positive integer <literal>n</literal> denoting that an event
824     occurred for connection <literal>cs[n-1]</literal>.
825     When no events are pending for the connections, a value of zero is
826     returned.
827     To ensure that all outstanding requests are performed call this function
828     repeatedly until zero is returned.
829    </para>
830   </sect1>
831  </chapter>
832  
833  <!-- Keep this comment at the end of the file
834  Local variables:
835  mode: sgml
836  sgml-omittag:t
837  sgml-shorttag:t
838  sgml-minimize-attributes:nil
839  sgml-always-quote-attributes:t
840  sgml-indent-step:1
841  sgml-indent-data:t
842  sgml-parent-document: "yaz.xml"
843  sgml-local-catalogs: nil
844  sgml-namecase-general:t
845  End:
846  -->
847