X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=bfeeb4cbf21bfe78e4e65de57bfec40825242f23;hb=b853eb3de1a249859eef71c9a285172a199656ce;hp=f5ccc78c5326a9ba9148ee347f888e39feebf5fe;hpb=7dbe4028e0cb3a7ed57fb2bbb0b05e62e112f56a;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index f5ccc78..bfeeb4c 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.280 2005-05-09 08:51:48 adam Exp $ + * $Id: client.c,v 1.284 2005-06-06 10:29:33 adam Exp $ */ #include @@ -126,6 +126,7 @@ static FILE *marc_file = 0; static char *refid = NULL; static char *last_open_command = NULL; static int auto_reconnect = 0; +static int auto_wait = 1; static Odr_bitmask z3950_options; static int z3950_version = 3; static int scan_stepSize = 0; @@ -1840,6 +1841,11 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } } + if (res->taskPackage && res->taskPackage->which == Z_External_octet) + { + Odr_oct *doc = res->taskPackage->u.octet_aligned; + printf("%.*s\n", doc->len, doc->buf); + } } const char *get_ill_element (void *clientData, const char *element) @@ -2245,6 +2251,29 @@ static int cmd_update_common(const char *arg, int version) return 2; } +static int cmd_xmlupdate(const char *arg) +{ + Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest); + Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; + + req->packageType = yaz_oidval_to_z3950oid(out, CLASS_EXTSERV, + VAL_XMLUPDATE); + Z_External *ext = (Z_External *) odr_malloc(out, sizeof(*ext)); + req->taskSpecificParameters = ext; + ext->direct_reference = req->packageType; + ext->descriptor = 0; + ext->indirect_reference = 0; + + ext->which = Z_External_octet; + ext->u.single_ASN1_type = (Odr_oct *) odr_malloc (out, sizeof(Odr_oct)); + + ext->u.single_ASN1_type->buf = (unsigned char*) odr_strdup(out, arg); + ext->u.single_ASN1_type->size = ext->u.single_ASN1_type->len = strlen(arg); + send_apdu(apdu); + + return 2; +} + static int cmd_itemorder(const char *arg) { char type[12]; @@ -2282,6 +2311,8 @@ static int cmd_options(const char *arg) int r; int pos; r = yaz_init_opt_encode(&z3950_options, arg, &pos); + if (r == -1) + printf("Unknown option(s) near %s\n", arg+pos); } else { @@ -3363,6 +3394,28 @@ int cmd_set_auto_reconnect(const char* arg) return 0; } + +int cmd_set_auto_wait(const char* arg) +{ + if(strlen(arg)==0) { + auto_wait = ! auto_wait; + } else if(strcmp(arg,"on")==0) { + auto_wait = 1; + } else if(strcmp(arg,"off")==0) { + auto_wait = 0; + } else { + printf("Error use on or off\n"); + return 1; + } + + if (auto_wait) + printf("Set auto wait enabled.\n"); + else + printf("Set auto wait disabled.\n"); + + return 0; +} + int cmd_set_marcdump(const char* arg) { if(marc_file && marc_file != stderr) { /* don't close stdout*/ @@ -3539,7 +3592,7 @@ static void initialize(void) #if HAVE_GETTIMEOFDAY -struct timeval tv_start, tv_end; +struct timeval tv_start; #endif #if HAVE_XML2 @@ -3719,6 +3772,10 @@ void wait_and_handle_response() int res; char *netbuffer= 0; int netbufferlen = 0; +#if HAVE_GETTIMEOFDAY + int got_tv_end = 0; + struct timeval tv_end; +#endif Z_GDU *gdu; while(conn) @@ -3751,6 +3808,11 @@ void wait_and_handle_response() close_session(); break; } +#if HAVE_GETTIMEOFDAY + if (got_tv_end == 0) + gettimeofday (&tv_end, 0); /* count first one only */ + got_tv_end++; +#endif odr_reset(out); odr_reset(in); /* release APDU from last round */ record_last = 0; @@ -3841,10 +3903,9 @@ void wait_and_handle_response() if (conn && !cs_more(conn)) break; } - if (conn) - { #if HAVE_GETTIMEOFDAY - gettimeofday (&tv_end, 0); + if (got_tv_end) + { #if 0 printf ("S/U S/U=%ld/%ld %ld/%ld", (long) tv_start.tv_sec, @@ -3855,8 +3916,8 @@ void wait_and_handle_response() 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 } +#endif xfree (netbuffer); } @@ -3995,6 +4056,7 @@ int cmd_list_all(const char* args) { if(yazProxy) printf("using proxy : %s\n",yazProxy); printf("auto_reconnect : %s\n",auto_reconnect?"on":"off"); + printf("auto_wait : %s\n",auto_wait?"on":"off"); if (!auth) { printf("Authentication : none\n"); @@ -4076,6 +4138,20 @@ int cmd_clear_otherinfo(const char* args) return 0; } +int cmd_wait_response(const char *arg) +{ + int wait_for = atoi(arg); + int i=0; + if( wait_for < 1 ) { + wait_for = 1; + }; + + for( i=0 ; i < wait_for ; ++i ) { + wait_and_handle_response( ); + }; + return 0; +} + static int cmd_help (const char *line); typedef char *(*completerFunctionType)(const char *text, int state); @@ -4118,6 +4194,7 @@ static struct { {"itemorder", cmd_itemorder, "ill|item ",NULL,0,NULL}, {"update", cmd_update, " []",NULL,0,NULL}, {"update0", cmd_update0, " []",NULL,0,NULL}, + {"xmlupdate", cmd_xmlupdate, " ",NULL,0,NULL}, {"packagename", cmd_packagename, "",NULL,0,NULL}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, {"charset", cmd_charset, " ",NULL,0,NULL}, @@ -4133,6 +4210,7 @@ static struct { {"set_cclfile", cmd_set_cclfile," ",NULL,1,NULL}, {"set_cqlfile", cmd_set_cqlfile," ",NULL,1,NULL}, {"set_auto_reconnect", cmd_set_auto_reconnect," on|off",complete_auto_reconnect,1,NULL}, + {"set_auto_wait", cmd_set_auto_wait," on|off",complete_auto_reconnect,1,NULL}, {"set_otherinfo", cmd_set_otherinfo," ",NULL,0,NULL}, {"sleep", cmd_sleep,"",NULL,0,NULL}, {"register_oid", cmd_register_oid," ",NULL,0,NULL}, @@ -4142,6 +4220,7 @@ static struct { {"list_otherinfo",cmd_list_otherinfo,"[otherinfoinddex]",NULL,0,NULL}, {"list_all",cmd_list_all,"",NULL,0,NULL}, {"clear_otherinfo",cmd_clear_otherinfo,"",NULL,0,NULL}, + {"wait_response",cmd_wait_response,"",NULL,0,NULL}, /* Server Admin Functions */ {"adm-reindex", cmd_adm_reindex, "",NULL,0,NULL}, {"adm-truncate", cmd_adm_truncate, "('database'|'index')",NULL,0,NULL}, @@ -4310,7 +4389,7 @@ void process_cmd_line(char* line) if(apdu_file) fflush(apdu_file); - if (res >= 2) + if (res >= 2 && auto_wait) wait_and_handle_response(); if(apdu_file)