Added call to xmalloc/nmem debugging functions.
[idzebra-moved-to-github.git] / index / zserver.c
index 9afe88a..12f4e5e 100644 (file)
@@ -1,10 +1,19 @@
 /*
- * Copyright (C) 1995-1999, Index Data 
+ * Copyright (C) 1995-2000, Index Data 
  * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zserver.c,v $
- * Revision 1.76  2000-03-15 15:00:31  adam
+ * Revision 1.79  2000-05-09 10:56:50  adam
+ * Added call to xmalloc/nmem debugging functions.
+ *
+ * Revision 1.78  2000/04/05 09:49:35  adam
+ * On Unix, zebra/z'mbol uses automake.
+ *
+ * Revision 1.77  2000/03/20 19:08:36  adam
+ * Added remote record import using Z39.50 extended services and Segment
+ * Requests.
+ *
+ * Revision 1.76  2000/03/15 15:00:31  adam
  * First work on threaded version.
  *
  * Revision 1.75  1999/11/30 13:48:04  adam
 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);
+static int bend_segment (void *handle, bend_segment_rr *rr);
+static int bend_search (void *handle, bend_search_rr *r);
+static int bend_fetch (void *handle, bend_fetch_rr *r);
+static int bend_scan (void *handle, bend_scan_rr *r);
 
 bend_initresult *bend_init (bend_initrequest *q)
 {
@@ -310,6 +323,10 @@ bend_initresult *bend_init (bend_initrequest *q)
     q->bend_sort = bend_sort;
     q->bend_delete = bend_delete;
     q->bend_esrequest = bend_esrequest;
+    q->bend_segment = bend_segment;
+    q->bend_search = bend_search;
+    q->bend_fetch = bend_fetch;
+    q->bend_scan = bend_scan;
 
     q->implementation_name = "Z'mbol Information Server";
     q->implementation_version = "Z'mbol 1.0";
@@ -349,22 +366,20 @@ bend_initresult *bend_init (bend_initrequest *q)
     return r;
 }
 
-bend_searchresult *bend_search (void *handle, bend_searchrequest *q, int *fd)
+int bend_search (void *handle, bend_search_rr *r)
 {
     ZebraHandle zh = (ZebraHandle) handle;
-    bend_searchresult *r = (bend_searchresult *)
-       odr_malloc (q->stream, sizeof(*r));
 
     r->hits = 0;
     r->errcode = 0;
     r->errstring = NULL;
     
-    logf (LOG_LOG, "ResultSet '%s'", q->setname);
-    switch (q->query->which)
+    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, q->decode, q->stream, q->query->u.type_1,
-                         q->num_bases, q->basenames, q->setname);
+       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;
@@ -376,21 +391,19 @@ bend_searchresult *bend_search (void *handle, bend_searchrequest *q, int *fd)
     default:
         r->errcode = 107;
     }
-    return r;
+    return 0;
 }
 
-bend_fetchresult *bend_fetch (void *handle, bend_fetchrequest *q, int *num)
+int bend_fetch (void *handle, bend_fetch_rr *r)
 {
     ZebraHandle zh = (ZebraHandle) handle;
-    bend_fetchresult *r = (bend_fetchresult *)
-       odr_malloc (q->stream, sizeof(*r));
     ZebraRetrievalRecord retrievalRecord;
 
-    retrievalRecord.position = q->number;
+    retrievalRecord.position = r->number;
     
     r->last_in_set = 0;
-    zebra_records_retrieve (zh, q->stream, q->setname, q->comp,
-                           q->format, 1, &retrievalRecord);
+    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;
@@ -398,7 +411,7 @@ bend_fetchresult *bend_fetch (void *handle, bend_fetchrequest *q, int *num)
     }
     else if (retrievalRecord.errCode) /* Surrogate Diagnostic */
     {
-       q->surrogate_flag = 1;
+       r->surrogate_flag = 1;
        r->errcode = retrievalRecord.errCode;
        r->errstring = retrievalRecord.errString;
        r->basename = retrievalRecord.base;
@@ -409,27 +422,22 @@ bend_fetchresult *bend_fetch (void *handle, bend_fetchrequest *q, int *num)
        r->basename = retrievalRecord.base;
        r->record = retrievalRecord.buf;
        r->len = retrievalRecord.len;
-       r->format = retrievalRecord.format;
+       r->output_format = retrievalRecord.format;
     }
-    return r;
+    return 0;
 }
 
-bend_scanresult *bend_scan (void *handle, bend_scanrequest *q, int *num)
+static int bend_scan (void *handle, bend_scan_rr *r)
 {
     ZebraScanEntry *entries;
     ZebraHandle zh = (ZebraHandle) handle;
-    bend_scanresult *r = (bend_scanresult *)
-       odr_malloc (q->stream, sizeof(*r));
     int is_partial, i;
     
-    r->term_position = q->term_position;
-    r->num_entries = q->num_entries;
-
     r->entries = (struct scan_entry *)
-       odr_malloc (q->stream, sizeof(*r->entries) * q->num_entries);
-    zebra_scan (zh, q->stream, q->term,
-               q->attributeset,
-               q->num_bases, q->basenames,
+       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)
@@ -443,12 +451,14 @@ bend_scanresult *bend_scan (void *handle, bend_scanrequest *q, int *num)
     }
     r->errcode = zh->errCode;
     r->errstring = zh->errString;
