Encode special characters in term
[yaz-moved-to-github.git] / src / rpn2solr.c
index 24b2a14..70b2f6c 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2011 Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -184,7 +184,10 @@ static int checkForTruncation(int flag, Z_AttributeList *attributes)
                if (truncation <= 3)
                     return ((int) truncation & flag);
             }
-            /* Complex: Shouldn't happen */
+            else if (ae->which == Z_AttributeValue_complex) {
+                //yaz_log(YLOG_DEBUG, "Z_Attribute_complex");
+                /* Complex: Shouldn't happen */
+            }
         }
     }
     /* No truncation or unsupported */
@@ -192,11 +195,11 @@ static int checkForTruncation(int flag, Z_AttributeList *attributes)
 };
 
 static int checkForLeftTruncation(Z_AttributeList *attributes) {
-       return checkForTruncation(1, attributes);
+       return checkForTruncation(2, attributes);
 }
 
 static int checkForRightTruncation(Z_AttributeList *attributes) {
-       return checkForTruncation(2, attributes);
+       return checkForTruncation(1, attributes);
 };
 
 static int rpn2solr_simple(solr_transform_t ct,
@@ -242,6 +245,7 @@ static int rpn2solr_simple(solr_transform_t ct,
         {
             size_t i;
             int must_quote = 0;
+
             for (i = 0 ; i < lterm; i++)
                 if (sterm[i] == ' ')
                     must_quote = 1;
@@ -250,7 +254,13 @@ static int rpn2solr_simple(solr_transform_t ct,
             /* Bug 2878: Check and add Truncation */
                        if (checkForLeftTruncation(apt->attributes))
                 wrbuf_puts(w, "*");
-            wrbuf_write(w, sterm, lterm);
+                       for (i = 0 ; i < lterm; i++) {
+                /* BUG 4415: Escape special characters in string terms */
+                           if (strchr("+-&|!(){}[]^\"~*?:\\", sterm[i])) {
+                              wrbuf_putc(w, '\\');
+                           }
+                           wrbuf_putc(w, sterm[i]);
+                       }
             /* Bug 2878: Check and add Truncation */
                        if (checkForRightTruncation(apt->attributes))
                 wrbuf_puts(w, "*");