/*
- * Copyright (C) 1994-1999, Index Data
+ * Copyright (C) 1994-2000, Index Data
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: zsets.c,v $
- * Revision 1.23 1999-05-26 07:49:13 adam
+ * Revision 1.28 2000-07-07 12:49:20 adam
+ * Optimized resultSetInsert{Rank,Sort}.
+ *
+ * Revision 1.27 2000/04/05 09:49:36 adam
+ * On Unix, zebra/z'mbol uses automake.
+ *
+ * Revision 1.26 2000/03/20 19:08:36 adam
+ * Added remote record import using Z39.50 extended services and Segment
+ * Requests.
+ *
+ * Revision 1.25 2000/03/15 15:00:31 adam
+ * First work on threaded version.
+ *
+ * Revision 1.24 1999/11/04 15:00:45 adam
+ * Implemented delete result set(s).
+ *
+ * Revision 1.23 1999/05/26 07:49:13 adam
* C++ compilation.
*
* Revision 1.22 1999/02/02 14:51:15 adam
return NULL;
}
-
-void resultSetDestroy (ZebraHandle zh)
+void resultSetDestroy (ZebraHandle zh, int num, char **names,int *statuses)
{
- ZebraSet s, s1;
-
- for (s = zh->sets; s; s = s1)
+ ZebraSet *ss = &zh->sets;
+ int i;
+
+ if (statuses)
+ for (i = 0; i<num; i++)
+ statuses[i] = Z_DeleteStatus_resultSetDidNotExist;
+ zh->errCode = 0;
+ zh->errString = NULL;
+ while (*ss)
{
- s1 = s->next;
-
- xfree (s->sort_info->all_entries);
- xfree (s->sort_info->entries);
- xfree (s->sort_info);
-
- if (s->nmem)
- nmem_destroy (s->nmem);
- rset_delete (s->rset);
- xfree (s->name);
- xfree (s);
+ int i = -1;
+ ZebraSet s = *ss;
+ if (num >= 0)
+ {
+ for (i = 0; i<num; i++)
+ if (!strcmp (s->name, names[i]))
+ {
+ if (statuses)
+ statuses[i] = Z_DeleteStatus_success;
+ i = -1;
+ break;
+ }
+ }
+ if (i < 0)
+ {
+ *ss = s->next;
+
+ xfree (s->sort_info->all_entries);
+ xfree (s->sort_info->entries);
+ xfree (s->sort_info);
+
+ if (s->nmem)
+ nmem_destroy (s->nmem);
+ rset_delete (s->rset);
+ xfree (s->name);
+ xfree (s);
+ }
+ else
+ ss = &s->next;
}
- zh->sets = NULL;
}
ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
xfree (records);
}
-struct sortKey {
+struct sortKeyInfo {
int relation;
int attrUse;
};
void resultSetInsertSort (ZebraHandle zh, ZebraSet sset,
- struct sortKey *criteria, int num_criteria,
+ struct sortKeyInfo *criteria, int num_criteria,
int sysno)
{
struct zset_sort_entry this_entry;
struct zset_sort_info *sort_info = sset->sort_info;
int i, j;
- sortIdx_sysno (zh->sortIdx, sysno);
+ sortIdx_sysno (zh->service->sortIdx, sysno);
for (i = 0; i<num_criteria; i++)
{
- sortIdx_type (zh->sortIdx, criteria[i].attrUse);
- sortIdx_read (zh->sortIdx, this_entry.buf[i]);
+ sortIdx_type (zh->service->sortIdx, criteria[i].attrUse);
+ sortIdx_read (zh->service->sortIdx, this_entry.buf[i]);
}
i = sort_info->num_entries;
while (--i >= 0)
break;
}
}
- j = sort_info->max_entries-1;
+ ++i;
+ j = sort_info->max_entries;
if (i == j)
return;
- ++i;
+
+ if (sort_info->num_entries == j)
+ --j;
+ else
+ j = (sort_info->num_entries)++;
new_entry = sort_info->entries[j];
while (j != i)
{
sort_info->entries[j] = sort_info->entries[j-1];
--j;
}
- sort_info->entries[j] = new_entry;
+ sort_info->entries[i] = new_entry;
assert (new_entry);
- if (sort_info->num_entries != sort_info->max_entries)
- (sort_info->num_entries)++;
for (i = 0; i<num_criteria; i++)
memcpy (new_entry->buf[i], this_entry.buf[i], SORT_IDX_ENTRYSIZE);
new_entry->sysno = sysno;
break;
}
}
- j = sort_info->max_entries-1;
+ ++i;
+ j = sort_info->max_entries;
if (i == j)
return;
- ++i;
+
+ if (sort_info->num_entries == j)
+ --j;
+ else
+ j = (sort_info->num_entries)++;
+
new_entry = sort_info->entries[j];
while (j != i)
{
sort_info->entries[j] = sort_info->entries[j-1];
--j;
}
- sort_info->entries[j] = new_entry;
+ sort_info->entries[i] = new_entry;
assert (new_entry);
- if (sort_info->num_entries != sort_info->max_entries)
- (sort_info->num_entries)++;
new_entry->sysno = sysno;
new_entry->score = score;
}
{
int i, psysno = 0;
struct it_key key;
- struct sortKey sort_criteria[3];
+ struct sortKeyInfo sort_criteria[3];
int num_criteria;
int term_index;
RSFD rfd;
case Z_SortKey_sortAttributes:
logf (LOG_DEBUG, "Sort: key %d is of type sortAttributes", i+1);
sort_criteria[i].attrUse =
- zebra_maps_sort (zh->zebra_maps, sk->u.sortAttributes);
+ zebra_maps_sort (zh->service->zebra_maps,
+ sk->u.sortAttributes);
logf (LOG_DEBUG, "use value = %d", sort_criteria[i].attrUse);
if (sort_criteria[i].attrUse == -1)
{
zh->errCode = 116;
return;
}
- if (sortIdx_type (zh->sortIdx, sort_criteria[i].attrUse))
+ if (sortIdx_type (zh->service->sortIdx, sort_criteria[i].attrUse))
{
zh->errCode = 207;
return;
}
rset_close (rset, rfd);
- zh->errCode = 0;
*sort_status = Z_SortStatus_success;
logf (LOG_DEBUG, "resultSetSortSingle end");
}
ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)
{
- ZebraRankClass p = zh->rank_classes;
+ ZebraRankClass p = zh->service->rank_classes;
while (p && strcmp (p->control->name, name))
p = p->next;
if (p && !p->init_flag)
{
if (p->control->create)
- p->class_handle = (*p->control->create)(zh);
+ p->class_handle = (*p->control->create)(zh->service);
p->init_flag = 1;
}
return p;
}
-void zebraRankInstall (ZebraHandle zh, struct rank_control *ctrl)
+void zebraRankInstall (ZebraService zh, struct rank_control *ctrl)
{
ZebraRankClass p = (ZebraRankClass) xmalloc (sizeof(*p));
p->control = (struct rank_control *) xmalloc (sizeof(*p->control));
zh->rank_classes = p;
}
-void zebraRankDestroy (ZebraHandle zh)
+void zebraRankDestroy (ZebraService zh)
{
ZebraRankClass p = zh->rank_classes;
while (p)