Remove zmbol references
[idzebra-moved-to-github.git] / index / zserver.c
index 4930473..3c0aae9 100644 (file)
@@ -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 <stdio.h>
 #include <assert.h>
@@ -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; i<no_terms; i++)
     {
         Z_Term *term;
-        const char *termz = zebra_resultSetTerms (zh, r->setname, 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;