Zebra with full functionality
[idzebra-moved-to-github.git] / index / zserver.c
index 1df6afd..66217cd 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (C) 1995-2000, Index Data 
+ * Copyright (C) 1995-2002, Index Data 
  * All rights reserved.
  *
- * $Id: zserver.c,v 1.83 2002-02-20 17:30:01 adam Exp $
+ * $Id: zserver.c,v 1.87 2002-04-05 08:46:26 adam Exp $
  */
 
 #include <stdio.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);
@@ -69,7 +62,7 @@ bend_initresult *bend_init (bend_initrequest *q)
     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;
     }
@@ -88,7 +81,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;
@@ -99,6 +92,76 @@ bend_initresult *bend_init (bend_initrequest *q)
     return r;
 }
 
+static void search_terms (ZebraHandle zh, bend_search_rr *r)
+{
+    int count;
+    int no_terms;
+    int i;
+    struct Z_External *ext;
+    Z_SearchInfoReport *sr;
+
+    /* get no of terms for result set */
+    zebra_resultSetTerms (zh, r->setname, -1, &count, &no_terms);
+    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;
+        const char *termz = zebra_resultSetTerms (zh, r->setname, i,
+                                                  &count, &no_terms);
+        
+        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;
+
+        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);
+        
+        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 +170,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 +196,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 +207,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 +232,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 +254,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 +272,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 +323,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 +342,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 +376,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)
     {
@@ -564,7 +632,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;