Added code to enable sending of admin extended service requests
[yaz-moved-to-github.git] / client / client.c
index 4262079..a113433 100644 (file)
@@ -1,10 +1,30 @@
 /*
- * Copyright (c) 1995-1999, Index Data
+ * Copyright (c) 1995-2000, Index Data
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.90  1999-11-30 13:47:11  adam
+ * Revision 1.96  2000-03-14 09:27:07  ian
+ * Added code to enable sending of admin extended service requests
+ *
+ * Revision 1.95  2000/02/28 11:20:05  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.94  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.93  2000/01/15 09:39:50  adam
+ * Implemented ill_get_ILLRequest. More ILL testing for client.
+ *
+ * Revision 1.92  1999/12/21 16:24:48  adam
+ * More robust ISO2709 handling (in case of real bad formats).
+ *
+ * Revision 1.91  1999/12/16 23:36:19  adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ * Revision 1.90  1999/11/30 13:47:11  adam
  * Improved installation. Moved header files to include/yaz.
  *
  * Revision 1.89  1999/11/04 14:58:44  adam
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
-#include <assert.h>
 
 #include <yaz/yaz-util.h>
 
 
 #include <yaz/pquery.h>
 
+#ifdef ASN_COMPILED
+#include <yaz/ill.h>
+#endif
+
 #if CCL2RPN
 #include <yaz/yaz-ccl.h>
 #endif
 #include <readline/history.h>
 #endif
 
+#include "admin.h"
+
 #define C_PROMPT "Z> "
 
 static ODR out, in, print;              /* encoding and decoding streams */
@@ -363,7 +388,12 @@ static QueryType queryType = QueryType_Prefix;
 static CCL_bibset bibset;               /* CCL bibset handle */
 #endif
 
-static void send_apdu(Z_APDU *a)
+ODR getODROutputStream()
+{
+    return out;
+}
+
+void send_apdu(Z_APDU *a)
 {
     char *buf;
     int len;
@@ -379,6 +409,7 @@ static void send_apdu(Z_APDU *a)
         odr_reset(print);
     }
     buf = odr_getbuf(out, &len, 0);
+    /* printf ("sending APDU of size %d\n", len); */
     if (cs_put(conn, buf, len) < 0)
     {
         fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn)));
@@ -738,15 +769,23 @@ static void display_record(Z_DatabaseRecord *p)
        }
     }
     if (ent && ent->value == VAL_SOIF)
-        print_record(r->u.octet_aligned->buf, r->u.octet_aligned->len);
+        print_record((const unsigned char *) r->u.octet_aligned->buf, r->u.octet_aligned->len);
     else if (r->which == Z_External_octet && p->u.octet_aligned->len)
     {
         const char *octet_buf = (char*)p->u.octet_aligned->buf;
        if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML ||
             ent->value == VAL_HTML)
-            print_record(octet_buf, p->u.octet_aligned->len);
+            print_record((const unsigned char *) octet_buf,
+                         p->u.octet_aligned->len);
        else
-            marc_display (octet_buf, NULL);
+        {
+            if (marc_display (octet_buf, NULL) <= 0)
+            {
+                printf ("ISO2709 decoding failed, dumping record as is:\n");
+                print_record((const unsigned char*) octet_buf,
+                              p->u.octet_aligned->len);
+            }
+        }
         if (marcdump)
             fwrite (octet_buf, 1, p->u.octet_aligned->len, marcdump);
     }
@@ -981,7 +1020,11 @@ static int send_searchRequest(char *arg)
     case QueryType_CCL2RPN:
         query.which = Z_Query_type_1;
         RPNquery = ccl_rpn_query(out, rpn);
-        assert(RPNquery);
+       if (!RPNquery)
+       {
+           printf ("Couldn't convert from CCL to RPN\n");
+           return 0;
+       }
         bib1.proto = protocol;
         bib1.oclass = CLASS_ATTSET;
         bib1.value = VAL_BIB1;
@@ -1196,7 +1239,142 @@ void process_ESResponse(Z_ExtendedServicesResponse *res)
     }
 }
 
