-/* $Id: cql.h,v 1.1 2003-01-06 08:20:27 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2011 Index Data.
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Index Data nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
-See the file LICENSE.
+/** \file cql.h
+ \brief Header with public definitions about CQL.
*/
#ifndef CQL_H_INCLUDED
#define CQL_H_INCLUDED
#include <stdio.h>
+#include <yaz/nmem.h>
+
+YAZ_BEGIN_CDECL
+/** \brief CQL parser handle (opaque pointer) */
typedef struct cql_parser *CQL_parser;
-/**
- * cql_parser_create:
- *
- * creates a CQL parser.
- *
- * Returns CQL parser or NULL if parser could not be created.
+/** \brief creates a CQL parser.
+ \returns CCL parser
+
+ Returns CQL parser or NULL if parser could not be created.
*/
+YAZ_EXPORT
CQL_parser cql_parser_create(void);
-/**
- * cql_parser_destroy:
- * @cp: A CQL parser
- *
- * Destroy CQL parser. This function does nothing if
- * NULL pointer is received.
+/** \brief destroys a CQL parser.
+ \param cp CQL parser
+
+ This function does nothing if NULL if received.
*/
+YAZ_EXPORT
void cql_parser_destroy(CQL_parser cp);
-/**
- * cql_parser_string:
- * @cp: A CQL parser.
- * @str: A query string to be parsed.
- *
- * Parses a CQL query string.
- *
- * Returns 0 if parsing was succesful; non-zero (error code) if
- * unsuccesful.
+/** \brief parses a CQL query (string)
+ \param cp CQL parser
+ \param str CQL string
+ \retval 0 success
+ \retval !=0 failure
*/
+YAZ_EXPORT
int cql_parser_string(CQL_parser cp, const char *str);
-/**
- * cql_parser_stream:
- * @cp: A CQL parser.
- * @getbyte: Handler to read one character (for parsing).
- * @ungetbyte: Handler to unread one byte (for parsing).
- * @client_data: User data associated with getbyte/ungetbyte handlers.
- *
- * Parses a CQL query from a user defined stream.
- *
- * Returns 0 if parsing was succesful; non-zero (error code) if
- * unsuccesful.
- */
+/** \brief parses CQL query (query stream)
+ \param cp CQL parser
+ \param getbyte function which reads one character from stream
+ \param ungetbyte function which unreads one character from stream
+ \param client_data data to be passed to stream functions
+ \retval 0 success
+ \retval !=0 failure
+
+ This function is similar to cql_parser_string but takes a
+ functions to read each query character from a stream.
+
+ The functions pointers getbytes, ungetbyte are similar to
+ that known from stdios getc, ungetc.
+*/
+YAZ_EXPORT
int cql_parser_stream(CQL_parser cp,
int (*getbyte)(void *client_data),
void (*ungetbyte)(int b, void *client_data),
void *client_data);
-/**
- * cql_parser_stdio:
- * @cp: A CQL parser.
- * @f: FILE handler in read mode.
- *
- * Parses a CQL query from a file.
- *
- * Returns 0 if parsing was succesful; non-zero (error code) if
- * unsuccesful.
- */
+/** \brief parses CQL query (from FILE)
+ \param cp CQL parser
+ \param f file where query is read from
+ \retval 0 success
+ \retval !=0 failure
+
+ This function is similar to cql_parser_string but reads from
+ stdio FILE handle instead.
+*/
+YAZ_EXPORT
int cql_parser_stdio(CQL_parser cp, FILE *f);
+/** \brief Node type: search term */
#define CQL_NODE_ST 1
+/** \brief Node type: boolean */
#define CQL_NODE_BOOL 2
-#define CQL_NODE_MOD 3
+/** \brief Node type: sortby single spec */
+#define CQL_NODE_SORT 3
+
+/** \brief CQL parse tree (node)
+ */
struct cql_node {
+ /** node type */
int which;
union {
+ /** which == CQL_NODE_ST */
struct {
+ /** CQL index */
char *index;
+ /** CQL index URI or NULL if no URI */
+ char *index_uri;
+ /** Search term */
char *term;
+ /** relation */
char *relation;
+ /** relation URL or NULL if no relation URI) */
+ char *relation_uri;
+ /** relation modifiers */
struct cql_node *modifiers;
- struct cql_node *prefixes;
+ /** term list */
+ struct cql_node *extra_terms;
} st;
+ /** which == CQL_NODE_BOOL */
struct {
+ /** operator name "and", "or", ... */
char *value;
+ /** left operand */
struct cql_node *left;
+ /** right operand */
struct cql_node *right;
+ /** modifiers (NULL for no list) */
struct cql_node *modifiers;
- struct cql_node *prefixes;
- } bool;
+ } boolean;
+ /** which == CQL_NODE_SORT */
struct {
- char *name;
- char *value;
+ char *index;
+ /** next spec */
struct cql_node *next;
- } mod;
+ /** modifiers (NULL for no list) */
+ struct cql_node *modifiers;
+ /** search node */
+ struct cql_node *search;
+ } sort;
} u;
};
+/** \brief Private structure that describes the CQL properties (profile)
+ */
struct cql_properties;
+/** \brief Structure used by cql_buf_write_handler
+ */
struct cql_buf_write_info {
int max;
int off;
char *buf;
};
-void cql_buf_write_handler (const char *b, void *client_data);
+/** \brief Handler for cql_buf_write_info
+ */
+YAZ_EXPORT
+void cql_buf_write_handler(const char *b, void *client_data);
+/** \brief Prints a CQL node and all sub nodes.
+ Hence this function prints the parse tree which is as returned by
+ cql_parser_result.
+*/
+YAZ_EXPORT
void cql_node_print(struct cql_node *cn);
-struct cql_node *cql_node_mk_sc(const char *index,
- const char *relation,
- const char *term);
-struct cql_node *cql_node_mk_boolean(const char *op);
+
+/** \brief creates a search clause node (st). */
+YAZ_EXPORT
+struct cql_node *cql_node_mk_sc(NMEM nmem, const char *index,
+ const char *relation, const char *term);
+
+/** \brief applies a prefix+uri to "unresolved" index and relation URIs.
+ "unresolved" URIs are those nodes where member index_uri / relation_uri
+ is NULL.
+*/
+YAZ_EXPORT
+struct cql_node *cql_apply_prefix(NMEM nmem, struct cql_node *cn,
+ const char *prefix, const char *uri);
+
+/** \brief creates a boolean node. */
+YAZ_EXPORT
+struct cql_node *cql_node_mk_boolean(NMEM nmem, const char *op);
+
+/** \brief creates a sort single spec node. */
+YAZ_EXPORT
+struct cql_node *cql_node_mk_sort(NMEM nmem, const char *index,
+ struct cql_node *modifiers);
+
+/** \brief destroys a node and its children. */
+YAZ_EXPORT
void cql_node_destroy(struct cql_node *cn);
-struct cql_node *cql_node_prefix(struct cql_node *n, const char *prefix,
- const char *uri);
-struct cql_node *cql_node_mk_mod(const char *name,
- const char *value);
-struct cql_node *cql_node_dup (struct cql_node *cp);
+/** duplicates a node (returns a copy of supplied node) . */
+YAZ_EXPORT
+struct cql_node *cql_node_dup (NMEM nmem, struct cql_node *cp);
+
+/** \brief returns the parse tree of the most recently parsed CQL query.
+ \param cp CQL parser
+ \returns CQL node or NULL for failure
+*/
+YAZ_EXPORT
struct cql_node *cql_parser_result(CQL_parser cp);
+/** \brief returns the sortby tree of the most recently parsed CQL query.
+ \param cp CQL parser
+ \returns CQL node or NULL for failure
+*/
+YAZ_EXPORT
+struct cql_node *cql_parser_sort_result(CQL_parser cp);
+
+/** \brief converts CQL tree to XCQL and writes to user-defined stream
+ \param cn CQL node (tree)
+ \param pr print function
+ \param client_data data to be passed to pr function
+ */
+YAZ_EXPORT
void cql_to_xml(struct cql_node *cn,
void (*pr)(const char *buf, void *client_data),
void *client_data);
+/** \brief converts CQL tree to XCQL and writes to file
+ \param cn CQL node (tree)
+ \param f file handle
+ */
+YAZ_EXPORT
void cql_to_xml_stdio(struct cql_node *cn, FILE *f);
+
+/** \brief converts CQL tree to XCQL and writes result to buffer
+ \param cn CQL node (tree)
+ \param out buffer
+ \param max size of buffer (max chars to write)
+ \returns length of resulting buffer
+ */
+YAZ_EXPORT
int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
-struct cql_node *cql_node_mk_proxargs(const char *relation,
- const char *distance,
- const char *unit,
- const char *ordering);
+/** \brief converts CQL tree to CCL and writes to user-defined stream
+ \param cn CQL node (tree)
+ \param pr print function
+ \param client_data data to be passed to pr function
+ */
+YAZ_EXPORT
+int cql_to_ccl(struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data);
+/** \brief converts CQL tree to CCL and writes to file
+ \param cn CQL node (tree)
+ \param f file handle
+ */
+YAZ_EXPORT
+void cql_to_ccl_stdio(struct cql_node *cn, FILE *f);
+
+/** \brief converts CQL tree to CCL and writes result to buffer
+ \param cn CQL node (tree)
+ \param out buffer
+ \param max size of buffer (max chars to write)
+ \retval 0 OK
+ \retval -1 conversion error
+ \retval -2 buffer too small (truncated)
+ */
+YAZ_EXPORT
+int cql_to_ccl_buf(struct cql_node *cn, char *out, int max);
+/** \brief stream handle for file (used by cql_to_xml_stdio) */
+YAZ_EXPORT
void cql_fputs(const char *buf, void *client_data);
+/** \brief CQL transform handle.
+ The transform describes how to convert from CQL to PQF (Type-1 AKA RPN).
+*/
typedef struct cql_transform_t_ *cql_transform_t;
+/** \brief creates a CQL transform handle
+ \returns transform handle or NULL for failure
+*/
+YAZ_EXPORT
+cql_transform_t cql_transform_create(void);
+
+/** \brief creates a CQL transform handle from am opened file handle
+ \param f file where transformation spec is read
+ \returns transform handle or NULL for failure
+
+ The transformation spec is read from a FILE handle which is assumed
+ opened for reading.
+*/
+YAZ_EXPORT
cql_transform_t cql_transform_open_FILE (FILE *f);
+
+/** \brief creates a CQL transform handle from a file
+ \param fname name of where transformation spec is read
+ \returns transform handle or NULL for failure
+*/
+YAZ_EXPORT
cql_transform_t cql_transform_open_fname(const char *fname);
+
+
+/** \brief defines CQL transform pattern
+ \param ct CQL transform handle
+ \param pattern pattern string
+ \param value pattern value
+ \returns 0 for succes; -1 for failure
+*/
+YAZ_EXPORT
+int cql_transform_define_pattern(cql_transform_t ct, const char *pattern,
+ const char *value);
+
+
+
+/** \brief destroys a CQL transform handle
+ \param ct CQL transform handle
+ */
+YAZ_EXPORT
void cql_transform_close(cql_transform_t ct);
-void cql_transform_pr(cql_transform_t ct,
- struct cql_node *cn,
- void (*pr)(const char *buf, void *client_data),
- void *client_data);
+/** \brief tranforms PQF given a CQL tree
+ \param ct CQL transform handle
+ \param cn CQL node tree
+ \param pr print function
+ \param client_data data to be passed to pr
+ \retval 0 success
+ \retval != 0 error
+
+ The result is written to a user-defined stream.
+*/
+YAZ_EXPORT
+int cql_transform(cql_transform_t ct,
+ struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data);
+
+/** \brief transforms PQF given a CQL tree (from FILE)
+ \param ct CQL transform handle
+ \param cn CQL tree
+ \param f FILE where output is written
+ \retval 0 success
+ \retval !=0 failure (error code)
+ The result is written to a file specified by FILE handle (which must
+ be opened for writing.
+*/
+YAZ_EXPORT
int cql_transform_FILE(cql_transform_t ct,
struct cql_node *cn, FILE *f);
+/** \brief transforms PQF given a CQL tree (from FILE)
+ \param ct CQL transform handle
+ \param cn CQL tree
+ \param out buffer for output
+ \param max maximum bytes for output (size of buffer)
+ \retval 0 success
+ \retval !=0 failure (error code)
+ */
+YAZ_EXPORT
int cql_transform_buf(cql_transform_t ct,
struct cql_node *cn, char *out, int max);
+
+/** \brief returns additional information for last transform
+ \param ct CQL transform handle
+ \param addinfo additional info (result)
+ \returns error code
+ */
+YAZ_EXPORT
int cql_transform_error(cql_transform_t ct, const char **addinfo);
-/*
-10 Illegal query
-11 Unsupported query type (XCQL vs CQL)
-12 Too many characters in query
-13 Unbalanced or illegal use of parentheses
-14 Unbalanced or illegal use of quotes
-15 Illegal or unsupported index set
-16 Illegal or unsupported index
-17 Illegal or unsupported combination of index and index set
-18 Illegal or unsupported combination of indexes
-19 Illegal or unsupported relation
-20 Illegal or unsupported relation modifier
-21 Illegal or unsupported combination of relation modifers
-22 Illegal or unsupported combination of relation and index
-23 Too many characters in term
-24 Illegal combination of relation and term
-25 Special characters not quoted in term
-26 Non special character escaped in term
-27 Empty term unsupported
-28 Masking character not supported
-29 Masked words too short
-30 Too many masking characters in term
-31 Anchoring character not supported
-32 Anchoring character in illegal or unsupported position
-33 Combination of proximity/adjacency and masking characters not supported
-34 Combination of proximity/adjacency and anchoring characters not supported
-35 Terms only exclusion (stop) words
-36 Term in invalid format for index or relation
-37 Illegal or unsupported boolean operator
-38 Too many boolean operators in query
-39 Proximity not supported
-40 Illegal or unsupported proximity relation
-41 Illegal or unsupported proximity distance
-42 Illegal or unsupported proximity unit
-43 Illegal or unsupported proximity ordering
-44 Illegal or unsupported combination of proximity modifiers
-45 Index set name (prefix) assigned to multiple identifiers
+/** \brief sets error and addinfo for transform
+ \param ct CQL transform handle
+ \param error error code
+ \param addinfo additional info
+ */
+YAZ_EXPORT
+void cql_transform_set_error(cql_transform_t ct, int error, const char *addinfo);
+
+/** \brief returns the CQL message corresponding to a given error code.
+ \param code error code
+ \returns text message
+*/
+YAZ_EXPORT
+const char *cql_strerror(int code);
+
+/** \brief returns the standard CQL context set URI.
+ \returns CQL URI string
*/
+YAZ_EXPORT
+const char *cql_uri(void);
+
+/** \brief compares two CQL strings (ala strcmp)
+ \param s1 string 1
+ \param s2 string 2
+ \returns comparison value
+ Compares two CQL strings (for relations, operators, etc)
+ (unfortunately defined as case-insensitive unlike XML etc)
+*/
+YAZ_EXPORT
+int cql_strcmp(const char *s1, const char *s2);
+
+/** \brief compares two CQL strings (ala strncmp)
+ \param s1 string 1
+ \param s2 string 2
+ \param n size
+ \returns comparison value
+ Compares two CQL strings at most n bytes
+ (unfortunately defined as case-insensitive unlike XML etc)
+ */
+YAZ_EXPORT
+int cql_strncmp(const char *s1, const char *s2, size_t n);
+
+/** \brief converts CQL sortby to sortkeys (ala versions 1.1)
+ \param cn CQL tree
+ \param pr print function
+ \param client_data data to be passed to pr function
+
+ This will take CQL_NODE_SORT entries and conver them to
+
+ path,schema,ascending,caseSensitive,missingValue
+ items..
+
+ One for each sort keys. Where
+
+ path is string index for sorting
+
+ schema is schema for sort index
+
+ ascending is a boolean (0=false, 1=true). Default is true.
+
+ caseSensitive is a boolean. Default is false.
+
+ missingValue is a string and one of 'abort', 'highValue', 'lowValue',
+ or 'omit'. Default is 'highValue'.
+
+ See also
+ http://www.loc.gov/standards/sru/sru1-1archive/search-retrieve-operation.html#sort
+*/
+YAZ_EXPORT
+int cql_sortby_to_sortkeys(struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data);
+
+/** \brief converts CQL sortby to sortkeys ..
+ \param cn CQL tree
+ \param out result buffer
+ \param max size of buffer (allocated)
+ \retval 0 OK
+ \retval -1 ERROR
+*/
+YAZ_EXPORT
+int cql_sortby_to_sortkeys_buf(struct cql_node *cn, char *out, int max);
+
+YAZ_END_CDECL
#endif
/* CQL_H_INCLUDED */
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+