-    return r;
+    return 0;
 }
 
 void bend_close (void *handle)
 {
     zebra_close ((ZebraHandle) handle);
+    xmalloc_trav("bend_close");
+    nmem_print_list();
 }
 
 int bend_sort (void *handle, bend_sort_rr *rr)
@@ -483,8 +493,8 @@ static int es_admin_request (ZebraHandle zh, Z_AdminEsRequest *r)
     case Z_ESAdminOriginPartToKeep_truncate:
        yaz_log(LOG_LOG, "adm-truncate");
        break;
-    case Z_ESAdminOriginPartToKeep_delete:
-       yaz_log(LOG_LOG, "adm-delete");
+    case Z_ESAdminOriginPartToKeep_drop:
+       yaz_log(LOG_LOG, "adm-drop");
        break;
     case Z_ESAdminOriginPartToKeep_create:
        yaz_log(LOG_LOG, "adm-create");
@@ -492,6 +502,7 @@ static int es_admin_request (ZebraHandle zh, Z_AdminEsRequest *r)
        break;
     case Z_ESAdminOriginPartToKeep_import:
        yaz_log(LOG_LOG, "adm-import");
+       zebra_admin_import_begin (zh, r->toKeep->databaseName);
        break;
     case Z_ESAdminOriginPartToKeep_refresh:
        yaz_log(LOG_LOG, "adm-refresh");
@@ -499,6 +510,14 @@ static int es_admin_request (ZebraHandle zh, Z_AdminEsRequest *r)
     case Z_ESAdminOriginPartToKeep_commit:
        yaz_log(LOG_LOG, "adm-commit");
        break;
+    case Z_ESAdminOriginPartToKeep_shutdown:
+       yaz_log(LOG_LOG, "shutdown");
+       zebra_admin_shutdown(zh);
+       break;
+    case Z_ESAdminOriginPartToKeep_start:
+       yaz_log(LOG_LOG, "start");
+       zebra_admin_start(zh);
+       break;
     default:
        yaz_log(LOG_LOG, "unknown admin");
        zh->errCode = 1001;
@@ -528,6 +547,18 @@ static int es_admin (ZebraHandle zh, Z_Admin *r)
     return 0;
 }
 
+int bend_segment (void *handle, bend_segment_rr *rr)
+{
+    ZebraHandle zh = (ZebraHandle) handle;
+    Z_Segment *segment = rr->segment;
+
+    if (segment->num_segmentRecords)
+       zebra_admin_import_segment (zh, rr->segment);
+    else
+       zebra_admin_import_end (zh);
+    return 0;
+}
+
 int bend_esrequest (void *handle, bend_esrequest_rr *rr)
 {
     ZebraHandle zh = (ZebraHandle) handle;
@@ -675,19 +706,25 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
                switch (*toKeep->action)
                {
                case Z_IUOriginPartToKeep_recordInsert:
-                   yaz_log (LOG_LOG, " recordInsert");
+                   yaz_log (LOG_LOG, "recordInsert");
                    break;
                case Z_IUOriginPartToKeep_recordReplace:
-                   yaz_log (LOG_LOG, " recordUpdate");
+                   yaz_log (LOG_LOG, "recordUpdate");
                    break;
                case Z_IUOriginPartToKeep_recordDelete:
-                   yaz_log (LOG_LOG, " recordDelete");
+                   yaz_log (LOG_LOG, "recordDelete");
                    break;
                case Z_IUOriginPartToKeep_elementUpdate:
-                   yaz_log (LOG_LOG, " elementUpdate");
+                   yaz_log (LOG_LOG, "elementUpdate");
                    break;
                case Z_IUOriginPartToKeep_specialUpdate:
-                   yaz_log (LOG_LOG, " specialUpdate");
+                   yaz_log (LOG_LOG, "specialUpdate");
+                   break;
+                case Z_ESAdminOriginPartToKeep_shutdown:
+                   yaz_log (LOG_LOG, "shutDown");
+                   break;
+               case Z_ESAdminOriginPartToKeep_start:
+                   yaz_log (LOG_LOG, "start");
                    break;
                default:
                    yaz_log (LOG_LOG, " unknown (%d)", *toKeep->action);
@@ -731,7 +768,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
                                     rec->u.sutrs->len,
                                     rec->u.sutrs->buf);
                         break;
-                   case Z_External_octet        :
+                   case Z_External_octet:
                        if (rec->u.octet_aligned->len > 170)
                            yaz_log (LOG_LOG, "%d bytes:\n%.168s ...",
                                     rec->u.octet_aligned->len,
@@ -783,8 +820,10 @@ static void bend_start (struct statserv_options_block *sob)
 static void bend_stop(struct statserv_options_block *sob)
 {
     if (sob->handle)
-       zebra_stop(sob->handle);
-    sob->handle = 0;
+    {
+       ZebraService service = sob->handle;
+       zebra_stop(service);
+    }
 }
 
 int main (int argc, char **argv)
@@ -796,12 +835,7 @@ int main (int argc, char **argv)
     sob->bend_start = bend_start;
     sob->bend_stop = bend_stop;
 
-    if (sob->dynamic)
-    {
-       sob->dynamic = 0;
-       sob->threads = 1;
-    }
     statserv_setcontrol (sob);
 
-    return statserv_main (argc, argv);
+    return statserv_main (argc, argv, bend_init, bend_close);
 }