X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzserver.c;h=3c0aae9e663706d992c1ee4a62111f06cf8ad98e;hb=b91ce3324c28145911b703dfe4e4c0ddb12d6532;hp=4930473bdc6a4182be42dda3b6537b043b070334;hpb=98e21f950e6d0babe88a6a1ccb03b90f0b3a6b1a;p=idzebra-moved-to-github.git diff --git a/index/zserver.c b/index/zserver.c index 4930473..3c0aae9 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -1,9 +1,26 @@ -/* - * Copyright (C) 1995-2000, Index Data - * All rights reserved. - * - * $Id: zserver.c,v 1.86 2002-04-04 20:50:37 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 #include @@ -49,13 +66,8 @@ bend_initresult *bend_init (bend_initrequest *q) 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"); @@ -89,6 +101,38 @@ bend_initresult *bend_init (bend_initrequest *q) 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; } @@ -97,11 +141,12 @@ 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 */ - zebra_resultSetTerms (zh, r->setname, -1, &count, &no_terms); + no_terms = zebra_resultSetTerms (zh, r->setname, 0, 0, 0, 0, 0); if (!no_terms) return; @@ -129,8 +174,10 @@ static void search_terms (ZebraHandle zh, bend_search_rr *r) for (i = 0; isetname, i, - &count, &no_terms); + 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; @@ -145,14 +192,25 @@ static void search_terms (ZebraHandle zh, bend_search_rr *r) 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); - + 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; @@ -620,6 +678,12 @@ static void bend_start (struct statserv_options_block *sob) 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;