ddb680704a96a285a4621ade21614d28d2c9c6f5
[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        righttrunc?
505
506        "notrunc?"
507
508        singlechar#mask
509
510       </screen>
511       <para>
512        Assuming that the qualifiers <literal>ti</literal>,
513        <literal>au</literal>
514        and <literal>date</literal> are defined we may use:
515       </para>
516
517       <screen>
518        ti=self portrait
519
520        au=(bob dylan and slow train coming)
521
522        date>1980 and (ti=((self portrait)))
523
524       </screen>
525      </example>
526
527     </sect3>
528     <sect3 id="ccl.qualifiers">
529      <title>CCL Qualifiers</title>
530
531      <para>
532       Qualifiers are used to direct the search to a particular searchable
533       index, such as title (ti) and author indexes (au). The CCL standard
534       itself doesn't specify a particular set of qualifiers, but it does
535       suggest a few short-hand notations. You can customize the CCL parser
536       to support a particular set of qualifiers to reflect the current target
537       profile. Traditionally, a qualifier would map to a particular
538       use-attribute within the BIB-1 attribute set. It is also
539       possible to set other attributes, such as the structure
540       attribute.
541      </para>
542
543      <para>
544       A  CCL profile is a set of predefined CCL qualifiers that may be
545       read from a file or set in the CCL API.
546       The YAZ client reads its CCL qualifiers from a file named
547       <filename>default.bib</filename>. There are four types of
548       lines in a CCL profile: qualifier specification,
549       qualifier alias, comments and directives.
550      </para>
551      <sect4 id="ccl.qualifier.specification">
552       <title>Qualifier specification</title>
553       <para>
554        A qualifier specification is of the form:
555       </para>
556
557       <para>
558        <replaceable>qualifier-name</replaceable>
559        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable>
560        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable> ...
561       </para>
562
563       <para>
564        where <replaceable>qualifier-name</replaceable> is the name of the
565        qualifier to be used (eg. <literal>ti</literal>),
566        <replaceable>type</replaceable> is attribute type in the attribute
567        set (Bib-1 is used if no attribute set is given) and
568        <replaceable>val</replaceable> is attribute value.
569        The <replaceable>type</replaceable> can be specified as an
570        integer or as it be specified either as a single-letter:
571        <literal>u</literal> for use,
572        <literal>r</literal> for relation,<literal>p</literal> for position,
573        <literal>s</literal> for structure,<literal>t</literal> for truncation
574        or <literal>c</literal> for completeness.
575        The attributes for the special qualifier name <literal>term</literal>
576        are used when no CCL qualifier is given in a query.
577        <table id="ccl.common.bib1.attributes">
578         <title>Common Bib-1 attributes</title>
579         <tgroup cols="2">
580          <colspec colwidth="2*" colname="type"></colspec>
581          <colspec colwidth="9*" colname="description"></colspec>
582          <thead>
583           <row>
584            <entry>Type</entry>
585            <entry>Description</entry>
586           </row>
587          </thead>
588          <tbody>
589           <row>
590            <entry><literal>u=</literal><replaceable>value</replaceable></entry>
591            <entry>
592             Use attribute (1). Common use attributes are
593             1 Personal-name, 4 Title, 7 ISBN, 8 ISSN, 30 Date,
594             62 Subject, 1003 Author), 1016 Any. Specify value
595             as an integer.
596            </entry>
597           </row>
598
599           <row>
600            <entry><literal>r=</literal><replaceable>value</replaceable></entry>
601            <entry>
602             Relation attribute (2). Common values are
603             1 &lt;, 2 &lt;=, 3 =, 4 &gt;=, 5 &gt;, 6 &lt;&gt;,
604             100 phonetic, 101 stem, 102 relevance, 103 always matches.
605            </entry>
606           </row>
607
608           <row>
609            <entry><literal>p=</literal><replaceable>value</replaceable></entry>
610            <entry>
611             Position attribute (3). Values: 1 first in field, 2
612             first in any subfield, 3 any position in field.
613            </entry>
614           </row>
615
616           <row>
617            <entry><literal>s=</literal><replaceable>value</replaceable></entry>
618            <entry>
619             Structure attribute (4). Values: 1 phrase, 2 word,
620             3 key, 4 year, 5 date, 6 word list, 100 date (un),
621             101 name (norm), 102 name (un), 103 structure, 104 urx,
622             105 free-form-text, 106 document-text, 107 local-number,
623             108 string, 109 numeric string.
624            </entry>
625           </row>
626
627           <row>
628            <entry><literal>t=</literal><replaceable>value</replaceable></entry>
629            <entry>
630             Truncation attribute (5). Values: 1 right, 2 left,
631             3 left&amp; right, 100 none, 101 process #, 102 regular-1,
632             103 regular-2, 104 CCL.
633            </entry>
634           </row>
635
636           <row>
637            <entry><literal>c=</literal><replaceable>value</replaceable></entry>
638            <entry>
639             Completeness attribute (6). Values: 1 incomplete subfield,
640             2 complete subfield, 3 complete field.
641            </entry>
642           </row>
643
644          </tbody>
645          </tgroup>
646         </table>
647       </para>
648       <para>
649        Refer to <xref linkend="bib1"/> or the complete
650        <ulink url="&url.z39.50.attset.bib1;">list of Bib-1 attributes</ulink>
651       </para>
652       <para>
653        It is also possible to specify non-numeric attribute values,
654        which are used in combination with certain types.
655        The special combinations are:
656
657        <table id="ccl.special.attribute.combos">
658         <title>Special attribute combos</title>
659         <tgroup cols="2">
660          <colspec colwidth="2*" colname="name"></colspec>
661          <colspec colwidth="9*" colname="description"></colspec>
662          <thead>
663           <row>
664            <entry>Name</entry>
665            <entry>Description</entry>
666           </row>
667          </thead>
668          <tbody>
669           <row>
670            <entry><literal>s=pw</literal></entry><entry>
671             The structure is set to either word or phrase depending
672             on the number of tokens in a term (phrase-word).
673            </entry>
674           </row>
675           <row>
676            <entry><literal>s=al</literal></entry><entry>
677             Each token in the term is ANDed. (and-list).
678             This does not set the structure at all.
679            </entry>
680           </row>
681
682           <row><entry><literal>s=ol</literal></entry><entry>
683             Each token in the term is ORed. (or-list).
684             This does not set the structure at all.
685            </entry>
686           </row>
687
688           <row><entry><literal>s=ag</literal></entry><entry>
689             Tokens that appears as phrases (with blank in them) gets
690             structure phrase attached. Tokens that appers as words
691             gets structure phrase attached. Phrases and words are
692             ANDed. This is a variant of s=al and s=pw, with the main
693             difference that words are not split (with operator AND)
694             but instead kept in one RPN token. This facility appeared
695             in YAZ 4.2.38.
696            </entry>
697           </row>
698
699           <row><entry><literal>r=o</literal></entry><entry>
700             Allows ranges and the operators greather-than, less-than, ...
701             equals.
702             This sets Bib-1 relation attribute accordingly (relation
703             ordered). A query construct is only treated as a range if
704             dash is used and that is surrounded by white-space. So
705             <literal>-1980</literal> is treated as term
706             <literal>"-1980"</literal> not <literal>&lt;= 1980</literal>.
707             If <literal>- 1980</literal> is used, however, that is
708             treated as a range.
709            </entry>
710           </row>
711
712           <row><entry><literal>r=r</literal></entry><entry>
713             Similar to <literal>r=o</literal> but assumes that terms
714             are non-negative (not prefixed with <literal>-</literal>).
715             Thus, a dash will always be treated as a range.
716             The construct <literal>1980-1990</literal> is
717             treated as a range with <literal>r=r</literal> but as a
718             single term <literal>"1980-1990"</literal> with
719             <literal>r=o</literal>. The special attribute
720             <literal>r=r</literal> is available in YAZ 2.0.24 or later.
721            </entry>
722           </row>
723
724           <row><entry><literal>t=l</literal></entry><entry>
725             Allows term to be left-truncated.
726             If term is of the form <literal>?x</literal>, the resulting
727             Type-1 term is <literal>x</literal> and truncation is left.
728            </entry>
729           </row>
730
731           <row><entry><literal>t=r</literal></entry><entry>
732             Allows term to be right-truncated.
733             If term is of the form <literal>x?</literal>, the resulting
734             Type-1 term is <literal>x</literal> and truncation is right.
735            </entry>
736           </row>
737
738           <row><entry><literal>t=n</literal></entry><entry>
739             If term is does not include <literal>?</literal>, the
740             truncation attribute is set to none (100).
741            </entry>
742           </row>
743
744           <row><entry><literal>t=b</literal></entry><entry>
745             Allows term to be both left&amp;right truncated.
746             If term is of the form <literal>?x?</literal>, the
747             resulting term is <literal>x</literal> and trunctation is
748             set to both left&amp;right.
749            </entry>
750           </row>
751
752           <row><entry><literal>t=x</literal></entry><entry>
753             Allows masking anywhere in a term, thus fully supporting
754             # (mask one character) and ? (zero or more of any).
755             If masking is used, trunction is set to 102 (regexp-1 in term)
756             and the term is converted accordingly to a regular expression.
757            </entry>
758           </row>
759
760           <row><entry><literal>t=z</literal></entry><entry>
761             Allows masking anywhere in a term, thus fully supporting
762             # (mask one character) and ? (zero or more of any).
763             If masking is used, trunction is set to 104 (Z39.58 in term)
764             and the term is converted accordingly to Z39.58 masking term -
765             actually the same truncation as CCL itself.
766            </entry>
767           </row>
768
769          </tbody>
770         </tgroup>
771        </table>
772       </para>
773       <example id="example.ccl.profile"><title>CCL profile</title>
774        <para>
775         Consider the following definition:
776        </para>
777
778        <screen>
779         ti       u=4 s=1
780         au       u=1 s=1
781         term     s=105
782         ranked   r=102
783         date     u=30 r=o
784       </screen>
785        <para>
786         <literal>ti</literal> and <literal>au</literal> both set
787         structure attribute to phrase (s=1).
788         <literal>ti</literal>
789         sets the use-attribute to 4. <literal>au</literal> sets the
790         use-attribute to 1.
791         When no qualifiers are used in the query the structure-attribute is
792         set to free-form-text (105) (rule for <literal>term</literal>).
793         The <literal>date</literal> sets the relation attribute to
794         the relation used in the CCL query and sets the use attribute
795         to 30 (Bib-1 Date).
796        </para>
797        <para>
798         You can combine attributes. To Search for "ranked title" you
799         can do
800         <screen>
801          ti,ranked=knuth computer
802         </screen>
803         which will set relation=ranked, use=title, structure=phrase.
804        </para>
805        <para>
806         Query
807         <screen>
808          date > 1980
809         </screen>
810         is a valid query. But
811         <screen>
812          ti > 1980
813         </screen>
814         is invalid.
815        </para>
816       </example>
817      </sect4>
818      <sect4 id="ccl.qualifier.alias">
819       <title>Qualifier alias</title>
820       <para>
821        A qualifier alias is of the form:
822       </para>
823       <para>
824        <replaceable>q</replaceable>
825        <replaceable>q1</replaceable> <replaceable>q2</replaceable> ..
826       </para>
827       <para>
828        which declares <replaceable>q</replaceable> to
829        be an alias for <replaceable>q1</replaceable>,
830        <replaceable>q2</replaceable>... such that the CCL
831        query <replaceable>q=x</replaceable> is equivalent to
832        <replaceable>q1=x or q2=x or ...</replaceable>.
833       </para>
834      </sect4>
835
836      <sect4 id="ccl.comments">
837       <title>Comments</title>
838       <para>
839        Lines with white space or lines that begin with
840        character <literal>#</literal> are treated as comments.
841       </para>
842      </sect4>
843
844      <sect4 id="ccl.directives">
845       <title>Directives</title>
846       <para>
847        Directive specifications takes the form
848       </para>
849       <para><literal>@</literal><replaceable>directive</replaceable> <replaceable>value</replaceable>
850       </para>
851       <table id="ccl.directives.table">
852        <title>CCL directives</title>
853        <tgroup cols="3">
854         <colspec colwidth="2*" colname="name"></colspec>
855         <colspec colwidth="8*" colname="description"></colspec>
856         <colspec colwidth="1*" colname="default"></colspec>
857         <thead>
858          <row>
859           <entry>Name</entry>
860           <entry>Description</entry>
861           <entry>Default</entry>
862          </row>
863         </thead>
864         <tbody>
865          <row>
866           <entry>truncation</entry>
867           <entry>Truncation character</entry>
868           <entry><literal>?</literal></entry>
869          </row>
870          <row>
871           <entry>field</entry>
872           <entry>Specifies how multiple fields are to be
873            combined. There are two modes: <literal>or</literal>:
874            multiple qualifier fields are ORed,
875            <literal>merge</literal>: attributes for the qualifier
876            fields are merged and assigned to one term.
877            </entry>
878           <entry><literal>merge</literal></entry>
879          </row>
880          <row>
881           <entry>case</entry>
882           <entry>Specifies if CCL operators and qualifiers should be
883            compared with case sensitivity or not. Specify 1 for
884            case sensitive; 0 for case insensitive.</entry>
885           <entry><literal>1</literal></entry>
886          </row>
887
888          <row>
889           <entry>and</entry>
890           <entry>Specifies token for CCL operator AND.</entry>
891           <entry><literal>and</literal></entry>
892          </row>
893
894          <row>
895           <entry>or</entry>
896           <entry>Specifies token for CCL operator OR.</entry>
897           <entry><literal>or</literal></entry>
898          </row>
899
900          <row>
901           <entry>not</entry>
902           <entry>Specifies token for CCL operator NOT.</entry>
903           <entry><literal>not</literal></entry>
904          </row>
905
906          <row>
907           <entry>set</entry>
908           <entry>Specifies token for CCL operator SET.</entry>
909           <entry><literal>set</literal></entry>
910          </row>
911         </tbody>
912         </tgroup>
913       </table>
914      </sect4>
915     </sect3>
916     <sect3 id="ccl.api">
917      <title>CCL API</title>
918      <para>
919       All public definitions can be found in the header file
920       <filename>ccl.h</filename>. A profile identifier is of type
921       <literal>CCL_bibset</literal>. A profile must be created with the call
922       to the function <function>ccl_qual_mk</function> which returns a profile
923       handle of type <literal>CCL_bibset</literal>.
924      </para>
925
926      <para>
927       To read a file containing qualifier definitions the function
928       <function>ccl_qual_file</function> may be convenient. This function
929       takes an already opened <literal>FILE</literal> handle pointer as
930       argument along with a <literal>CCL_bibset</literal> handle.
931      </para>
932
933      <para>
934       To parse a simple string with a FIND query use the function
935      </para>
936      <screen>
937 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
938                                    int *error, int *pos);
939      </screen>
940      <para>
941       which takes the CCL profile (<literal>bibset</literal>) and query
942       (<literal>str</literal>) as input. Upon successful completion the RPN
943       tree is returned. If an error occur, such as a syntax error, the integer
944       pointed to by <literal>error</literal> holds the error code and
945       <literal>pos</literal> holds the offset inside query string in which
946       the parsing failed.
947      </para>
948
949      <para>
950       An English representation of the error may be obtained by calling
951       the <literal>ccl_err_msg</literal> function. The error codes are
952       listed in <filename>ccl.h</filename>.
953      </para>
954
955      <para>
956       To convert the CCL RPN tree (type
957       <literal>struct ccl_rpn_node *</literal>)
958       to the Z_RPNQuery of YAZ the function <function>ccl_rpn_query</function>
959       must be used. This function which is part of YAZ is implemented in
960       <filename>yaz-ccl.c</filename>.
961       After calling this function the CCL RPN tree is probably no longer
962       needed. The <literal>ccl_rpn_delete</literal> destroys the CCL RPN tree.
963      </para>
964
965      <para>
966       A CCL profile may be destroyed by calling the
967       <function>ccl_qual_rm</function> function.
968      </para>
969
970      <para>
971       The token names for the CCL operators may be changed by setting the
972       globals (all type <literal>char *</literal>)
973       <literal>ccl_token_and</literal>, <literal>ccl_token_or</literal>,
974       <literal>ccl_token_not</literal> and <literal>ccl_token_set</literal>.
975       An operator may have aliases, i.e. there may be more than one name for
976       the operator. To do this, separate each alias with a space character.
977      </para>
978     </sect3>
979    </sect2>
980    <sect2 id="cql"><title>CQL</title>
981     <para>
982      <ulink url="&url.cql;">CQL</ulink>
983       - Common Query Language - was defined for the
984      <ulink url="&url.sru;">SRU</ulink> protocol.
985      In many ways CQL has a similar syntax to CCL.
986      The objective of CQL is different. Where CCL aims to be
987      an end-user language, CQL is <emphasis>the</emphasis> protocol
988      query language for SRU.
989     </para>
990     <tip>
991      <para>
992       If you are new to CQL, read the
993       <ulink url="&url.cql.intro;">Gentle Introduction</ulink>.
994      </para>
995     </tip>
996     <para>
997      The CQL parser in &yaz; provides the following:
998      <itemizedlist>
999       <listitem>
1000        <para>
1001         It parses and validates a CQL query.
1002        </para>
1003       </listitem>
1004       <listitem>
1005        <para>
1006         It generates a C structure that allows you to convert
1007         a CQL query to some other query language, such as SQL.
1008        </para>
1009       </listitem>
1010       <listitem>
1011        <para>
1012         The parser converts a valid CQL query to PQF, thus providing a
1013         way to use CQL for both SRU servers and Z39.50 targets at the
1014         same time.
1015        </para>
1016       </listitem>
1017       <listitem>
1018        <para>
1019         The parser converts CQL to
1020         <ulink url="&url.xcql;">XCQL</ulink>.
1021         XCQL is an XML representation of CQL.
1022         XCQL is part of the SRU specification. However, since SRU
1023         supports CQL only, we don't expect XCQL to be widely used.
1024         Furthermore, CQL has the advantage over XCQL that it is
1025         easy to read.
1026        </para>
1027       </listitem>
1028      </itemizedlist>
1029     </para>
1030     <sect3 id="cql.parsing"><title>CQL parsing</title>
1031      <para>
1032       A CQL parser is represented by the <literal>CQL_parser</literal>
1033       handle. Its contents should be considered &yaz; internal (private).
1034       <synopsis>
1035 #include &lt;yaz/cql.h&gt;
1036
1037 typedef struct cql_parser *CQL_parser;
1038
1039 CQL_parser cql_parser_create(void);
1040 void cql_parser_destroy(CQL_parser cp);
1041       </synopsis>
1042      A parser is created by <function>cql_parser_create</function> and
1043      is destroyed by <function>cql_parser_destroy</function>.
1044      </para>
1045      <para>
1046       To parse a CQL query string, the following function
1047       is provided:
1048       <synopsis>
1049 int cql_parser_string(CQL_parser cp, const char *str);
1050       </synopsis>
1051       A CQL query is parsed by the <function>cql_parser_string</function>
1052       which takes a query <parameter>str</parameter>.
1053       If the query was valid (no syntax errors), then zero is returned;
1054       otherwise -1 is returned to indicate a syntax error.
1055      </para>
1056      <para>
1057       <synopsis>
1058 int cql_parser_stream(CQL_parser cp,
1059                       int (*getbyte)(void *client_data),
1060                       void (*ungetbyte)(int b, void *client_data),
1061                       void *client_data);
1062
1063 int cql_parser_stdio(CQL_parser cp, FILE *f);
1064       </synopsis>
1065       The functions <function>cql_parser_stream</function> and
1066       <function>cql_parser_stdio</function> parses a CQL query
1067       - just like <function>cql_parser_string</function>.
1068       The only difference is that the CQL query can be
1069       fed to the parser in different ways.
1070       The <function>cql_parser_stream</function> uses a generic
1071       byte stream as input. The <function>cql_parser_stdio</function>
1072       uses a <literal>FILE</literal> handle which is opened for reading.
1073      </para>
1074     </sect3>
1075
1076     <sect3 id="cql.tree"><title>CQL tree</title>
1077      <para>
1078       The the query string is valid, the CQL parser
1079       generates a tree representing the structure of the
1080       CQL query.
1081      </para>
1082      <para>
1083       <synopsis>
1084 struct cql_node *cql_parser_result(CQL_parser cp);
1085       </synopsis>
1086       <function>cql_parser_result</function> returns the
1087       a pointer to the root node of the resulting tree.
1088      </para>
1089      <para>
1090       Each node in a CQL tree is represented by a
1091       <literal>struct cql_node</literal>.
1092       It is defined as follows:
1093       <synopsis>
1094 #define CQL_NODE_ST 1
1095 #define CQL_NODE_BOOL 2
1096 struct cql_node {
1097     int which;
1098     union {
1099         struct {
1100             char *index;
1101             char *index_uri;
1102             char *term;
1103             char *relation;
1104             char *relation_uri;
1105             struct cql_node *modifiers;
1106         } st;
1107         struct {
1108             char *value;
1109             struct cql_node *left;
1110             struct cql_node *right;
1111             struct cql_node *modifiers;
1112         } boolean;
1113     } u;
1114 };
1115       </synopsis>
1116       There are two node types: search term (ST) and boolean (BOOL).
1117       A modifier is treated as a search term too.
1118      </para>
1119      <para>
1120       The search term node has five members:
1121       <itemizedlist>
1122        <listitem>
1123         <para>
1124          <literal>index</literal>: index for search term.
1125          If an index is unspecified for a search term,
1126          <literal>index</literal> will be NULL.
1127         </para>
1128        </listitem>
1129        <listitem>
1130         <para>
1131          <literal>index_uri</literal>: index URi for search term
1132          or NULL if none could be resolved for the index.
1133         </para>
1134        </listitem>
1135        <listitem>
1136         <para>
1137          <literal>term</literal>: the search term itself.
1138         </para>
1139        </listitem>
1140        <listitem>
1141         <para>
1142          <literal>relation</literal>: relation for search term.
1143         </para>
1144        </listitem>
1145        <listitem>
1146         <para>
1147          <literal>relation_uri</literal>: relation URI for search term.
1148         </para>
1149        </listitem>
1150        <listitem>
1151         <para>
1152          <literal>modifiers</literal>: relation modifiers for search
1153          term. The <literal>modifiers</literal> list itself of cql_nodes
1154          each of type <literal>ST</literal>.
1155         </para>
1156        </listitem>
1157       </itemizedlist>
1158      </para>
1159
1160      <para>
1161       The boolean node represents both <literal>and</literal>,
1162       <literal>or</literal>, not as well as
1163       proximity.
1164       <itemizedlist>
1165        <listitem>
1166         <para>
1167          <literal>left</literal> and <literal>right</literal>: left
1168          - and right operand respectively.
1169         </para>
1170        </listitem>
1171        <listitem>
1172         <para>
1173          <literal>modifiers</literal>: proximity arguments.
1174         </para>
1175        </listitem>
1176       </itemizedlist>
1177      </para>
1178
1179     </sect3>
1180     <sect3 id="cql.to.pqf"><title>CQL to PQF conversion</title>
1181      <para>
1182       Conversion to PQF (and Z39.50 RPN) is tricky by the fact
1183       that the resulting RPN depends on the Z39.50 target
1184       capabilities (combinations of supported attributes).
1185       In addition, the CQL and SRU operates on index prefixes
1186       (URI or strings), whereas the RPN uses Object Identifiers
1187       for attribute sets.
1188      </para>
1189      <para>
1190       The CQL library of &yaz; defines a <literal>cql_transform_t</literal>
1191       type. It represents a particular mapping between CQL and RPN.
1192       This handle is created and destroyed by the functions:
1193      <synopsis>
1194 cql_transform_t cql_transform_open_FILE (FILE *f);
1195 cql_transform_t cql_transform_open_fname(const char *fname);
1196 void cql_transform_close(cql_transform_t ct);
1197       </synopsis>
1198       The first two functions create a tranformation handle from
1199       either an already open FILE or from a filename respectively.
1200      </para>
1201      <para>
1202       The handle is destroyed by <function>cql_transform_close</function>
1203       in which case no further reference of the handle is allowed.
1204      </para>
1205      <para>
1206       When a <literal>cql_transform_t</literal> handle has been created
1207       you can convert to RPN.
1208       <synopsis>
1209 int cql_transform_buf(cql_transform_t ct,
1210                       struct cql_node *cn, char *out, int max);
1211       </synopsis>
1212       This function converts the CQL tree <literal>cn</literal>
1213       using handle <literal>ct</literal>.
1214       For the resulting PQF, you supply a buffer <literal>out</literal>
1215       which must be able to hold at at least <literal>max</literal>
1216       characters.
1217      </para>
1218      <para>
1219       If conversion failed, <function>cql_transform_buf</function>
1220       returns a non-zero SRU error code; otherwise zero is returned
1221       (conversion successful).  The meanings of the numeric error
1222       codes are listed in the SRU specifications at
1223       <ulink url="&url.sru.diagnostics.list;"/>
1224      </para>
1225      <para>
1226       If conversion fails, more information can be obtained by calling
1227       <synopsis>
1228 int cql_transform_error(cql_transform_t ct, char **addinfop);
1229       </synopsis>
1230       This function returns the most recently returned numeric
1231       error-code and sets the string-pointer at
1232       <literal>*addinfop</literal> to point to a string containing
1233       additional information about the error that occurred: for
1234       example, if the error code is 15 (``Illegal or unsupported context
1235       set''), the additional information is the name of the requested
1236       context set that was not recognised.
1237      </para>
1238      <para>
1239       The SRU error-codes may be translated into brief human-readable
1240       error messages using
1241       <synopsis>
1242 const char *cql_strerror(int code);
1243       </synopsis>
1244      </para>
1245      <para>
1246       If you wish to be able to produce a PQF result in a different
1247       way, there are two alternatives.
1248       <synopsis>
1249 void cql_transform_pr(cql_transform_t ct,
1250                       struct cql_node *cn,
1251                       void (*pr)(const char *buf, void *client_data),
1252                       void *client_data);
1253
1254 int cql_transform_FILE(cql_transform_t ct,
1255                        struct cql_node *cn, FILE *f);
1256       </synopsis>
1257       The former function produces output to a user-defined
1258       output stream. The latter writes the result to an already
1259       open <literal>FILE</literal>.
1260      </para>
1261     </sect3>
1262     <sect3 id="cql.to.rpn">
1263      <title>Specification of CQL to RPN mappings</title>
1264      <para>
1265       The file supplied to functions
1266       <function>cql_transform_open_FILE</function>,
1267       <function>cql_transform_open_fname</function> follows
1268       a structure found in many Unix utilities.
1269       It consists of mapping specifications - one per line.
1270       Lines starting with <literal>#</literal> are ignored (comments).
1271      </para>
1272      <para>
1273       Each line is of the form
1274       <literallayout>
1275        <replaceable>CQL pattern</replaceable><literal> = </literal> <replaceable> RPN equivalent</replaceable>
1276       </literallayout>
1277      </para>
1278      <para>
1279       An RPN pattern is a simple attribute list. Each attribute pair
1280       takes the form:
1281       <literallayout>
1282        [<replaceable>set</replaceable>] <replaceable>type</replaceable><literal>=</literal><replaceable>value</replaceable>
1283       </literallayout>
1284       The attribute <replaceable>set</replaceable> is optional.
1285       The <replaceable>type</replaceable> is the attribute type,
1286       <replaceable>value</replaceable> the attribute value.
1287      </para>
1288      <para>
1289       The character <literal>*</literal> (asterisk) has special meaning
1290       when used in the RPN pattern.
1291       Each occurrence of <literal>*</literal> is substituted with the
1292       CQL matching name (index, relation, qualifier etc).
1293       This facility can be used to copy a CQL name verbatim to the RPN result.
1294      </para>
1295      <para>
1296       The following CQL patterns are recognized:
1297       <variablelist>
1298        <varlistentry><term>
1299          <literal>index.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1300         </term>
1301         <listitem>
1302          <para>
1303           This pattern is invoked when a CQL index, such as
1304           dc.title is converted. <replaceable>set</replaceable>
1305           and <replaceable>name</replaceable> are the context set and index
1306           name respectively.
1307           Typically, the RPN specifies an equivalent use attribute.
1308          </para>
1309          <para>
1310           For terms not bound by an index the pattern
1311           <literal>index.cql.serverChoice</literal> is used.
1312           Here, the prefix <literal>cql</literal> is defined as
1313           <literal>http://www.loc.gov/zing/cql/cql-indexes/v1.0/</literal>.
1314           If this pattern is not defined, the mapping will fail.
1315          </para>
1316          <para>
1317           The pattern,
1318           <literal>index.</literal><replaceable>set</replaceable><literal>.*</literal>
1319           is used when no other index pattern is matched.
1320         </para>
1321         </listitem>
1322        </varlistentry>
1323        <varlistentry><term>
1324          <literal>qualifier.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1325          (DEPRECATED)
1326         </term>
1327         <listitem>
1328          <para>
1329           For backwards compatibility, this is recognised as a synonym of
1330           <literal>index.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1331          </para>
1332         </listitem>
1333        </varlistentry>
1334        <varlistentry><term>
1335          <literal>relation.</literal><replaceable>relation</replaceable>
1336         </term>
1337         <listitem>
1338          <para>
1339           This pattern specifies how a CQL relation is mapped to RPN.
1340           <replaceable>pattern</replaceable> is name of relation
1341           operator. Since <literal>=</literal> is used as
1342           separator between CQL pattern and RPN, CQL relations
1343           including <literal>=</literal> cannot be
1344           used directly. To avoid a conflict, the names
1345           <literal>ge</literal>,
1346           <literal>eq</literal>,
1347           <literal>le</literal>,
1348           must be used for CQL operators, greater-than-or-equal,
1349           equal, less-than-or-equal respectively.
1350           The RPN pattern is supposed to include a relation attribute.
1351          </para>
1352          <para>
1353           For terms not bound by a relation, the pattern
1354           <literal>relation.scr</literal> is used. If the pattern
1355           is not defined, the mapping will fail.
1356          </para>
1357          <para>
1358           The special pattern, <literal>relation.*</literal> is used
1359           when no other relation pattern is matched.
1360          </para>
1361         </listitem>
1362        </varlistentry>
1363
1364        <varlistentry><term>
1365          <literal>relationModifier.</literal><replaceable>mod</replaceable>
1366         </term>
1367         <listitem>
1368          <para>
1369           This pattern specifies how a CQL relation modifier is mapped to RPN.
1370           The RPN pattern is usually a relation attribute.
1371          </para>
1372         </listitem>
1373        </varlistentry>
1374
1375        <varlistentry><term>
1376          <literal>structure.</literal><replaceable>type</replaceable>
1377         </term>
1378         <listitem>
1379          <para>
1380           This pattern specifies how a CQL structure is mapped to RPN.
1381           Note that this CQL pattern is somewhat to similar to
1382           CQL pattern <literal>relation</literal>.
1383           The <replaceable>type</replaceable> is a CQL relation.
1384          </para>
1385          <para>
1386           The pattern, <literal>structure.*</literal> is used
1387           when no other structure pattern is matched.
1388           Usually, the RPN equivalent specifies a structure attribute.
1389          </para>
1390         </listitem>
1391        </varlistentry>
1392
1393        <varlistentry><term>
1394          <literal>position.</literal><replaceable>type</replaceable>
1395         </term>
1396         <listitem>
1397          <para>
1398           This pattern specifies how the anchor (position) of
1399           CQL is mapped to RPN.
1400           The <replaceable>type</replaceable> is one
1401           of <literal>first</literal>, <literal>any</literal>,
1402           <literal>last</literal>, <literal>firstAndLast</literal>.
1403          </para>
1404          <para>
1405           The pattern, <literal>position.*</literal> is used
1406           when no other position pattern is matched.
1407          </para>
1408         </listitem>
1409        </varlistentry>
1410
1411        <varlistentry><term>
1412          <literal>set.</literal><replaceable>prefix</replaceable>
1413         </term>
1414         <listitem>
1415          <para>
1416           This specification defines a CQL context set for a given prefix.
1417           The value on the right hand side is the URI for the set -
1418           <emphasis>not</emphasis> RPN. All prefixes used in
1419           index patterns must be defined this way.
1420          </para>
1421         </listitem>
1422        </varlistentry>
1423
1424        <varlistentry><term>
1425          <literal>set</literal>
1426         </term>
1427         <listitem>
1428          <para>
1429           This specification defines a default CQL context set for index names.
1430           The value on the right hand side is the URI for the set.
1431          </para>
1432         </listitem>
1433        </varlistentry>
1434
1435       </variablelist>
1436      </para>
1437      <example id="example.cql.to.rpn.mapping">
1438       <title>CQL to RPN mapping file</title>
1439       <para>
1440        This simple file defines two context sets, three indexes and three
1441        relations, a position pattern and a default structure.
1442       </para>
1443       <programlisting><![CDATA[
1444        set.cql  = http://www.loc.gov/zing/cql/context-sets/cql/v1.1/
1445        set.dc   = http://www.loc.gov/zing/cql/dc-indexes/v1.0/
1446
1447        index.cql.serverChoice = 1=1016
1448        index.dc.title         = 1=4
1449        index.dc.subject       = 1=21
1450
1451        relation.<             = 2=1
1452        relation.eq            = 2=3
1453        relation.scr           = 2=3
1454
1455        position.any           = 3=3 6=1
1456
1457        structure.*            = 4=1
1458 ]]>
1459       </programlisting>
1460       <para>
1461        With the mappings above, the CQL query
1462        <screen>
1463         computer
1464        </screen>
1465        is converted to the PQF:
1466        <screen>
1467         @attr 1=1016 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "computer"
1468        </screen>
1469        by rules <literal>index.cql.serverChoice</literal>,
1470        <literal>relation.scr</literal>, <literal>structure.*</literal>,
1471        <literal>position.any</literal>.
1472       </para>
1473       <para>
1474        CQL query
1475        <screen>
1476         computer^
1477        </screen>
1478        is rejected, since <literal>position.right</literal> is
1479        undefined.
1480       </para>
1481       <para>
1482        CQL query
1483        <screen>
1484         >my = "http://www.loc.gov/zing/cql/dc-indexes/v1.0/" my.title = x
1485        </screen>
1486        is converted to
1487        <screen>
1488         @attr 1=4 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "x"
1489        </screen>
1490       </para>
1491      </example>
1492      <example id="example.cql.to.rpn.string">
1493       <title>CQL to RPN string attributes</title>
1494       <para>
1495        In this example we allow any index to be passed to RPN as
1496        a use attribute.
1497       </para>
1498       <programlisting><![CDATA[
1499        # Identifiers for prefixes used in this file. (index.*)
1500        set.cql  = info:srw/cql-context-set/1/cql-v1.1
1501        set.rpn  = http://bogus/rpn
1502        set      = http://bogus/rpn
1503
1504        # The default index when none is specified by the query
1505        index.cql.serverChoice     = 1=any
1506
1507        index.rpn.*                = 1=*
1508        relation.eq                = 2=3
1509        structure.*                = 4=1
1510        position.any               = 3=3
1511 ]]>
1512       </programlisting>
1513       <para>
1514        The <literal>http://bogus/rpn</literal> context set is also the default
1515        so we can make queries such as
1516        <screen>
1517         title = a
1518        </screen>
1519        which is converted to
1520        <screen>
1521         @attr 2=3 @attr 4=1 @attr 3=3 @attr 1=title "a"
1522        </screen>
1523       </para>
1524      </example>
1525      <example id="example.cql.to.rpn.bathprofile">
1526       <title>CQL to RPN using Bath Profile</title>
1527       <para>
1528        The file <filename>etc/pqf.properties</filename> has mappings from
1529        the Bath Profile and Dublin Core to RPN.
1530        If YAZ is installed as a package it's usually located
1531        in <filename>/usr/share/yaz/etc</filename> and part of the
1532        development package, such as <literal>libyaz-dev</literal>.
1533       </para>
1534      </example>
1535     </sect3>
1536     <sect3 id="cql.xcql"><title>CQL to XCQL conversion</title>
1537      <para>
1538       Conversion from CQL to XCQL is trivial and does not
1539       require a mapping to be defined.
1540       There three functions to choose from depending on the
1541       way you wish to store the resulting output (XML buffer
1542       containing XCQL).
1543       <synopsis>
1544 int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
1545 void cql_to_xml(struct cql_node *cn,
1546                 void (*pr)(const char *buf, void *client_data),
1547                 void *client_data);
1548 void cql_to_xml_stdio(struct cql_node *cn, FILE *f);
1549       </synopsis>
1550       Function <function>cql_to_xml_buf</function> converts
1551       to XCQL and stores result in a user supplied buffer of a given
1552       max size.
1553      </para>
1554      <para>
1555       <function>cql_to_xml</function> writes the result in
1556       a user defined output stream.
1557       <function>cql_to_xml_stdio</function> writes to a
1558       a file.
1559      </para>
1560     </sect3>
1561    </sect2>
1562   </sect1>
1563   <sect1 id="tools.oid"><title>Object Identifiers</title>
1564
1565    <para>
1566     The basic YAZ representation of an OID is an array of integers,
1567     terminated with the value -1. This integer is of type
1568     <literal>Odr_oid</literal>.
1569    </para>
1570    <para>
1571     Fundamental OID operations and the type <literal>Odr_oid</literal>
1572     are defined in <filename>yaz/oid_util.h</filename>.
1573    </para>
1574    <para>
1575     An OID can either be declared as a automatic variable or it can
1576     allocated using the memory utilities or ODR/NMEM. It's
1577     guaranteed that an OID can fit in <literal>OID_SIZE</literal> integers.
1578    </para>
1579    <example id="tools.oid.bib1.1"><title>Create OID on stack</title>
1580     <para>
1581      We can create an OID for the Bib-1 attribute set with:
1582      <screen>
1583       Odr_oid bib1[OID_SIZE];
1584       bib1[0] = 1;
1585       bib1[1] = 2;
1586       bib1[2] = 840;
1587       bib1[3] = 10003;
1588       bib1[4] = 3;
1589       bib1[5] = 1;
1590       bib1[6] = -1;
1591      </screen>
1592     </para>
1593    </example>
1594    <para>
1595     And OID may also be filled from a string-based representation using
1596     dots (.). This is achieved by function
1597     <screen>
1598      int oid_dotstring_to_oid(const char *name, Odr_oid *oid);
1599     </screen>
1600     This functions returns 0 if name could be converted; -1 otherwise.
1601    </para>
1602    <example id="tools.oid.bib1.2"><title>Using oid_oiddotstring_to_oid</title>
1603     <para>
1604      We can fill the Bib-1 attribute set OID easier with:
1605      <screen>
1606       Odr_oid bib1[OID_SIZE];
1607       oid_oiddotstring_to_oid("1.2.840.10003.3.1", bib1);
1608      </screen>
1609    </para>
1610    </example>
1611    <para>
1612     We can also allocate an OID dynamically on a ODR stream with:
1613    <screen>
1614     Odr_oid *odr_getoidbystr(ODR o, const char *str);
1615    </screen>
1616     This creates an OID from string-based representation using dots.
1617     This function take an &odr; stream as parameter. This stream is used to
1618     allocate memory for the data elements, which is released on a
1619     subsequent call to <function>odr_reset()</function> on that stream.
1620    </para>
1621
1622    <example id="tools.oid.bib1.3"><title>Using odr_getoidbystr</title>
1623     <para>
1624      We can create a OID for the Bib-1 attribute set with:
1625      <screen>
1626       Odr_oid *bib1 = odr_getoidbystr(odr, "1.2.840.10003.3.1");
1627      </screen>
1628     </para>
1629    </example>
1630
1631    <para>
1632     The function
1633     <screen>
1634      char *oid_oid_to_dotstring(const Odr_oid *oid, char *oidbuf)
1635     </screen>
1636     does the reverse of <function>oid_oiddotstring_to_oid</function>. It
1637     converts an OID to the string-based representation using dots.
1638     The supplied char buffer <literal>oidbuf</literal> holds the resulting
1639     string and must be at least <literal>OID_STR_MAX</literal> in size.
1640    </para>
1641
1642    <para>
1643     OIDs can be copied with <function>oid_oidcpy</function> which takes
1644     two OID lists as arguments. Alternativly, an OID copy can be allocated
1645     on a ODR stream with:
1646     <screen>
1647      Odr_oid *odr_oiddup(ODR odr, const Odr_oid *o);
1648     </screen>
1649    </para>
1650
1651    <para>
1652     OIDs can be compared with <function>oid_oidcmp</function> which returns
1653     zero if the two OIDs provided are identical; non-zero otherwise.
1654    </para>
1655
1656    <sect2 id="tools.oid.database"><title>OID database</title>
1657     <para>
1658      From YAZ version 3 and later, the oident system has been replaced
1659      by an OID database. OID database is a misnomer .. the old odient
1660      system was also a database.
1661     </para>
1662     <para>
1663      The OID database is really just a map between named Object Identifiers
1664      (string) and their OID raw equivalents. Most operations either
1665      convert from string to OID or other way around.
1666     </para>
1667     <para>
1668      Unfortunately, whenever we supply a string we must also specify the
1669      <emphasis>OID class</emphasis>. The class is necessary because some
1670      strings correspond to multiple OIDs. An example of such a string is
1671      <literal>Bib-1</literal> which may either be an attribute-set
1672      or a diagnostic-set.
1673     </para>
1674     <para>
1675      Applications using the YAZ database should include
1676      <filename>yaz/oid_db.h</filename>.
1677     </para>
1678     <para>
1679      A YAZ database handle is of type <literal>yaz_oid_db_t</literal>.
1680      Actually that's a pointer. You need not think deal with that.
1681      YAZ has a built-in database which can be considered "constant" for
1682      most purposes.
1683      We can get hold that by using function <function>yaz_oid_std</function>.
1684     </para>
1685     <para>
1686      All functions with prefix <function>yaz_string_to_oid</function>
1687      converts from class + string to OID. We have variants of this
1688      operation due to different memory allocation strategies.
1689     </para>
1690     <para>
1691      All functions with prefix
1692      <function>yaz_oid_to_string</function> converts from OID to string
1693      + class.
1694     </para>
1695
1696     <example id="tools.oid.bib1.4"><title>Create OID with YAZ DB</title>
1697      <para>
1698       We can create an OID for the Bib-1 attribute set on the ODR stream
1699       odr with:
1700      <screen>
1701         Odr_oid *bib1 =
1702          yaz_string_to_oid_odr(yaz_oid_std(), CLASS_ATTSET, "Bib-1", odr);
1703       </screen>
1704       This is more complex than using <function>odr_getoidbystr</function>.
1705       You would only use <function>yaz_string_to_oid_odr</function> when the
1706       string (here Bib-1) is supplied by a user or configuration.
1707      </para>
1708     </example>
1709
1710    </sect2>
1711    <sect2 id="tools.oid.std"><title>Standard OIDs</title>
1712
1713     <para>
1714      All the object identifers in the standard OID database as returned
1715      by <function>yaz_oid_std</function> can referenced directly in a
1716      program as a constant OID.
1717      Each constant OID is prefixed with <literal>yaz_oid_</literal> -
1718      followed by OID class (lowercase) - then by OID name (normalized and
1719      lowercase).
1720     </para>
1721     <para>
1722      See <xref linkend="list-oids"/> for list of all object identifiers
1723      built into YAZ.
1724      These are declared in <filename>yaz/oid_std.h</filename> but are
1725      included by <filename>yaz/oid_db.h</filename> as well.
1726     </para>
1727
1728     <example id="tools.oid.bib1.5"><title>Use a built-in OID</title>
1729      <para>
1730       We can allocate our own OID filled with the constant OID for
1731       Bib-1 with:
1732       <screen>
1733         Odr_oid *bib1 = odr_oiddup(o, yaz_oid_attset_bib1);
1734       </screen>
1735      </para>
1736     </example>
1737    </sect2>
1738   </sect1>
1739   <sect1 id="tools.nmem"><title>Nibble Memory</title>
1740
1741    <para>
1742     Sometimes when you need to allocate and construct a large,
1743     interconnected complex of structures, it can be a bit of a pain to
1744     release the associated memory again. For the structures describing the
1745     Z39.50 PDUs and related structures, it is convenient to use the
1746     memory-management system of the &odr; subsystem (see
1747     <xref linkend="odr.use"/>). However, in some circumstances
1748     where you might otherwise benefit from using a simple nibble memory
1749     management system, it may be impractical to use
1750     <function>odr_malloc()</function> and <function>odr_reset()</function>.
1751     For this purpose, the memory manager which also supports the &odr;
1752     streams is made available in the NMEM module. The external interface
1753     to this module is given in the <filename>nmem.h</filename> file.
1754    </para>
1755
1756    <para>
1757     The following prototypes are given:
1758    </para>
1759
1760    <screen>
1761     NMEM nmem_create(void);
1762     void nmem_destroy(NMEM n);
1763     void *nmem_malloc(NMEM n, size_t size);
1764     void nmem_reset(NMEM n);
1765     size_t nmem_total(NMEM n);
1766     void nmem_init(void);
1767     void nmem_exit(void);
1768    </screen>
1769
1770    <para>
1771     The <function>nmem_create()</function> function returns a pointer to a
1772     memory control handle, which can be released again by
1773     <function>nmem_destroy()</function> when no longer needed.
1774     The function <function>nmem_malloc()</function> allocates a block of
1775     memory of the requested size. A call to <function>nmem_reset()</function>
1776     or <function>nmem_destroy()</function> will release all memory allocated
1777     on the handle since it was created (or since the last call to
1778     <function>nmem_reset()</function>. The function
1779     <function>nmem_total()</function> returns the number of bytes currently
1780     allocated on the handle.
1781    </para>
1782
1783    <para>
1784     The nibble memory pool is shared amongst threads. POSIX
1785     mutex'es and WIN32 Critical sections are introduced to keep the
1786     module thread safe. Function <function>nmem_init()</function>
1787     initializes the nibble memory library and it is called automatically
1788     the first time the <literal>YAZ.DLL</literal> is loaded. &yaz; uses
1789     function <function>DllMain</function> to achieve this. You should
1790     <emphasis>not</emphasis> call <function>nmem_init</function> or
1791     <function>nmem_exit</function> unless you're absolute sure what
1792     you're doing. Note that in previous &yaz; versions you'd have to call
1793     <function>nmem_init</function> yourself.
1794    </para>
1795
1796   </sect1>
1797
1798   <sect1 id="tools.log"><title>Log</title>
1799   <para>
1800    &yaz; has evolved a fairly complex log system which should be useful both
1801    for debugging &yaz; itself, debugging applications that use &yaz;, and for
1802    production use of those applications.
1803   </para>
1804   <para>
1805    The log functions are declared in header <filename>yaz/log.h</filename>
1806     and implemented in <filename>src/log.c</filename>.
1807     Due to name clash with syslog and some math utilities the logging
1808     interface has been modified as of YAZ 2.0.29. The obsolete interface
1809     is still available if in header file <filename>yaz/log.h</filename>.
1810     The key points of the interface are:
1811   </para>
1812   <screen>
1813    void yaz_log(int level, const char *fmt, ...)
1814
1815    void yaz_log_init(int level, const char *prefix, const char *name);
1816    void yaz_log_init_file(const char *fname);
1817    void yaz_log_init_level(int level);
1818    void yaz_log_init_prefix(const char *prefix);
1819    void yaz_log_time_format(const char *fmt);
1820    void yaz_log_init_max_size(int mx);
1821
1822    int yaz_log_mask_str(const char *str);
1823    int yaz_log_module_level(const char *name);
1824   </screen>
1825
1826   <para>
1827    The reason for the whole log module is the <function>yaz_log</function>
1828    function. It takes a bitmask indicating the log levels, a
1829    <literal>printf</literal>-like format string, and a variable number of
1830    arguments to log.
1831   </para>
1832
1833   <para>
1834    The <literal>log level</literal> is a bit mask, that says on which level(s)
1835    the log entry should be made, and optionally set some behaviour of the
1836    logging. In the most simple cases, it can be one of <literal>YLOG_FATAL,
1837    YLOG_DEBUG, YLOG_WARN, YLOG_LOG</literal>. Those can be combined with bits
1838    that modify the way the log entry is written:<literal>YLOG_ERRNO,
1839    YLOG_NOTIME, YLOG_FLUSH</literal>.
1840    Most of the rest of the bits are deprecated, and should not be used. Use
1841    the dynamic log levels instead.
1842   </para>
1843
1844   <para>
1845    Applications that use &yaz;, should not use the LOG_LOG for ordinary
1846    messages, but should make use of the dynamic loglevel system. This consists
1847    of two parts, defining the loglevel and checking it.
1848   </para>
1849
1850   <para>
1851    To define the log levels, the (main) program should pass a string to
1852    <function>yaz_log_mask_str</function> to define which log levels are to be
1853    logged. This string should be a comma-separated list of log level names,
1854    and can contain both hard-coded names and dynamic ones. The log level
1855    calculation starts with <literal>YLOG_DEFAULT_LEVEL</literal> and adds a bit
1856    for each word it meets, unless the word starts with a '-', in which case it
1857    clears the bit. If the string <literal>'none'</literal> is found,
1858    all bits are cleared. Typically this string comes from the command-line,
1859    often identified by <literal>-v</literal>. The
1860    <function>yaz_log_mask_str</function> returns a log level that should be
1861    passed to <function>yaz_log_init_level</function> for it to take effect.
1862   </para>
1863
1864   <para>
1865    Each module should check what log bits it should be used, by calling
1866    <function>yaz_log_module_level</function> with a suitable name for the
1867    module. The name is cleared from a preceding path and an extension, if any,
1868    so it is quite possible to use <literal>__FILE__</literal> for it. If the
1869    name has been passed to <function>yaz_log_mask_str</function>, the routine
1870    returns a non-zero bitmask, which should then be used in consequent calls
1871    to yaz_log. (It can also be tested, so as to avoid unnecessary calls to
1872    yaz_log, in time-critical places, or when the log entry would take time
1873    to construct.)
1874   </para>
1875
1876   <para>
1877    Yaz uses the following dynamic log levels:
1878    <literal>server, session, request, requestdetail</literal> for the server
1879    functionality.
1880    <literal>zoom</literal> for the zoom client api.
1881    <literal>ztest</literal> for the simple test server.
1882    <literal>malloc, nmem, odr, eventl</literal> for internal debugging of yaz itself.
1883    Of course, any program using yaz is welcome to define as many new ones, as
1884    it needs.
1885   </para>
1886
1887   <para>
1888    By default the log is written to stderr, but this can be changed by a call
1889    to <function>yaz_log_init_file</function> or
1890    <function>yaz_log_init</function>. If the log is directed to a file, the
1891    file size is checked at every write, and if it exceeds the limit given in
1892    <function>yaz_log_init_max_size</function>, the log is rotated. The
1893    rotation keeps one old version (with a <literal>.1</literal> appended to
1894    the name). The size defaults to 1GB. Setting it to zero will disable the
1895    rotation feature.
1896   </para>
1897
1898   <screen>
1899   A typical yaz-log looks like this
1900   13:23:14-23/11 yaz-ztest(1) [session] Starting session from tcp:127.0.0.1 (pid=30968)
1901   13:23:14-23/11 yaz-ztest(1) [request] Init from 'YAZ' (81) (ver 2.0.28) OK
1902   13:23:17-23/11 yaz-ztest(1) [request] Search Z: @attrset Bib-1 foo  OK:7 hits
1903   13:23:22-23/11 yaz-ztest(1) [request] Present: [1] 2+2  OK 2 records returned
1904   13:24:13-23/11 yaz-ztest(1) [request] Close OK
1905   </screen>
1906
1907   <para>
1908    The log entries start with a time stamp. This can be omitted by setting the
1909    <literal>YLOG_NOTIME</literal> bit in the loglevel. This way automatic tests
1910    can be hoped to produce identical log files, that are easy to diff. The
1911    format of the time stamp can be set with
1912    <function>yaz_log_time_format</function>, which takes a format string just
1913    like <function>strftime</function>.
1914   </para>
1915
1916   <para>
1917    Next in a log line comes the prefix, often the name of the program. For
1918    yaz-based servers, it can also contain the session number. Then
1919    comes one or more logbits in square brackets, depending on the logging
1920    level set by <function>yaz_log_init_level</function> and the loglevel
1921    passed to <function>yaz_log_init_level</function>. Finally comes the format
1922    string and additional values passed to <function>yaz_log</function>
1923   </para>
1924
1925   <para>
1926    The log level <literal>YLOG_LOGLVL</literal>, enabled by the string
1927    <literal>loglevel</literal>, will log all the log-level affecting
1928    operations. This can come in handy if you need to know what other log
1929    levels would be useful. Grep the logfile for <literal>[loglevel]</literal>.
1930   </para>
1931
1932   <para>
1933    The log system is almost independent of the rest of &yaz;, the only
1934    important dependence is of <filename>nmem</filename>, and that only for
1935    using the semaphore definition there.
1936   </para>
1937
1938   <para>
1939    The dynamic log levels and log rotation were introduced in &yaz; 2.0.28. At
1940    the same time, the log bit names were changed from
1941    <literal>LOG_something</literal> to <literal>YLOG_something</literal>,
1942    to avoid collision with <filename>syslog.h</filename>.
1943   </para>
1944
1945   </sect1>
1946
1947   <sect1 id="marc"><title>MARC</title>
1948
1949    <para>
1950     YAZ provides a fast utility for working with MARC records.
1951     Early versions of the MARC utility only allowed decoding of ISO2709.
1952     Today the utility may both encode - and decode to a varity of formats.
1953    </para>
1954    <synopsis><![CDATA[
1955     #include <yaz/marcdisp.h>
1956
1957     /* create handler */
1958     yaz_marc_t yaz_marc_create(void);
1959     /* destroy */
1960     void yaz_marc_destroy(yaz_marc_t mt);
1961
1962     /* set XML mode YAZ_MARC_LINE, YAZ_MARC_SIMPLEXML, ... */
1963     void yaz_marc_xml(yaz_marc_t mt, int xmlmode);
1964     #define YAZ_MARC_LINE      0
1965     #define YAZ_MARC_SIMPLEXML 1
1966     #define YAZ_MARC_OAIMARC   2
1967     #define YAZ_MARC_MARCXML   3
1968     #define YAZ_MARC_ISO2709   4
1969     #define YAZ_MARC_XCHANGE   5
1970     #define YAZ_MARC_CHECK     6
1971     #define YAZ_MARC_TURBOMARC 7
1972
1973     /* supply iconv handle for character set conversion .. */
1974     void yaz_marc_iconv(yaz_marc_t mt, yaz_iconv_t cd);
1975
1976     /* set debug level, 0=none, 1=more, 2=even more, .. */
1977     void yaz_marc_debug(yaz_marc_t mt, int level);
1978
1979     /* decode MARC in buf of size bsize. Returns >0 on success; <=0 on failure.
1980     On success, result in *result with size *rsize. */
1981     int yaz_marc_decode_buf(yaz_marc_t mt, const char *buf, int bsize,
1982                             const char **result, size_t *rsize);
1983
1984     /* decode MARC in buf of size bsize. Returns >0 on success; <=0 on failure.
1985        On success, result in WRBUF */
1986     int yaz_marc_decode_wrbuf(yaz_marc_t mt, const char *buf,
1987                               int bsize, WRBUF wrbuf);
1988 ]]>
1989    </synopsis>
1990    <note>
1991     <para>
1992      The synopsis is just a basic subset of all functionality. Refer
1993      to the actual header file <filename>marcdisp.h</filename> for
1994      details.
1995     </para>
1996    </note>
1997    <para>
1998     A MARC conversion handle must be created by using
1999     <function>yaz_marc_create</function> and destroyed
2000     by calling <function>yaz_marc_destroy</function>.
2001   </para>
2002    <para>
2003     All other function operate on a <literal>yaz_marc_t</literal> handle.
2004     The output is specified by a call to <function>yaz_marc_xml</function>.
2005     The <literal>xmlmode</literal> must be one of
2006     <variablelist>
2007      <varlistentry>
2008       <term>YAZ_MARC_LINE</term>
2009       <listitem>
2010        <para>
2011         A simple line-by-line format suitable for display but not
2012         recommend for further (machine) processing.
2013        </para>
2014       </listitem>
2015      </varlistentry>
2016
2017      <varlistentry>
2018       <term>YAZ_MARC_MARCXML</term>
2019       <listitem>
2020        <para>
2021         <ulink url="&url.marcxml;">MARCXML</ulink>.
2022        </para>
2023       </listitem>
2024      </varlistentry>
2025
2026      <varlistentry>
2027       <term>YAZ_MARC_ISO2709</term>
2028       <listitem>
2029        <para>
2030         ISO2709 (sometimes just referred to as "MARC").
2031        </para>
2032       </listitem>
2033      </varlistentry>
2034
2035      <varlistentry>
2036       <term>YAZ_MARC_XCHANGE</term>
2037       <listitem>
2038        <para>
2039         <ulink url="&url.marcxchange;">MarcXchange</ulink>.
2040        </para>
2041       </listitem>
2042      </varlistentry>
2043
2044      <varlistentry>
2045       <term>YAZ_MARC_CHECK</term>
2046       <listitem>
2047        <para>
2048         Pseudo format for validation only. Does not generate
2049         any real output except diagnostics.
2050        </para>
2051       </listitem>
2052      </varlistentry>
2053
2054      <varlistentry>
2055       <term>YAZ_MARC_TURBOMARC</term>
2056       <listitem>
2057        <para>
2058         XML format with same semantics as MARCXML but more compact
2059         and geared towards fast processing with XSLT. Refer to
2060         <xref linkend="tools.turbomarc"/> for more information.
2061        </para>
2062       </listitem>
2063      </varlistentry>
2064
2065     </variablelist>
2066    </para>
2067    <para>
2068     The actual conversion functions are
2069     <function>yaz_marc_decode_buf</function> and
2070     <function>yaz_marc_decode_wrbuf</function> which decodes and encodes
2071     a MARC record. The former function operates on simple buffers, the
2072     stores the resulting record in a WRBUF handle (WRBUF is a simple string
2073     type).
2074    </para>
2075    <example id="example.marc.display">
2076     <title>Display of MARC record</title>
2077     <para>
2078      The following program snippet illustrates how the MARC API may
2079      be used to convert a MARC record to the line-by-line format:
2080      <programlisting><![CDATA[
2081       void print_marc(const char *marc_buf, int marc_buf_size)
2082       {
2083          char *result;      /* for result buf */
2084          size_t result_len;    /* for size of result */
2085          yaz_marc_t mt = yaz_marc_create();
2086          yaz_marc_xml(mt, YAZ_MARC_LINE);
2087          yaz_marc_decode_buf(mt, marc_buf, marc_buf_size,
2088                              &result, &result_len);
2089          fwrite(result, result_len, 1, stdout);
2090          yaz_marc_destroy(mt);  /* note that result is now freed... */
2091       }
2092 ]]>
2093       </programlisting>
2094     </para>
2095    </example>
2096    <sect2 id="tools.turbomarc">
2097     <title>TurboMARC</title>
2098     <para>
2099      TurboMARC is yet another XML encoding of a MARC record. The format
2100      was designed for fast processing with XSLT.
2101     </para>
2102     <para>
2103      Applications like
2104      Pazpar2 uses XSLT to convert an XML encoded MARC record to an internal
2105      representation. This conversion mostly check the tag of a MARC field
2106      to determine the basic rules in the conversion. This check is
2107      costly when that is tag is encoded as an attribute in MARCXML.
2108      By having the tag value as the element instead, makes processing
2109      many times faster (at least for Libxslt).
2110     </para>
2111     <para>
2112      TurboMARC is encoded as follows:
2113      <itemizedlist>
2114       <listitem><para>
2115         Record elements is part of namespace
2116         "<literal>http://www.indexdata.com/turbomarc</literal>".
2117        </para></listitem>
2118       <listitem><para>
2119         A record is enclosed in element <literal>r</literal>.
2120        </para></listitem>
2121       <listitem><para>
2122         A collection of records is enclosed in element
2123         <literal>collection</literal>.
2124        </para></listitem>
2125       <listitem><para>
2126         The leader is encoded as element <literal>l</literal> with the
2127         leader content as its (text) value.
2128        </para></listitem>
2129       <listitem><para>
2130         A control field is encoded as element <literal>c</literal> concatenated
2131         with the tag value of the control field if the tag value
2132         matches the regular expression <literal>[a-zA-Z0-9]*</literal>.
2133         If the tag value do not match the regular expression
2134         <literal>[a-zA-Z0-9]*</literal> the control field is encoded
2135         as element <literal>c</literal> and attribute <literal>code</literal>
2136         will hold the tag value.
2137         This rule ensure that in the rare cases where a tag value might
2138         result in a non-wellformed XML YAZ encode it as a coded attribute
2139         (as in MARCXML).
2140        </para>
2141        <para>
2142         The control field content is the the text value of this element.
2143         Indicators are encoded as attribute names
2144         <literal>i1</literal>, <literal>i2</literal>, etc.. and
2145         corresponding values for each indicator.
2146        </para></listitem>
2147       <listitem><para>
2148         A data field is encoded as element <literal>d</literal> concatenated
2149         with the tag value of the data field or using the attribute
2150         <literal>code</literal> as described in the rules for control fields.
2151         The children of the data field element is subfield elements.
2152         Each subfield element is encoded as <literal>s</literal>
2153         concatenated with the sub field code.
2154         The text of the subfield element is the contents of the subfield.
2155         Indicators are encoded as attributes for the data field element similar
2156         to the encoding for control fields.
2157        </para></listitem>
2158      </itemizedlist>
2159     </para>
2160    </sect2>
2161   </sect1>
2162
2163   <sect1 id="tools.retrieval">
2164    <title>Retrieval Facility</title>
2165    <para>
2166     YAZ version 2.1.20 or later includes a Retrieval facility tool
2167     which allows a SRU/Z39.50 to describe itself and perform record
2168     conversions. The idea is the following:
2169
2170     <itemizedlist>
2171      <listitem>
2172       <para>
2173        An SRU/Z39.50 client sends a retrieval request which includes
2174        a combination of the following parameters: syntax (format),
2175        schema (or element set name).
2176       </para>
2177      </listitem>
2178
2179      <listitem>
2180       <para>
2181        The retrieval facility is invoked with parameters in a
2182        server/proxy. The retrieval facility matches the parameters a set of
2183        "supported" retrieval types.
2184        If there is no match, the retrieval signals an error
2185        (syntax and / or schema not supported).
2186       </para>
2187      </listitem>
2188
2189      <listitem>
2190       <para>
2191        For a successful match, the backend is invoked with the same
2192        or altered retrieval parameters (syntax, schema). If
2193        a record is received from the backend, it is converted to the
2194        frontend name / syntax.
2195       </para>
2196      </listitem>
2197
2198      <listitem>
2199       <para>
2200        The resulting record is sent back the client and tagged with
2201        the frontend syntax / schema.
2202       </para>
2203      </listitem>
2204
2205     </itemizedlist>
2206    </para>
2207    <para>
2208     The Retrieval facility is driven by an XML configuration. The
2209     configuration is neither Z39.50 ZeeRex or SRU ZeeRex. But it
2210     should be easy to generate both of them from the XML configuration.
2211     (unfortunately the two versions
2212     of ZeeRex differ substantially in this regard).
2213    </para>
2214    <sect2 id="tools.retrieval.format">
2215     <title>Retrieval XML format</title>
2216     <para>
2217      All elements should be covered by namespace
2218      <literal>http://indexdata.com/yaz</literal> .
2219      The root element node must be <literal>retrievalinfo</literal>.
2220     </para>
2221     <para>
2222      The <literal>retrievalinfo</literal> must include one or
2223      more <literal>retrieval</literal> elements. Each
2224     <literal>retrieval</literal> defines specific combination of
2225      syntax, name and identifier supported by this retrieval service.
2226     </para>
2227     <para>
2228      The <literal>retrieval</literal> element may include any of the
2229      following attributes:
2230      <variablelist>
2231       <varlistentry><term><literal>syntax</literal> (REQUIRED)</term>
2232        <listitem>
2233         <para>
2234          Defines the record syntax. Possible values is any
2235          of the names defined in YAZ' OID database or a raw
2236          OID in (n.n ... n).
2237         </para>
2238        </listitem>
2239       </varlistentry>
2240       <varlistentry><term><literal>name</literal> (OPTIONAL)</term>
2241        <listitem>
2242         <para>
2243          Defines the name of the retrieval format. This can be
2244          any string. For SRU, the value, is equivalent to schema (short-hand);
2245          for Z39.50 it's equivalent to simple element set name.
2246          For YAZ 3.0.24 and later this name may be specified as a glob
2247          expression with operators
2248          <literal>*</literal> and <literal>?</literal>.
2249         </para>
2250        </listitem>
2251       </varlistentry>
2252       <varlistentry><term><literal>identifier</literal> (OPTIONAL)</term>
2253        <listitem>
2254         <para>
2255          Defines the URI schema name of the retrieval format. This can be
2256          any string. For SRU, the value, is equivalent to URI schema.
2257          For Z39.50, there is no equivalent.
2258         </para>
2259        </listitem>
2260       </varlistentry>
2261      </variablelist>
2262     </para>
2263     <para>
2264      The <literal>retrieval</literal> may include one
2265      <literal>backend</literal> element. If a <literal>backend</literal>
2266      element is given, it specifies how the records are retrieved by
2267      some backend and how the records are converted from the backend to
2268      the "frontend".
2269     </para>
2270     <para>
2271      The attributes, <literal>name</literal> and <literal>syntax</literal>
2272      may be specified for the <literal>backend</literal> element. These
2273      semantics of these attributes is equivalent to those for the
2274      <literal>retrieval</literal>. However, these values are passed to
2275      the "backend".
2276     </para>
2277     <para>
2278      The <literal>backend</literal> element may includes one or more
2279      conversion instructions (as children elements). The supported
2280      conversions are:
2281      <variablelist>
2282       <varlistentry><term><literal>marc</literal></term>
2283        <listitem>
2284         <para>
2285          The <literal>marc</literal> element specifies a conversion
2286          to - and from ISO2709 encoded MARC and
2287          <ulink url="&url.marcxml;">&acro.marcxml;</ulink>/MarcXchange.
2288          The following attributes may be specified:
2289
2290          <variablelist>
2291           <varlistentry><term><literal>inputformat</literal> (REQUIRED)</term>
2292            <listitem>
2293             <para>
2294              Format of input. Supported values are
2295             <literal>marc</literal> (for ISO2709); and <literal>xml</literal>
2296              for MARCXML/MarcXchange.
2297             </para>
2298            </listitem>
2299           </varlistentry>
2300
2301           <varlistentry><term><literal>outputformat</literal> (REQUIRED)</term>
2302            <listitem>
2303             <para>
2304              Format of output. Supported values are
2305             <literal>line</literal> (MARC line format);
2306             <literal>marcxml</literal> (for MARCXML),
2307             <literal>marc</literal> (ISO2709),
2308             <literal>marcxhcange</literal> (for MarcXchange).
2309             </para>
2310            </listitem>
2311           </varlistentry>
2312
2313           <varlistentry><term><literal>inputcharset</literal> (OPTIONAL)</term>
2314            <listitem>
2315             <para>
2316              Encoding of input. For XML input formats, this need not
2317              be given, but for ISO2709 based inputformats, this should
2318              be set to the encoding used. For MARC21 records, a common
2319              inputcharset value  would be <literal>marc-8</literal>.
2320             </para>
2321            </listitem>
2322           </varlistentry>
2323
2324           <varlistentry><term><literal>outputcharset</literal> (OPTIONAL)</term>
2325            <listitem>
2326             <para>
2327              Encoding of output. If outputformat is XML based, it is
2328              strongly recommened to use <literal>utf-8</literal>.
2329             </para>
2330            </listitem>
2331           </varlistentry>
2332
2333          </variablelist>
2334         </para>
2335        </listitem>
2336       </varlistentry>
2337       <varlistentry><term><literal>xslt</literal></term>
2338        <listitem>
2339         <para>
2340          The <literal>xslt</literal> element specifies a conversion
2341          via &acro.xslt;. The following attributes may be specified:
2342
2343          <variablelist>
2344           <varlistentry><term><literal>stylesheet</literal> (REQUIRED)</term>
2345            <listitem>
2346             <para>
2347              Stylesheet file.
2348             </para>
2349            </listitem>
2350           </varlistentry>
2351          </variablelist>
2352
2353         </para>
2354        </listitem>
2355       </varlistentry>
2356      </variablelist>
2357     </para>
2358    </sect2>
2359    <sect2 id="tools.retrieval.examples">
2360     <title>Retrieval Facility Examples</title>
2361     <example id="tools.retrieval.marc21">
2362      <title>MARC21 backend</title>
2363      <para>
2364       A typical way to use the retrieval facility is to enable XML
2365       for servers that only supports ISO2709 encoded MARC21 records.
2366      </para>
2367      <programlisting><![CDATA[
2368      <retrievalinfo>
2369        <retrieval syntax="usmarc" name="F"/>
2370        <retrieval syntax="usmarc" name="B"/>
2371        <retrieval syntax="xml" name="marcxml"
2372                   identifier="info:srw/schema/1/marcxml-v1.1">
2373          <backend syntax="usmarc" name="F">
2374            <marc inputformat="marc" outputformat="marcxml"
2375                  inputcharset="marc-8"/>
2376          </backend>
2377        </retrieval>
2378        <retrieval syntax="xml" name="dc">
2379          <backend syntax="usmarc" name="F">
2380            <marc inputformat="marc" outputformat="marcxml"
2381                  inputcharset="marc-8"/>
2382            <xslt stylesheet="MARC21slim2DC.xsl"/>
2383          </backend>
2384        </retrieval>
2385      </retrievalinfo>
2386 ]]>
2387      </programlisting>
2388      <para>
2389       This means that our frontend supports:
2390       <itemizedlist>
2391        <listitem>
2392         <para>
2393          MARC21 F(ull) records.
2394         </para>
2395        </listitem>
2396        <listitem>
2397         <para>
2398          MARC21 B(rief) records.
2399         </para>
2400        </listitem>
2401
2402        <listitem>
2403         <para>
2404          MARCXML records.
2405         </para>
2406        </listitem>
2407
2408        <listitem>
2409         <para>
2410          Dublin core records.
2411         </para>
2412        </listitem>
2413       </itemizedlist>
2414      </para>
2415     </example>
2416    </sect2>
2417    <sect2 id="tools.retrieval.api">
2418     <title>API</title>
2419     <para>
2420      It should be easy to use the retrieval systems from applications. Refer
2421      to the headers
2422      <filename>yaz/retrieval.h</filename> and
2423      <filename>yaz/record_conv.h</filename>.
2424     </para>
2425    </sect2>
2426   </sect1>
2427  </chapter>
2428
2429  <!-- Keep this comment at the end of the file
2430  Local variables:
2431  mode: sgml
2432  sgml-omittag:t
2433  sgml-shorttag:t
2434  sgml-minimize-attributes:nil
2435  sgml-always-quote-attributes:t
2436  sgml-indent-step:1
2437  sgml-indent-data:t
2438  sgml-parent-document: "yaz.xml"
2439  sgml-local-catalogs: nil
2440  sgml-namecase-general:t
2441  End:
2442  -->