f82743623405a4a7b7ab56f8ed76491ba68933c1
[yaz-moved-to-github.git] / doc / tools.xml
1 <!-- $Id: tools.xml,v 1.20 2003-02-14 20:33:00 adam 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 two 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
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 optional an 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, a dash, followed by an attribute value. 
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     </para>
182
183     <para>
184      Z39.50 version 3 defines various encoding of terms.
185      Use the @term operator to indicate the encoding type:
186      <literal>general</literal>, <literal>numeric</literal>,
187      <literal>string</literal> (for InternationalString), ..
188      If no term type has been given, the <literal>general</literal> form
189      is used which is the only encoding allowed in both version 2 - and 3
190      of the Z39.50 standard.
191     </para>
192     
193     <para>
194      The following are all examples of valid queries in the PQF.
195     </para>
196
197     <screen>
198      dylan
199
200      "bob dylan"
201
202      @or "dylan" "zimmerman"
203
204      @set Result-1
205
206      @or @and bob dylan @set Result-1
207
208      @attr 1=4 computer
209
210      @attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
211
212      @attr 4=1 @attr 1=4 "self portrait"
213
214      @prox 0 3 1 2 k 2 dylan zimmerman
215
216      @and @attr 2=4 @attr gils 1=2038 -114 @attr 2=2 @attr gils 1=2039 -109
217
218      @term string "a UTF-8 string, maybe?"
219
220      @attr 1=/book/title computer
221     </screen>
222
223    </sect2>
224    <sect2 id="CCL"><title>Common Command Language</title>
225
226     <para>
227      Not all users enjoy typing in prefix query structures and numerical
228      attribute values, even in a minimalistic test client. In the library
229      world, the more intuitive Common Command Language (or ISO 8777) has
230      enjoyed some popularity - especially before the widespread
231      availability of graphical interfaces. It is still useful in
232      applications where you for some reason or other need to provide a
233      symbolic language for expressing boolean query structures.
234     </para>
235
236     <para>
237      The <ulink url="http://europagate.dtv.dk/">EUROPAGATE</ulink>
238      research project working under the Libraries programme
239      of the European Commission's DG XIII has, amongst other useful tools,
240      implemented a general-purpose CCL parser which produces an output
241      structure that can be trivially converted to the internal RPN
242      representation of &yaz; (The <literal>Z_RPNQuery</literal> structure).
243      Since the CCL utility - along with the rest of the software
244      produced by EUROPAGATE - is made freely available on a liberal
245      license, it is included as a supplement to &yaz;.
246     </para>
247
248     <sect3><title>CCL Syntax</title>
249
250      <para>
251       The CCL parser obeys the following grammar for the FIND argument.
252       The syntax is annotated by in the lines prefixed by
253       <literal>&dash;&dash;</literal>.
254      </para>
255
256      <screen>
257       CCL-Find ::= CCL-Find Op Elements
258                 | Elements.
259
260       Op ::= "and" | "or" | "not"
261       -- The above means that Elements are separated by boolean operators.
262
263       Elements ::= '(' CCL-Find ')'
264                 | Set
265                 | Terms
266                 | Qualifiers Relation Terms
267                 | Qualifiers Relation '(' CCL-Find ')'
268                 | Qualifiers '=' string '-' string
269       -- Elements is either a recursive definition, a result set reference, a
270       -- list of terms, qualifiers followed by terms, qualifiers followed
271       -- by a recursive definition or qualifiers in a range (lower - upper).
272
273       Set ::= 'set' = string
274       -- Reference to a result set
275
276       Terms ::= Terms Prox Term
277              | Term
278       -- Proximity of terms.
279
280       Term ::= Term string
281             | string
282       -- This basically means that a term may include a blank
283
284       Qualifiers ::= Qualifiers ',' string
285                   | string
286       -- Qualifiers is a list of strings separated by comma
287
288       Relation ::= '=' | '>=' | '&lt;=' | '&lt;>' | '>' | '&lt;'
289       -- Relational operators. This really doesn't follow the ISO8777
290       -- standard.
291
292       Prox ::= '%' | '!'
293       -- Proximity operator
294
295      </screen>
296
297      <para>
298       The following queries are all valid:
299      </para>
300
301      <screen>
302       dylan
303
304       "bob dylan"
305
306       dylan or zimmerman
307
308       set=1
309
310       (dylan and bob) or set=1
311
312      </screen>
313      <para>
314       Assuming that the qualifiers <literal>ti</literal>, <literal>au</literal>
315       and <literal>date</literal> are defined we may use:
316      </para>
317
318      <screen>
319       ti=self portrait
320
321       au=(bob dylan and slow train coming)
322
323       date>1980 and (ti=((self portrait)))
324
325      </screen>
326
327     </sect3>
328     <sect3><title>CCL Qualifiers</title>
329
330      <para>
331       Qualifiers are used to direct the search to a particular searchable
332       index, such as title (ti) and author indexes (au). The CCL standard
333       itself doesn't specify a particular set of qualifiers, but it does
334       suggest a few short-hand notations. You can customize the CCL parser
335       to support a particular set of qualifiers to reflect the current target
336       profile. Traditionally, a qualifier would map to a particular
337       use-attribute within the BIB-1 attribute set. However, you could also
338       define qualifiers that would set, for example, the
339       structure-attribute.
340      </para>
341
342      <para>
343       Consider a scenario where the target support ranked searches in the
344       title-index. In this case, the user could specify
345      </para>
346
347      <screen>
348       ti,ranked=knuth computer
349      </screen>
350      <para>
351       and the <literal>ranked</literal> would map to relation=relevance
352       (2=102) and the <literal>ti</literal> would map to title (1=4).
353      </para>
354
355      <para>
356       A "profile" with a set predefined CCL qualifiers can be read from a
357       file. The YAZ client reads its CCL qualifiers from a file named
358       <filename>default.bib</filename>. Each line in the file has the form:
359      </para>
360
361      <para>
362       <replaceable>qualifier-name</replaceable>  
363       <replaceable>type</replaceable>=<replaceable>val</replaceable>
364       <replaceable>type</replaceable>=<replaceable>val</replaceable> ...
365      </para>
366
367      <para>
368       where <replaceable>qualifier-name</replaceable> is the name of the
369       qualifier to be used (eg. <literal>ti</literal>),
370       <replaceable>type</replaceable> is a BIB-1 category type and
371       <replaceable>val</replaceable> is the corresponding BIB-1 attribute
372       value.
373       The <replaceable>type</replaceable> can be either numeric or it may be
374       either <literal>u</literal> (use), <literal>r</literal> (relation),
375       <literal>p</literal> (position), <literal>s</literal> (structure),
376       <literal>t</literal> (truncation) or <literal>c</literal> (completeness).
377       The <replaceable>qualifier-name</replaceable> <literal>term</literal>
378       has a special meaning.
379       The types and values for this definition is used when
380       <emphasis>no</emphasis> qualifiers are present.
381      </para>
382
383      <para>
384       Consider the following definition:
385      </para>
386
387      <screen>
388       ti       u=4 s=1
389       au       u=1 s=1
390       term     s=105
391      </screen>
392      <para>
393       Two qualifiers are defined, <literal>ti</literal> and
394       <literal>au</literal>.
395       They both set the structure-attribute to phrase (1).
396       <literal>ti</literal>
397       sets the use-attribute to 4. <literal>au</literal> sets the
398       use-attribute to 1.
399       When no qualifiers are used in the query the structure-attribute is
400       set to free-form-text (105).
401      </para>
402
403     </sect3>
404     <sect3><title>CCL API</title>
405      <para>
406       All public definitions can be found in the header file
407       <filename>ccl.h</filename>. A profile identifier is of type
408       <literal>CCL_bibset</literal>. A profile must be created with the call
409       to the function <function>ccl_qual_mk</function> which returns a profile
410       handle of type <literal>CCL_bibset</literal>.
411      </para>
412
413      <para>
414       To read a file containing qualifier definitions the function
415       <function>ccl_qual_file</function> may be convenient. This function
416       takes an already opened <literal>FILE</literal> handle pointer as
417       argument along with a <literal>CCL_bibset</literal> handle.
418      </para>
419
420      <para>
421       To parse a simple string with a FIND query use the function
422      </para>
423      <screen>
424 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
425                                    int *error, int *pos);
426      </screen>
427      <para>
428       which takes the CCL profile (<literal>bibset</literal>) and query
429       (<literal>str</literal>) as input. Upon successful completion the RPN
430       tree is returned. If an error occur, such as a syntax error, the integer
431       pointed to by <literal>error</literal> holds the error code and
432       <literal>pos</literal> holds the offset inside query string in which
433       the parsing failed.
434      </para>
435
436      <para>
437       An English representation of the error may be obtained by calling
438       the <literal>ccl_err_msg</literal> function. The error codes are
439       listed in <filename>ccl.h</filename>.
440      </para>
441
442      <para>
443       To convert the CCL RPN tree (type
444       <literal>struct ccl_rpn_node *</literal>)
445       to the Z_RPNQuery of YAZ the function <function>ccl_rpn_query</function>
446       must be used. This function which is part of YAZ is implemented in
447       <filename>yaz-ccl.c</filename>.
448       After calling this function the CCL RPN tree is probably no longer
449       needed. The <literal>ccl_rpn_delete</literal> destroys the CCL RPN tree.
450      </para>
451
452      <para>
453       A CCL profile may be destroyed by calling the
454       <function>ccl_qual_rm</function> function.
455      </para>
456
457      <para>
458       The token names for the CCL operators may be changed by setting the
459       globals (all type <literal>char *</literal>)
460       <literal>ccl_token_and</literal>, <literal>ccl_token_or</literal>,
461       <literal>ccl_token_not</literal> and <literal>ccl_token_set</literal>.
462       An operator may have aliases, i.e. there may be more than one name for
463       the operator. To do this, separate each alias with a space character.
464      </para>
465     </sect3>
466    </sect2>
467    <sect2 id="tools.cql"><title>CQL</title>
468     <para>
469      <ulink url="http://www.loc.gov/z3950/agency/zing/cql/">CQL</ulink>
470       - Common Query Language - was defined for the
471      <ulink url="http://www.loc.gov/z3950/agency/zing/srw/">SRW</ulink>
472      protocol.
473      In many ways CQL has a similar syntax to CCL.
474      The objective of CQL is different. Where CCL aims to be
475      an end-user language, CQL is <emphasis>the</emphasis> protocol
476      query language for SRW.
477     </para>
478     <tip>
479      <para>
480       If you are new to CQL, read the 
481       <ulink url="http://zing.z3950.org/cql/intro.html">Gentle
482        Introduction</ulink>.
483      </para>
484     </tip>
485     <para>
486      The CQL parser in &yaz; provides the following:
487      <itemizedlist>
488       <listitem>
489        <para>
490         It parses and validates a CQL query.
491        </para>
492       </listitem>
493       <listitem>
494        <para>
495         It generates a C structure that allows you to convert
496         a CQL query to some other query language, such as SQL.
497        </para>
498       </listitem>
499       <listitem>
500        <para>
501         The parser converts a valid CQL query to PQF, thus providing a
502         way to use CQL for both SRW/SRU servers and Z39.50 targets at the
503         same time.
504        </para>
505       </listitem>
506       <listitem>
507        <para>
508         The parser converts CQL to
509         <ulink url="http://www.loc.gov/z3950/agency/zing/cql/xcql.html">
510          XCQL</ulink>.
511         XCQL is an XML representation of CQL.
512         XCQL is part of the SRW specification. However, since SRU
513         supports CQL only, we don't expect XCQL to be widely used.
514         Furthermore, CQL has the advantage over XCQL that it is
515         easy to read.
516        </para>
517       </listitem>
518      </itemizedlist>
519     </para>
520     <sect3 id="tools.cql.parsing"><title>CQL parsing</title>
521      <para>
522       A CQL parser is represented by the <literal>CQL_parser</literal>
523       handle. Its contents should be considered &yaz; internal (private).
524       <synopsis>
525 #include &lt;yaz/cql.h&gt;
526
527 typedef struct cql_parser *CQL_parser;
528
529 CQL_parser cql_parser_create(void);
530 void cql_parser_destroy(CQL_parser cp);
531       </synopsis>
532      A parser is created by <function>cql_parser_create</function> and
533      is destroyed by <function>cql_parser_destroy</function>.
534      </para>
535      <para>
536       To parse a CQL query string, the following function
537       is provided:
538       <synopsis>
539 int cql_parser_string(CQL_parser cp, const char *str);
540       </synopsis>
541       A CQL query is parsed by the <function>cql_parser_string</function>
542       which takes a query <parameter>str</parameter>.
543       If the query was valid (no syntax errors), then zero is returned;
544       otherwise a non-zero error code is returned.
545      </para>
546      <para>
547       <synopsis>
548 int cql_parser_stream(CQL_parser cp,
549                       int (*getbyte)(void *client_data),
550                       void (*ungetbyte)(int b, void *client_data),
551                       void *client_data);
552
553 int cql_parser_stdio(CQL_parser cp, FILE *f);
554       </synopsis>
555       The functions <function>cql_parser_stream</function> and
556       <function>cql_parser_stdio</function> parses a CQL query
557       - just like <function>cql_parser_string</function>.
558       The only difference is that the CQL query can be
559       fed to the parser in different ways.
560       The <function>cql_parser_stream</function> uses a generic
561       byte stream as input. The <function>cql_parser_stdio</function>
562       uses a <literal>FILE</literal> handle which is opened for reading.
563      </para>
564     </sect3>
565     
566     <sect3 id="tools.cql.tree"><title>CQL tree</title>
567      <para>
568       The the query string is validl, the CQL parser
569       generates a tree representing the structure of the
570       CQL query.
571      </para>
572      <para>
573       <synopsis>
574 struct cql_node *cql_parser_result(CQL_parser cp);
575       </synopsis>
576       <function>cql_parser_result</function> returns the
577       a pointer to the root node of the resulting tree.
578      </para>
579      <para>
580       Each node in a CQL tree is represented by a 
581       <literal>struct cql_node</literal>.
582       It is defined as follows:
583       <synopsis>
584 #define CQL_NODE_ST 1
585 #define CQL_NODE_BOOL 2
586 #define CQL_NODE_MOD 3
587 struct cql_node {
588     int which;
589     union {
590         struct {
591             char *index;
592             char *term;
593             char *relation;
594             struct cql_node *modifiers;
595             struct cql_node *prefixes;
596         } st;
597         struct {
598             char *value;
599             struct cql_node *left;
600             struct cql_node *right;
601             struct cql_node *modifiers;
602             struct cql_node *prefixes;
603         } boolean;
604         struct {
605             char *name;
606             char *value;
607             struct cql_node *next;
608         } mod;
609     } u;
610 };
611       </synopsis>
612       There are three kinds of nodes, search term (ST), boolean (BOOL),
613       and modifier (MOD).
614      </para>
615      <para>
616       The search term node has five members:
617       <itemizedlist>
618        <listitem>
619         <para>
620          <literal>index</literal>: index for search term.
621          If an index is unspecified for a search term,
622          <literal>index</literal> will be NULL.
623         </para>
624        </listitem>
625        <listitem>
626         <para>
627          <literal>term</literal>: the search term itself.
628         </para>
629        </listitem>
630        <listitem>
631         <para>
632          <literal>relation</literal>: relation for search term.
633         </para>
634        </listitem>
635        <listitem>
636         <para>
637          <literal>modifiers</literal>: relation modifiers for search
638          term. The <literal>modifiers</literal> is a simple linked
639          list (NULL for last entry). Each relation modifier node
640          is of type <literal>MOD</literal>.
641         </para>
642        </listitem>
643        <listitem>
644         <para>
645          <literal>prefixes</literal>: index prefixes for search
646          term. The <literal>prefixes</literal> is a simple linked
647          list (NULL for last entry). Each prefix node
648          is of type <literal>MOD</literal>.
649         </para>
650        </listitem>
651       </itemizedlist>
652      </para>
653
654      <para>
655       The boolean node represents both <literal>and</literal>,
656       <literal>or</literal>, not as well as
657       proximity.
658       <itemizedlist>
659        <listitem>
660         <para>
661          <literal>left</literal> and <literal>right</literal>: left
662          - and right operand respectively.
663         </para>
664        </listitem>
665        <listitem>
666         <para>
667          <literal>modifiers</literal>: proximity arguments.
668         </para>
669        </listitem>
670        <listitem>
671         <para>
672          <literal>prefixes</literal>: index prefixes.
673          The <literal>prefixes</literal> is a simple linked
674          list (NULL for last entry). Each prefix node
675          is of type <literal>MOD</literal>.
676         </para>
677        </listitem>
678       </itemizedlist>
679      </para>
680
681      <para>
682       The modifier node is a "utility" node used for name-value pairs,
683       such as prefixes, proximity arguements, etc.
684       <itemizedlist>
685        <listitem>
686         <para>
687          <literal>name</literal> name of mod node.
688         </para>
689        </listitem>
690        <listitem>
691         <para>
692          <literal>value</literal> value of mod node.
693         </para>
694        </listitem>
695        <listitem>
696         <para>
697          <literal>next</literal>: pointer to next node which is
698          always a mod node (NULL for last entry).
699         </para>
700        </listitem>
701       </itemizedlist>
702      </para>
703
704     </sect3>
705     <sect3 id="tools.cql.pqf"><title>CQL to PQF conversion</title>
706      <para>
707       Conversion to PQF (and Z39.50 RPN) is tricky by the fact
708       that the resulting RPN depends on the Z39.50 target
709       capabilities (combinations of supported attributes). 
710       In addition, the CQL and SRW operates on index prefixes
711       (URI or strings), whereas the RPN uses Object Identifiers
712       for attribute sets.
713      </para>
714      <para>
715       The CQL library of &yaz; defines a <literal>cql_transform_t</literal>
716       type. It represents a particular mapping between CQL and RPN.
717       This handle is created and destroyed by the functions:
718      <synopsis>
719 cql_transform_t cql_transform_open_FILE (FILE *f);
720 cql_transform_t cql_transform_open_fname(const char *fname);
721 void cql_transform_close(cql_transform_t ct);
722       </synopsis>
723       The first two functions create a tranformation handle from
724       either an already open FILE or from a filename respectively.
725      </para>
726      <para>
727       The handle is destroyed by <function>cql_transform_close</function> 
728       in which case no further reference of the handle is allowed.
729      </para>
730      <para>
731       When a <literal>cql_transform_t</literal> handle has been created
732       you can convert to RPN.
733       <synopsis>
734 int cql_transform_buf(cql_transform_t ct,
735                       struct cql_node *cn, char *out, int max);
736       </synopsis>
737       This function converts the CQL tree <literal>cn</literal> 
738       using handle <literal>ct</literal>.
739       For the resulting PQF, you supply a buffer <literal>out</literal>
740       which must be able to hold at at least <literal>max</literal>
741       characters.
742      </para>
743      <para>
744       If conversion failed, <function>cql_transform_buf</function>
745       returns a non-zero error code; otherwise zero is returned
746       (conversion successful).
747      </para>
748      <para>
749       If you wish to be able to produce a PQF result in a different
750       way, there are two alternatives.
751       <synopsis>
752 void cql_transform_pr(cql_transform_t ct,
753                       struct cql_node *cn,
754                       void (*pr)(const char *buf, void *client_data),
755                       void *client_data);
756
757 int cql_transform_FILE(cql_transform_t ct,
758                        struct cql_node *cn, FILE *f);
759       </synopsis>
760       The former function produces output to a user-defined
761       output stream. The latter writes the result to an already
762       open <literal>FILE</literal>.
763      </para>
764     </sect3>
765     <sect3 id="tools.cql.map">
766      <title>Specification of CQL to RPN mapping</title>
767      <para>
768       The file supplied to functions 
769       <function>cql_transform_open_FILE</function>,
770       <function>cql_transform_open_fname</function> follows
771       a structure found in many Unix utilities.
772       It consists of mapping specifications - one per line.
773       Lines starting with <literal>#</literal> are ignored (comments).
774      </para>
775      <para>
776       Each line is of the form
777       <literallayout>
778        <replaceable>CQL pattern</replaceable><literal> = </literal> <replaceable> RPN equivalent</replaceable>
779       </literallayout>
780      </para>
781      <para>
782       An RPN pattern is a simple attribute list. Each attribute pair
783       takes the form:
784       <literallayout>
785        [<replaceable>set</replaceable>] <replaceable>type</replaceable><literal>=</literal><replaceable>value</replaceable>
786       </literallayout>
787       The attribute <replaceable>set</replaceable> is optional.
788       The <replaceable>type</replaceable> is the attribute type,
789       <replaceable>value</replaceable> the attribute value.
790      </para>
791      <para>
792       The following CQL patterns are recognized:
793       <variablelist>
794        <varlistentry><term>
795          <literal>qualifier.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
796         </term>
797         <listitem>
798          <para>
799           This pattern is invoked when a CQL qualifier, such as 
800           dc.title is converted. <replaceable>set</replaceable>
801           and <replaceable>name</replaceable> is the index set and qualifier
802           name respectively.
803           Typically, the RPN specifies an equivalent use attribute.
804          </para>
805          <para>
806           For terms not bound by a qualifier the pattern
807           <literal>qualifier.srw.serverChoice</literal> is used.
808           Here, the prefix <literal>srw</literal> is defined as
809           <literal>http://www.loc.gov/zing/cql/srw-indexes/v1.0/</literal>.
810           If this pattern is not defined, the mapping will fail.
811          </para>
812         </listitem>
813        </varlistentry>
814        <varlistentry><term>
815          <literal>relation.</literal><replaceable>relation</replaceable>
816         </term>
817         <listitem>
818          <para>
819           This pattern specifies how a CQL relation is mapped to RPN.
820           <replaceable>pattern</replaceable> is name of relation
821           operator. Since <literal>=</literal> is used as
822           separator between CQL pattern and RPN, CQL relations
823           including <literal>=</literal> cannot be
824           used directly. To avoid a conflict, the names
825           <literal>ge</literal>,
826           <literal>eq</literal>,
827           <literal>le</literal>,
828           must be used for CQL operators, greater-than-or-equal,
829           equal, less-than-or-equal respectively.
830           The RPN pattern is supposed to include a relation attribute.
831          </para>
832          <para>
833           For terms not bound by a relation, the pattern
834           <literal>relation.scr</literal> is used. If the pattern
835           is not defined, the mapping will fail.
836          </para>
837          <para>
838           The special pattern, <literal>relation.*</literal> is used
839           when no other relation pattern is matched.
840          </para>
841         </listitem>
842        </varlistentry>
843
844        <varlistentry><term>
845          <literal>relationModifier.</literal><replaceable>mod</replaceable>
846         </term>
847         <listitem>
848          <para>
849           This pattern specifies how a CQL relation modifier is mapped to RPN.
850           The RPN pattern is usually a relation attribute.
851          </para>
852         </listitem>
853        </varlistentry>
854
855        <varlistentry><term>
856          <literal>structure.</literal><replaceable>type</replaceable>
857         </term>
858         <listitem>
859          <para>
860           This pattern specifies how a CQL structure is mapped to RPN.
861           Note that this CQL pattern is somewhat to similar to
862           CQL pattern <literal>relation</literal>. 
863           The <replaceable>type</replaceable> is a CQL relation.
864          </para>
865          <para>
866           The pattern, <literal>structure.*</literal> is used
867           when no other structure pattern is matched.
868           Usually, the RPN equivalent specifies a structure attribute.
869          </para>
870         </listitem>
871        </varlistentry>
872
873        <varlistentry><term>
874          <literal>position.</literal><replaceable>type</replaceable>
875         </term>
876         <listitem>
877          <para>
878           This pattern specifies how the anchor (position) of
879           CQL is mapped to RPN.
880           The <replaceable>type</replaceable> is one
881           of <literal>first</literal>, <literal>any</literal>,
882           <literal>last</literal>, <literal>firstAndLast</literal>.
883          </para>
884          <para>
885           The pattern, <literal>position.*</literal> is used
886           when no other position pattern is matched.
887          </para>
888         </listitem>
889        </varlistentry>
890
891        <varlistentry><term>
892          <literal>set.</literal><replaceable>prefix</replaceable>
893         </term>
894         <listitem>
895          <para>
896           This specification defines a CQL index set for a given prefix.
897           The value on the right hand side is the URI for the set - 
898           <emphasis>not</emphasis> RPN. All prefixes used in
899           qualifier patterns must be defined this way.
900          </para>
901         </listitem>
902        </varlistentry>
903       </variablelist>
904      </para>
905      <example><title>Small CQL to RPN mapping file</title>
906       <para>
907        This small file defines two index sets, three qualifiers and three
908        relations, a position pattern and a default structure.
909       </para>
910       <programlisting><![CDATA[
911        set.srw    = http://www.loc.gov/zing/cql/srw-indexes/v1.0/
912        set.dc     = http://www.loc.gov/zing/cql/dc-indexes/v1.0/
913
914        qualifier.srw.serverChoice = 1=1016
915        qualifier.dc.title         = 1=4
916        qualifier.dc.subject       = 1=21
917   
918        relation.<                 = 2=1
919        relation.eq                = 2=3
920        relation.scr               = 2=3
921
922        position.any               = 3=3 6=1
923
924        structure.*                = 4=1
925 ]]>
926       </programlisting>
927       <para>
928        With the mappings above, the CQL query
929        <screen>
930         computer
931        </screen>
932        is converted to the PQF:
933        <screen>
934         @attr 1=1016 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "computer"
935        </screen>
936        by rules <literal>qualifier.srw.serverChoice</literal>,
937        <literal>relation.scr</literal>, <literal>structure.*</literal>,
938        <literal>position.any</literal>.
939       </para>
940       <para>
941        CQL query
942        <screen>
943         computer^
944        </screen>
945        is rejected, since <literal>position.right</literal> is
946        undefined.
947       </para>
948       <para>
949        CQL query
950        <screen>
951         >my = "http://www.loc.gov/zing/cql/dc-indexes/v1.0/" my.title = x
952        </screen>
953        is converted to
954        <screen>
955         @attr 1=4 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "x"
956        </screen>
957       </para>
958      </example>
959     </sect3>
960     <sect3 id="tools.cql.xcql"><title>CQL to XCQL conversion</title>
961      <para>
962       Conversion from CQL to XCQL is trivial and does not
963       require a mapping to be defined.
964       There three functions to choose from depending on the
965       way you wish to store the resulting output (XML buffer
966       containing XCQL).
967       <synopsis>
968 int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
969 void cql_to_xml(struct cql_node *cn, 
970                 void (*pr)(const char *buf, void *client_data),
971                 void *client_data);
972 void cql_to_xml_stdio(struct cql_node *cn, FILE *f);
973       </synopsis>
974       Function <function>cql_to_xml_buf</function> converts
975       to XCQL and stores result in a user supplied buffer of a given
976       max size.
977      </para>
978      <para>
979       <function>cql_to_xml</function> writes the result in
980       a user defined output stream.
981       <function>cql_to_xml_stdio</function> writes to a
982       a file.
983      </para>
984     </sect3>
985    </sect2>
986   </sect1>
987   <sect1 id="tools.oid"><title>Object Identifiers</title>
988
989    <para>
990     The basic YAZ representation of an OID is an array of integers,
991     terminated with the value -1. The &odr; module provides two
992     utility-functions to create and copy this type of data elements:
993    </para>
994
995    <screen>
996     Odr_oid *odr_getoidbystr(ODR o, char *str);
997    </screen>
998
999    <para>
1000     Creates an OID based on a string-based representation using dots (.)
1001     to separate elements in the OID.
1002    </para>
1003
1004    <screen>
1005     Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
1006    </screen>
1007
1008    <para>
1009     Creates a copy of the OID referenced by the <emphasis>o</emphasis>
1010     parameter.
1011     Both functions take an &odr; stream as parameter. This stream is used to
1012     allocate memory for the data elements, which is released on a
1013     subsequent call to <function>odr_reset()</function> on that stream.
1014    </para>
1015
1016    <para>
1017     The OID module provides a higher-level representation of the
1018     family of object identifiers which describe the Z39.50 protocol and its
1019     related objects. The definition of the module interface is given in
1020     the <filename>oid.h</filename> file.
1021    </para>
1022
1023    <para>
1024     The interface is mainly based on the <literal>oident</literal> structure.
1025     The definition of this structure looks like this:
1026    </para>
1027
1028    <screen>
1029 typedef struct oident
1030 {
1031     oid_proto proto;
1032     oid_class oclass;
1033     oid_value value;
1034     int oidsuffix[OID_SIZE];
1035     char *desc;
1036 } oident;
1037    </screen>
1038
1039    <para>
1040     The proto field takes one of the values
1041    </para>
1042
1043    <screen>
1044     PROTO_Z3950
1045     PROTO_SR
1046    </screen>
1047
1048    <para>
1049     If you don't care about talking to SR-based implementations (few
1050     exist, and they may become fewer still if and when the ISO SR and ANSI
1051     Z39.50 documents are merged into a single standard), you can ignore
1052     this field on incoming packages, and always set it to PROTO_Z3950
1053     for outgoing packages.
1054    </para>
1055    <para>
1056
1057     The oclass field takes one of the values
1058    </para>
1059
1060    <screen>
1061     CLASS_APPCTX
1062     CLASS_ABSYN
1063     CLASS_ATTSET
1064     CLASS_TRANSYN
1065     CLASS_DIAGSET
1066     CLASS_RECSYN
1067     CLASS_RESFORM
1068     CLASS_ACCFORM
1069     CLASS_EXTSERV
1070     CLASS_USERINFO
1071     CLASS_ELEMSPEC
1072     CLASS_VARSET
1073     CLASS_SCHEMA
1074     CLASS_TAGSET
1075     CLASS_GENERAL
1076    </screen>
1077
1078    <para>
1079     corresponding to the OID classes defined by the Z39.50 standard.
1080
1081     Finally, the value field takes one of the values
1082    </para>
1083
1084    <screen>
1085     VAL_APDU
1086     VAL_BER
1087     VAL_BASIC_CTX
1088     VAL_BIB1
1089     VAL_EXP1
1090     VAL_EXT1
1091     VAL_CCL1
1092     VAL_GILS
1093     VAL_WAIS
1094     VAL_STAS
1095     VAL_DIAG1
1096     VAL_ISO2709
1097     VAL_UNIMARC
1098     VAL_INTERMARC
1099     VAL_CCF
1100     VAL_USMARC
1101     VAL_UKMARC
1102     VAL_NORMARC
1103     VAL_LIBRISMARC
1104     VAL_DANMARC
1105     VAL_FINMARC
1106     VAL_MAB
1107     VAL_CANMARC
1108     VAL_SBN
1109     VAL_PICAMARC
1110     VAL_AUSMARC
1111     VAL_IBERMARC
1112     VAL_EXPLAIN
1113     VAL_SUTRS
1114     VAL_OPAC
1115     VAL_SUMMARY
1116     VAL_GRS0
1117     VAL_GRS1
1118     VAL_EXTENDED
1119     VAL_RESOURCE1
1120     VAL_RESOURCE2
1121     VAL_PROMPT1
1122     VAL_DES1
1123     VAL_KRB1
1124     VAL_PRESSET
1125     VAL_PQUERY
1126     VAL_PCQUERY
1127     VAL_ITEMORDER
1128     VAL_DBUPDATE
1129     VAL_EXPORTSPEC
1130     VAL_EXPORTINV
1131     VAL_NONE
1132     VAL_SETM
1133     VAL_SETG
1134     VAL_VAR1
1135     VAL_ESPEC1
1136    </screen>
1137
1138    <para>
1139     again, corresponding to the specific OIDs defined by the standard.
1140    </para>
1141
1142    <para>
1143     The desc field contains a brief, mnemonic name for the OID in question.
1144    </para>
1145
1146    <para>
1147     The function
1148    </para>
1149
1150    <screen>
1151     struct oident *oid_getentbyoid(int *o);
1152    </screen>
1153
1154    <para>
1155     takes as argument an OID, and returns a pointer to a static area
1156     containing an <literal>oident</literal> structure. You typically use
1157     this function when you receive a PDU containing an OID, and you wish
1158     to branch out depending on the specific OID value.
1159    </para>
1160
1161    <para>
1162     The function
1163    </para>
1164
1165    <screen>
1166     int *oid_ent_to_oid(struct oident *ent, int *dst);
1167    </screen>
1168
1169    <para>
1170     Takes as argument an <literal>oident</literal> structure - in which
1171     the <literal>proto</literal>, <literal>oclass</literal>/, and
1172     <literal>value</literal> fields are assumed to be set correctly -
1173     and returns a pointer to a the buffer as given by <literal>dst</literal>
1174     containing the base
1175     representation of the corresponding OID. The function returns
1176     NULL and the array dst is unchanged if a mapping couldn't place.
1177     The array <literal>dst</literal> should be at least of size
1178     <literal>OID_SIZE</literal>.
1179    </para>
1180    <para>
1181
1182     The <function>oid_ent_to_oid()</function> function can be used whenever
1183     you need to prepare a PDU containing one or more OIDs. The separation of
1184     the <literal>protocol</literal> element from the remainder of the
1185     OID-description makes it simple to write applications that can
1186     communicate with either Z39.50 or OSI SR-based applications.
1187    </para>
1188
1189    <para>
1190     The function
1191    </para>
1192
1193    <screen>
1194     oid_value oid_getvalbyname(const char *name);
1195    </screen>
1196
1197    <para>
1198     takes as argument a mnemonic OID name, and returns the
1199     <literal>/value</literal> field of the first entry in the database that 
1200     contains the given name in its <literal>desc</literal> field.
1201    </para>
1202
1203    <para>
1204     Finally, the module provides the following utility functions, whose
1205     meaning should be obvious:
1206    </para>
1207
1208    <screen>
1209     void oid_oidcpy(int *t, int *s);
1210     void oid_oidcat(int *t, int *s);
1211     int oid_oidcmp(int *o1, int *o2);
1212     int oid_oidlen(int *o);
1213    </screen>
1214
1215    <note>
1216     <para>
1217      The OID module has been criticized - and perhaps rightly so
1218      - for needlessly abstracting the
1219      representation of OIDs. Other toolkits use a simple
1220      string-representation of OIDs with good results. In practice, we have
1221      found the interface comfortable and quick to work with, and it is a
1222      simple matter (for what it's worth) to create applications compatible
1223      with both ISO SR and Z39.50. Finally, the use of the
1224      <literal>/oident</literal> database is by no means mandatory.
1225      You can easily create your own system for representing OIDs, as long
1226      as it is compatible with the low-level integer-array representation
1227      of the ODR module.
1228     </para>
1229    </note>
1230
1231   </sect1>
1232
1233   <sect1 id="tools.nmem"><title>Nibble Memory</title>
1234
1235    <para>
1236     Sometimes when you need to allocate and construct a large,
1237     interconnected complex of structures, it can be a bit of a pain to
1238     release the associated memory again. For the structures describing the
1239     Z39.50 PDUs and related structures, it is convenient to use the
1240     memory-management system of the &odr; subsystem (see
1241     <link linkend="odr-use">Using ODR</link>). However, in some circumstances
1242     where you might otherwise benefit from using a simple nibble memory
1243     management system, it may be impractical to use
1244     <function>odr_malloc()</function> and <function>odr_reset()</function>.
1245     For this purpose, the memory manager which also supports the &odr;
1246     streams is made available in the NMEM module. The external interface
1247     to this module is given in the <filename>nmem.h</filename> file.
1248    </para>
1249
1250    <para>
1251     The following prototypes are given:
1252    </para>
1253
1254    <screen>
1255     NMEM nmem_create(void);
1256     void nmem_destroy(NMEM n);
1257     void *nmem_malloc(NMEM n, int size);
1258     void nmem_reset(NMEM n);
1259     int nmem_total(NMEM n);
1260     void nmem_init(void);
1261     void nmem_exit(void);
1262    </screen>
1263
1264    <para>
1265     The <function>nmem_create()</function> function returns a pointer to a
1266     memory control handle, which can be released again by
1267     <function>nmem_destroy()</function> when no longer needed.
1268     The function <function>nmem_malloc()</function> allocates a block of
1269     memory of the requested size. A call to <function>nmem_reset()</function>
1270     or <function>nmem_destroy()</function> will release all memory allocated
1271     on the handle since it was created (or since the last call to
1272     <function>nmem_reset()</function>. The function
1273     <function>nmem_total()</function> returns the number of bytes currently
1274     allocated on the handle.
1275    </para>
1276
1277    <para>
1278     The nibble memory pool is shared amongst threads. POSIX
1279     mutex'es and WIN32 Critical sections are introduced to keep the
1280     module thread safe. Function <function>nmem_init()</function>
1281     initializes the nibble memory library and it is called automatically
1282     the first time the <literal>YAZ.DLL</literal> is loaded. &yaz; uses
1283     function <function>DllMain</function> to achieve this. You should
1284     <emphasis>not</emphasis> call <function>nmem_init</function> or
1285     <function>nmem_exit</function> unless you're absolute sure what
1286     you're doing. Note that in previous &yaz; versions you'd have to call
1287     <function>nmem_init</function> yourself. 
1288    </para>
1289
1290   </sect1>
1291  </chapter>
1292  
1293  <!-- Keep this comment at the end of the file
1294  Local variables:
1295  mode: sgml
1296  sgml-omittag:t
1297  sgml-shorttag:t
1298  sgml-minimize-attributes:nil
1299  sgml-always-quote-attributes:t
1300  sgml-indent-step:1
1301  sgml-indent-data:t
1302  sgml-parent-document: "yaz.xml"
1303  sgml-local-catalogs: nil
1304  sgml-namecase-general:t
1305  End:
1306  -->