X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=16ac8e48f8594828197d825f1116907a62a53726;hb=986cee5f65c6f0d5dde92b7fe2977a4532ecd3f9;hp=4d86ecae43873043d0193906e89bf07501b3cb46;hpb=b440dce0831a72bebe4f4821ab7771cc05e8facb;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 4d86eca..16ac8e4 100644 --- a/client/client.c +++ b/client/client.c @@ -1,10 +1,59 @@ /* - * 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.87 1999-08-27 09:40:32 adam + * Revision 1.102 2000-05-18 11:57:04 adam + * Client display time elapsed. + * + * Revision 1.101 2000/04/05 07:39:54 adam + * Added shared library support (libtool). + * + * Revision 1.100 2000/03/20 19:29:59 adam + * Minor change. + * + * Revision 1.99 2000/03/20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.98 2000/03/16 13:55:49 ian + * Added commands for sending shutdown and startup admin requests via the admin ES. + * + * Revision 1.97 2000/03/14 14:06:04 ian + * Minor change to order of debugging output for send_apdu, + * fixed encoding of admin request. + * + * 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 + * Added status elements for backend delete result set handler. + * Updated delete result result set command for client. + * + * Revision 1.88 1999/10/11 10:00:29 adam + * Modified printing of records. + * + * Revision 1.87 1999/08/27 09:40:32 adam * Renamed logf function to yaz_log. Removed VC++ project files. * * Revision 1.86 1999/07/06 12:13:35 adam @@ -289,23 +338,26 @@ #include #include #include -#include -#include +#include -#include +#include #ifdef USE_XTIMOSI -#include +#include #endif -#include -#include -#include +#include +#include +#include -#include +#include + +#ifdef ASN_COMPILED +#include +#endif #if CCL2RPN -#include +#include #endif #if HAVE_READLINE_READLINE_H @@ -315,15 +367,17 @@ #include #endif +#include "admin.h" + #define C_PROMPT "Z> " static ODR out, in, print; /* encoding and decoding streams */ static FILE *apdu_file = 0; static COMSTACK conn = 0; /* our z-association */ static Z_IdAuthentication *auth = 0; /* our current auth definition */ -static char *databaseNames[128]; +char *databaseNames[128]; +int num_databaseNames = 0; static Z_External *record_last = 0; -static int num_databaseNames = 0; static int setnumber = 0; /* current result set number */ static int smallSetUpperBound = 0; static int largeSetLowerBound = 1; @@ -353,22 +407,28 @@ 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; - if (!z_APDU(out, &a, 0, 0)) - { - odr_perror(out, "Encoding APDU"); - exit(1); - } if (apdu_file) { z_APDU(print, &a, 0, 0); odr_reset(print); } + if (!z_APDU(out, &a, 0, 0)) + { + odr_perror(out, "Encoding APDU"); + exit(1); + } 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))); @@ -663,6 +723,19 @@ static void display_grs1(Z_GenericRecord *r, int level) } } +static void print_record(const unsigned char *buf, size_t len) +{ + size_t i; + for (i = 0; i= 32) || strchr ("\n\r\t\f", buf[i])) + fputc (buf[i], stdout); + else + printf ("\\X%02X", buf[i]); + /* add newline if not already added ... */ + if (i <= 0 || buf[i-1] != '\n') + fputc ('\n', stdout); +} + static void display_record(Z_DatabaseRecord *p) { Z_External *r = (Z_External*) p; @@ -715,23 +788,23 @@ static void display_record(Z_DatabaseRecord *p) } } if (ent && ent->value == VAL_SOIF) - printf("%.*s", r->u.octet_aligned->len, r->u.octet_aligned->buf); + 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) - { - int i; - for (i = 0; iu.octet_aligned->len; i++) - if (octet_buf[i] > 126 || octet_buf[i] < 7) - printf ("<%02X>", octet_buf[i]); - else - fputc (octet_buf[i], stdout); - printf ("\n"); - } + 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); } @@ -742,7 +815,7 @@ static void display_record(Z_DatabaseRecord *p) printf("Expecting single SUTRS type for SUTRS.\n"); return; } - printf("%.*s", r->u.sutrs->len, r->u.sutrs->buf); + print_record(r->u.sutrs->buf, r->u.sutrs->len); } else if (ent && ent->value == VAL_GRS1) { @@ -844,18 +917,35 @@ static void display_records(Z_Records *p) static int send_deleteResultSetRequest(char *arg) { + char names[8][32]; + int i; + Z_APDU *apdu = zget_APDU(out, Z_APDU_deleteResultSetRequest); Z_DeleteResultSetRequest *req = apdu->u.deleteResultSetRequest; req->referenceId = set_refid (out); - req->num_resultSetList = 1; - req->resultSetList = (char **) - odr_malloc (out, sizeof(*req->resultSetList)); - *req->resultSetList = arg; + req->num_resultSetList = + sscanf (arg, "%30s %30s %30s %30s %30s %30s %30s %30s", + names[0], names[1], names[2], names[3], + names[4], names[5], names[6], names[7]); + req->deleteFunction = (int *) odr_malloc (out, sizeof(*req->deleteFunction)); - *req->deleteFunction = Z_DeleteRequest_list; + if (req->num_resultSetList > 0) + { + *req->deleteFunction = Z_DeleteRequest_list; + req->resultSetList = (char **) + odr_malloc (out, sizeof(*req->resultSetList)* + req->num_resultSetList); + for (i = 0; inum_resultSetList; i++) + req->resultSetList[i] = names[i]; + } + else + { + *req->deleteFunction = Z_DeleteRequest_all; + req->resultSetList = 0; + } send_apdu(apdu); printf("Sent deleteResultSetRequest.\n"); @@ -949,7 +1039,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; @@ -1164,7 +1258,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; @@ -1211,33 +1440,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; @@ -1303,10 +1536,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); } @@ -1329,11 +1567,6 @@ static int cmd_find(char *arg) static int cmd_delete(char *arg) { - if (!*arg) - { - printf("Delete what?\n"); - return 0; - } if (!conn) { printf("Not connected yet\n"); @@ -1799,6 +2032,21 @@ void process_sortResponse(Z_SortResponse *res) #endif } +void process_deleteResultSetResponse (Z_DeleteResultSetResponse *res) +{ + printf("Got deleteResultSetResponse status=%d\n", + *res->deleteOperationStatus); + if (res->deleteListStatuses) + { + int i; + for (i = 0; i < res->deleteListStatuses->num; i++) + { + printf ("%s status=%d\n", res->deleteListStatuses->elements[i]->id, + *res->deleteListStatuses->elements[i]->status); + } + } +} + int cmd_sort_generic(char *arg, int newset) { if (!conn) @@ -2030,14 +2278,30 @@ static int client(int wait) {"attributeset", cmd_attributeset, ""}, {"querytype", cmd_querytype, ""}, {"refid", cmd_refid, ""}, - {"itemorder", cmd_itemorder, ""}, + {"itemorder", cmd_itemorder, "1|2 "}, {"update", cmd_update, ""}, +#ifdef ASN_COMPILED + /* Server Admin Functions */ + {"adm-reindex", cmd_adm_reindex, ""}, + {"adm-truncate", cmd_adm_truncate, "('database'|'index')"}, + {"adm-create", cmd_adm_create, ""}, + {"adm-drop", cmd_adm_drop, "('database'|'index')"}, + {"adm-import", cmd_adm_import, " "}, + {"adm-refresh", cmd_adm_refresh, ""}, + {"adm-commit", cmd_adm_commit, ""}, + {"adm-shutdown", cmd_adm_shutdown, ""}, + {"adm-startup", cmd_adm_startup, ""}, +#endif {0,0} }; char *netbuffer= 0; int netbufferlen = 0; int i; Z_APDU *apdu; +#if HAVE_GETTIMEOFDAY + struct timeval tv_start, tv_end; + gettimeofday (&tv_start, 0); +#endif while (1) { @@ -2084,6 +2348,10 @@ static int client(int wait) if ((end_p = strchr (line, '\n'))) *end_p = '\0'; #endif +#if HAVE_GETTIMEOFDAY + gettimeofday (&tv_start, 0); +#endif + if ((res = sscanf(line, "%s %[^;]", word, arg)) <= 0) { strcpy(word, last_cmd); @@ -2112,9 +2380,11 @@ static int client(int wait) } } wait = 0; + if (conn #ifdef USE_SELECT - if (conn && FD_ISSET(cs_fileno(conn), &input)) + && FD_ISSET(cs_fileno(conn), &input) #endif + ) { do { @@ -2138,6 +2408,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)) @@ -2184,9 +2456,8 @@ static int client(int wait) (apdu->u.resourceControlRequest); break; case Z_APDU_deleteResultSetResponse: - printf("Got deleteResultSetResponse status=%d\n", - *apdu->u.deleteResultSetResponse-> - deleteOperationStatus); + process_deleteResultSetResponse(apdu->u. + deleteResultSetResponse); break; default: printf("Received unknown APDU type (%d).\n", @@ -2195,6 +2466,15 @@ static int client(int wait) } } while (conn && cs_more(conn)); +#if HAVE_GETTIMEOFDAY + gettimeofday (&tv_end, 0); + if (1) + { + printf ("Elapsed: %.6f\n", (double) tv_end.tv_usec / + 1e6 + tv_end.tv_sec - + ((double) tv_start.tv_usec / 1e6 + tv_start.tv_sec)); + } +#endif } } return 0; @@ -2236,7 +2516,7 @@ int main(int argc, char **argv) log_init (log_mask_str(arg), "", NULL); break; default: - fprintf (stderr, "Usage: %s [-m ] [ -m ] " + fprintf (stderr, "Usage: %s [-m ] [ -a ] " "[]\n", prog); exit (1);