-/*
- * 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.91 2002-08-05 14:08:08 adam Exp $
+ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+ Index Data Aps
+
+This file is part of the Zebra server.
+
+Zebra 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
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+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 Zebra; see the file LICENSE.zebra. If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*/
+
+
#include <stdio.h>
#include <assert.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);
q->bend_fetch = bend_fetch;
q->bend_scan = bend_scan;
-#if ZMBOL
- q->implementation_name = "Z'mbol Information Server";
- q->implementation_version = "Z'mbol " ZEBRAVER;
-#else
q->implementation_name = "Zebra Information Server";
q->implementation_version = "Zebra " ZEBRAVER;
-#endif
logf (LOG_DEBUG, "bend_init");
sob = statserv_getcontrol ();
if (!(zh = zebra_open (sob->handle)))
{
- logf (LOG_FATAL, "Failed to open Zebra `%s'", sob->configname);
+ yaz_log (LOG_FATAL, "Failed to open config `%s'", sob->configname);
r->errcode = 1;
return r;
}
xfree (openpass);
}
}
- if (zebra_auth (zh->service, user, passwd))
+ if (zebra_auth (zh, user, passwd))
{
r->errcode = 222;
r->errstring = user;
return r;
}
r->handle = zh;
+ if (q->charneg_request) /* characater set and langauge negotiation? */
+ {
+ char **charsets = 0;
+ int num_charsets;
+ char **langs = 0;
+ int num_langs = 0;
+ int selected = 0;
+ int i;
+
+ NMEM nmem = nmem_create ();
+ yaz_log (LOG_LOG, "character set and language negotiation");
+
+ yaz_get_proposal_charneg (nmem, q->charneg_request,
+ &charsets, &num_charsets,
+ &langs, &num_langs, &selected);
+ for (i = 0; i < num_charsets; i++)
+ {
+ yaz_log (LOG_LOG, "charset %d %s", i, charsets[i]);
+
+ if (odr_set_charset (q->decode, "UTF-8", charsets[i]) == 0)
+ {
+ odr_set_charset (q->stream, charsets[i], "UTF-8");
+ if (selected)
+ zebra_record_encoding (zh, charsets[i]);
+ q->charneg_response =
+ yaz_set_response_charneg (q->stream, charsets[i],
+ 0, selected);
+ break;
+ }
+ }
+ nmem_destroy (nmem);
+ }
return r;
}
+static void search_terms (ZebraHandle zh, bend_search_rr *r)
+{
+ int count;
+ int no_terms;
+ int i;
+ int type;
+ struct Z_External *ext;
+ Z_SearchInfoReport *sr;
+
+ /* get no of terms for result set */
+ no_terms = zebra_resultSetTerms (zh, r->setname, 0, 0, 0, 0, 0);
+ 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;
+ char outbuf[1024];
+ size_t len = sizeof(outbuf);
+ zebra_resultSetTerms (zh, r->setname, i,
+ &count, &type, outbuf, &len);
+
+ 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;
+ switch (type)
+ {
+ case Z_Term_characterString:
+ yaz_log (LOG_LOG, "term as characterString");
+ term->which = Z_Term_characterString;
+ term->u.characterString = odr_strdup (r->stream, outbuf);
+ break;
+ case Z_Term_general:
+ yaz_log (LOG_LOG, "term as general");
+ term->which = Z_Term_general;
+ term->u.general = odr_malloc (r->stream, sizeof(*term->u.general));
+ term->u.general->size = term->u.general->len = len;
+ term->u.general->buf = odr_malloc (r->stream, len);
+ memcpy (term->u.general->buf, outbuf, len);
+ break;
+ default:
+ term->which = Z_Term_general;
+ term->u.null = odr_nullval();
+ }
+ 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;
-
+
+ if (zebra_select_databases (zh, r->num_bases,
+ (const char **) r->basenames))
+ {
+ zebra_result (zh, &r->errcode, &r->errstring);
+ return 0;
+ }
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)
{
static void bend_stop(struct statserv_options_block *sob)
{
+#ifdef WIN32
+
+#else
+ if (!sob->inetd)
+ unlink ("zebrasrv.pid");
+#endif
if (sob->handle)
{
ZebraService service = sob->handle;
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;