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