Fix log messages
[idzebra-moved-to-github.git] / index / zserver.c
index 1df6afd..dd85fbd 100644 (file)
@@ -1,9 +1,26 @@
-/*
- * 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.92 2002-08-29 08:47: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);
@@ -56,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_WARN, "Failed to open config `%s'", sob->configname);
        r->errcode = 1;
        return r;
     }
@@ -88,7 +93,7 @@ bend_initresult *bend_init (bend_initrequest *q)
            xfree (openpass);
        }
     }
-    if (zebra_auth (zh->service, user, passwd))
+    if (zebra_auth (zh, user, passwd))
     {
        r->errcode = 222;
        r->errstring = user;
@@ -96,9 +101,125 @@ 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;
 }
 
+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;
@@ -107,15 +228,21 @@ int bend_search (void *handle, bend_search_rr *r)
     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;
@@ -127,6 +254,7 @@ int bend_search (void *handle, bend_search_rr *r)
     return 0;
 }
 
+
 int bend_fetch (void *handle, bend_fetch_rr *r)
 {
     ZebraHandle zh = (ZebraHandle) handle;
@@ -137,19 +265,16 @@ int bend_fetch (void *handle, bend_fetch_rr *r)
     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;
@@ -165,12 +290,17 @@ static int bend_scan (void *handle, bend_scan_rr *r)
     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)
@@ -182,8 +312,7 @@ static int bend_scan (void *handle, bend_scan_rr *r)
        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;
 }
 
@@ -201,8 +330,7 @@ int bend_sort (void *handle, bend_sort_rr *rr)
     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;
 }
 
@@ -253,7 +381,6 @@ static int es_admin_request (ZebraHandle zh, Z_AdminEsRequest *r)
        break;
     default:
        yaz_log(LOG_LOG, "unknown admin");
-       zh->errCode = 1001;
     }
     if (r->toKeep->databaseName)
     {
@@ -273,7 +400,6 @@ static int es_admin (ZebraHandle zh, Z_Admin *r)
        yaz_log (LOG_LOG, "adm taskpackage (unhandled)");
        break;
     default:
-       zh->errCode = 1001;
        break;
     }
 
@@ -308,8 +434,8 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
     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)
     {
@@ -552,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;
@@ -564,7 +696,7 @@ int main (int argc, char **argv)
     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;