Zebra uses own XML reader (was part of YAZ before)
[idzebra-moved-to-github.git] / index / zserver.c
index 9f0572c..3c0aae9 100644 (file)
@@ -1,9 +1,26 @@
-/*
- * Copyright (C) 1995-2000, Index Data 
- * All rights reserved.
- *
- * $Id: zserver.c,v 1.85 2002-04-04 14:14:13 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,20 +66,15 @@ 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");
 
     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;
     }
@@ -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;
@@ -233,8 +291,12 @@ static int bend_scan (void *handle, bend_scan_rr *r)
     ZebraHandle zh = (ZebraHandle) handle;
     int is_partial, i;
 
-    zebra_select_databases (zh, r->num_bases, (const char **) r->basenames);
-    
+    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,
@@ -616,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;