* Copyright (C) 1995-2000, Index Data
* All rights reserved.
*
- * $Id: zserver.c,v 1.83 2002-02-20 17:30:01 adam Exp $
+ * $Id: zserver.c,v 1.85 2002-04-04 14:14:13 adam Exp $
*/
#include <stdio.h>
#include "zserver.h"
-#ifndef ZEBRASDR
-#define ZEBRASDR 0
-#endif
-#if ZEBRASDR
-#include "zebrasdr.h"
-#endif
-
static int bend_sort (void *handle, bend_sort_rr *rr);
static int bend_delete (void *handle, bend_delete_rr *rr);
static int bend_esrequest (void *handle, bend_esrequest_rr *rr);
xfree (openpass);
}
}
- if (zebra_auth (zh->service, user, passwd))
+ if (zebra_auth (zh, user, passwd))
{
r->errcode = 222;
r->errstring = user;
return r;
}
+static void search_terms (ZebraHandle zh, bend_search_rr *r)
+{
+ int count;
+ int no_terms;
+ int i;
+ struct Z_External *ext;
+ Z_SearchInfoReport *sr;
+
+ /* get no of terms for result set */
+ zebra_resultSetTerms (zh, r->setname, -1, &count, &no_terms);
+ if (!no_terms)
+ return;
+
+ r->search_info = odr_malloc (r->stream, sizeof(*r->search_info));
+
+ r->search_info->num_elements = 1;
+ r->search_info->list =
+ odr_malloc (r->stream, sizeof(*r->search_info->list));
+ r->search_info->list[0] =
+ odr_malloc (r->stream, sizeof(**r->search_info->list));
+ r->search_info->list[0]->category = 0;
+ r->search_info->list[0]->which = Z_OtherInfo_externallyDefinedInfo;
+ ext = odr_malloc (r->stream, sizeof(*ext));
+ r->search_info->list[0]->information.externallyDefinedInfo = ext;
+ ext->direct_reference =
+ yaz_oidval_to_z3950oid (r->stream, CLASS_USERINFO, VAL_SEARCHRES1);
+ ext->indirect_reference = 0;
+ ext->descriptor = 0;
+ ext->which = Z_External_searchResult1;
+ sr = odr_malloc (r->stream, sizeof(Z_SearchInfoReport));
+ ext->u.searchResult1 = sr;
+ sr->num = no_terms;
+ sr->elements = odr_malloc (r->stream, sr->num *
+ sizeof(*sr->elements));
+ for (i = 0; i<no_terms; i++)
+ {
+ Z_Term *term;
+ const char *termz = zebra_resultSetTerms (zh, r->setname, i,
+ &count, &no_terms);
+
+ sr->elements[i] = odr_malloc (r->stream, sizeof(**sr->elements));
+ sr->elements[i]->subqueryId = 0;
+ sr->elements[i]->fullQuery = odr_malloc (r->stream,
+ sizeof(bool_t));
+ *sr->elements[i]->fullQuery = 0;
+ sr->elements[i]->subqueryExpression =
+ odr_malloc (r->stream, sizeof(Z_QueryExpression));
+ sr->elements[i]->subqueryExpression->which =
+ Z_QueryExpression_term;
+ sr->elements[i]->subqueryExpression->u.term =
+ odr_malloc (r->stream, sizeof(Z_QueryExpressionTerm));
+ term = odr_malloc (r->stream, sizeof(Z_Term));
+ sr->elements[i]->subqueryExpression->u.term->queryTerm = term;
+
+ term->which = Z_Term_general;
+ term->u.general = odr_malloc (r->stream, sizeof(Odr_oct));
+ term->u.general->buf = odr_strdup (r->stream, termz);
+
+ term->u.general->len = strlen (termz);
+ term->u.general->size = strlen (termz);
+
+ sr->elements[i]->subqueryExpression->u.term->termComment = 0;
+ sr->elements[i]->subqueryInterpretation = 0;
+ sr->elements[i]->subqueryRecommendation = 0;
+ sr->elements[i]->subqueryCount = odr_intdup (r->stream, count);
+ sr->elements[i]->subqueryWeight = 0;
+ sr->elements[i]->resultsByDB = 0;
+ }
+}
+
int bend_search (void *handle, bend_search_rr *r)
{
ZebraHandle zh = (ZebraHandle) handle;
r->errcode = 0;
r->errstring = NULL;
+ if (zebra_select_databases (zh, r->num_bases,
+ (const char **) r->basenames))
+ {
+ zebra_result (zh, &r->errcode, &r->errstring);
+ return 0;
+ }
logf (LOG_LOG, "ResultSet '%s'", r->setname);
switch (r->query->which)
{
case Z_Query_type_1: case Z_Query_type_101:
zebra_search_rpn (zh, r->decode, r->stream, r->query->u.type_1,
- r->num_bases, r->basenames, r->setname);
- r->errcode = zh->errCode;
- r->errstring = zh->errString;
- r->hits = zh->hits;
+ r->setname, &r->hits);
+ zebra_result (zh, &r->errcode, &r->errstring);
+ if (!r->errcode)
+ search_terms (zh, r);
break;
case Z_Query_type_2:
r->errcode = 107;
return 0;
}
+
int bend_fetch (void *handle, bend_fetch_rr *r)
{
ZebraHandle zh = (ZebraHandle) handle;
r->last_in_set = 0;
zebra_records_retrieve (zh, r->stream, r->setname, r->comp,
r->request_format, 1, &retrievalRecord);
- if (zh->errCode) /* non Surrogate Diagnostic */
- {
- r->errcode = zh->errCode;
- r->errstring = zh->errString;
- }
- else if (retrievalRecord.errCode) /* Surrogate Diagnostic */
+ zebra_result (zh, &r->errcode, &r->errstring);
+ /* non Surrogate Diagnostic OR Surrogate Diagnostic */
+ if (r->errcode == 0 && retrievalRecord.errCode)
{
r->surrogate_flag = 1;
r->errcode = retrievalRecord.errCode;
r->errstring = retrievalRecord.errString;
r->basename = retrievalRecord.base;
}
- else /* Database Record */
+ else if (r->errcode == 0) /* Database Record */
{
r->errcode = 0;
r->basename = retrievalRecord.base;
ZebraScanEntry *entries;
ZebraHandle zh = (ZebraHandle) handle;
int is_partial, i;
+
+ zebra_select_databases (zh, r->num_bases, (const char **) r->basenames);
r->entries = (struct scan_entry *)
odr_malloc (r->stream, sizeof(*r->entries) * r->num_entries);
zebra_scan (zh, r->stream, r->term,
r->attributeset,
- r->num_bases, r->basenames,
&r->term_position,
&r->num_entries, &entries, &is_partial);
if (is_partial)
r->entries[i].term = entries[i].term;
r->entries[i].occurrences = entries[i].occurrences;
}
- r->errcode = zh->errCode;
- r->errstring = zh->errString;
+ zebra_result (zh, &r->errcode, &r->errstring);
return 0;
}
zebra_sort (zh, rr->stream,
rr->num_input_setnames, (const char **) rr->input_setnames,
rr->output_setname, rr->sort_sequence, &rr->sort_status);
- rr->errcode = zh->errCode;
- rr->errstring = zh->errString;
+ zebra_result (zh, &rr->errcode, &rr->errstring);
return 0;
}
break;
default:
yaz_log(LOG_LOG, "unknown admin");
- zh->errCode = 1001;
}
if (r->toKeep->databaseName)
{
yaz_log (LOG_LOG, "adm taskpackage (unhandled)");
break;
default:
- zh->errCode = 1001;
break;
}
else if (rr->esr->taskSpecificParameters->which == Z_External_ESAdmin)
{
es_admin (zh, rr->esr->taskSpecificParameters->u.adminService);
- rr->errcode = zh->errCode;
- rr->errstring = zh->errString;
+
+ zebra_result (zh, &rr->errcode, &rr->errstring);
}
else if (rr->esr->taskSpecificParameters->which == Z_External_itemOrder)
{
struct statserv_options_block *sob;
sob = statserv_getcontrol ();
- strcpy (sob->configname, FNAME_CONFIG);
+ strcpy (sob->configname, "zebra.cfg");
sob->bend_start = bend_start;
sob->bend_stop = bend_stop;