-static Z_External *CreateItemOrderExternal(int itemno)
+#ifdef ASN_COMPILED
+
+const char *get_ill_element (void *clientData, const char *element)
+{
+    /* printf ("asking for %s\n", element); */
+    if (!strcmp (element, "ill,transaction-id,transaction-group-qualifier"))
+       return "1";
+    if (!strcmp (element, "ill,transaction-id,transaction-qualifier"))
+       return "1";
+    return 0;
+}
+
+static Z_External *create_external_itemRequest()
+{
+    struct ill_get_ctl ctl;
+    ILL_ItemRequest *req;
+    Z_External *r = 0;
+    int item_request_size = 0;
+    char *item_request_buf = 0;
+
+    ctl.odr = out;
+    ctl.clientData = 0;
+    ctl.f = get_ill_element;
+
+    req = ill_get_ItemRequest(&ctl, "ill", 0);
+
+    if (!ill_ItemRequest (out, &req, 0, 0))
+    {
+       if (apdu_file)
+       {
+           ill_ItemRequest(print, &req, 0, 0);
+           odr_reset(print);
+       }
+       item_request_buf = odr_getbuf (out, &item_request_size, 0);
+       if (item_request_buf)
+           odr_setbuf (out, item_request_buf, item_request_size, 1);
+        printf ("Couldn't encode ItemRequest, size %d\n", item_request_size);
+       return 0;
+    }
+    else
+    {
+       oident oid;
+       
+       item_request_buf = odr_getbuf (out, &item_request_size, 0);
+       oid.proto = PROTO_GENERAL;
+       oid.oclass = CLASS_GENERAL;
+       oid.value = VAL_ISO_ILL_1;
+       
+       r = (Z_External *) odr_malloc (out, sizeof(*r));
+       r->direct_reference = odr_oiddup(out,oid_getoidbyent(&oid)); 
+       r->indirect_reference = 0;
+       r->descriptor = 0;
+       r->which = Z_External_single;
+       
+       r->u.single_ASN1_type = (Odr_oct *)
+           odr_malloc (out, sizeof(*r->u.single_ASN1_type));
+       r->u.single_ASN1_type->buf = odr_malloc (out, item_request_size);
+       r->u.single_ASN1_type->len = item_request_size;
+       r->u.single_ASN1_type->size = item_request_size;
+       memcpy (r->u.single_ASN1_type->buf, item_request_buf,
+               item_request_size);
+       printf ("len = %d\n", item_request_size);
+    }
+    return r;
+}
+#else
+static Z_External *create_external_itemRequest()
+{
+    return 0;
+}
+#endif
+
+#ifdef ASN_COMPILED
+static Z_External *create_external_ILLRequest()
+{
+    struct ill_get_ctl ctl;
+    ILL_Request *req;
+    Z_External *r = 0;
+    int ill_request_size = 0;
+    char *ill_request_buf = 0;
+       
+    ctl.odr = out;
+    ctl.clientData = 0;
+    ctl.f = get_ill_element;
+
+    req = ill_get_ILLRequest(&ctl, "ill", 0);
+
+    if (!ill_Request (out, &req, 0, 0))
+    {
+       if (apdu_file)
+       {
+           printf ("-------------------\n");
+           ill_Request(print, &req, 0, 0);
+           odr_reset(print);
+           printf ("-------------------\n");
+       }
+       ill_request_buf = odr_getbuf (out, &ill_request_size, 0);
+       if (ill_request_buf)
+           odr_setbuf (out, ill_request_buf, ill_request_size, 1);
+        printf ("Couldn't encode ILL-Request, size %d\n", ill_request_size);
+       return 0;
+    }
+    else
+    {
+       oident oid;
+       ill_request_buf = odr_getbuf (out, &ill_request_size, 0);
+       
+       oid.proto = PROTO_GENERAL;
+       oid.oclass = CLASS_GENERAL;
+       oid.value = VAL_ISO_ILL_1;
+       
+       r = (Z_External *) odr_malloc (out, sizeof(*r));
+       r->direct_reference = odr_oiddup(out,oid_getoidbyent(&oid)); 
+       r->indirect_reference = 0;
+       r->descriptor = 0;
+       r->which = Z_External_single;
+       
+       r->u.single_ASN1_type = (Odr_oct *)
+           odr_malloc (out, sizeof(*r->u.single_ASN1_type));
+       r->u.single_ASN1_type->buf = odr_malloc (out, ill_request_size);
+       r->u.single_ASN1_type->len = ill_request_size;
+       r->u.single_ASN1_type->size = ill_request_size;
+       memcpy (r->u.single_ASN1_type->buf, ill_request_buf, ill_request_size);
+       printf ("len = %d\n", ill_request_size);
+    }
+    return r;
+}
+#else
+static Z_External *create_external_ILLRequest()
+{
+    return 0;
+}
+#endif
+
+
+static Z_External *create_ItemOrderExternal(const char *type, int itemno)
 {
     Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External));
     oident ItemOrderRequest;
