X-Path attribute expressions with spaces in them is now handled.
[idzebra-moved-to-github.git] / index / zrpn.c
index d238961..f09278d 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: zrpn.c,v 1.133 2003-04-15 20:48:04 adam Exp $
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003
+/* $Id: zrpn.c,v 1.135 2004-01-15 13:31:31 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
 This file is part of the Zebra server.
@@ -912,6 +912,10 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     struct rpn_char_map_info rcmi;
     int space_split = complete_flag ? 0 : 1;
 
+    int bases_ok = 0;     /* no of databases with OK attribute */
+    int errCode = 0;      /* err code (if any is not OK) */
+    char *errString = 0;  /* addinfo */
+
     rpn_char_map_prepare (zh->reg, reg_type, &rcmi);
     attr_init (&use, zapt, 1);
     use_value = attr_find_ex (&use, &curAttributeSet, &use_string);
@@ -963,8 +967,8 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                     /* set was found, but value wasn't defined */
                     char val_str[32];
                     sprintf (val_str, "%d", use_value);
-                    zh->errCode = 114;
-                    zh->errString = nmem_strdup (stream, val_str);
+                    errCode = 114;
+                    errString = nmem_strdup (stream, val_str);
                 }
                 else
                 {
@@ -976,10 +980,10 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                     oident.value = curAttributeSet;
                     oid_ent_to_oid (&oident, oid);
                     
-                    zh->errCode = 121;
-                    zh->errString = nmem_strdup (stream, oident.desc);
+                    errCode = 121;
+                    errString = nmem_strdup (stream, oident.desc);
                 }
-                return -1;
+                continue;
             }
         }
         for (local_attr = attp.local_attributes; local_attr;
@@ -1009,10 +1013,12 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         {
             char val_str[32];
             sprintf (val_str, "%d", use_value);
-            zh->errCode = 114;
-            zh->errString = nmem_strdup (stream, val_str);
-            return -1;
+            errCode = 114;
+            errString = nmem_strdup (stream, val_str);
+           continue;
         }
+       bases_ok++; /* this has OK attributes */
+
         term_dict[prefix_len++] = ')';
         term_dict[prefix_len++] = 1;
         term_dict[prefix_len++] = reg_type;
@@ -1135,6 +1141,12 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
            break;
         }
     }
+    if (!bases_ok)
+    {
+       zh->errCode = errCode;
+       zh->errString = errString;
+       return -1;
+    }
     *term_sub = termp;
     logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx);
     return 1;
@@ -1798,6 +1810,10 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     const char *termp;
     struct rpn_char_map_info rcmi;
 
+    int bases_ok = 0;     /* no of databases with OK attribute */
+    int errCode = 0;      /* err code (if any is not OK) */
+    char *errString = 0;  /* addinfo */
+
     rpn_char_map_prepare (zh->reg, reg_type, &rcmi);
     attr_init (&use, zapt, 1);
     use_value = attr_find_ex (&use, &curAttributeSet, &use_string);
@@ -1838,12 +1854,12 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                {
                     char val_str[32];
                     sprintf (val_str, "%d", use_value);
-                    zh->errString = nmem_strdup (stream, val_str);
-                    zh->errCode = 114;
+                    errString = nmem_strdup (stream, val_str);
+                    errCode = 114;
                }
                 else
-                    zh->errCode = 121;
-                return -1;
+                    errCode = 121;
+                continue;
             }
         }
         if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no]))
@@ -1879,10 +1895,11 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         {
             char val_str[32];
             sprintf (val_str, "%d", use_value);
-            zh->errCode = 114;
-            zh->errString = nmem_strdup (stream, val_str);
-            return -1;
+            errCode = 114;
+            errString = nmem_strdup (stream, val_str);
+            continue;
         }
+       bases_ok++;
         term_dict[prefix_len++] = ')';        
         term_dict[prefix_len++] = 1;
         term_dict[prefix_len++] = reg_type;
@@ -1893,6 +1910,12 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                               term_dst))
            return 0;
     }
+    if (!bases_ok)
+    {
+       zh->errCode = errCode;
+       zh->errString = errString;
+       return -1;
+    }
     *term_sub = termp;
     logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx);
     return 1;
@@ -2289,18 +2312,25 @@ static RSET rpn_search_xpath (ZebraHandle zh,
                 xpath[level].predicate->which == XPATH_PREDICATE_RELATION &&
                 xpath[level].predicate->u.relation.name[0])
             {
-                char predicate_str[128];
-
-                strcpy (predicate_str,
-                        xpath[level].predicate->u.relation.name+1);
+               WRBUF wbuf = wrbuf_alloc();
+               wrbuf_puts(wbuf, xpath[level].predicate->u.relation.name+1);
                 if (xpath[level].predicate->u.relation.value)
                 {
-                    strcat (predicate_str, "=");
-                    strcat (predicate_str,
-                            xpath[level].predicate->u.relation.value);
+                   const char *cp = xpath[level].predicate->u.relation.value;
+                   wrbuf_putc(wbuf, '=');
+                   
+                   while (*cp)
+                   {
+                       if (strchr(REGEX_CHARS, *cp))
+                           wrbuf_putc(wbuf, '\\');
+                       wrbuf_putc(wbuf, *cp);
+                       cp++;
+                   }
                 }
+               wrbuf_puts(wbuf, "");
                 rset_attr = xpath_trunc (
-                    zh, stream, '0', predicate_str, 3, curAttributeSet);
+                    zh, stream, '0', wrbuf_buf(wbuf), 3, curAttributeSet);
+               wrbuf_free(wbuf, 1);
             } 
             else 
             {
@@ -2690,6 +2720,10 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
     int ords[32], ord_no = 0;
     int ptr[32];
 
+    int bases_ok = 0;     /* no of databases with OK attribute */
+    int errCode = 0;      /* err code (if any is not OK) */
+    char *errString = 0;  /* addinfo */
+
     unsigned reg_id;
     char *search_type = NULL;
     char rank_type[128];
@@ -2758,13 +2792,12 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
            {
                 char val_str[32];
                 sprintf (val_str, "%d", use_value);
-                zh->errCode = 114;
-                zh->errString = odr_strdup (stream, val_str);
+                errCode = 114;
+                errString = odr_strdup (stream, val_str);
            }   
            else
-               zh->errCode = 121;
-           *num_entries = 0;
-           return;
+               errCode = 121;
+           continue;
         }
         if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no]))
         {
@@ -2773,6 +2806,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
            *num_entries = 0;
            return;
         }
+       bases_ok++;
         for (local_attr = attp.local_attributes; local_attr && ord_no < 32;
              local_attr = local_attr->next)
         {
@@ -2784,10 +2818,20 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                 ords[ord_no++] = ord;
         }
     }
+    if (!bases_ok && errCode)
+    {
+       zh->errCode = errCode;
+       zh->errString = errString;
+       *num_entries = 0;
+    }
     if (ord_no == 0)
     {
+       char val_str[32];
+       sprintf (val_str, "%d", use_value);
+       zh->errCode = 114;
+       zh->errString = odr_strdup (stream, val_str);
+
        *num_entries = 0;
-        zh->errCode = 113;
        return;
     }
     /* prepare dictionary scanning */