DB Update implemented in client (very basic).
[yaz-moved-to-github.git] / client / client.c
index 9e0fd13..653ab41 100644 (file)
@@ -1,10 +1,23 @@
 /*
- * Copyright (c) 1995-1999, Index Data.
+ * Copyright (c) 1995-1999, Index Data
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.78  1999-03-18 12:57:18  adam
+ * Revision 1.82  1999-05-26 13:49:12  adam
+ * DB Update implemented in client (very basic).
+ *
+ * Revision 1.81  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.80  1999/03/31 11:18:24  adam
+ * Implemented odr_strdup. Added Reference ID to backend server API.
+ *
+ * Revision 1.79  1999/03/23 14:14:25  adam
+ * Yet another fix.
+ *
+ * Revision 1.78  1999/03/18 12:57:18  adam
  * Minor fix.
  *
  * Revision 1.77  1999/03/11 15:26:51  adam
@@ -294,6 +307,7 @@ static ODR out, in, print;              /* encoding and decoding streams */
 static COMSTACK conn = 0;               /* our z-association */
 static Z_IdAuthentication *auth = 0;    /* our current auth definition */
 static char *databaseNames[128];
+static Z_External *record_last = 0;
 static int num_databaseNames = 0;
 static int setnumber = 0;               /* current result set number */
 static int smallSetUpperBound = 0;
@@ -328,7 +342,7 @@ static void send_apdu(Z_APDU *a)
     char *buf;
     int len;
 
