Bump version to 4.0.0
[yaz-moved-to-github.git] / doc / tools.xml
1  <chapter id="tools"><title>Supporting Tools</title>
2   
3   <para>
4    In support of the service API - primarily the ASN module, which
5    provides the pro-grammatic interface to the Z39.50 APDUs, &yaz; contains
6    a collection of tools that support the development of applications.
7   </para>
8
9   <sect1 id="tools.query"><title>Query Syntax Parsers</title>
10
11    <para>
12     Since the type-1 (RPN) query structure has no direct, useful string
13     representation, every origin application needs to provide some form of
14     mapping from a local query notation or representation to a
15     <token>Z_RPNQuery</token> structure. Some programmers will prefer to
16     construct the query manually, perhaps using
17     <function>odr_malloc()</function> to simplify memory management.
18     The &yaz; distribution includes three separate, query-generating tools
19     that may be of use to you.
20    </para>
21
22    <sect2 id="PQF"><title>Prefix Query Format</title>
23
24     <para>
25      Since RPN or reverse polish notation is really just a fancy way of
26      describing a suffix notation format (operator follows operands), it
27      would seem that the confusion is total when we now introduce a prefix
28      notation for RPN. The reason is one of simple laziness - it's somewhat
29      simpler to interpret a prefix format, and this utility was designed
30      for maximum simplicity, to provide a baseline representation for use
31      in simple test applications and scripting environments (like Tcl). The
32      demonstration client included with YAZ uses the PQF.
33     </para>
34
35     <note>
36      <para>
37       The PQF have been adopted by other parties developing Z39.50
38       software. It is often referred to as Prefix Query Notation
39       - PQN.
40      </para>
41     </note>
42     <para>
43      The PQF is defined by the pquery module in the YAZ library. 
44      There are two sets of function that have similar behavior. First
45      set operates on a PQF parser handle, second set doesn't. First set
46      set of functions are more flexible than the second set. Second set
47      is obsolete and is only provided to ensure backwards compatibility.
48     </para>
49     <para>
50      First set of functions all operate on a PQF parser handle:
51     </para>
52     <synopsis>
53      #include &lt;yaz/pquery.h&gt;
54
55      YAZ_PQF_Parser yaz_pqf_create (void);
56
57      void yaz_pqf_destroy (YAZ_PQF_Parser p);
58
59      Z_RPNQuery *yaz_pqf_parse (YAZ_PQF_Parser p, ODR o, const char *qbuf);
60
61      Z_AttributesPlusTerm *yaz_pqf_scan (YAZ_PQF_Parser p, ODR o,
62                           Odr_oid **attributeSetId, const char *qbuf);
63
64
65      int yaz_pqf_error (YAZ_PQF_Parser p, const char **msg, size_t *off);
66     </synopsis>
67     <para>
68      A PQF parser is created and destructed by functions
69      <function>yaz_pqf_create</function> and
70      <function>yaz_pqf_destroy</function> respectively.
71      Function <function>yaz_pqf_parse</function> parses query given
72      by string <literal>qbuf</literal>. If parsing was successful,
73      a Z39.50 RPN Query is returned which is created using ODR stream
74      <literal>o</literal>. If parsing failed, a NULL pointer is
75      returned.
76      Function <function>yaz_pqf_scan</function> takes a scan query in 
77      <literal>qbuf</literal>. If parsing was successful, the function
78      returns attributes plus term pointer and modifies
79      <literal>attributeSetId</literal> to hold attribute set for the
80      scan request - both allocated using ODR stream <literal>o</literal>.
81      If parsing failed, yaz_pqf_scan returns a NULL pointer.
82      Error information for bad queries can be obtained by a call to
83      <function>yaz_pqf_error</function> which returns an error code and
84      modifies <literal>*msg</literal> to point to an error description,
85      and modifies <literal>*off</literal> to the offset within last
86      query were parsing failed.
87     </para>
88     <para>
89      The second set of functions are declared as follows:
90     </para>
91     <synopsis>
92      #include &lt;yaz/pquery.h&gt;
93
94      Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
95
96      Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
97                              Odr_oid **attributeSetP, const char *qbuf);
98
99      int p_query_attset (const char *arg);
100     </synopsis>
101     <para>
102      The function <function>p_query_rpn()</function> takes as arguments an
103       &odr; stream (see section <link linkend="odr">The ODR Module</link>)
104      to provide a memory source (the structure created is released on
105      the next call to <function>odr_reset()</function> on the stream), a
106      protocol identifier (one of the constants <token>PROTO_Z3950</token> and
107      <token>PROTO_SR</token>), an attribute set reference, and
108      finally a null-terminated string holding the query string.
109     </para>
110     <para>
111      If the parse went well, <function>p_query_rpn()</function> returns a
112      pointer to a <literal>Z_RPNQuery</literal> structure which can be
113      placed directly into a <literal>Z_SearchRequest</literal>. 
114      If parsing failed, due to syntax error, a NULL pointer is returned.
115     </para>
116     <para>
117      The <literal>p_query_attset</literal> specifies which attribute set
118      to use if the query doesn't specify one by the
119      <literal>@attrset</literal> operator.
120      The <literal>p_query_attset</literal> returns 0 if the argument is a
121      valid attribute set specifier; otherwise the function returns -1.
122     </para>
123
124     <para>
125      The grammar of the PQF is as follows:
126     </para>
127
128     <literallayout>
129      query ::= top-set query-struct.
130
131      top-set ::= [ '@attrset' string ]
132
133      query-struct ::= attr-spec | simple | complex | '@term' term-type query
134
135      attr-spec ::= '@attr' [ string ] string query-struct
136
137      complex ::= operator query-struct query-struct.
138
139      operator ::= '@and' | '@or' | '@not' | '@prox' proximity.
140
141      simple ::= result-set | term.
142
143      result-set ::= '@set' string.
144
145      term ::= string.
146
147      proximity ::= exclusion distance ordered relation which-code unit-code.
148
149      exclusion ::= '1' | '0' | 'void'.
150
151      distance ::= integer.
152
153      ordered ::= '1' | '0'.
154
155      relation ::= integer.
156
157      which-code ::= 'known' | 'private' | integer.
158
159      unit-code ::= integer.
160
161      term-type ::= 'general' | 'numeric' | 'string' | 'oid' | 'datetime' | 'null'.
162     </literallayout>
163
164     <para>
165      You will note that the syntax above is a fairly faithful
166      representation of RPN, except for the Attribute, which has been
167      moved a step away from the term, allowing you to associate one or more
168      attributes with an entire query structure. The parser will
169      automatically apply the given attributes to each term as required.
170     </para>
171
172     <para>
173      The @attr operator is followed by an attribute specification 
174      (<literal>attr-spec</literal> above). The specification consists
175      of an optional attribute set, an attribute type-value pair and
176      a sub-query. The attribute type-value pair is packed in one string:
177      an attribute type, an equals sign, and an attribute value, like this:
178      <literal>@attr 1=1003</literal>.
179      The type is always an integer but the value may be either an
180      integer or a string (if it doesn't start with a digit character).
181      A string attribute-value is encoded as a Type-1 ``complex''
182      attribute with the list of values containing the single string
183      specified, and including no semantic indicators.
184     </para>
185
186     <para>
187      Version 3 of the Z39.50 specification defines various encoding of terms.
188      Use <literal>@term </literal> <replaceable>type</replaceable>
189      <replaceable>string</replaceable>,
190      where type is one of: <literal>general</literal>,
191      <literal>numeric</literal> or <literal>string</literal>
192      (for InternationalString).
193      If no term type has been given, the <literal>general</literal> form
194      is used.  This is the only encoding allowed in both versions 2 and 3
195      of the Z39.50 standard.
196     </para>
197     
198     <sect3 id="PQF-prox">
199       <title>Using Proximity Operators with PQF</title>
200       <note>
201         <para>
202           This is an advanced topic, describing how to construct
203           queries that make very specific requirements on the
204           relative location of their operands.
205           You may wish to skip this section and go straight to
206           <link linkend="pqf-examples">the example PQF queries</link>.
207         </para>
208         <para>
209           <warning>
210             <para>
211               Most Z39.50 servers do not support proximity searching, or
212               support only a small subset of the full functionality that
213               can be expressed using the PQF proximity operator.  Be
214               aware that the ability to <emphasis>express</emphasis> a
215               query in PQF is no guarantee that any given server will
216               be able to <emphasis>execute</emphasis> it.
217             </para>
218           </warning>
219         </para>
220       </note>
221       <para>
222         The proximity operator <literal>@prox</literal> is a special
223         and more restrictive version of the conjunction operator
224         <literal>@and</literal>.  Its semantics are described in 
225         section 3.7.2 (Proximity) of Z39.50 the standard itself, which
226         can be read on-line at
227         <ulink url="&url.z39.50.proximity;"/>
228       </para>
229       <para>
230         In PQF, the proximity operation is represented by a sequence
231         of the form
232         <screen>
233 @prox <replaceable>exclusion</replaceable> <replaceable>distance</replaceable> <replaceable>ordered</replaceable> <replaceable>relation</replaceable> <replaceable>which-code</replaceable> <replaceable>unit-code</replaceable>
234         </screen>
235         in which the meanings of the parameters are as described in in
236         the standard, and they can take the following values:
237         <itemizedlist>
238           <listitem><formalpara><title>exclusion</title><para>
239             0 = false (i.e. the proximity condition specified by the
240             remaining parameters must be satisfied) or
241             1 = true (the proximity condition specified by the
242             remaining parameters must <emphasis>not</emphasis> be
243             satisifed).
244           </para></formalpara></listitem>
245           <listitem><formalpara><title>distance</title><para>
246             An integer specifying the difference between the locations
247             of the operands: e.g. two adjacent words would have
248             distance=1 since their locations differ by one unit.
249           </para></formalpara></listitem>
250           <listitem><formalpara><title>ordered</title><para>
251             1 = ordered (the operands must occur in the order the
252             query specifies them) or
253             0 = unordered (they may appear in either order).
254           </para></formalpara></listitem>
255           <listitem><formalpara><title>relation</title><para>
256             Recognised values are
257             1 (lessThan),
258             2 (lessThanOrEqual),
259             3 (equal),
260             4 (greaterThanOrEqual),
261             5 (greaterThan) and
262             6 (notEqual).
263           </para></formalpara></listitem>
264           <listitem><formalpara><title>which-code</title><para>
265             <literal>known</literal>
266             or
267             <literal>k</literal>
268             (the unit-code parameter is taken from the well-known list
269             of alternatives described in below) or
270             <literal>private</literal>
271             or
272             <literal>p</literal>
273             (the unit-code paramater has semantics specific to an
274             out-of-band agreement such as a profile).
275           </para></formalpara></listitem>
276           <listitem><formalpara><title>unit-code</title><para>
277             If the which-code parameter is <literal>known</literal>
278             then the recognised values are
279             1 (character),
280             2 (word),
281             3 (sentence),
282             4 (paragraph),
283             5 (section),
284             6 (chapter),
285             7 (document),
286             8 (element),
287             9 (subelement),
288             10 (elementType) and
289             11 (byte).
290             If which-code is <literal>private</literal> then the
291             acceptable values are determined by the profile.
292           </para></formalpara></listitem>
293         </itemizedlist>
294         (The numeric values of the relation and well-known unit-code
295         parameters are taken straight from
296         <ulink url="&url.z39.50.proximity.asn1;"
297         >the ASN.1</ulink> of the proximity structure in the standard.)
298       </para>
299     </sect3>
300
301     <sect3 id="pqf-examples"><title>PQF queries</title>
302
303      <example id="example.pqf.simple.terms">
304       <title>PQF queries using simple terms</title>
305       <para>
306        <screen>
307         dylan
308
309         "bob dylan"
310        </screen>
311       </para>
312      </example>
313      <example id="pqf.example.pqf.boolean.operators">
314       <title>PQF boolean operators</title>
315       <para>
316        <screen>
317         @or "dylan" "zimmerman"
318
319         @and @or dylan zimmerman when
320
321         @and when @or dylan zimmerman
322        </screen>
323       </para>
324      </example>
325      <example id="example.pqf.result.sets">
326       <title>PQF references to result sets</title>
327       <para>
328        <screen>
329         @set Result-1
330
331         @and @set seta @set setb
332        </screen>
333       </para>
334      </example>
335      <example id="example.pqf.attributes">
336       <title>Attributes for terms</title>
337       <para>
338        <screen>
339         @attr 1=4 computer
340
341         @attr 1=4 @attr 4=1 "self portrait"
342
343         @attrset exp1 @attr 1=1 CategoryList
344
345         @attr gils 1=2008 Copenhagen
346
347         @attr 1=/book/title computer
348        </screen>
349       </para>
350      </example>
351      <example id="example.pqf.proximity">
352       <title>PQF Proximity queries</title>
353       <para>
354        <screen>
355         @prox 0 3 1 2 k 2 dylan zimmerman
356        </screen>
357        <note><para>
358          Here the parameters 0, 3, 1, 2, k and 2 represent exclusion,
359          distance, ordered, relation, which-code and unit-code, in that
360          order.  So:
361          <itemizedlist>
362           <listitem><para>
363             exclusion = 0: the proximity condition must hold
364            </para></listitem>
365           <listitem><para>
366             distance = 3: the terms must be three units apart
367            </para></listitem>
368           <listitem><para>
369             ordered = 1: they must occur in the order they are specified
370            </para></listitem>
371           <listitem><para>
372             relation = 2: lessThanOrEqual (to the distance of 3 units)
373            </para></listitem>
374           <listitem><para>
375             which-code is ``known'', so the standard unit-codes are used
376            </para></listitem>
377           <listitem><para>
378             unit-code = 2: word.
379            </para></listitem>
380          </itemizedlist>
381          So the whole proximity query means that the words
382          <literal>dylan</literal> and <literal>zimmerman</literal> must
383          both occur in the record, in that order, differing in position
384          by three or fewer words (i.e. with two or fewer words between
385          them.)  The query would find ``Bob Dylan, aka. Robert
386          Zimmerman'', but not ``Bob Dylan, born as Robert Zimmerman''
387          since the distance in this case is four.
388         </para></note>
389       </para>
390      </example>
391      <example id="example.pqf.search.term.type">
392       <title>PQF specification of search term type</title>
393       <para>
394        <screen>
395         @term string "a UTF-8 string, maybe?"
396        </screen>
397       </para>
398      </example>
399      <example id="example.pqf.mixed.queries">
400       <title>PQF mixed queries</title>
401       <para>
402        <screen>
403         @or @and bob dylan @set Result-1
404         
405         @attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
406         
407         @and @attr 2=4 @attr gils 1=2038 -114 @attr 2=2 @attr gils 1=2039 -109
408       </screen>
409        <note>
410         <para>
411          The last of these examples is a spatial search: in
412          <ulink url="http://www.gils.net/prof_v2.html#sec_7_4"
413           >the GILS attribute set</ulink>,
414          access point
415          2038 indicates West Bounding Coordinate and
416          2030 indicates East Bounding Coordinate,
417          so the query is for areas extending from -114 degrees
418          to no more than -109 degrees.
419         </para>
420        </note>
421       </para>
422      </example>
423     </sect3>
424    </sect2>
425    <sect2 id="CCL"><title>CCL</title>
426
427     <para>
428      Not all users enjoy typing in prefix query structures and numerical
429      attribute values, even in a minimalistic test client. In the library
430      world, the more intuitive Common Command Language - CCL (ISO 8777)
431      has enjoyed some popularity - especially before the widespread
432      availability of graphical interfaces. It is still useful in
433      applications where you for some reason or other need to provide a
434      symbolic language for expressing boolean query structures.
435     </para>
436
437     <sect3 id="ccl.syntax">
438      <title>CCL Syntax</title>
439
440      <para>
441       The CCL parser obeys the following grammar for the FIND argument.
442       The syntax is annotated by in the lines prefixed by
443       <literal>--</literal>.
444      </para>
445
446      <screen>
447       CCL-Find ::= CCL-Find Op Elements
448                 | Elements.
449
450       Op ::= "and" | "or" | "not"
451       -- The above means that Elements are separated by boolean operators.
452
453       Elements ::= '(' CCL-Find ')'
454                 | Set
455                 | Terms
456                 | Qualifiers Relation Terms
457                 | Qualifiers Relation '(' CCL-Find ')'
458                 | Qualifiers '=' string '-' string
459       -- Elements is either a recursive definition, a result set reference, a
460       -- list of terms, qualifiers followed by terms, qualifiers followed
461       -- by a recursive definition or qualifiers in a range (lower - upper).
462
463       Set ::= 'set' = string
464       -- Reference to a result set
465
466       Terms ::= Terms Prox Term
467              | Term
468       -- Proximity of terms.
469
470       Term ::= Term string
471             | string
472       -- This basically means that a term may include a blank
473
474       Qualifiers ::= Qualifiers ',' string
475                   | string
476       -- Qualifiers is a list of strings separated by comma
477
478       Relation ::= '=' | '>=' | '&lt;=' | '&lt;>' | '>' | '&lt;'
479       -- Relational operators. This really doesn't follow the ISO8777
480       -- standard.
481
482       Prox ::= '%' | '!'
483       -- Proximity operator
484
485      </screen>
486      
487      <example id="example.ccl.queries">
488       <title>CCL queries</title>
489       <para>
490        The following queries are all valid:
491       </para>
492       
493       <screen>
494        dylan
495        
496        "bob dylan"
497        
498        dylan or zimmerman
499        
500        set=1
501        
502        (dylan and bob) or set=1
503        
504       </screen>
505       <para>
506        Assuming that the qualifiers <literal>ti</literal>,
507        <literal>au</literal>
508        and <literal>date</literal> are defined we may use:
509       </para>
510       
511       <screen>
512        ti=self portrait
513        
514        au=(bob dylan and slow train coming)
515
516        date>1980 and (ti=((self portrait)))
517        
518       </screen>
519      </example>
520      
521     </sect3>
522     <sect3 id="ccl.qualifiers">
523      <title>CCL Qualifiers</title>
524      
525      <para>
526       Qualifiers are used to direct the search to a particular searchable
527       index, such as title (ti) and author indexes (au). The CCL standard
528       itself doesn't specify a particular set of qualifiers, but it does
529       suggest a few short-hand notations. You can customize the CCL parser
530       to support a particular set of qualifiers to reflect the current target
531       profile. Traditionally, a qualifier would map to a particular
532       use-attribute within the BIB-1 attribute set. It is also
533       possible to set other attributes, such as the structure
534       attribute.
535      </para>
536
537      <para>
538       A  CCL profile is a set of predefined CCL qualifiers that may be
539       read from a file or set in the CCL API.
540       The YAZ client reads its CCL qualifiers from a file named
541       <filename>default.bib</filename>. There are four types of
542       lines in a CCL profile: qualifier specification,
543       qualifier alias, comments and directives.
544      </para>
545      <sect4 id="ccl.qualifier.specification">
546       <title>Qualifier specification</title>
547       <para>
548        A qualifier specification is of the form:
549       </para>
550       
551       <para>
552        <replaceable>qualifier-name</replaceable>  
553        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable>
554        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable> ...      
555       </para>
556       
557       <para>
558        where <replaceable>qualifier-name</replaceable> is the name of the
559        qualifier to be used (eg. <literal>ti</literal>),
560        <replaceable>type</replaceable> is attribute type in the attribute
561        set (Bib-1 is used if no attribute set is given) and
562        <replaceable>val</replaceable> is attribute value.
563        The <replaceable>type</replaceable> can be specified as an
564        integer or as it be specified either as a single-letter:
565        <literal>u</literal> for use, 
566        <literal>r</literal> for relation,<literal>p</literal> for position,
567        <literal>s</literal> for structure,<literal>t</literal> for truncation
568        or <literal>c</literal> for completeness.
569        The attributes for the special qualifier name <literal>term</literal>
570        are used when no CCL qualifier is given in a query.
571        <table id="ccl.common.bib1.attributes">
572         <title>Common Bib-1 attributes</title>
573         <tgroup cols="2">
574          <colspec colwidth="2*" colname="type"></colspec>
575          <colspec colwidth="9*" colname="description"></colspec>
576          <thead>
577           <row>
578            <entry>Type</entry>
579            <entry>Description</entry>
580           </row>
581          </thead>
582          <tbody>
583           <row>
584            <entry><literal>u=</literal><replaceable>value</replaceable></entry>
585            <entry>
586             Use attribute (1). Common use attributes are
587             1 Personal-name, 4 Title, 7 ISBN, 8 ISSN, 30 Date,
588             62 Subject, 1003 Author), 1016 Any. Specify value
589             as an integer.
590            </entry>
591           </row>
592
593           <row>
594            <entry><literal>r=</literal><replaceable>value</replaceable></entry>
595            <entry>
596             Relation attribute (2). Common values are
597             1 &lt;, 2 &lt;=, 3 =, 4 &gt;=, 5 &gt;, 6 &lt;&gt;,
598             100 phonetic, 101 stem, 102 relevance, 103 always matches.
599            </entry>
600           </row>
601
602           <row>
603            <entry><literal>p=</literal><replaceable>value</replaceable></entry>
604            <entry>
605             Position attribute (3). Values: 1 first in field, 2
606             first in any subfield, 3 any position in field.
607            </entry>
608           </row>
609
610           <row>
611            <entry><literal>s=</literal><replaceable>value</replaceable></entry>
612            <entry>
613             Structure attribute (4). Values: 1 phrase, 2 word,
614             3 key, 4 year, 5 date, 6 word list, 100 date (un),
615             101 name (norm), 102 name (un), 103 structure, 104 urx,
616             105 free-form-text, 106 document-text, 107 local-number,
617             108 string, 109 numeric string.
618            </entry>
619           </row>
620
621           <row>
622            <entry><literal>t=</literal><replaceable>value</replaceable></entry>
623            <entry>
624             Truncation attribute (5). Values: 1 right, 2 left,
625             3 left&amp; right, 100 none, 101 process #, 102 regular-1,
626             103 regular-2, 104 CCL.
627            </entry>
628           </row>
629
630           <row>
631            <entry><literal>c=</literal><replaceable>value</replaceable></entry>
632            <entry>
633             Completeness attribute (6). Values: 1 incomplete subfield,
634             2 complete subfield, 3 complete field.
635            </entry>
636           </row>
637
638          </tbody>
639          </tgroup>
640         </table>
641       </para>
642       <para>
643        Refer to <xref linkend="bib1"/> or the complete
644        <ulink url="&url.z39.50.attset.bib1;">list of Bib-1 attributes</ulink>
645       </para>
646       <para>
647        It is also possible to specify non-numeric attribute values, 
648        which are used in combination with certain types.
649        The special combinations are:
650        
651        <table id="ccl.special.attribute.combos">
652         <title>Special attribute combos</title>
653         <tgroup cols="2">
654          <colspec colwidth="2*" colname="name"></colspec>
655          <colspec colwidth="9*" colname="description"></colspec>
656          <thead>
657           <row>
658            <entry>Name</entry>
659            <entry>Description</entry>
660           </row>
661          </thead>
662          <tbody>
663           <row>
664            <entry><literal>s=pw</literal></entry><entry>
665             The structure is set to either word or phrase depending
666             on the number of tokens in a term (phrase-word).
667            </entry>
668           </row>
669           <row>
670            <entry><literal>s=al</literal></entry><entry>
671             Each token in the term is ANDed. (and-list).
672             This does not set the structure at all.
673            </entry>
674           </row>
675           
676           <row><entry><literal>s=ol</literal></entry><entry>
677             Each token in the term is ORed. (or-list).
678             This does not set the structure at all.
679            </entry>
680           </row>
681           
682           <row><entry><literal>r=o</literal></entry><entry>
683             Allows ranges and the operators greather-than, less-than, ...
684             equals.
685             This sets Bib-1 relation attribute accordingly (relation
686             ordered). A query construct is only treated as a range if
687             dash is used and that is surrounded by white-space. So
688             <literal>-1980</literal> is treated as term 
689             <literal>"-1980"</literal> not <literal>&lt;= 1980</literal>.
690             If <literal>- 1980</literal> is used, however, that is
691             treated as a range.
692            </entry>
693           </row>
694           
695           <row><entry><literal>r=r</literal></entry><entry>
696             Similar to <literal>r=o</literal> but assumes that terms
697             are non-negative (not prefixed with <literal>-</literal>).
698             Thus, a dash will always be treated as a range.
699             The construct <literal>1980-1990</literal> is
700             treated as a range with <literal>r=r</literal> but as a
701             single term <literal>"1980-1990"</literal> with
702             <literal>r=o</literal>. The special attribute
703             <literal>r=r</literal> is available in YAZ 2.0.24 or later.
704            </entry>
705           </row>
706           
707           <row><entry><literal>t=l</literal></entry><entry>
708             Allows term to be left-truncated.
709             If term is of the form <literal>?x</literal>, the resulting
710             Type-1 term is <literal>x</literal> and truncation is left.
711            </entry>
712           </row>
713           
714           <row><entry><literal>t=r</literal></entry><entry>
715             Allows term to be right-truncated.
716             If term is of the form <literal>x?</literal>, the resulting
717             Type-1 term is <literal>x</literal> and truncation is right.
718            </entry>
719           </row>
720           
721           <row><entry><literal>t=n</literal></entry><entry>
722             If term is does not include <literal>?</literal>, the
723             truncation attribute is set to none (100).
724            </entry>
725           </row>
726           
727           <row><entry><literal>t=b</literal></entry><entry>
728             Allows term to be both left&amp;right truncated.
729             If term is of the form <literal>?x?</literal>, the
730             resulting term is <literal>x</literal> and trunctation is
731             set to both left&amp;right.
732            </entry>
733           </row>
734          </tbody>
735         </tgroup>
736        </table>
737       </para>
738       <example id="example.ccl.profile"><title>CCL profile</title>
739        <para>
740         Consider the following definition:
741        </para>
742        
743        <screen>
744         ti       u=4 s=1
745         au       u=1 s=1
746         term     s=105
747         ranked   r=102
748         date     u=30 r=o
749       </screen>
750        <para>
751         <literal>ti</literal> and <literal>au</literal> both set 
752         structure attribute to phrase (s=1).
753         <literal>ti</literal>
754         sets the use-attribute to 4. <literal>au</literal> sets the
755         use-attribute to 1.
756         When no qualifiers are used in the query the structure-attribute is
757         set to free-form-text (105) (rule for <literal>term</literal>).
758         The <literal>date</literal> sets the relation attribute to
759         the relation used in the CCL query and sets the use attribute
760         to 30 (Bib-1 Date).
761        </para>
762        <para>
763         You can combine attributes. To Search for "ranked title" you
764         can do 
765         <screen>
766          ti,ranked=knuth computer
767         </screen>
768         which will set relation=ranked, use=title, structure=phrase.
769        </para>
770        <para>
771         Query
772         <screen>
773          date > 1980
774         </screen>
775         is a valid query. But
776         <screen>
777          ti > 1980
778         </screen>
779         is invalid.
780        </para>
781       </example>
782      </sect4>
783      <sect4 id="ccl.qualifier.alias">
784       <title>Qualifier alias</title>
785       <para>
786        A qualifier alias is of the form:
787       </para>
788       <para>
789        <replaceable>q</replaceable>  
790        <replaceable>q1</replaceable> <replaceable>q2</replaceable> ..
791       </para>
792       <para>
793        which declares <replaceable>q</replaceable> to
794        be an alias for <replaceable>q1</replaceable>, 
795        <replaceable>q2</replaceable>... such that the CCL
796        query <replaceable>q=x</replaceable> is equivalent to
797        <replaceable>q1=x or q2=x or ...</replaceable>.
798       </para>
799      </sect4>
800
801      <sect4 id="ccl.comments">
802       <title>Comments</title>
803       <para>
804        Lines with white space or lines that begin with
805        character <literal>#</literal> are treated as comments.
806       </para>
807      </sect4>
808
809      <sect4 id="ccl.directives">
810       <title>Directives</title>
811       <para>
812        Directive specifications takes the form
813       </para>
814       <para><literal>@</literal><replaceable>directive</replaceable> <replaceable>value</replaceable>
815       </para>
816       <table id="ccl.directives.table">
817        <title>CCL directives</title>
818        <tgroup cols="3">
819         <colspec colwidth="2*" colname="name"></colspec>
820         <colspec colwidth="8*" colname="description"></colspec>
821         <colspec colwidth="1*" colname="default"></colspec>
822         <thead>
823          <row>
824           <entry>Name</entry>
825           <entry>Description</entry>
826           <entry>Default</entry>
827          </row>
828         </thead>
829         <tbody>
830          <row>
831           <entry>truncation</entry>
832           <entry>Truncation character</entry>
833           <entry><literal>?</literal></entry>
834          </row>
835          <row>
836           <entry>field</entry>
837           <entry>Specifies how multiple fields are to be
838            combined. There are two modes: <literal>or</literal>:
839            multiple qualifier fields are ORed,
840            <literal>merge</literal>: attributes for the qualifier
841            fields are merged and assigned to one term.
842            </entry>
843           <entry><literal>merge</literal></entry>
844          </row>
845          <row>
846           <entry>case</entry>
847           <entry>Specificies if CCL operatores and qualifiers should be
848            compared with case sensitivity or not. Specify 0 for
849            case sensitive; 1 for case insensitive.</entry>
850           <entry><literal>0</literal></entry>
851          </row>
852
853          <row>
854           <entry>and</entry>
855           <entry>Specifies token for CCL operator AND.</entry>
856           <entry><literal>and</literal></entry>
857          </row>
858
859          <row>
860           <entry>or</entry>
861           <entry>Specifies token for CCL operator OR.</entry>
862           <entry><literal>or</literal></entry>
863          </row>
864
865          <row>
866           <entry>not</entry>
867           <entry>Specifies token for CCL operator NOT.</entry>
868           <entry><literal>not</literal></entry>
869          </row>
870
871          <row>
872           <entry>set</entry>
873           <entry>Specifies token for CCL operator SET.</entry>
874           <entry><literal>set</literal></entry>
875          </row>
876         </tbody>
877         </tgroup>
878       </table>
879      </sect4>
880     </sect3>
881     <sect3 id="ccl.api">
882      <title>CCL API</title>
883      <para>
884       All public definitions can be found in the header file
885       <filename>ccl.h</filename>. A profile identifier is of type
886       <literal>CCL_bibset</literal>. A profile must be created with the call
887       to the function <function>ccl_qual_mk</function> which returns a profile
888       handle of type <literal>CCL_bibset</literal>.
889      </para>
890
891      <para>
892       To read a file containing qualifier definitions the function
893       <function>ccl_qual_file</function> may be convenient. This function
894       takes an already opened <literal>FILE</literal> handle pointer as
895       argument along with a <literal>CCL_bibset</literal> handle.
896      </para>
897
898      <para>
899       To parse a simple string with a FIND query use the function
900      </para>
901      <screen>
902 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
903                                    int *error, int *pos);
904      </screen>
905      <para>
906       which takes the CCL profile (<literal>bibset</literal>) and query
907       (<literal>str</literal>) as input. Upon successful completion the RPN
908       tree is returned. If an error occur, such as a syntax error, the integer
909       pointed to by <literal>error</literal> holds the error code and
910       <literal>pos</literal> holds the offset inside query string in which
911       the parsing failed.
912      </para>
913
914      <para>
915       An English representation of the error may be obtained by calling
916       the <literal>ccl_err_msg</literal> function. The error codes are
917       listed in <filename>ccl.h</filename>.
918      </para>
919
920      <para>
921       To convert the CCL RPN tree (type
922       <literal>struct ccl_rpn_node *</literal>)
923       to the Z_RPNQuery of YAZ the function <function>ccl_rpn_query</function>
924       must be used. This function which is part of YAZ is implemented in
925       <filename>yaz-ccl.c</filename>.
926       After calling this function the CCL RPN tree is probably no longer
927       needed. The <literal>ccl_rpn_delete</literal> destroys the CCL RPN tree.
928      </para>
929
930      <para>
931       A CCL profile may be destroyed by calling the
932       <function>ccl_qual_rm</function> function.
933      </para>
934
935      <para>
936       The token names for the CCL operators may be changed by setting the
937       globals (all type <literal>char *</literal>)
938       <literal>ccl_token_and</literal>, <literal>ccl_token_or</literal>,
939       <literal>ccl_token_not</literal> and <literal>ccl_token_set</literal>.
940       An operator may have aliases, i.e. there may be more than one name for
941       the operator. To do this, separate each alias with a space character.
942      </para>
943     </sect3>
944    </sect2>
945    <sect2 id="cql"><title>CQL</title>
946     <para>
947      <ulink url="&url.cql;">CQL</ulink>
948       - Common Query Language - was defined for the
949      <ulink url="&url.sru;">SRU</ulink> protocol.
950      In many ways CQL has a similar syntax to CCL.
951      The objective of CQL is different. Where CCL aims to be
952      an end-user language, CQL is <emphasis>the</emphasis> protocol
953      query language for SRU.
954     </para>
955     <tip>
956      <para>
957       If you are new to CQL, read the 
958       <ulink url="&url.cql.intro;">Gentle Introduction</ulink>.
959      </para>
960     </tip>
961     <para>
962      The CQL parser in &yaz; provides the following:
963      <itemizedlist>
964       <listitem>
965        <para>
966         It parses and validates a CQL query.
967        </para>
968       </listitem>
969       <listitem>
970        <para>
971         It generates a C structure that allows you to convert
972         a CQL query to some other query language, such as SQL.
973        </para>
974       </listitem>
975       <listitem>
976        <para>
977         The parser converts a valid CQL query to PQF, thus providing a
978         way to use CQL for both SRU servers and Z39.50 targets at the
979         same time.
980        </para>
981       </listitem>
982       <listitem>
983        <para>
984         The parser converts CQL to
985         <ulink url="&url.xcql;">XCQL</ulink>.
986         XCQL is an XML representation of CQL.
987         XCQL is part of the SRU specification. However, since SRU
988         supports CQL only, we don't expect XCQL to be widely used.
989         Furthermore, CQL has the advantage over XCQL that it is
990         easy to read.
991        </para>
992       </listitem>
993      </itemizedlist>
994     </para>
995     <sect3 id="cql.parsing"><title>CQL parsing</title>
996      <para>
997       A CQL parser is represented by the <literal>CQL_parser</literal>
998       handle. Its contents should be considered &yaz; internal (private).
999       <synopsis>
1000 #include &lt;yaz/cql.h&gt;
1001
1002 typedef struct cql_parser *CQL_parser;
1003
1004 CQL_parser cql_parser_create(void);
1005 void cql_parser_destroy(CQL_parser cp);
1006       </synopsis>
1007      A parser is created by <function>cql_parser_create</function> and
1008      is destroyed by <function>cql_parser_destroy</function>.
1009      </para>
1010      <para>
1011       To parse a CQL query string, the following function
1012       is provided:
1013       <synopsis>
1014 int cql_parser_string(CQL_parser cp, const char *str);
1015       </synopsis>
1016       A CQL query is parsed by the <function>cql_parser_string</function>
1017       which takes a query <parameter>str</parameter>.
1018       If the query was valid (no syntax errors), then zero is returned;
1019       otherwise -1 is returned to indicate a syntax error.
1020      </para>
1021      <para>
1022       <synopsis>
1023 int cql_parser_stream(CQL_parser cp,
1024                       int (*getbyte)(void *client_data),
1025                       void (*ungetbyte)(int b, void *client_data),
1026                       void *client_data);
1027
1028 int cql_parser_stdio(CQL_parser cp, FILE *f);
1029       </synopsis>
1030       The functions <function>cql_parser_stream</function> and
1031       <function>cql_parser_stdio</function> parses a CQL query
1032       - just like <function>cql_parser_string</function>.
1033       The only difference is that the CQL query can be
1034       fed to the parser in different ways.
1035       The <function>cql_parser_stream</function> uses a generic
1036       byte stream as input. The <function>cql_parser_stdio</function>
1037       uses a <literal>FILE</literal> handle which is opened for reading.
1038      </para>
1039     </sect3>
1040     
1041     <sect3 id="cql.tree"><title>CQL tree</title>
1042      <para>
1043       The the query string is valid, the CQL parser
1044       generates a tree representing the structure of the
1045       CQL query.
1046      </para>
1047      <para>
1048       <synopsis>
1049 struct cql_node *cql_parser_result(CQL_parser cp);
1050       </synopsis>
1051       <function>cql_parser_result</function> returns the
1052       a pointer to the root node of the resulting tree.
1053      </para>
1054      <para>
1055       Each node in a CQL tree is represented by a 
1056       <literal>struct cql_node</literal>.
1057       It is defined as follows:
1058       <synopsis>
1059 #define CQL_NODE_ST 1
1060 #define CQL_NODE_BOOL 2
1061 struct cql_node {
1062     int which;
1063     union {
1064         struct {
1065             char *index;
1066             char *index_uri;
1067             char *term;
1068             char *relation;
1069             char *relation_uri;
1070             struct cql_node *modifiers;
1071         } st;
1072         struct {
1073             char *value;
1074             struct cql_node *left;
1075             struct cql_node *right;
1076             struct cql_node *modifiers;
1077         } boolean;
1078     } u;
1079 };
1080       </synopsis>
1081       There are two node types: search term (ST) and boolean (BOOL).
1082       A modifier is treated as a search term too.
1083      </para>
1084      <para>
1085       The search term node has five members:
1086       <itemizedlist>
1087        <listitem>
1088         <para>
1089          <literal>index</literal>: index for search term.
1090          If an index is unspecified for a search term,
1091          <literal>index</literal> will be NULL.
1092         </para>
1093        </listitem>
1094        <listitem>
1095         <para>
1096          <literal>index_uri</literal>: index URi for search term
1097          or NULL if none could be resolved for the index.
1098         </para>
1099        </listitem>
1100        <listitem>
1101         <para>
1102          <literal>term</literal>: the search term itself.
1103         </para>
1104        </listitem>
1105        <listitem>
1106         <para>
1107          <literal>relation</literal>: relation for search term.
1108         </para>
1109        </listitem>
1110        <listitem>
1111         <para>
1112          <literal>relation_uri</literal>: relation URI for search term.
1113         </para>
1114        </listitem>
1115        <listitem>
1116         <para>
1117          <literal>modifiers</literal>: relation modifiers for search
1118          term. The <literal>modifiers</literal> list itself of cql_nodes
1119          each of type <literal>ST</literal>.
1120         </para>
1121        </listitem>
1122       </itemizedlist>
1123      </para>
1124
1125      <para>
1126       The boolean node represents both <literal>and</literal>,
1127       <literal>or</literal>, not as well as
1128       proximity.
1129       <itemizedlist>
1130        <listitem>
1131         <para>
1132          <literal>left</literal> and <literal>right</literal>: left
1133          - and right operand respectively.
1134         </para>
1135        </listitem>
1136        <listitem>
1137         <para>
1138          <literal>modifiers</literal>: proximity arguments.
1139         </para>
1140        </listitem>
1141       </itemizedlist>
1142      </para>
1143
1144     </sect3>
1145     <sect3 id="cql.to.pqf"><title>CQL to PQF conversion</title>
1146      <para>
1147       Conversion to PQF (and Z39.50 RPN) is tricky by the fact
1148       that the resulting RPN depends on the Z39.50 target
1149       capabilities (combinations of supported attributes). 
1150       In addition, the CQL and SRU operates on index prefixes
1151       (URI or strings), whereas the RPN uses Object Identifiers
1152       for attribute sets.
1153      </para>
1154      <para>
1155       The CQL library of &yaz; defines a <literal>cql_transform_t</literal>
1156       type. It represents a particular mapping between CQL and RPN.
1157       This handle is created and destroyed by the functions:
1158      <synopsis>
1159 cql_transform_t cql_transform_open_FILE (FILE *f);
1160 cql_transform_t cql_transform_open_fname(const char *fname);
1161 void cql_transform_close(cql_transform_t ct);
1162       </synopsis>
1163       The first two functions create a tranformation handle from
1164       either an already open FILE or from a filename respectively.
1165      </para>
1166      <para>
1167       The handle is destroyed by <function>cql_transform_close</function> 
1168       in which case no further reference of the handle is allowed.
1169      </para>
1170      <para>
1171       When a <literal>cql_transform_t</literal> handle has been created
1172       you can convert to RPN.
1173       <synopsis>
1174 int cql_transform_buf(cql_transform_t ct,
1175                       struct cql_node *cn, char *out, int max);
1176       </synopsis>
1177       This function converts the CQL tree <literal>cn</literal> 
1178       using handle <literal>ct</literal>.
1179       For the resulting PQF, you supply a buffer <literal>out</literal>
1180       which must be able to hold at at least <literal>max</literal>
1181       characters.
1182      </para>
1183      <para>
1184       If conversion failed, <function>cql_transform_buf</function>
1185       returns a non-zero SRU error code; otherwise zero is returned
1186       (conversion successful).  The meanings of the numeric error
1187       codes are listed in the SRU specifications at
1188       <ulink url="&url.sru.diagnostics.list;"/>
1189      </para>
1190      <para>
1191       If conversion fails, more information can be obtained by calling
1192       <synopsis>
1193 int cql_transform_error(cql_transform_t ct, char **addinfop);
1194       </synopsis>
1195       This function returns the most recently returned numeric
1196       error-code and sets the string-pointer at
1197       <literal>*addinfop</literal> to point to a string containing
1198       additional information about the error that occurred: for
1199       example, if the error code is 15 (``Illegal or unsupported context
1200       set''), the additional information is the name of the requested
1201       context set that was not recognised.
1202      </para>
1203      <para>
1204       The SRU error-codes may be translated into brief human-readable
1205       error messages using
1206       <synopsis>
1207 const char *cql_strerror(int code);
1208       </synopsis>
1209      </para>
1210      <para>
1211       If you wish to be able to produce a PQF result in a different
1212       way, there are two alternatives.
1213       <synopsis>
1214 void cql_transform_pr(cql_transform_t ct,
1215                       struct cql_node *cn,
1216                       void (*pr)(const char *buf, void *client_data),
1217                       void *client_data);
1218
1219 int cql_transform_FILE(cql_transform_t ct,
1220                        struct cql_node *cn, FILE *f);
1221       </synopsis>
1222       The former function produces output to a user-defined
1223       output stream. The latter writes the result to an already
1224       open <literal>FILE</literal>.
1225      </para>
1226     </sect3>
1227     <sect3 id="cql.to.rpn">
1228      <title>Specification of CQL to RPN mappings</title>
1229      <para>
1230       The file supplied to functions 
1231       <function>cql_transform_open_FILE</function>,
1232       <function>cql_transform_open_fname</function> follows
1233       a structure found in many Unix utilities.
1234       It consists of mapping specifications - one per line.
1235       Lines starting with <literal>#</literal> are ignored (comments).
1236      </para>
1237      <para>
1238       Each line is of the form
1239       <literallayout>
1240        <replaceable>CQL pattern</replaceable><literal> = </literal> <replaceable> RPN equivalent</replaceable>
1241       </literallayout>
1242      </para>
1243      <para>
1244       An RPN pattern is a simple attribute list. Each attribute pair
1245       takes the form:
1246       <literallayout>
1247        [<replaceable>set</replaceable>] <replaceable>type</replaceable><literal>=</literal><replaceable>value</replaceable>
1248       </literallayout>
1249       The attribute <replaceable>set</replaceable> is optional.
1250       The <replaceable>type</replaceable> is the attribute type,
1251       <replaceable>value</replaceable> the attribute value.
1252      </para>
1253      <para>
1254       The character <literal>*</literal> (asterisk) has special meaning
1255       when used in the RPN pattern.
1256       Each occurrence of <literal>*</literal> is substituted with the
1257       CQL matching name (index, relation, qualifier etc).
1258       This facility can be used to copy a CQL name verbatim to the RPN result.
1259      </para>
1260      <para>
1261       The following CQL patterns are recognized:
1262       <variablelist>
1263        <varlistentry><term>
1264          <literal>index.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1265         </term>
1266         <listitem>
1267          <para>
1268           This pattern is invoked when a CQL index, such as 
1269           dc.title is converted. <replaceable>set</replaceable>
1270           and <replaceable>name</replaceable> are the context set and index
1271           name respectively.
1272           Typically, the RPN specifies an equivalent use attribute.
1273          </para>
1274          <para>
1275           For terms not bound by an index the pattern
1276           <literal>index.cql.serverChoice</literal> is used.
1277           Here, the prefix <literal>cql</literal> is defined as
1278           <literal>http://www.loc.gov/zing/cql/cql-indexes/v1.0/</literal>.
1279           If this pattern is not defined, the mapping will fail.
1280          </para>
1281          <para>
1282           The pattern, 
1283           <literal>index.</literal><replaceable>set</replaceable><literal>.*</literal>
1284           is used when no other index pattern is matched.
1285         </para>
1286         </listitem>
1287        </varlistentry>
1288        <varlistentry><term>
1289          <literal>qualifier.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1290          (DEPRECATED)
1291         </term>
1292         <listitem>
1293          <para>
1294           For backwards compatibility, this is recognised as a synonym of
1295           <literal>index.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1296          </para>
1297         </listitem>
1298        </varlistentry>
1299        <varlistentry><term>
1300          <literal>relation.</literal><replaceable>relation</replaceable>
1301         </term>
1302         <listitem>
1303          <para>
1304           This pattern specifies how a CQL relation is mapped to RPN.
1305           <replaceable>pattern</replaceable> is name of relation
1306           operator. Since <literal>=</literal> is used as
1307           separator between CQL pattern and RPN, CQL relations
1308           including <literal>=</literal> cannot be
1309           used directly. To avoid a conflict, the names
1310           <literal>ge</literal>,
1311           <literal>eq</literal>,
1312           <literal>le</literal>,
1313           must be used for CQL operators, greater-than-or-equal,
1314           equal, less-than-or-equal respectively.
1315           The RPN pattern is supposed to include a relation attribute.
1316          </para>
1317          <para>
1318           For terms not bound by a relation, the pattern
1319           <literal>relation.scr</literal> is used. If the pattern
1320           is not defined, the mapping will fail.
1321          </para>
1322          <para>
1323           The special pattern, <literal>relation.*</literal> is used
1324           when no other relation pattern is matched.
1325          </para>
1326         </listitem>
1327        </varlistentry>
1328
1329        <varlistentry><term>
1330          <literal>relationModifier.</literal><replaceable>mod</replaceable>
1331         </term>
1332         <listitem>
1333          <para>
1334           This pattern specifies how a CQL relation modifier is mapped to RPN.
1335           The RPN pattern is usually a relation attribute.
1336          </para>
1337         </listitem>
1338        </varlistentry>
1339
1340        <varlistentry><term>
1341          <literal>structure.</literal><replaceable>type</replaceable>
1342         </term>
1343         <listitem>
1344          <para>
1345           This pattern specifies how a CQL structure is mapped to RPN.
1346           Note that this CQL pattern is somewhat to similar to
1347           CQL pattern <literal>relation</literal>. 
1348           The <replaceable>type</replaceable> is a CQL relation.
1349          </para>
1350          <para>
1351           The pattern, <literal>structure.*</literal> is used
1352           when no other structure pattern is matched.
1353           Usually, the RPN equivalent specifies a structure attribute.
1354          </para>
1355         </listitem>
1356        </varlistentry>
1357
1358        <varlistentry><term>
1359          <literal>position.</literal><replaceable>type</replaceable>
1360         </term>
1361         <listitem>
1362          <para>
1363           This pattern specifies how the anchor (position) of
1364           CQL is mapped to RPN.
1365           The <replaceable>type</replaceable> is one
1366           of <literal>first</literal>, <literal>any</literal>,
1367           <literal>last</literal>, <literal>firstAndLast</literal>.
1368          </para>
1369          <para>
1370           The pattern, <literal>position.*</literal> is used
1371           when no other position pattern is matched.
1372          </para>
1373         </listitem>
1374        </varlistentry>
1375
1376        <varlistentry><term>
1377          <literal>set.</literal><replaceable>prefix</replaceable>
1378         </term>
1379         <listitem>
1380          <para>
1381           This specification defines a CQL context set for a given prefix.
1382           The value on the right hand side is the URI for the set - 
1383           <emphasis>not</emphasis> RPN. All prefixes used in
1384           index patterns must be defined this way.
1385          </para>
1386         </listitem>
1387        </varlistentry>
1388
1389        <varlistentry><term>
1390          <literal>set</literal>
1391         </term>
1392         <listitem>
1393          <para>
1394           This specification defines a default CQL context set for index names.
1395           The value on the right hand side is the URI for the set.
1396          </para>
1397         </listitem>
1398        </varlistentry>
1399
1400       </variablelist>
1401      </para>
1402      <example id="example.cql.to.rpn.mapping">
1403       <title>CQL to RPN mapping file</title>
1404       <para>
1405        This simple file defines two context sets, three indexes and three
1406        relations, a position pattern and a default structure.
1407       </para>
1408       <programlisting><![CDATA[
1409        set.cql  = http://www.loc.gov/zing/cql/context-sets/cql/v1.1/
1410        set.dc   = http://www.loc.gov/zing/cql/dc-indexes/v1.0/
1411
1412        index.cql.serverChoice = 1=1016
1413        index.dc.title         = 1=4
1414        index.dc.subject       = 1=21
1415   
1416        relation.<             = 2=1
1417        relation.eq            = 2=3
1418        relation.scr           = 2=3
1419
1420        position.any           = 3=3 6=1
1421
1422        structure.*            = 4=1
1423 ]]>
1424       </programlisting>
1425       <para>
1426        With the mappings above, the CQL query
1427        <screen>
1428         computer
1429        </screen>
1430        is converted to the PQF:
1431        <screen>
1432         @attr 1=1016 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "computer"
1433        </screen>
1434        by rules <literal>index.cql.serverChoice</literal>,
1435        <literal>relation.scr</literal>, <literal>structure.*</literal>,
1436        <literal>position.any</literal>.
1437       </para>
1438       <para>
1439        CQL query
1440        <screen>
1441         computer^
1442        </screen>
1443        is rejected, since <literal>position.right</literal> is
1444        undefined.
1445       </para>
1446       <para>
1447        CQL query
1448        <screen>
1449         >my = "http://www.loc.gov/zing/cql/dc-indexes/v1.0/" my.title = x
1450        </screen>
1451        is converted to
1452        <screen>
1453         @attr 1=4 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "x"
1454        </screen>
1455       </para>
1456      </example>
1457      <example id="example.cql.to.rpn.string">
1458       <title>CQL to RPN string attributes</title>
1459       <para>
1460        In this example we allow any index to be passed to RPN as
1461        a use attribute.
1462       </para>
1463       <programlisting><![CDATA[
1464        # Identifiers for prefixes used in this file. (index.*)
1465        set.cql  = info:srw/cql-context-set/1/cql-v1.1
1466        set.rpn  = http://bogus/rpn
1467        set      = http://bogus/rpn
1468
1469        # The default index when none is specified by the query
1470        index.cql.serverChoice     = 1=any
1471
1472        index.rpn.*                = 1=*
1473        relation.eq                = 2=3
1474        structure.*                = 4=1
1475        position.any               = 3=3
1476 ]]>
1477       </programlisting>
1478       <para>
1479        The <literal>http://bogus/rpn</literal> context set is also the default
1480        so we can make queries such as
1481        <screen>
1482         title = a
1483        </screen>
1484        which is converted to
1485        <screen>
1486         @attr 2=3 @attr 4=1 @attr 3=3 @attr 1=title "a"
1487        </screen>
1488       </para>
1489      </example>
1490      <example id="example.cql.to.rpn.bathprofile">
1491       <title>CQL to RPN using Bath Profile</title>
1492       <para>
1493        The file <filename>etc/pqf.properties</filename> has mappings from
1494        the Bath Profile and Dublin Core to RPN.
1495        If YAZ is installed as a package it's usually located
1496        in <filename>/usr/share/yaz/etc</filename> and part of the
1497        development package, such as <literal>libyaz-dev</literal>.
1498       </para>
1499      </example>
1500     </sect3>
1501     <sect3 id="cql.xcql"><title>CQL to XCQL conversion</title>
1502      <para>
1503       Conversion from CQL to XCQL is trivial and does not
1504       require a mapping to be defined.
1505       There three functions to choose from depending on the
1506       way you wish to store the resulting output (XML buffer
1507       containing XCQL).
1508       <synopsis>
1509 int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
1510 void cql_to_xml(struct cql_node *cn, 
1511                 void (*pr)(const char *buf, void *client_data),
1512                 void *client_data);
1513 void cql_to_xml_stdio(struct cql_node *cn, FILE *f);
1514       </synopsis>
1515       Function <function>cql_to_xml_buf</function> converts
1516       to XCQL and stores result in a user supplied buffer of a given
1517       max size.
1518      </para>
1519      <para>
1520       <function>cql_to_xml</function> writes the result in
1521       a user defined output stream.
1522       <function>cql_to_xml_stdio</function> writes to a
1523       a file.
1524      </para>
1525     </sect3>
1526    </sect2>
1527   </sect1>
1528   <sect1 id="tools.oid"><title>Object Identifiers</title>
1529
1530    <para>
1531     The basic YAZ representation of an OID is an array of integers,
1532     terminated with the value -1. This integer is of type 
1533     <literal>Odr_oid</literal>.
1534    </para>
1535    <para>
1536     Fundamental OID operations and the type <literal>Odr_oid</literal>
1537     are defined in <filename>yaz/oid_util.h</filename>.
1538    </para>
1539    <para>
1540     An OID can either be declared as a automatic variable or it can
1541     allocated using the memory utilities or ODR/NMEM. It's
1542     guaranteed that an OID can fit in <literal>OID_SIZE</literal> integers.
1543    </para>
1544    <example id="tools.oid.bib1.1"><title>Create OID on stack</title>
1545     <para>
1546      We can create an OID for the Bib-1 attribute set with:
1547      <screen>
1548       Odr_oid bib1[OID_SIZE];
1549       bib1[0] = 1;
1550       bib1[1] = 2;
1551       bib1[2] = 840;
1552       bib1[3] = 10003;
1553       bib1[4] = 3;
1554       bib1[5] = 1;
1555       bib1[6] = -1;
1556      </screen>
1557     </para>
1558    </example>
1559    <para>
1560     And OID may also be filled from a string-based representation using
1561     dots (.). This is achieved by function
1562     <screen>
1563      int oid_dotstring_to_oid(const char *name, Odr_oid *oid);
1564     </screen>
1565     This functions returns 0 if name could be converted; -1 otherwise.
1566    </para>
1567    <example id="tools.oid.bib1.2"><title>Using oid_oiddotstring_to_oid</title>
1568     <para>
1569      We can fill the Bib-1 attribute set OID easier with:
1570      <screen>
1571       Odr_oid bib1[OID_SIZE];
1572       oid_oiddotstring_to_oid("1.2.840.10003.3.1", bib1);
1573      </screen>
1574    </para>
1575    </example>
1576    <para>
1577     We can also allocate an OID dynamically on a ODR stream with:
1578    <screen>
1579     Odr_oid *odr_getoidbystr(ODR o, const char *str);
1580    </screen>
1581     This creates an OID from string-based representation using dots.
1582     This function take an &odr; stream as parameter. This stream is used to
1583     allocate memory for the data elements, which is released on a
1584     subsequent call to <function>odr_reset()</function> on that stream.
1585    </para>
1586
1587    <example id="tools.oid.bib1.3"><title>Using odr_getoidbystr</title>
1588     <para>
1589      We can create a OID for the Bib-1 attribute set with:
1590      <screen>
1591       Odr_oid *bib1 = odr_getoidbystr(odr, "1.2.840.10003.3.1");
1592      </screen>
1593     </para>
1594    </example>
1595
1596    <para>
1597     The function
1598     <screen>
1599      char *oid_oid_to_dotstring(const Odr_oid *oid, char *oidbuf)
1600     </screen>
1601     does the reverse of <function>oid_oiddotstring_to_oid</function>. It
1602     converts an OID to the string-based representation using dots.
1603     The supplied char buffer <literal>oidbuf</literal> holds the resulting
1604     string and must be at least <literal>OID_STR_MAX</literal> in size.
1605    </para>
1606
1607    <para>
1608     OIDs can be copied with <function>oid_oidcpy</function> which takes
1609     two OID lists as arguments. Alternativly, an OID copy can be allocated
1610     on a ODR stream with:
1611     <screen>
1612      Odr_oid *odr_oiddup(ODR odr, const Odr_oid *o);
1613     </screen>
1614    </para>
1615    
1616    <para>
1617     OIDs can be compared with <function>oid_oidcmp</function> which returns
1618     zero if the two OIDs provided are identical; non-zero otherwise.
1619    </para>
1620  
1621    <sect2 id="tools.oid.database"><title>OID database</title>
1622     <para>
1623      From YAZ version 3 and later, the oident system has been replaced
1624      by an OID database. OID database is a misnomer .. the old odient
1625      system was also a database.
1626     </para>
1627     <para>
1628      The OID database is really just a map between named Object Identifiers
1629      (string) and their OID raw equivalents. Most operations either
1630      convert from string to OID or other way around.
1631     </para>
1632     <para>
1633      Unfortunately, whenever we supply a string we must also specify the 
1634      <emphasis>OID class</emphasis>. The class is necessary because some
1635      strings correspond to multiple OIDs. An example of such a string is
1636      <literal>Bib-1</literal> which may either be an attribute-set 
1637      or a diagnostic-set.
1638     </para>
1639     <para>
1640      Applications using the YAZ database should include 
1641      <filename>yaz/oid_db.h</filename>.
1642     </para>
1643     <para>
1644      A YAZ database handle is of type <literal>yaz_oid_db_t</literal>.
1645      Actually that's a pointer. You need not think deal with that.
1646      YAZ has a built-in database which can be considered "constant" for
1647      most purposes. 
1648      We can get hold that by using function <function>yaz_oid_std</function>.
1649     </para>
1650     <para>
1651      All functions with prefix <function>yaz_string_to_oid</function>
1652      converts from class + string to OID. We have variants of this
1653      operation due to different memory allocation strategies.
1654     </para>
1655     <para>
1656      All functions with prefix
1657      <function>yaz_oid_to_string</function> converts from OID to string
1658      + class.
1659     </para>
1660
1661     <example id="tools.oid.bib1.4"><title>Create OID with YAZ DB</title>
1662      <para>
1663       We can create an OID for the Bib-1 attribute set on the ODR stream
1664       odr with:
1665      <screen>
1666         Odr_oid *bib1 = 
1667          yaz_string_to_oid_odr(yaz_oid_std(), CLASS_ATTSET, "Bib-1", odr);
1668       </screen>
1669       This is more complex than using <function>odr_getoidbystr</function>.
1670       You would only use <function>yaz_string_to_oid_odr</function> when the
1671       string (here Bib-1) is supplied by a user or configuration.
1672      </para>
1673     </example>
1674
1675    </sect2>
1676    <sect2 id="tools.oid.std"><title>Standard OIDs</title>
1677      
1678     <para>
1679      All the object identifers in the standard OID database as returned
1680      by <function>yaz_oid_std</function> can referenced directly in a
1681      program as a constant OID.
1682      Each constant OID is prefixed with <literal>yaz_oid_</literal> -
1683      followed by OID class (lowercase) - then by OID name (normalized and
1684      lowercase).
1685     </para>
1686     <para>
1687      See <xref linkend="list-oids"/> for list of all object identifiers
1688      built into YAZ.
1689      These are declared in <filename>yaz/oid_std.h</filename> but are
1690      included by <filename>yaz/oid_db.h</filename> as well.
1691     </para>
1692
1693     <example id="tools.oid.bib1.5"><title>Use a built-in OID</title>
1694      <para>
1695       We can allocate our own OID filled with the constant OID for
1696       Bib-1 with:
1697       <screen>
1698         Odr_oid *bib1 = odr_oiddup(o, yaz_oid_attset_bib1);
1699       </screen>
1700      </para>
1701     </example>
1702    </sect2>
1703   </sect1>
1704   <sect1 id="tools.nmem"><title>Nibble Memory</title>
1705
1706    <para>
1707     Sometimes when you need to allocate and construct a large,
1708     interconnected complex of structures, it can be a bit of a pain to
1709     release the associated memory again. For the structures describing the
1710     Z39.50 PDUs and related structures, it is convenient to use the
1711     memory-management system of the &odr; subsystem (see
1712     <xref linkend="odr.use"/>). However, in some circumstances
1713     where you might otherwise benefit from using a simple nibble memory
1714     management system, it may be impractical to use
1715     <function>odr_malloc()</function> and <function>odr_reset()</function>.
1716     For this purpose, the memory manager which also supports the &odr;
1717     streams is made available in the NMEM module. The external interface
1718     to this module is given in the <filename>nmem.h</filename> file.
1719    </para>
1720
1721    <para>
1722     The following prototypes are given:
1723    </para>
1724
1725    <screen>
1726     NMEM nmem_create(void);
1727     void nmem_destroy(NMEM n);
1728     void *nmem_malloc(NMEM n, int size);
1729     void nmem_reset(NMEM n);
1730     int nmem_total(NMEM n);
1731     void nmem_init(void);
1732     void nmem_exit(void);
1733    </screen>
1734
1735    <para>
1736     The <function>nmem_create()</function> function returns a pointer to a
1737     memory control handle, which can be released again by
1738     <function>nmem_destroy()</function> when no longer needed.
1739     The function <function>nmem_malloc()</function> allocates a block of
1740     memory of the requested size. A call to <function>nmem_reset()</function>
1741     or <function>nmem_destroy()</function> will release all memory allocated
1742     on the handle since it was created (or since the last call to
1743     <function>nmem_reset()</function>. The function
1744     <function>nmem_total()</function> returns the number of bytes currently
1745     allocated on the handle.
1746    </para>
1747
1748    <para>
1749     The nibble memory pool is shared amongst threads. POSIX
1750     mutex'es and WIN32 Critical sections are introduced to keep the
1751     module thread safe. Function <function>nmem_init()</function>
1752     initializes the nibble memory library and it is called automatically
1753     the first time the <literal>YAZ.DLL</literal> is loaded. &yaz; uses
1754     function <function>DllMain</function> to achieve this. You should
1755     <emphasis>not</emphasis> call <function>nmem_init</function> or
1756     <function>nmem_exit</function> unless you're absolute sure what
1757     you're doing. Note that in previous &yaz; versions you'd have to call
1758     <function>nmem_init</function> yourself. 
1759    </para>
1760
1761   </sect1>
1762
1763   <sect1 id="tools.log"><title>Log</title>
1764   <para>
1765    &yaz; has evolved a fairly complex log system which should be useful both 
1766    for debugging &yaz; itself, debugging applications that use &yaz;, and for
1767    production use of those applications.  
1768   </para>
1769   <para>
1770    The log functions are declared in header <filename>yaz/log.h</filename>
1771     and implemented in <filename>src/log.c</filename>.
1772     Due to name clash with syslog and some math utilities the logging
1773     interface has been modified as of YAZ 2.0.29. The obsolete interface
1774     is still available if in header file <filename>yaz/log.h</filename>.
1775     The key points of the interface are:
1776   </para>
1777   <screen>
1778    void yaz_log(int level, const char *fmt, ...)
1779
1780    void yaz_log_init(int level, const char *prefix, const char *name);
1781    void yaz_log_init_file(const char *fname);
1782    void yaz_log_init_level(int level);
1783    void yaz_log_init_prefix(const char *prefix);
1784    void yaz_log_time_format(const char *fmt);
1785    void yaz_log_init_max_size(int mx);
1786
1787    int yaz_log_mask_str(const char *str);
1788    int yaz_log_module_level(const char *name);
1789   </screen>
1790
1791   <para>
1792    The reason for the whole log module is the <function>yaz_log</function>
1793    function. It takes a bitmask indicating the log levels, a
1794    <literal>printf</literal>-like format string, and a variable number of
1795    arguments to log.
1796   </para>
1797
1798   <para>
1799    The <literal>log level</literal> is a bit mask, that says on which level(s)
1800    the log entry should be made, and optionally set some behaviour of the
1801    logging. In the most simple cases, it can be one of <literal>YLOG_FATAL,
1802    YLOG_DEBUG, YLOG_WARN, YLOG_LOG</literal>. Those can be combined with bits
1803    that modify the way the log entry is written:<literal>YLOG_ERRNO,
1804    YLOG_NOTIME, YLOG_FLUSH</literal>.
1805    Most of the rest of the bits are deprecated, and should not be used. Use
1806    the dynamic log levels instead.
1807   </para>
1808
1809   <para>
1810    Applications that use &yaz;, should not use the LOG_LOG for ordinary
1811    messages, but should make use of the dynamic loglevel system. This consists
1812    of two parts, defining the loglevel and checking it.
1813   </para>
1814
1815   <para>
1816    To define the log levels, the (main) program should pass a string to
1817    <function>yaz_log_mask_str</function> to define which log levels are to be
1818    logged. This string should be a comma-separated list of log level names,
1819    and can contain both hard-coded names and dynamic ones. The log level
1820    calculation starts with <literal>YLOG_DEFAULT_LEVEL</literal> and adds a bit
1821    for each word it meets, unless the word starts with a '-', in which case it 
1822    clears the bit. If the string <literal>'none'</literal> is found,
1823    all bits are cleared. Typically this string comes from the command-line,
1824    often identified by <literal>-v</literal>. The
1825    <function>yaz_log_mask_str</function> returns a log level that should be
1826    passed to <function>yaz_log_init_level</function> for it to take effect.
1827   </para>
1828
1829   <para>
1830    Each module should check what log bits it should be used, by calling 
1831    <function>yaz_log_module_level</function> with a suitable name for the
1832    module. The name is cleared from a preceding path and an extension, if any,
1833    so it is quite possible to use <literal>__FILE__</literal> for it. If the
1834    name has been passed to <function>yaz_log_mask_str</function>, the routine
1835    returns a non-zero bitmask, which should then be used in consequent calls
1836    to yaz_log. (It can also be tested, so as to avoid unnecessary calls to
1837    yaz_log, in time-critical places, or when the log entry would take time 
1838    to construct.) 
1839   </para>
1840
1841   <para>
1842    Yaz uses the following dynamic log levels:
1843    <literal>server, session, request, requestdetail</literal> for the server
1844    functionality.
1845    <literal>zoom</literal> for the zoom client api.
1846    <literal>ztest</literal> for the simple test server.
1847    <literal>malloc, nmem, odr, eventl</literal> for internal debugging of yaz itself.
1848    Of course, any program using yaz is welcome to define as many new ones, as
1849    it needs.
1850   </para>
1851
1852   <para>
1853    By default the log is written to stderr, but this can be changed by a call
1854    to <function>yaz_log_init_file</function> or
1855    <function>yaz_log_init</function>. If the log is directed to a file, the
1856    file size is checked at every write, and if it exceeds the limit given in
1857    <function>yaz_log_init_max_size</function>, the log is rotated. The
1858    rotation keeps one old version (with a <literal>.1</literal> appended to
1859    the name). The size defaults to 1GB. Setting it to zero will disable the
1860    rotation feature.
1861   </para>
1862
1863   <screen>
1864   A typical yaz-log looks like this
1865   13:23:14-23/11 yaz-ztest(1) [session] Starting session from tcp:127.0.0.1 (pid=30968)
1866   13:23:14-23/11 yaz-ztest(1) [request] Init from 'YAZ' (81) (ver 2.0.28) OK
1867   13:23:17-23/11 yaz-ztest(1) [request] Search Z: @attrset Bib-1 foo  OK:7 hits
1868   13:23:22-23/11 yaz-ztest(1) [request] Present: [1] 2+2  OK 2 records returned
1869   13:24:13-23/11 yaz-ztest(1) [request] Close OK
1870   </screen>
1871
1872   <para>
1873    The log entries start with a time stamp. This can be omitted by setting the
1874    <literal>YLOG_NOTIME</literal> bit in the loglevel. This way automatic tests
1875    can be hoped to produce identical log files, that are easy to diff. The
1876    format of the time stamp can be set with
1877    <function>yaz_log_time_format</function>, which takes a format string just
1878    like <function>strftime</function>.
1879   </para>
1880
1881   <para>
1882    Next in a log line comes the prefix, often the name of the program. For
1883    yaz-based servers, it can also contain the session number. Then
1884    comes one or more logbits in square brackets, depending on the logging
1885    level set by <function>yaz_log_init_level</function> and the loglevel
1886    passed to <function>yaz_log_init_level</function>. Finally comes the format
1887    string and additional values passed to <function>yaz_log</function>
1888   </para>
1889
1890   <para>
1891    The log level <literal>YLOG_LOGLVL</literal>, enabled by the string
1892    <literal>loglevel</literal>, will log all the log-level affecting
1893    operations. This can come in handy if you need to know what other log
1894    levels would be useful. Grep the logfile for <literal>[loglevel]</literal>.
1895   </para>
1896
1897   <para>
1898    The log system is almost independent of the rest of &yaz;, the only
1899    important dependence is of <filename>nmem</filename>, and that only for
1900    using the semaphore definition there. 
1901   </para>
1902
1903   <para>
1904    The dynamic log levels and log rotation were introduced in &yaz; 2.0.28. At
1905    the same time, the log bit names were changed from
1906    <literal>LOG_something</literal> to <literal>YLOG_something</literal>, 
1907    to avoid collision with <filename>syslog.h</filename>.
1908   </para>
1909
1910   </sect1>
1911   
1912   <sect1 id="marc"><title>MARC</title>
1913    
1914    <para>
1915     YAZ provides a fast utility that decodes MARC records and
1916     encodes to a varity of output formats. The MARC records must
1917     be encoded in ISO2709.
1918    </para>
1919    <synopsis><![CDATA[
1920     #include <yaz/marcdisp.h>
1921
1922     /* create handler */
1923     yaz_marc_t yaz_marc_create(void);
1924     /* destroy */
1925     void yaz_marc_destroy(yaz_marc_t mt);
1926
1927     /* set XML mode YAZ_MARC_LINE, YAZ_MARC_SIMPLEXML, ... */
1928     void yaz_marc_xml(yaz_marc_t mt, int xmlmode);
1929     #define YAZ_MARC_LINE      0
1930     #define YAZ_MARC_SIMPLEXML 1
1931     #define YAZ_MARC_OAIMARC   2
1932     #define YAZ_MARC_MARCXML   3
1933     #define YAZ_MARC_ISO2709   4
1934     #define YAZ_MARC_XCHANGE   5
1935
1936     /* supply iconv handle for character set conversion .. */
1937     void yaz_marc_iconv(yaz_marc_t mt, yaz_iconv_t cd);
1938
1939     /* set debug level, 0=none, 1=more, 2=even more, .. */
1940     void yaz_marc_debug(yaz_marc_t mt, int level);
1941
1942     /* decode MARC in buf of size bsize. Returns >0 on success; <=0 on failure.
1943     On success, result in *result with size *rsize. */
1944     int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize,
1945                              char **result, int *rsize);
1946
1947     /* decode MARC in buf of size bsize. Returns >0 on success; <=0 on failure.
1948        On success, result in WRBUF */
1949     int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf,
1950                                int bsize, WRBUF wrbuf);
1951 ]]>
1952    </synopsis>
1953    <para>
1954     A MARC conversion handle must be created by using
1955     <function>yaz_marc_create</function> and destroyed
1956     by calling <function>yaz_marc_destroy</function>.
1957   </para>
1958    <para>
1959     All other function operate on a <literal>yaz_marc_t</literal> handle.
1960     The output is specified by a call to <function>yaz_marc_xml</function>.
1961     The <literal>xmlmode</literal> must be one of
1962     <variablelist>
1963      <varlistentry>
1964       <term>YAZ_MARC_LINE</term>
1965       <listitem>
1966        <para>
1967         A simple line-by-line format suitable for display but not
1968         recommend for further (machine) processing.
1969        </para>
1970       </listitem>
1971      </varlistentry>
1972
1973      <varlistentry>
1974       <term>YAZ_MARC_MARCXML</term>
1975       <listitem>
1976        <para>
1977         The resulting record is converted to MARCXML.
1978        </para>
1979       </listitem>
1980      </varlistentry>
1981
1982      <varlistentry>
1983       <term>YAZ_MARC_ISO2709</term>
1984       <listitem>
1985        <para>
1986         The resulting record is converted to ISO2709 (MARC).
1987        </para>
1988       </listitem>
1989      </varlistentry>
1990     </variablelist>
1991    </para>
1992    <para>
1993     The actual conversion functions are 
1994     <function>yaz_marc_decode_buf</function> and
1995     <function>yaz_marc_decode_wrbuf</function> which decodes and encodes
1996     a MARC record. The former function operates on simple buffers, the
1997     stores the resulting record in a WRBUF handle (WRBUF is a simple string
1998     type).
1999    </para>
2000    <example id="example.marc.display">
2001     <title>Display of MARC record</title>
2002     <para>
2003      The followint program snippet illustrates how the MARC API may
2004      be used to convert a MARC record to the line-by-line format:
2005      <programlisting><![CDATA[
2006       void print_marc(const char *marc_buf, int marc_buf_size)
2007       {
2008          char *result;      /* for result buf */
2009          int result_len;    /* for size of result */
2010          yaz_marc_t mt = yaz_marc_create();
2011          yaz_marc_xml(mt, YAZ_MARC_LINE);
2012          yaz_marc_decode_buf(mt, marc_buf, marc_buf_size,
2013                              &result, &result_len);
2014          fwrite(result, result_len, 1, stdout);
2015          yaz_marc_destroy(mt);  /* note that result is now freed... */
2016       }
2017 ]]>
2018       </programlisting>
2019     </para>
2020    </example>
2021   </sect1>
2022
2023   <sect1 id="tools.retrieval">
2024    <title>Retrieval Facility</title>
2025    <para>
2026     YAZ version 2.1.20 or later includes a Retrieval facility tool
2027     which allows a SRU/Z39.50 to describe itself and perform record
2028     conversions. The idea is the following:
2029     
2030     <itemizedlist>
2031      <listitem>
2032       <para>
2033        An SRU/Z39.50 client sends a retrieval request which includes
2034        a combination of the following parameters: syntax (format),
2035        schema (or element set name).
2036       </para>
2037      </listitem>
2038
2039      <listitem>
2040       <para>
2041        The retrieval facility is invoked with parameters in a
2042        server/proxy. The retrieval facility matches the parameters a set of
2043        "supported" retrieval types.
2044        If there is no match, the retrieval signals an error
2045        (syntax and / or schema not supported).
2046       </para>
2047      </listitem>
2048
2049      <listitem>
2050       <para>
2051        For a successful match, the backend is invoked with the same
2052        or altered retrieval parameters (syntax, schema). If
2053        a record is received from the backend, it is converted to the
2054        frontend name / syntax.
2055       </para>
2056      </listitem>
2057
2058      <listitem>
2059       <para>
2060        The resulting record is sent back the client and tagged with
2061        the frontend syntax / schema.
2062       </para>
2063      </listitem>
2064
2065     </itemizedlist>
2066    </para>
2067    <para>
2068     The Retrieval facility is driven by an XML configuration. The
2069     configuration is neither Z39.50 ZeeRex or SRU ZeeRex. But it
2070     should be easy to generate both of them from the XML configuration.
2071     (unfortunately the two versions
2072     of ZeeRex differ substantially in this regard).
2073    </para>
2074    <sect2 id="tools.retrieval.format">
2075     <title>Retrieval XML format</title>
2076     <para>
2077      All elements should be covered by namespace 
2078      <literal>http://indexdata.com/yaz</literal> .
2079      The root element node must be <literal>retrievalinfo</literal>.
2080     </para>
2081     <para>
2082      The <literal>retrievalinfo</literal> must include one or
2083      more <literal>retrieval</literal> elements. Each 
2084     <literal>retrieval</literal> defines specific combination of
2085      syntax, name and identifier supported by this retrieval service.
2086     </para>
2087     <para>
2088      The <literal>retrieval</literal> element may include any of the
2089      following attributes:
2090      <variablelist>
2091       <varlistentry><term><literal>syntax</literal> (REQUIRED)</term>
2092        <listitem>
2093         <para>
2094          Defines the record syntax. Possible values is any
2095          of the names defined in YAZ' OID database or a raw
2096          OID in (n.n ... n).
2097         </para>
2098        </listitem>
2099       </varlistentry>
2100       <varlistentry><term><literal>name</literal> (OPTIONAL)</term>
2101        <listitem>
2102         <para>
2103          Defines the name of the retrieval format. This can be
2104          any string. For SRU, the value, is equivalent to schema (short-hand);
2105          for Z39.50 it's equivalent to simple element set name.
2106          For YAZ 3.0.24 and later this name may be specified as a glob
2107          expression with operators
2108          <literal>*</literal> and <literal>?</literal>.
2109         </para>
2110        </listitem>
2111       </varlistentry>
2112       <varlistentry><term><literal>identifier</literal> (OPTIONAL)</term>
2113        <listitem>
2114         <para>
2115          Defines the URI schema name of the retrieval format. This can be
2116          any string. For SRU, the value, is equivalent to URI schema.
2117          For Z39.50, there is no equivalent.
2118         </para>
2119        </listitem>
2120       </varlistentry>
2121      </variablelist>
2122     </para>
2123     <para>
2124      The <literal>retrieval</literal> may include one 
2125      <literal>backend</literal> element. If a <literal>backend</literal>
2126      element is given, it specifies how the records are retrieved by
2127      some backend and how the records are converted from the backend to
2128      the "frontend".
2129     </para>
2130     <para>
2131      The attributes, <literal>name</literal> and <literal>syntax</literal>
2132      may be specified for the <literal>backend</literal> element. These
2133      semantics of these attributes is equivalent to those for the
2134      <literal>retrieval</literal>. However, these values are passed to
2135      the "backend".
2136     </para>
2137     <para>
2138      The <literal>backend</literal> element may includes one or more
2139      conversion instructions (as children elements). The supported
2140      conversions are:
2141      <variablelist>
2142       <varlistentry><term><literal>marc</literal></term>
2143        <listitem>
2144         <para>
2145          The <literal>marc</literal> element specifies a conversion 
2146          to - and from ISO2709 encoded MARC and 
2147          <ulink url="&url.marcxml;">&acro.marcxml;</ulink>/MarcXchange.
2148          The following attributes may be specified:
2149
2150          <variablelist>
2151           <varlistentry><term><literal>inputformat</literal> (REQUIRED)</term>
2152            <listitem>
2153             <para>
2154              Format of input. Supported values are 
2155             <literal>marc</literal> (for ISO2709); and <literal>xml</literal>
2156              for MARCXML/MarcXchange.
2157             </para>
2158            </listitem>
2159           </varlistentry>
2160
2161           <varlistentry><term><literal>outputformat</literal> (REQUIRED)</term>
2162            <listitem>
2163             <para>
2164              Format of output. Supported values are 
2165             <literal>line</literal> (MARC line format); 
2166             <literal>marcxml</literal> (for MARCXML),
2167             <literal>marc</literal> (ISO2709),
2168             <literal>marcxhcange</literal> (for MarcXchange).
2169             </para>
2170            </listitem>
2171           </varlistentry>
2172
2173           <varlistentry><term><literal>inputcharset</literal> (OPTIONAL)</term>
2174            <listitem>
2175             <para>
2176              Encoding of input. For XML input formats, this need not
2177              be given, but for ISO2709 based inputformats, this should
2178              be set to the encoding used. For MARC21 records, a common
2179              inputcharset value  would be <literal>marc-8</literal>.
2180             </para>
2181            </listitem>
2182           </varlistentry>
2183
2184           <varlistentry><term><literal>outputcharset</literal> (OPTIONAL)</term>
2185            <listitem>
2186             <para>
2187              Encoding of output. If outputformat is XML based, it is
2188              strongly recommened to use <literal>utf-8</literal>.
2189             </para>
2190            </listitem>
2191           </varlistentry>
2192
2193          </variablelist>
2194         </para>
2195        </listitem>
2196       </varlistentry>
2197       <varlistentry><term><literal>xslt</literal></term>
2198        <listitem>
2199         <para>
2200          The <literal>xslt</literal> element specifies a conversion
2201          via &acro.xslt;. The following attributes may be specified:
2202
2203          <variablelist>
2204           <varlistentry><term><literal>stylesheet</literal> (REQUIRED)</term>
2205            <listitem>
2206             <para>
2207              Stylesheet file.
2208             </para>
2209            </listitem>
2210           </varlistentry>
2211          </variablelist>
2212
2213         </para>
2214        </listitem>
2215       </varlistentry>
2216      </variablelist>
2217     </para>
2218    </sect2>
2219    <sect2 id="tools.retrieval.examples">
2220     <title>Retrieval Facility Examples</title>
2221     <example id="tools.retrieval.marc21">
2222      <title>MARC21 backend</title>
2223      <para>
2224       A typical way to use the retrieval facility is to enable XML
2225       for servers that only supports ISO2709 encoded MARC21 records.
2226      </para>
2227      <programlisting><![CDATA[
2228      <retrievalinfo>
2229        <retrieval syntax="usmarc" name="F"/>
2230        <retrieval syntax="usmarc" name="B"/>
2231        <retrieval syntax="xml" name="marcxml"
2232                   identifier="info:srw/schema/1/marcxml-v1.1">
2233          <backend syntax="usmarc" name="F">
2234            <marc inputformat="marc" outputformat="marcxml"
2235                  inputcharset="marc-8"/>
2236          </backend>
2237        </retrieval>
2238        <retrieval syntax="xml" name="dc">
2239          <backend syntax="usmarc" name="F">
2240            <marc inputformat="marc" outputformat="marcxml"
2241                  inputcharset="marc-8"/>
2242            <xslt stylesheet="MARC21slim2DC.xsl"/>
2243          </backend>
2244        </retrieval>
2245      </retrievalinfo>
2246 ]]>
2247      </programlisting>
2248      <para>
2249       This means that our frontend supports:
2250       <itemizedlist>
2251        <listitem>
2252         <para>
2253          MARC21 F(ull) records.
2254         </para>
2255        </listitem>
2256        <listitem>
2257         <para>
2258          MARC21 B(rief) records.
2259         </para>
2260        </listitem>
2261
2262        <listitem>
2263         <para>
2264          MARCXML records.
2265         </para>
2266        </listitem>
2267
2268        <listitem>
2269         <para>
2270          Dublin core records.
2271         </para>
2272        </listitem>
2273       </itemizedlist>
2274      </para>
2275     </example>
2276    </sect2>
2277    <sect2 id="tools.retrieval.api">
2278     <title>API</title>
2279     <para>
2280      It should be easy to use the retrieval systems from applications. Refer
2281      to the headers
2282      <filename>yaz/retrieval.h</filename> and 
2283      <filename>yaz/record_conv.h</filename>.
2284     </para>
2285    </sect2>
2286   </sect1>
2287  </chapter>
2288  
2289  <!-- Keep this comment at the end of the file
2290  Local variables:
2291  mode: sgml
2292  sgml-omittag:t
2293  sgml-shorttag:t
2294  sgml-minimize-attributes:nil
2295  sgml-always-quote-attributes:t
2296  sgml-indent-step:1
2297  sgml-indent-data:t
2298  sgml-parent-document: "yaz.xml"
2299  sgml-local-catalogs: nil
2300  sgml-namecase-general:t
2301  End:
2302  -->