@@ -1243,33 +1421,37 @@ static Z_External *CreateItemOrderExternal(int itemno)
        (int *) odr_malloc(out, sizeof(int));
     *r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = itemno;
 
-    r->u.itemOrder->u.esRequest->notToKeep->itemRequest = NULL;
+    switch (*type)
+    {
+    case '2':
+       printf ("using item-request\n");
+       r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 
+           create_external_itemRequest();
+       break;
+    case '1':
+       printf ("using ILL-request\n");
+       r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 
+           create_external_ILLRequest();
+       break;
+    default:
+       r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
+    }
     return r;
 }
 
-/* II : Added to do DALI Item Order Extended services request */
-static int send_itemorder(char *arg)
+static int send_itemorder(const char *type, int itemno)
 {
-    int itemno = -1;
     Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
     Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
     oident ItemOrderRequest;
 
-    if (*arg)
-        itemno = atoi(arg);
-
-    /* Set up item order request */
-
-    /* Package type, Using protocol ILL ( But that's not in the oid.h file yet */
-    /* create an object of class Extended Service, value Item Order            */
     ItemOrderRequest.proto = PROTO_Z3950;
     ItemOrderRequest.oclass = CLASS_EXTSERV;
     ItemOrderRequest.value = VAL_ITEMORDER;
     req->packageType = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest));
     req->packageName = "1.Extendedserveq";
 
-    /* ** taskSpecificParameters ** */
-    req->taskSpecificParameters = CreateItemOrderExternal(itemno);
+    req->taskSpecificParameters = create_ItemOrderExternal(type, itemno);
 
     send_apdu(apdu);
     return 0;
@@ -1335,10 +1517,15 @@ static int cmd_update(char *arg)
 /* II : Added to do DALI Item Order Extended services request */
 static int cmd_itemorder(char *arg)
 {
+    char type[12];
+    int itemno;
+
+    if (sscanf (arg, "%10s %d", type, &itemno) != 2)
+       return 0;
+
     printf("Item order request\n");
     fflush(stdout);
-
-    send_itemorder(arg);
+    send_itemorder(type, itemno);
     return(2);
 }
 
@@ -2072,8 +2259,16 @@ static int client(int wait)
        {"attributeset", cmd_attributeset, "<attrset>"},
         {"querytype", cmd_querytype, "<type>"},
        {"refid", cmd_refid, "<id>"},
-       {"itemorder", cmd_itemorder, "<item>"},
+       {"itemorder", cmd_itemorder, "1|2 <item>"},
        {"update", cmd_update, "<item>"},
+       /* Server Admin Functions */
+       {"adm-reindex", cmd_adm_reindex, "<database-name>"},
+       {"adm-truncate", cmd_adm_truncate, "('database'|'index')<object-name>"},
+       {"adm-create", cmd_adm_create, "<database-name>"},
+       {"adm-delete", cmd_adm_delete, "('database'|'index')<object-name>"},
+       {"adm-import", cmd_adm_import, "<database-name> <record-type> <source-file-name>"},
+       {"adm-refresh", cmd_adm_refresh, "<database-name>"},
+       {"adm-commit", cmd_adm_commit, ""},
         {0,0}
     };
     char *netbuffer= 0;
@@ -2180,6 +2375,8 @@ static int client(int wait)
                     fprintf(stderr, "Packet dump:\n---------\n");
                     odr_dumpBER(stderr, netbuffer, res);
                     fprintf(stderr, "---------\n");
+                   if (apdu_file)
+                       z_APDU(print, &apdu, 0, 0);
                     exit(1);
                 }
                 if (apdu_file && !z_APDU(print, &apdu, 0, 0))