-    if (!z_APDU(out, &a, 0))
+    if (!z_APDU(out, &a, 0, 0))
     {
         odr_perror(out, "Encoding APDU");
         exit(1);
@@ -410,7 +424,7 @@ static int process_initResponse(Z_InitResponse *res)
     {
         printf("UserInformationfield:\n");
         if (!z_External(print, (Z_External**)&res-> userInformationField,
-            0))
+            0, 0))
         {
             odr_perror(print, "Printing userinfo\n");
             odr_reset(print);
@@ -632,6 +646,7 @@ static void display_record(Z_DatabaseRecord *p)
     Z_External *r = (Z_External*) p;
     oident *ent = oid_getentbyoid(r->direct_reference);
 
+    record_last = r;
     /*
      * Tell the user what we got.
      */
@@ -640,7 +655,7 @@ static void display_record(Z_DatabaseRecord *p)
         printf("Record type: ");
         if (ent)
             printf("%s\n", ent->desc);
-        else if (!odr_oid(print, &r->direct_reference, 0))
+        else if (!odr_oid(print, &r->direct_reference, 0, 0))
         {
             odr_perror(print, "print oid");
             odr_reset(print);
@@ -659,7 +674,7 @@ static void display_record(Z_DatabaseRecord *p)
             */
            odr_setbuf(in, (char*)p->u.octet_aligned->buf,
                p->u.octet_aligned->len, 0);
-           if (!(*type->fun)(in, (char **)&rr, 0))
+           if (!(*type->fun)(in, (char **)&rr, 0, 0))
            {
                odr_perror(in, "Decoding constructed record.");
                fprintf(stderr, "[Near %d]\n", odr_offset(in));
@@ -719,7 +734,7 @@ static void display_record(Z_DatabaseRecord *p)
     else 
     {
         printf("Unknown record representation.\n");
-        if (!z_External(print, &r, 0))
+        if (!z_External(print, &r, 0, 0))
         {
             odr_perror(print, "Printing external");
             odr_reset(print);
@@ -775,7 +790,7 @@ static void display_nameplusrecord(Z_NamePlusRecord *p)
         printf("[%s]", p->databaseName);
     if (p->which == Z_NamePlusRecord_surrogateDiagnostic)
         display_diagrecs(&p->u.surrogateDiagnostic, 1);
-    else
+    else if (p->which == Z_NamePlusRecord_databaseRecord)
         display_record(p->u.databaseRecord);
 }
 
@@ -1180,10 +1195,6 @@ static int send_itemorder(char *arg)
 
     /* Set up item order request */
 
-    /* Function being performed by this extended services request */
-    req->function = (int *) odr_malloc(out, sizeof(int));
-    *req->function = Z_ExtendedServicesRequest_create;
-
     /* 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;
@@ -1195,13 +1206,62 @@ static int send_itemorder(char *arg)
     /* ** taskSpecificParameters ** */
     req->taskSpecificParameters = CreateItemOrderExternal(itemno);
 
-    /* waitAction - Create the ILL request and that's it */
-    *req->waitAction = Z_ExtendedServicesRequest_wait;
-
     send_apdu(apdu);
     return 0;
 }
 
+static int cmd_update(char *arg)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
+    Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+    Z_External *r;
+    int oid[OID_SIZE];
+    Z_IUOriginPartToKeep *toKeep;
+    Z_IUSuppliedRecords *notToKeep;
+    oident update_oid;
+    printf ("Update request\n");
+    fflush(stdout);
+
+    if (!record_last)
+       return 0;
+    update_oid.proto = PROTO_Z3950;
+    update_oid.oclass = CLASS_EXTSERV;
+    update_oid.value = VAL_DBUPDATE;
+    oid_ent_to_oid (&update_oid, oid);
+    req->packageType = odr_oiddup(out,oid);
+    req->packageName = "1.Extendedserveq";
+
+    r = req->taskSpecificParameters = (Z_External *)
+       odr_malloc (out, sizeof(*r));
+    r->direct_reference = odr_oiddup(out,oid);
+    r->which = Z_External_update;
+    r->u.update = (Z_IUUpdate *) odr_malloc(out, sizeof(*r->u.update));
+    r->u.update->which = Z_IUUpdate_esRequest;
+    r->u.update->u.esRequest = (Z_IUUpdateEsRequest *)
+       odr_malloc(out, sizeof(*r->u.update->u.esRequest));
+    toKeep = r->u.update->u.esRequest->toKeep = (Z_IUOriginPartToKeep *)
+       odr_malloc(out, sizeof(*r->u.update->u.esRequest->toKeep));
+    toKeep->databaseName = databaseNames[0];
+    toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
+    *toKeep->action = Z_IUOriginPartToKeep_recordInsert;
+
+    notToKeep = r->u.update->u.esRequest->notToKeep = (Z_IUSuppliedRecords *)
+       odr_malloc(out, sizeof(*r->u.update->u.esRequest->notToKeep));
+    notToKeep->num = 1;
+    notToKeep->elements = (Z_IUSuppliedRecords_elem **)
+       odr_malloc(out, sizeof(*notToKeep->elements));
+    notToKeep->elements[0] = (Z_IUSuppliedRecords_elem *)
+       odr_malloc(out, sizeof(**notToKeep->elements));
+    notToKeep->elements[0]->u.number = 0;
+    notToKeep->elements[0]->supplementalId = 0;
+    notToKeep->elements[0]->correlationInfo = 0;
+    notToKeep->elements[0]->record = record_last;
+    
+    send_apdu(apdu);
+
+    return 2;
+}
+
 /* II : Added to do DALI Item Order Extended services request */
 static int cmd_itemorder(char *arg)
 {
@@ -1455,7 +1515,8 @@ int send_sortrequest(char *arg, int newset)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
     Z_SortRequest *req = apdu->u.sortRequest;
-    Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)odr_malloc (out, sizeof(*sksl));
+    Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
+        odr_malloc (out, sizeof(*sksl));
     char setstring[32];
     char sort_string[32], sort_flags[32];
     int off;
@@ -1473,9 +1534,7 @@ int send_sortrequest(char *arg, int newset)
     req->num_inputResultSetNames = 1;
     req->inputResultSetNames = (Z_InternationalString **)
        odr_malloc (out, sizeof(*req->inputResultSetNames));
-    req->inputResultSetNames[0] = (char *)
-       odr_malloc (out, strlen(setstring)+1);
-    strcpy (req->inputResultSetNames[0], setstring);
+    req->inputResultSetNames[0] = odr_strdup (out, setstring);
 #else
     req->inputResultSetNames =
        (Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames));
@@ -1483,15 +1542,13 @@ int send_sortrequest(char *arg, int newset)
     req->inputResultSetNames->strings =
        (char **)odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
     req->inputResultSetNames->strings[0] =
-       (char *)odr_malloc (out, strlen(setstring)+1);
-    strcpy (req->inputResultSetNames->strings[0], setstring);
+       odr_strdup (out, setstring);
 #endif
 
     if (newset && setnumber >= 0)
        sprintf (setstring, "%d", ++setnumber);
 
-    req->sortedResultSetName = (char *)odr_malloc (out, strlen(setstring)+1);
-    strcpy (req->sortedResultSetName, setstring);
+    req->sortedResultSetName = odr_strdup (out, setstring);
 
     req->sortSequence = sksl;
     sksl->num_specs = 0;
@@ -1538,8 +1595,7 @@ int send_sortrequest(char *arg, int newset)
        else
        {
            sk->which = Z_SortKey_sortField;
-           sk->u.sortField = (char *)odr_malloc (out, strlen(sort_string)+1);
-           strcpy (sk->u.sortField, sort_string);
+           sk->u.sortField = odr_strdup (out, sort_string);
        }
        sks->sortRelation = (int *)odr_malloc (out, sizeof(*sks->sortRelation));
        *sks->sortRelation = Z_SortRelation_ascending;
@@ -1874,6 +1930,7 @@ static int client(int wait)
         {"querytype", cmd_querytype, "<type>"},
        {"refid", cmd_refid, "<id>"},
        {"itemorder", cmd_itemorder, "<item>"},
+       {"update", cmd_update, "<item>"},
         {0,0}
     };
     char *netbuffer= 0;
@@ -1909,9 +1966,11 @@ static int client(int wait)
 #if HAVE_READLINE_READLINE_H
            char* line_in;
            line_in=readline(C_PROMPT);
+            if (!line_in)
+                break;
 #if HAVE_READLINE_HISTORY_H
-           if (line_in && *line_in)
-               add_history(line_in);
+            if (*line_in)
+               add_history(line_in);
 #endif
            strcpy(line,line_in);
             free (line_in);
@@ -1969,8 +2028,9 @@ static int client(int wait)
                     exit(1);
                 }
                 odr_reset(in); /* release APDU from last round */
+               record_last = 0;
                 odr_setbuf(in, netbuffer, res, 0);
-                if (!z_APDU(in, &apdu, 0))
+                if (!z_APDU(in, &apdu, 0, 0))
                 {
                     odr_perror(in, "Decoding incoming APDU");
                    fprintf(stderr, "[Near %d]\n", odr_offset(in));