#include "pazpar2.h"
#include "reclists.h"
+#include "jenkins_hash.h"
-extern struct parameters global_parameters;
+struct reclist
+{
+ struct reclist_bucket **hashtable;
+ int hashtable_size;
+ int hashmask;
+
+ struct record_cluster **flatlist;
+ int flatlist_size;
+ int num_records;
+ int pointer;
-// Not threadsafe
-static struct reclist_sortparms *sortparms = 0;
+ NMEM nmem;
+};
+
+static struct reclist_sortparms *qsort_sortparms = 0; /* thread pr */
struct reclist_bucket
{
#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;
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];
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);
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;
return res;
}
+int reclist_get_num_records(struct reclist *l)
+{
+ if (l)
+ return l->num_records;
+ return 0;
+}
+
+struct record_cluster *reclist_get_cluster(struct reclist *l, int i)
+{
+ return l->flatlist[i];
+}
+
// Insert a record. Return record cluster (newly formed or pre-existing)
struct record_cluster *reclist_insert( struct reclist *l,
struct conf_service *service,
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)
{
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab
*/
+