For queries that cannot be converted to the specified rpnCharset,
ZOOM now returns a diagnostic on the client-side ('invalid query' /
10010). This fixes bug #2113.
YAZ_EXPORT void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
ODR o, yaz_iconv_t cd);
YAZ_EXPORT void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
ODR o, yaz_iconv_t cd);
+
+YAZ_EXPORT int yaz_query_charset_convert_rpnquery_check(Z_RPNQuery *q,
+ ODR o, yaz_iconv_t cd);
+
#include <yaz/query-charset.h>
#include <yaz/wrbuf.h>
#include <yaz/query-charset.h>
#include <yaz/wrbuf.h>
-void yaz_query_charset_convert_buf(char *buf_in, int len_in,
- char **buf_out, int *len_out,
- ODR o, WRBUF wrbuf, yaz_iconv_t cd)
+static int yaz_query_charset_convert_buf(char *buf_in, int len_in,
+ char **buf_out, int *len_out,
+ ODR o, WRBUF wrbuf, yaz_iconv_t cd)
wrbuf_rewind(wrbuf);
wrbuf_iconv_write(wrbuf, cd, buf_in, len_in);
wrbuf_iconv_reset(wrbuf, cd);
wrbuf_rewind(wrbuf);
wrbuf_iconv_write(wrbuf, cd, buf_in, len_in);
wrbuf_iconv_reset(wrbuf, cd);
{ /* we assume conversion failed */
*buf_out = buf_in;
*len_out = len_in;
{ /* we assume conversion failed */
*buf_out = buf_in;
*len_out = len_in;
*buf_out = (char*) odr_malloc(o, *len_out);
memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out);
}
*buf_out = (char*) odr_malloc(o, *len_out);
memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out);
}
-void yaz_query_charset_convert_term(Z_Term *q,
- ODR o, WRBUF wrbuf, yaz_iconv_t cd)
+static int yaz_query_charset_convert_term(Z_Term *q,
+ ODR o, WRBUF wrbuf, yaz_iconv_t cd)
switch(q->which)
{
case Z_Term_general:
switch(q->which)
{
case Z_Term_general:
- yaz_query_charset_convert_buf(
+ r = yaz_query_charset_convert_buf(
(char *) q->u.general->buf, q->u.general->len,
(char **) &q->u.general->buf, &q->u.general->len, o, wrbuf, cd);
break;
}
(char *) q->u.general->buf, q->u.general->len,
(char **) &q->u.general->buf, &q->u.general->len, o, wrbuf, cd);
break;
}
-void yaz_query_charset_convert_operand(Z_Operand *q,
- ODR o, WRBUF wrbuf, yaz_iconv_t cd)
+static int yaz_query_charset_convert_operand(Z_Operand *q,
+ ODR o, WRBUF wrbuf, yaz_iconv_t cd)
switch(q->which)
{
case Z_Operand_APT:
switch(q->which)
{
case Z_Operand_APT:
- yaz_query_charset_convert_term(q->u.attributesPlusTerm->term,
- o, wrbuf, cd);
+ r = yaz_query_charset_convert_term(q->u.attributesPlusTerm->term,
+ o, wrbuf, cd);
break;
case Z_Operand_resultSetId:
break;
case Z_Operand_resultAttr:
break;
}
break;
case Z_Operand_resultSetId:
break;
case Z_Operand_resultAttr:
break;
}
-void yaz_query_charset_convert_structure(Z_RPNStructure *q,
- ODR o, WRBUF wrbuf, yaz_iconv_t cd)
+static int yaz_query_charset_convert_structure(Z_RPNStructure *q,
+ ODR o, WRBUF wrbuf,
+ yaz_iconv_t cd)
switch(q->which)
{
case Z_RPNStructure_simple:
switch(q->which)
{
case Z_RPNStructure_simple:
- yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd);
+ r = yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd);
break;
case Z_RPNStructure_complex:
break;
case Z_RPNStructure_complex:
- yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd);
- yaz_query_charset_convert_structure(q->u.complex->s2, o, wrbuf, cd);
+ r = yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd);
+ if (r == 0)
+ r = yaz_query_charset_convert_structure(
+ q->u.complex->s2, o, wrbuf, cd);
+ return r;
+}
+
+int yaz_query_charset_convert_rpnquery_check(Z_RPNQuery *q,
+ ODR o, yaz_iconv_t cd)
+{
+ int r = 0;
+ WRBUF wrbuf = wrbuf_alloc();
+ r = yaz_query_charset_convert_structure(q->RPNStructure, o, wrbuf, cd);
+ wrbuf_destroy(wrbuf);
+ return r;
}
void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
}
void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
yaz_iconv_t cd = yaz_iconv_open(cp, "UTF-8");
if (cd)
{
yaz_iconv_t cd = yaz_iconv_open(cp, "UTF-8");
if (cd)
{
search_req->query = yaz_copy_Z_Query(search_req->query,
c->odr_out);
search_req->query = yaz_copy_Z_Query(search_req->query,
c->odr_out);
- yaz_query_charset_convert_rpnquery(search_req->query->u.type_1,
- c->odr_out, cd);
+ r = yaz_query_charset_convert_rpnquery_check(
+ search_req->query->u.type_1,
+ c->odr_out, cd);
+ if (r)
+ { /* query could not be char converted */
+ set_ZOOM_error(c, ZOOM_ERROR_INVALID_QUERY, 0);
+ return zoom_complete;
+ }