ZOOM reject queries that cannot be char converted
[yaz-moved-to-github.git] / src / query-charset.c
index 2861203..a875f80 100644 (file)
 #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)
 {
+    int r = 0;
     wrbuf_rewind(wrbuf);
     wrbuf_iconv_write(wrbuf, cd, buf_in, len_in);
     wrbuf_iconv_reset(wrbuf, cd);
@@ -26,56 +27,78 @@ void yaz_query_charset_convert_buf(char *buf_in, int len_in,
     {   /* we assume conversion failed */
         *buf_out = buf_in;
         *len_out = len_in;
+        r = -1;
     }
     else
     {
+        /* conversion OK */
         *buf_out = (char*) odr_malloc(o, *len_out);
         memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out);
     }
+    return r;
 }
 
-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)
 {
+    int r = 0;
     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;
     }
+    return r;
 }
 
-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)
 {
+    int r = 0;
     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;
     }
+    return r;
 }
 
-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)
 {
+    int r = 0;
     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:
-        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);
         break;
     }
+    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,
@@ -97,6 +120,7 @@ void yaz_query_charset_convert_apt(Z_AttributesPlusTerm *apt,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab