Fixed memory init problem for mod_dom in show records mode.
[idzebra-moved-to-github.git] / index / zsets.c
index 5187cf4..8a3f66a 100644 (file)
@@ -576,23 +576,28 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset,
                     criteria[i].ord[database_no]);
             zebra_sort_type(zh->reg->sort_index, criteria[i].ord[database_no]);
             wrbuf_rewind(w);
-            if (zebra_sort_read(zh->reg->sort_index, w))
+            if (zebra_sort_read(zh->reg->sort_index, 0, w))
             {
+                /* consider each sort entry and take lowest/highest one
+                   of the one as sorting key depending on whether sort is
+                   ascending/descending */
                 int off = 0;
                 while (off != wrbuf_len(w))
                 {
+                    size_t l = strlen(wrbuf_buf(w)+off);
                     assert(off < wrbuf_len(w));
-                    if (off == 0)
-                        strcpy(this_entry_buf, wrbuf_buf(w));
-                    else if (criteria[i].relation == 'A')
-                    {
-                        if (strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0)
-                            strcpy(this_entry_buf, wrbuf_buf(w)+off);
-                    }
-                    else if (criteria[i].relation == 'D')
+
+                    if (l >= SORT_IDX_ENTRYSIZE)
+                        l = SORT_IDX_ENTRYSIZE-1;
+                    if ( (off == 0)
+                         || (criteria[i].relation == 'A'
+                             && strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0)
+                         || (criteria[i].relation == 'D'
+                             && strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0)
+                        )
                     {
-                        if (strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0)
-                            strcpy(this_entry_buf, wrbuf_buf(w)+off);
+                        memcpy(this_entry_buf, wrbuf_buf(w)+off, l);
+                        this_entry_buf[l] = '\0';
                     }
                     off += 1 + strlen(wrbuf_buf(w)+off);
                 }
@@ -618,12 +623,6 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset,
                 char this_entry_org[1024];
                 char other_entry_org[1024];
                 double diff;
-                /* when searching multiple databases, we use the index
-                   type of the first one. So if they differ between
-                   databases, we have a problem here we could store the
-                   index_type for each database, but if we didn't find the
-                   record in any sort index, then we still don't know to
-                   which database it belongs. */
                 const char *index_type = criteria[j].index_type;
                 zebra_term_untrans(zh, index_type, this_entry_org,
                                    this_entry_buf);