Fix for non-threaded resolver.
[pazpar2-moved-to-github.git] / src / reclists.c
index 783025f..3e3100c 100644 (file)
@@ -1,7 +1,5 @@
-/* $Id: reclists.c,v 1.20 2007-07-23 12:23:30 adam Exp $
-   Copyright (c) 2006-2007, Index Data.
-
-This file is part of Pazpar2.
+/* This file is part of Pazpar2.
+   Copyright (C) 2006-2009 Index Data
 
 Pazpar2 is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -14,26 +12,24 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with Pazpar2; see the file LICENSE.  If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
- */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+*/
 
 #include <assert.h>
 
 #if HAVE_CONFIG_H
-#include <cconfig.h>
+#include <config.h>
 #endif
 
 #include <yaz/yaz-util.h>
 
 #include "pazpar2.h"
 #include "reclists.h"
+#include "jenkins_hash.h"
 
-extern struct parameters global_parameters;
-
-// Not threadsafe
-static struct reclist_sortparms *sortparms = 0;
+static struct reclist_sortparms *qsort_sortparms = 0; /* thread pr */
 
 struct reclist_bucket
 {
@@ -95,11 +91,11 @@ reclist_sortparms_insert(NMEM nmem,
 #endif
 
 
-struct reclist_sortparms *reclist_parse_sortparms(NMEM nmem, const char *parms)
+struct reclist_sortparms *reclist_parse_sortparms(NMEM nmem, const char *parms,
+    struct conf_service *service)
 {
     struct reclist_sortparms *res = 0;
     struct reclist_sortparms **rp = &res;
-    struct conf_service *service = config->servers->service;
 
     if (strlen(parms) > 256)
         return 0;
@@ -110,7 +106,7 @@ struct reclist_sortparms *reclist_parse_sortparms(NMEM nmem, const char *parms)
         const char *cpp;
         int increasing;
         int i;
-        int offset;
+        int offset = 0;
         enum conf_sortkey_type type;
         struct reclist_sortparms *new;
 
@@ -129,7 +125,6 @@ struct reclist_sortparms *reclist_parse_sortparms(NMEM nmem, const char *parms)
         if (!strcmp(parm, "relevance"))
         {
             type = Metadata_sortkey_relevance;
-            offset = -1;
         }
         else
         {
@@ -171,20 +166,20 @@ static int reclist_cmp(const void *p1, const void *p2)
     struct reclist_sortparms *s;
     int res = 0;
 
-    for (s = sortparms; s && res == 0; s = s->next)
+    for (s = qsort_sortparms; s && res == 0; s = s->next)
     {
         union data_types *ut1 = r1->sortkeys[s->offset];
         union data_types *ut2 = r2->sortkeys[s->offset];
         switch (s->type)
         {
-            char *s1, *s2;
+            const char *s1, *s2;
             
             case Metadata_sortkey_relevance:
                 res = r2->relevance - r1->relevance;
                 break;
             case Metadata_sortkey_string:
-                s1 = ut1 ? ut1->text : "";
-                s2 = ut2 ? ut2->text : "";
+                s1 = ut1 ? ut1->text.sort : "";
+                s2 = ut2 ? ut2->text.sort : "";
                 res = strcmp(s2, s1);
                 if (res)
                 {
@@ -208,8 +203,8 @@ static int reclist_cmp(const void *p1, const void *p2)
                     res = 0;
                 break;
             default:
-                yaz_log(YLOG_FATAL, "Bad sort type: %d", s->type);
-                exit(1);
+                yaz_log(YLOG_WARN, "Bad sort type: %d", s->type);
+                res = 0;
         }
     }
     return res;
@@ -217,7 +212,7 @@ static int reclist_cmp(const void *p1, const void *p2)
 
 void reclist_sort(struct reclist *l, struct reclist_sortparms *parms)
 {
-    sortparms = parms;
+    qsort_sortparms = parms;
     qsort(l->flatlist, l->num_records, 
           sizeof(struct record_cluster*), reclist_cmp);
     reclist_rewind(l);
@@ -237,23 +232,6 @@ void reclist_rewind(struct reclist *l)
         l->pointer = 0;
 }
 
-// Jenkins one-at-a-time hash (from wikipedia)
-static unsigned int hash(const unsigned char *key)
-{
-    unsigned int hash = 0;
-
-    while (*key)
-    {
-        hash += *(key++);
-        hash += (hash << 10);
-        hash ^= (hash >> 6);
-    }
-    hash += (hash << 3);
-    hash ^= (hash >> 11);
-    hash += (hash << 15);
-    return hash;
-}
-
 struct reclist *reclist_create(NMEM nmem, int numrecs)
 {
     int hashsize = 1;
@@ -293,7 +271,7 @@ struct record_cluster *reclist_insert( struct reclist *l,
     assert(merge_key);
     assert(total);
 
-    bucket = hash((unsigned char*) merge_key) & l->hashmask;
+    bucket = jenkins_hash((unsigned char*) merge_key) & l->hashmask;
 
     for (p = &l->hashtable[bucket]; *p; p = &(*p)->next)
     {
@@ -343,7 +321,9 @@ struct record_cluster *reclist_insert( struct reclist *l,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab
  */
+