X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=f727e5c0e62333501d298d2d2dfb795d047750c2;hb=1ff2e27ec44aebe0c9f6cc5a26ea19cd6e97b9e8;hp=983b7b42ade2e65e4e06dad1bd7df97e0484e041;hpb=1f6254e4d56700f2862a549a77daeb6c22d1f8d4;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 983b7b4..f727e5c 100644 --- a/client/client.c +++ b/client/client.c @@ -4,7 +4,20 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: client.c,v $ - * Revision 1.59 1998-01-29 13:17:56 adam + * Revision 1.63 1998-03-05 08:05:10 adam + * Added a few casts to make C++ happy. + * + * Revision 1.62 1998/02/11 11:53:33 adam + * Changed code so that it compiles as C++. + * + * Revision 1.61 1998/02/10 11:03:06 adam + * Implemented command refid. Client prints reference-ID's, when present, + * in responses. + * + * Revision 1.60 1998/01/29 14:08:52 adam + * Better sort diagnostics. + * + * Revision 1.59 1998/01/29 13:17:56 adam * Added sort. * * Revision 1.58 1998/01/07 13:51:45 adam @@ -240,6 +253,7 @@ static Z_InitResponse *session = 0; /* session parameters */ static char last_scan[512] = "0"; static char last_cmd[100] = "?"; static FILE *marcdump = 0; +static char *refid = NULL; typedef enum { QueryType_Prefix, @@ -264,14 +278,34 @@ static void send_apdu(Z_APDU *a) exit(1); } buf = odr_getbuf(out, &len, 0); - odr_reset(out); /* release the APDU structure */ if (cs_put(conn, buf, len) < 0) { fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn))); exit(1); } + odr_reset(out); /* release the APDU structure */ } +static void print_refid (Z_ReferenceId *id) +{ + if (id) + { + printf ("ReferenceId: '%.*s'\n", id->len, id->buf); + } +} + +static Z_ReferenceId *set_refid (ODR out) +{ + Z_ReferenceId *id; + if (!refid) + return 0; + id = (Z_ReferenceId *) odr_malloc (out, sizeof(*id)); + id->size = id->len = strlen(refid); + id->buf = (unsigned char *) odr_malloc (out, id->len); + memcpy (id->buf, refid, id->len); + return id; +} + /* INIT SERVICE ------------------------------- */ static void send_initRequest() @@ -526,7 +560,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, &rr, 0)) + if (!(*type->fun)(in, (char **)&rr, 0)) { odr_perror(in, "Decoding constructed record."); fprintf(stderr, "[Near %d]\n", odr_offset(in)); @@ -540,7 +574,7 @@ static void display_record(Z_DatabaseRecord *p) * Note: we throw away the original, BER-encoded record here. * Do something else with it if you want to keep it. */ - r->u.sutrs = rr; /* we don't actually check the type here. */ + r->u.sutrs = (Odr_oct *)rr; /* we don't actually check the type here. */ r->which = type->what; } } @@ -665,7 +699,7 @@ static int send_searchRequest(char *arg) } } #endif - + req->referenceId = set_refid (out); if (!strcmp(arg, "@big")) /* strictly for troublemaking */ { static unsigned char big[2100]; @@ -677,7 +711,7 @@ static int send_searchRequest(char *arg) bigo.buf = big; req->referenceId = &bigo; } - + if (setnumber >= 0) { sprintf(setstring, "%d", ++setnumber); @@ -746,6 +780,8 @@ static int send_searchRequest(char *arg) static int process_searchResponse(Z_SearchResponse *res) { + printf ("Received SearchResponse.\n"); + print_refid (res->referenceId); if (*res->searchStatus) printf("Search was a success.\n"); else @@ -760,6 +796,13 @@ static int process_searchResponse(Z_SearchResponse *res) return 0; } +static int process_resourceControlRequest (Z_ResourceControlRequest *req) +{ + printf ("Received ResourceControlRequest.\n"); + print_refid (req->referenceId); + return 0; +} + static int cmd_find(char *arg) { if (!*arg) @@ -825,7 +868,7 @@ static int cmd_base(char *arg) cp = arg + strlen(arg); if (cp - arg < 1) break; - databaseNames[num_databaseNames] = xmalloc (1 + cp - arg); + databaseNames[num_databaseNames] = (char *)xmalloc (1 + cp - arg); memcpy (databaseNames[num_databaseNames], arg, cp - arg); databaseNames[num_databaseNames++][cp - arg] = '\0'; if (!*cp) @@ -863,6 +906,7 @@ static int send_presentRequest(char *arg) char *p; char setstring[100]; + req->referenceId = set_refid (out); if ((p = strchr(arg, '+'))) { nos = atoi(p + 1); @@ -981,6 +1025,7 @@ int send_scanrequest(char *string, int pp, int num) Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest); Z_ScanRequest *req = apdu->u.scanRequest; + req->referenceId = set_refid (out); req->num_databaseNames = num_databaseNames; req->databaseNames = databaseNames; req->termListAndStartPoint = p_query_scan(out, protocol, @@ -995,7 +1040,7 @@ 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 = 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; @@ -1007,71 +1052,74 @@ int send_sortrequest(char *arg, int newset) else sprintf (setstring, "default"); + req->referenceId = set_refid (out); + req->inputResultSetNames = - odr_malloc (out, sizeof(*req->inputResultSetNames)); + (Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames)); req->inputResultSetNames->num_strings = 1; req->inputResultSetNames->strings = - odr_malloc (out, sizeof(*req->inputResultSetNames->strings)); + (char **)odr_malloc (out, sizeof(*req->inputResultSetNames->strings)); req->inputResultSetNames->strings[0] = - odr_malloc (out, strlen(setstring)+1); + (char *)odr_malloc (out, strlen(setstring)+1); strcpy (req->inputResultSetNames->strings[0], setstring); if (newset && setnumber >= 0) sprintf (setstring, "%d", ++setnumber); - req->sortedResultSetName = odr_malloc (out, strlen(setstring)+1); + req->sortedResultSetName = (char *)odr_malloc (out, strlen(setstring)+1); strcpy (req->sortedResultSetName, setstring); req->sortSequence = sksl; sksl->num_specs = 0; - sksl->specs = odr_malloc (out, sizeof(sksl->specs) * 20); + sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20); bib1.proto = protocol; bib1.oclass = CLASS_ATTSET; bib1.value = VAL_BIB1; - while ((sscanf (arg, "%31s %31s%n", sort_string, sort_flags, &off)) == 2) + while ((sscanf (arg, "%31s %31s%n", sort_string, sort_flags, &off)) == 2 + && off > 1) { int i; char *sort_string_sep; - Z_SortKeySpec *sks = odr_malloc (out, sizeof(*sks)); - Z_SortKey *sk = odr_malloc (out, sizeof(*sk)); + Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks)); + Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk)); arg += off; sksl->specs[sksl->num_specs++] = sks; - sks->sortElement = odr_malloc (out, sizeof(*sks->sortElement)); + sks->sortElement = (Z_SortElement *)odr_malloc (out, sizeof(*sks->sortElement)); sks->sortElement->which = Z_SortElement_generic; sks->sortElement->u.generic = sk; if ((sort_string_sep = strchr (sort_string, '='))) { - Z_AttributeElement *el = odr_malloc (out, sizeof(*el)); + Z_AttributeElement *el = (Z_AttributeElement *)odr_malloc (out, sizeof(*el)); sk->which = Z_SortKey_sortAttributes; sk->u.sortAttributes = - odr_malloc (out, sizeof(*sk->u.sortAttributes)); + (Z_SortAttributes *)odr_malloc (out, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = oid_ent_to_oid(&bib1, oid); sk->u.sortAttributes->list = - odr_malloc (out, sizeof(*sk->u.sortAttributes->list)); + (Z_AttributeList *)odr_malloc (out, sizeof(*sk->u.sortAttributes->list)); sk->u.sortAttributes->list->num_attributes = 1; sk->u.sortAttributes->list->attributes = - odr_malloc (out, + (Z_AttributeElement **)odr_malloc (out, sizeof(*sk->u.sortAttributes->list->attributes)); sk->u.sortAttributes->list->attributes[0] = el; el->attributeSet = 0; - el->attributeType = odr_malloc (out, sizeof(*el->attributeType)); + el->attributeType = (int *)odr_malloc (out, sizeof(*el->attributeType)); *el->attributeType = atoi (sort_string); el->which = Z_AttributeValue_numeric; - el->value.numeric = odr_malloc (out, sizeof(*el->value.numeric)); + el->value.numeric = (int *)odr_malloc (out, sizeof(*el->value.numeric)); *el->value.numeric = atoi (sort_string_sep + 1); } else { sk->which = Z_SortKey_sortField; - sk->u.sortField = odr_malloc (out, strlen(sort_string)+1); + sk->u.sortField = (char *)odr_malloc (out, strlen(sort_string)+1); strcpy (sk->u.sortField, sort_string); } - sks->sortRelation = odr_malloc (out, sizeof(*sks->sortRelation)); + sks->sortRelation = (int *)odr_malloc (out, sizeof(*sks->sortRelation)); *sks->sortRelation = Z_SortRelation_ascending; - sks->caseSensitivity = odr_malloc (out, sizeof(*sks->caseSensitivity)); + sks->caseSensitivity = (int *)odr_malloc (out, sizeof(*sks->caseSensitivity)); *sks->caseSensitivity = Z_SortCase_caseSensitive; sks->missingValueAction = NULL; @@ -1102,7 +1150,10 @@ int send_sortrequest(char *arg, int newset) } } if (!sksl->num_specs) - return 0; + { + printf ("Missing sort specifications\n"); + return -1; + } send_apdu(apdu); return 2; } @@ -1123,9 +1174,13 @@ void display_term(Z_TermInfo *t) void process_scanResponse(Z_ScanResponse *res) { int i; - - printf("SCAN: %d entries, position=%d\n", *res->numberOfEntriesReturned, - *res->positionOfTerm); + + printf("Received ScanResponse\n"); + print_refid (res->referenceId); + printf("%d entries", *res->numberOfEntriesReturned); + if (res->positionOfTerm) + printf (", position=%d", *res->positionOfTerm); + printf ("\n"); if (*res->scanStatus != Z_Scan_success) printf("Scan returned code %d\n", *res->scanStatus); if (!res->entries) @@ -1150,7 +1205,7 @@ void process_scanResponse(Z_ScanResponse *res) void process_sortResponse(Z_SortResponse *res) { - printf("Sort: status="); + printf("Received SortResponse: status="); switch (*res->sortStatus) { case Z_SortStatus_success: @@ -1163,6 +1218,7 @@ void process_sortResponse(Z_SortResponse *res) printf ("unknown (%d)", *res->sortStatus); } printf ("\n"); + print_refid (res->referenceId); if (res->diagnostics) display_diagrecs(res->diagnostics->diagRecs, res->diagnostics->num_diagRecs); @@ -1296,6 +1352,18 @@ int cmd_querytype (char *arg) return 1; } +int cmd_refid (char *arg) +{ + xfree (refid); + refid = NULL; + if (*arg) + { + refid = (char *) xmalloc (strlen(arg)+1); + strcpy (refid, arg); + } + return 1; +} + int cmd_close(char *arg) { Z_APDU *apdu = zget_APDU(out, Z_APDU_close); @@ -1361,6 +1429,7 @@ static int client(int wait) {"close", cmd_close, ""}, {"attributeset", cmd_attributeset, ""}, {"querytype", cmd_querytype, ""}, + {"refid", cmd_refid, ""}, {0,0} }; char *netbuffer= 0; @@ -1427,6 +1496,7 @@ static int client(int wait) continue; } } + wait = 0; #ifdef USE_SELECT if (conn && FD_ISSET(cs_fileno(conn), &input)) #endif @@ -1474,6 +1544,7 @@ static int client(int wait) process_scanResponse(apdu->u.scanResponse); break; case Z_APDU_presentResponse: + print_refid (apdu->u.presentResponse->referenceId); setno += *apdu->u.presentResponse->numberOfRecordsReturned; if (apdu->u.presentResponse->records) @@ -1488,17 +1559,20 @@ static int client(int wait) printf("Target has closed the association.\n"); process_close(apdu->u.close); break; + case Z_APDU_resourceControlRequest: + process_resourceControlRequest + (apdu->u.resourceControlRequest); + break; default: printf("Received unknown APDU type (%d).\n", apdu->which); exit(1); } - printf(C_PROMPT); - fflush(stdout); } while (cs_more(conn)); + printf(C_PROMPT); + fflush(stdout); } - wait = 0; } return 0; }