Use rset_dup for result set references
[idzebra-moved-to-github.git] / index / zrpn.c
index 0a9716f..a1eb701 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: zrpn.c,v 1.128 2003-02-26 21:46:37 adam Exp $
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+/* $Id: zrpn.c,v 1.132 2003-03-31 22:14:18 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003
    Index Data Aps
 
 This file is part of the Zebra server.
@@ -950,7 +950,7 @@ 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 (1)", use_value);
+                    sprintf (val_str, "%d", use_value);
                     zh->errCode = 114;
                     zh->errString = nmem_strdup (stream, val_str);
                 }
@@ -996,7 +996,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         if (!prefix_len)
         {
             char val_str[32];
-            sprintf (val_str, "%d (2)", use_value);
+            sprintf (val_str, "%d", use_value);
             zh->errCode = 114;
             zh->errString = nmem_strdup (stream, val_str);
             return -1;
@@ -1300,7 +1300,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no,
        parms.temp_path = res_get (zh->res, "setTmpDir");
        result = rset_create (rset_kind_temp, &parms);
        rsfd_result = rset_open (result, RSETF_WRITE);
-       
+
        while (*more)
        {
            for (i = 1; i<rset_no; i++)
@@ -1349,8 +1349,9 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no,
        rset_temp_parms parms;
        RSFD rsfd_result;
 
-       logf (LOG_LOG, "generic prox, dist = %d, relation = %d, ordered =%d, exclusion=%d",
-             distance, relation, ordered, exclusion);
+       yaz_log (LOG_LOG, "generic prox, dist=%d, relation=%d, ordered=%d"
+                         ", exclusion=%d",
+                         distance, relation, ordered, exclusion);
        parms.rset_term = rset_term_create (prox_term, length_prox_term,
                                            flags, term_type);
        parms.rset_term->nn = min_nn;
@@ -1774,7 +1775,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                         oid_value attributeSet, struct grep_info *grep_info,
                         int reg_type, int complete_flag,
                         int num_bases, char **basenames,
-                        char *term_dst, int xpath_use)
+                        char *term_dst, int xpath_use, NMEM stream)
 {
     char term_dict[2*IT_MAX_WORD+2];
     int r, base_no;
@@ -1822,7 +1823,12 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                 logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d",
                       curAttributeSet, use_value, r);
                 if (r == -1)
+               {
+                    char val_str[32];
+                    sprintf (val_str, "%d", use_value);
+                    zh->errString = nmem_strdup (stream, val_str);
                     zh->errCode = 114;
+               }
                 else
                     zh->errCode = 121;
                 return -1;
@@ -1859,7 +1865,10 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         }
         if (!prefix_len)
         {
+            char val_str[32];
+            sprintf (val_str, "%d", use_value);
             zh->errCode = 114;
+            zh->errString = nmem_strdup (stream, val_str);
             return -1;
         }
         term_dict[prefix_len++] = ')';        
@@ -1900,7 +1909,8 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh,
        grep_info.isam_p_indx = 0;
         r = numeric_term (zh, zapt, &termp, attributeSet, &grep_info,
                          reg_type, complete_flag, num_bases, basenames,
-                         term_dst, xpath_use);
+                         term_dst, xpath_use,
+                         stream);
         if (r < 1)
             break;
        logf (LOG_DEBUG, "term: %s", term_dst);
@@ -2091,12 +2101,11 @@ struct xpath_location_step {
 
 static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                        oid_value attributeSet,
-                       struct xpath_location_step *xpath, NMEM mem)
+                       struct xpath_location_step *xpath, int max, NMEM mem)
 {
     oid_value curAttributeSet = attributeSet;
     AttrType use;
     const char *use_string = 0;
-    int no = 0;
     
     attr_init (&use, zapt, 1);
     attr_find_ex (&use, &curAttributeSet, &use_string);
@@ -2104,7 +2113,7 @@ static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     if (!use_string || *use_string != '/')
         return -1;
 
-    return (parse_xpath_str(use_string, xpath, mem));
+    return zebra_parse_xpath_str(use_string, xpath, max, mem);
 }
  
                
@@ -2343,7 +2352,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     if (sort_flag)
        return rpn_sort_spec (zh, zapt, attributeSet, stream, sort_sequence,
                              rank_type);
-    xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, stream);
+    xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream);
     if (xpath_len >= 0)
     {
         xpath_use = 1016;
@@ -2491,6 +2500,8 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
                    nmem_strdup (stream, zs->u.simple->u.resultSetId);
                return 0;
            }
+            else
+                rset_dup(r);
         }
         else
         {
@@ -2651,7 +2662,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
               oid_value attributeset,
               int num_bases, char **basenames,
               int *position, int *num_entries, ZebraScanEntry **list,
-              int *is_partial)
+              int *is_partial, RSET limit_set, int return_zero)
 {
     int i;
     int pos = *position;
@@ -2672,11 +2683,38 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
     char rank_type[128];
     int complete_flag;
     int sort_flag;
+
     *list = 0;
 
     if (attributeset == VAL_NONE)
         attributeset = VAL_BIB1;
 
+    if (!limit_set)
+    {
+        AttrType termset;
+        int termset_value_numeric;
+        const char *termset_value_string;
+        attr_init (&termset, zapt, 8);
+        termset_value_numeric =
+            attr_find_ex (&termset, NULL, &termset_value_string);
+        if (termset_value_numeric != -1)
+        {
+            char resname[32];
+            const char *termset_name = 0;
+            
+            if (termset_value_numeric != -2)
+            {
+                
+                sprintf (resname, "%d", termset_value_numeric);
+                termset_name = resname;
+            }
+            else
+                termset_name = termset_value_string;
+            
+            limit_set = resultSetRef (zh, termset_name);
+        }
+    }
+        
     yaz_log (LOG_DEBUG, "position = %d, num = %d set=%d",
              pos, num, attributeset);
         
@@ -2705,7 +2743,12 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
             logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d",
                   attributeset, use_value);
            if (r == -1)
-               zh->errCode = 114;
+           {
+                char val_str[32];
+                sprintf (val_str, "%d", use_value);
+                zh->errCode = 114;
+                zh->errString = odr_strdup (stream, val_str);
+           }   
            else
                zh->errCode = 121;
            *num_entries = 0;
@@ -2828,6 +2871,17 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                 ptr[j]++;
             }
         }
+        if (limit_set)
+        {
+            rset_bool_parms bool_parms;
+
+            bool_parms.key_size = sizeof(struct it_key);
+            bool_parms.cmp = key_compare_it;
+            bool_parms.rset_l = rset;
+            bool_parms.rset_r = rset_dup(limit_set);
+
+            rset = rset_create (rset_kind_and, &bool_parms);
+        }
         count_set (rset, &glist[i+before].occurrences);
         rset_delete (rset);
     }
@@ -2896,6 +2950,17 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                 ptr[j]++;
             }
         }
+        if (limit_set)
+        {
+            rset_bool_parms bool_parms;
+
+            bool_parms.key_size = sizeof(struct it_key);
+            bool_parms.cmp = key_compare_it;
+            bool_parms.rset_l = rset;
+            bool_parms.rset_r = rset_dup(limit_set);
+
+            rset = rset_create (rset_kind_and, &bool_parms);
+        }
         count_set (rset, &glist[before-1-i].occurrences);
         rset_delete (rset);
     }