X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=b5a11ebadd1abf916745521e2b3b2657077802b0;hb=48fdd95e1a026cfcc20ddd2329f0bda940f936e2;hp=9f44998e74778694729ce93c7fb0762edb58ccb3;hpb=4602e6f66713b5c44cebd5a8deb2790e2cdea91e;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 9f44998..b5a11eb 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.276 2005-04-20 12:59:51 adam Exp $ + * $Id: client.c,v 1.283 2005-06-06 07:25:47 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; @@ -1280,6 +1281,34 @@ static int send_srw(Z_SRW_PDU *sr) #endif #if HAVE_XML2 +static char *encode_SRW_term(ODR o, const char *q) +{ + const char *in_charset = "ISO-8859-1"; + WRBUF w = wrbuf_alloc(); + yaz_iconv_t cd; + char *res; + if (outputCharset) + in_charset = outputCharset; + cd = yaz_iconv_open("UTF-8", in_charset); + if (!cd) + { + wrbuf_free(w, 1); + return odr_strdup(o, q); + } + wrbuf_iconv_write(w, cd, q, strlen(q)); + if (wrbuf_len(w)) + { + int len = wrbuf_len(w); + res = odr_strdupn(o, wrbuf_buf(w), len); + } + else + res = odr_strdup(o, q); + yaz_iconv_close(cd); + wrbuf_free(w, 1); + return res; +} + + static int send_SRW_scanRequest(const char *arg, int pos, int num) { Z_SRW_PDU *sr = 0; @@ -1291,11 +1320,11 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) { case QueryType_CQL: sr->u.scan_request->query_type = Z_SRW_query_type_cql; - sr->u.scan_request->scanClause.cql = odr_strdup(out, arg); + sr->u.scan_request->scanClause.cql = encode_SRW_term(out, arg); break; case QueryType_Prefix: sr->u.scan_request->query_type = Z_SRW_query_type_pqf; - sr->u.scan_request->scanClause.pqf = odr_strdup(out, arg); + sr->u.scan_request->scanClause.pqf = encode_SRW_term(out, arg); break; default: printf ("Only CQL and PQF supported in SRW\n"); @@ -1329,17 +1358,17 @@ static int send_SRW_searchRequest(const char *arg) { case QueryType_CQL: srw_sr->u.request->query_type = Z_SRW_query_type_cql; - srw_sr->u.request->query.cql = odr_strdup(srw_sr_odr_out, arg); + srw_sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg); sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = odr_strdup(out, arg); + sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg); break; case QueryType_Prefix: srw_sr->u.request->query_type = Z_SRW_query_type_pqf; - srw_sr->u.request->query.pqf = odr_strdup(srw_sr_odr_out, arg); + srw_sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg); sr->u.request->query_type = Z_SRW_query_type_pqf; - sr->u.request->query.pqf = odr_strdup(out, arg); + sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg); break; default: printf ("Only CQL and PQF supported in SRW\n"); @@ -2254,6 +2283,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 { @@ -3335,6 +3366,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*/ @@ -3511,7 +3564,7 @@ static void initialize(void) #if HAVE_GETTIMEOFDAY -struct timeval tv_start, tv_end; +struct timeval tv_start; #endif #if HAVE_XML2 @@ -3691,6 +3744,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) @@ -3723,6 +3780,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; @@ -3813,10 +3875,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, @@ -3827,8 +3888,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); } @@ -3967,6 +4028,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"); @@ -4048,6 +4110,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); @@ -4105,6 +4181,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}, @@ -4114,6 +4191,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}, @@ -4145,29 +4223,48 @@ static int cmd_help (const char *line) for (i = 0; cmd_array[i].cmd; i++) if (*topic == 0 || strcmp (topic, cmd_array[i].cmd) == 0) printf(" %s %s\n", cmd_array[i].cmd, cmd_array[i].ad); - if (strcmp (topic, "find") == 0) - { - printf ("RPN:\n"); - printf (" \"term\" Simple Term\n"); - printf (" @attr [attset] type=value op Attribute\n"); - printf (" @and opl opr And\n"); - printf (" @or opl opr Or\n"); - printf (" @not opl opr And-Not\n"); - printf (" @set set Result set\n"); - printf ("\n"); - printf ("Bib-1 attribute types\n"); - printf ("1=Use: "); - printf ("4=Title 7=ISBN 8=ISSN 30=Date 62=Abstract 1003=Author 1016=Any\n"); - printf ("2=Relation: "); - printf ("1< 2<= 3= 4>= 5> 6!= 102=Relevance\n"); - printf ("3=Position: "); - printf ("1=First in Field 2=First in subfield 3=Any position\n"); - printf ("4=Structure: "); - printf ("1=Phrase 2=Word 3=Key 4=Year 5=Date 6=WordList\n"); - printf ("5=Truncation: "); - printf ("1=Right 2=Left 3=L&R 100=No 101=# 102=Re-1 103=Re-2\n"); - printf ("6=Completeness:"); - printf ("1=Incomplete subfield 2=Complete subfield 3=Complete field\n"); + if (!strcmp(topic, "find")) + { + printf("RPN:\n"); + printf(" \"term\" Simple Term\n"); + printf(" @attr [attset] type=value op Attribute\n"); + printf(" @and opl opr And\n"); + printf(" @or opl opr Or\n"); + printf(" @not opl opr And-Not\n"); + printf(" @set set Result set\n"); + printf(" @prox exl dist ord rel uc ut Proximity. Use help prox\n"); + printf("\n"); + printf("Bib-1 attribute types\n"); + printf("1=Use: "); + printf("4=Title 7=ISBN 8=ISSN 30=Date 62=Abstract 1003=Author 1016=Any\n"); + printf("2=Relation: "); + printf("1< 2<= 3= 4>= 5> 6!= 102=Relevance\n"); + printf("3=Position: "); + printf("1=First in Field 2=First in subfield 3=Any position\n"); + printf("4=Structure: "); + printf("1=Phrase 2=Word 3=Key 4=Year 5=Date 6=WordList\n"); + printf("5=Truncation: "); + printf("1=Right 2=Left 3=L&R 100=No 101=# 102=Re-1 103=Re-2\n"); + printf("6=Completeness:"); + printf("1=Incomplete subfield 2=Complete subfield 3=Complete field\n"); + } + if (!strcmp(topic, "prox")) + { + printf("Proximity:\n"); + printf(" @prox exl dist ord rel uc ut\n"); + printf(" exl: exclude flag . 0=include, 1=exclude.\n"); + printf(" dist: distance integer.\n"); + printf(" ord: order flag. 0=unordered, 1=ordered.\n"); + printf(" rel: relation integer. 1< 2<= 3= 4>= 5> 6!= .\n"); + printf(" uc: unit class. k=known, p=private.\n"); + printf(" ut: unit type. 1=character, 2=word, 3=sentence,\n"); + printf(" 4=paragraph, 5=section, 6=chapter, 7=document,\n"); + printf(" 8=element, 9=subelement, 10=elementType, 11=byte.\n"); + printf("\nExamples:\n"); + printf(" Search for a and b in-order at most 3 words apart:\n"); + printf(" @prox 0 3 1 2 k 2 a b\n"); + printf(" Search for any order of a and b next to each other:\n"); + printf(" @prox 0 1 0 3 k 2 a b\n"); } return 1; } @@ -4257,14 +4354,13 @@ void process_cmd_line(char* line) if (!cmd_array[i].cmd) /* dump our help-screen */ { printf("Unknown command: %s.\n", word); - printf("use help for list of commands\n"); - /* cmd_help (""); */ + printf("Type 'help' for list of commands\n"); res = 1; } if(apdu_file) fflush(apdu_file); - if (res >= 2) + if (res >= 2 && auto_wait) wait_and_handle_response(); if(apdu_file)