X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=client%2Fclient.c;h=0c67a8771cd97b6a929ab41175d701a9a8df8465;hb=27e67487d8100738feb98ae7315540846d6bfdf0;hp=00764e49cf19ac805652045734b8263e6df9df51;hpb=a97dab98e81128f07806d68b6891dbf65c732ede;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 00764e4..0c67a87 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.145 2002-02-24 12:24:40 adam Exp $ + * $Id: client.c,v 1.156 2002-06-02 21:34:45 adam Exp $ */ #include @@ -20,17 +20,14 @@ #include #include #include +#include #include #include -#if YAZ_MODULE_ill #include -#endif -#if YAZ_MODULE_ccl #include -#endif #if HAVE_READLINE_READLINE_H #include @@ -72,6 +69,8 @@ static char ccl_fields[512] = "default.bib"; static char* esPackageName = 0; static char* yazProxy = 0; static int kilobytes = 1024; +static char* yazCharset = 0; +static char* yazLang = 0; static char last_cmd[32] = "?"; static FILE *marcdump = 0; @@ -85,10 +84,14 @@ typedef enum { static QueryType queryType = QueryType_Prefix; -#if YAZ_MODULE_ccl static CCL_bibset bibset; /* CCL bibset handle */ -#endif +#if HAVE_READLINE_COMPLETION_OVER + +#else +/* readline doesn't have this var. Define it ourselves. */ +int rl_attempted_completion_over = 0; +#endif /* set this one to 1, to avoid decode of unknown MARCs */ #define AVOID_MARC_DECODE 1 @@ -198,6 +201,23 @@ static void send_initRequest(const char* type_and_host) yaz_oi_set_string_oidval(&req->otherInfo, out, VAL_PROXY, 1, type_and_host); + if (yazCharset || yazLang) { + Z_OtherInformation **p; + Z_OtherInformationUnit *p0; + + yaz_oi_APDU(apdu, &p); + + if (p0=yaz_oi_update(p, out, NULL, 0, 0)) { + ODR_MASK_SET(req->options, Z_Options_negotiationModel); + + p0->which = Z_OtherInfo_externallyDefinedInfo; + p0->information.externallyDefinedInfo = + yaz_set_proposal_charneg(out, + (const char**)&yazCharset, (yazCharset)?1:0, + (const char**)&yazLang, (yazLang)?1:0, 1); + } + } + send_apdu(apdu); printf("Sent initrequest.\n"); } @@ -275,6 +295,24 @@ static int process_initResponse(Z_InitResponse *res) if (ODR_MASK_GET(res->options, Z_Options_queryType104)) printf (" queryType104"); printf ("\n"); + + if (ODR_MASK_GET(res->options, Z_Options_negotiationModel)) { + + Z_CharSetandLanguageNegotiation *p = + yaz_get_charneg_record(res->otherInfo); + + if (p) { + + char *charset=NULL, *lang=NULL; + int selected; + + yaz_get_response_charneg(session_mem, p, &charset, &lang, &selected); + + printf("Accepted character set : `%s'\n", charset); + printf("Accepted code language : `%s'\n", lang); + printf("Accepted records in ...: %d\n", selected ); + } + } fflush (stdout); return 0; } @@ -308,17 +346,16 @@ static int cmd_base(char *arg) return 1; } - int cmd_open(char *arg) { void *add; char type_and_host[101], base[101]; CS_TYPE t; - + if (conn) { printf("Already connected.\n"); - + cs_close (conn); conn = NULL; if (session_mem) @@ -331,30 +368,30 @@ int cmd_open(char *arg) base[0] = '\0'; if (sscanf (arg, "%100[^/]/%100s", type_and_host, base) < 1) return 0; - + if(yazProxy) - conn = cs_create_host(yazProxy, 1, &add); + conn = cs_create_host(yazProxy, 1, &add); else - conn = cs_create_host(type_and_host, 1, &add); + conn = cs_create_host(type_and_host, 1, &add); if (!conn) { - printf ("Couldn't create comstack\n"); - return 0; + printf ("Couldn't create comstack\n"); + return 0; } printf("Connecting..."); fflush(stdout); if (cs_connect(conn, add) < 0) { - printf ("error = %s\n", cs_strerror(conn)); - if (conn->cerrno == CSYSERR) - perror("system"); + printf ("error = %s\n", cs_strerror(conn)); + if (conn->cerrno == CSYSERR) + perror("system"); cs_close(conn); conn = 0; return 0; } printf("Ok.\n"); - + send_initRequest(type_and_host); if (*base) cmd_base (base); @@ -399,6 +436,7 @@ int cmd_authentication(char *arg) } /* SEARCH SERVICE ------------------------------ */ +static void display_record(Z_External *r); static void display_variant(Z_Variant *v, int level) { @@ -420,7 +458,9 @@ static void display_grs1(Z_GenericRecord *r, int level) int i; if (!r) + { return; + } for (i = 0; i < r->num_elements; i++) { Z_TaggedElement *t; @@ -438,8 +478,13 @@ static void display_grs1(Z_GenericRecord *r, int level) printf("%s) ", t->tagValue->u.string); if (t->content->which == Z_ElementData_subtree) { - printf("\n"); - display_grs1(t->content->u.subtree, level+1); + if (!t->content->u.subtree) + printf (" (no subtree)\n"); + else + { + printf("\n"); + display_grs1(t->content->u.subtree, level+1); + } } else if (t->content->which == Z_ElementData_string) printf("%s\n", t->content->u.string); @@ -449,7 +494,7 @@ static void display_grs1(Z_GenericRecord *r, int level) { int *ip = t->content->u.oid; oident *oent; - + if ((oent = oid_getentbyoid(t->content->u.oid))) printf("OID: %s\n", oent->desc); else @@ -466,8 +511,15 @@ static void display_grs1(Z_GenericRecord *r, int level) printf("[Element empty]\n"); else if (t->content->which == Z_ElementData_elementNotThere) printf("[Element not there]\n"); + else if (t->content->which == Z_ElementData_date) + printf("Date: %s\n", t->content->u.date); + else if (t->content->which == Z_ElementData_ext) + { + printf ("External\n"); + display_record (t->content->u.ext); + } else - printf("??????\n"); + printf("? type = %d\n",t->content->which); if (t->appliedVariant) display_variant(t->appliedVariant, level+1); if (t->metaData && t->metaData->supportedVariants) @@ -491,7 +543,7 @@ static void print_record(const unsigned char *buf, size_t len) print_stringn (buf, len); /* add newline if not already added ... */ if (i <= 0 || buf[i-1] != '\n') - printf ("\n"); + printf ("\n"); } static void display_record(Z_External *r) @@ -544,6 +596,8 @@ static void display_record(Z_External *r) r->which = type->what; } } + if (ent && ent->oclass != CLASS_RECSYN) + return; if (ent && ent->value == VAL_SOIF) print_record((const unsigned char *) r->u.octet_aligned->buf, r->u.octet_aligned->len); @@ -621,7 +675,6 @@ static void display_record(Z_External *r) } } - static void display_diagrecs(Z_DiagRec **pp, int num) { int i; @@ -731,15 +784,12 @@ static int send_searchRequest(char *arg) Z_SearchRequest *req = apdu->u.searchRequest; Z_Query query; int oid[OID_SIZE]; -#if YAZ_MODULE_ccl struct ccl_rpn_node *rpn = NULL; int error, pos; -#endif char setstring[100]; Z_RPNQuery *RPNquery; Odr_oct ccl_query; -#if YAZ_MODULE_ccl if (queryType == QueryType_CCL2RPN) { rpn = ccl_find_str(bibset, arg, &error, &pos); @@ -749,7 +799,6 @@ static int send_searchRequest(char *arg) return 0; } } -#endif req->referenceId = set_refid (out); if (!strcmp(arg, "@big")) /* strictly for troublemaking */ { @@ -807,7 +856,6 @@ static int send_searchRequest(char *arg) ccl_query.buf = (unsigned char*) arg; ccl_query.len = strlen(arg); break; -#if YAZ_MODULE_ccl case QueryType_CCL2RPN: query.which = Z_Query_type_1; RPNquery = ccl_rpn_query(out, rpn); @@ -819,7 +867,6 @@ static int send_searchRequest(char *arg) query.u.type_1 = RPNquery; ccl_rpn_delete (rpn); break; -#endif default: printf ("Unsupported query type\n"); return 0; @@ -830,6 +877,59 @@ static int send_searchRequest(char *arg) return 2; } +/* display Query Expression as part of searchResult-1 */ +static void display_queryExpression (Z_QueryExpression *qe) +{ + if (!qe) + return; + if (qe->which == Z_QueryExpression_term) + { + if (qe->u.term->queryTerm) + { + Z_Term *term = qe->u.term->queryTerm; + if (term->which == Z_Term_general) + printf (" %.*s", term->u.general->len, term->u.general->buf); + } + } + +} + +/* see if we can find USR:SearchResult-1 */ +static void display_searchResult (Z_OtherInformation *o) +{ + int i; + if (!o) + return ; + for (i = 0; i < o->num_elements; i++) + { + if (o->list[i]->which == Z_OtherInfo_externallyDefinedInfo) + { + Z_External *ext = o->list[i]->information.externallyDefinedInfo; + + if (ext->which == Z_External_searchResult1) + { + int j; + Z_SearchInfoReport *sr = ext->u.searchResult1; + printf ("SearchResult-1:"); + for (j = 0; j < sr->num; j++) + { + if (!sr->elements[j]->subqueryExpression) + printf (" %d", j); + display_queryExpression ( + sr->elements[j]->subqueryExpression); + display_queryExpression ( + sr->elements[j]->subqueryInterpretation); + display_queryExpression ( + sr->elements[j]->subqueryRecommendation); + if (sr->elements[j]->subqueryCount) + printf ("(%d)", *sr->elements[j]->subqueryCount); + } + printf ("\n"); + } + } + } +} + static int process_searchResponse(Z_SearchResponse *res) { printf ("Received SearchResponse.\n"); @@ -841,8 +941,10 @@ static int process_searchResponse(Z_SearchResponse *res) printf("Number of hits: %d", *res->resultCount); if (setnumber >= 0) printf (", setno %d", setnumber); - printf("\nrecords returned: %d\n", - *res->numberOfRecordsReturned); + printf ("\n"); + display_searchResult (res->additionalSearchInfo); + printf("records returned: %d\n", + *res->numberOfRecordsReturned); setno += *res->numberOfRecordsReturned; if (res->records) display_records(res->records); @@ -908,18 +1010,18 @@ static void print_string_or_numeric(int iLevel, const char *pTag, Z_StringOrNume { switch (pStringNumeric->which) { - case Z_StringOrNumeric_string: - print_string(iLevel, pTag, pStringNumeric->u.string); - break; - - case Z_StringOrNumeric_numeric: - print_int(iLevel, pTag, pStringNumeric->u.numeric); - break; - - default: - print_level(iLevel); - printf("%s: valid type for Z_StringOrNumeric\n", pTag); - break; + case Z_StringOrNumeric_string: + print_string(iLevel, pTag, pStringNumeric->u.string); + break; + + case Z_StringOrNumeric_numeric: + print_int(iLevel, pTag, pStringNumeric->u.numeric); + break; + + default: + print_level(iLevel); + printf("%s: valid type for Z_StringOrNumeric\n", pTag); + break; } } } @@ -931,18 +1033,22 @@ static void print_universe_report_duplicate(int iLevel, Z_UniverseReportDuplicat print_level(iLevel); printf("Universe Report Duplicate: \n"); iLevel++; - print_string_or_numeric(iLevel, "Hit No", pUniverseReportDuplicate->hitno); + print_string_or_numeric(iLevel, "Hit No", + pUniverseReportDuplicate->hitno); } } -static void print_universe_report_hits(int iLevel, Z_UniverseReportHits *pUniverseReportHits) +static void +print_universe_report_hits(int iLevel, + Z_UniverseReportHits *pUniverseReportHits) { if (pUniverseReportHits != NULL) { print_level(iLevel); printf("Universe Report Hits: \n"); iLevel++; - print_string_or_numeric(iLevel, "Database", pUniverseReportHits->database); + print_string_or_numeric(iLevel, "Database", + pUniverseReportHits->database); print_string_or_numeric(iLevel, "Hits", pUniverseReportHits->hits); } } @@ -957,18 +1063,18 @@ static void print_universe_report(int iLevel, Z_UniverseReport *pUniverseReport) print_int(iLevel, "Total Hits", pUniverseReport->totalHits); switch (pUniverseReport->which) { - case Z_UniverseReport_databaseHits: - print_universe_report_hits(iLevel, pUniverseReport->u.databaseHits); - break; - - case Z_UniverseReport_duplicate: - print_universe_report_duplicate(iLevel, pUniverseReport->u.duplicate); - break; - - default: - print_level(iLevel); - printf("Type: %d\n", pUniverseReport->which); - break; + case Z_UniverseReport_databaseHits: + print_universe_report_hits(iLevel, pUniverseReport->u.databaseHits); + break; + + case Z_UniverseReport_duplicate: + print_universe_report_duplicate(iLevel, pUniverseReport->u.duplicate); + break; + + default: + print_level(iLevel); + printf("Type: %d\n", pUniverseReport->which); + break; } } } @@ -985,14 +1091,14 @@ static void print_external(int iLevel, Z_External *pExternal) print_string(iLevel, "Descriptor", pExternal->descriptor); switch (pExternal->which) { - case Z_External_universeReport: - print_universe_report(iLevel, pExternal->u.universeReport); - break; - - default: - print_level(iLevel); - printf("Type: %d\n", pExternal->which); - break; + case Z_External_universeReport: + print_universe_report(iLevel, pExternal->u.universeReport); + break; + + default: + print_level(iLevel); + printf("Type: %d\n", pExternal->which); + break; } } } @@ -1073,8 +1179,6 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } -#if YAZ_MODULE_ill - const char *get_ill_element (void *clientData, const char *element) { return 0; @@ -1091,7 +1195,7 @@ static Z_External *create_external_itemRequest() ctl.odr = out; ctl.clientData = 0; ctl.f = get_ill_element; - + req = ill_get_ItemRequest(&ctl, "ill", 0); if (!req) printf ("ill_get_ItemRequest failed\n"); @@ -1136,9 +1240,7 @@ static Z_External *create_external_itemRequest() } return r; } -#endif -#ifdef YAZ_MODULE_ill static Z_External *create_external_ILL_APDU(int which) { struct ill_get_ctl ctl; @@ -1194,7 +1296,6 @@ static Z_External *create_external_ILL_APDU(int which) } return r; } -#endif static Z_External *create_ItemOrderExternal(const char *type, int itemno) @@ -1302,7 +1403,7 @@ static int cmd_update(char *arg) oident update_oid; printf ("Update request\n"); fflush(stdout); - + if (!record_last) return 0; update_oid.proto = PROTO_Z3950; @@ -1350,19 +1451,18 @@ static int cmd_update(char *arg) return 2; } -/* 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(type, itemno); - return(2); + return 2; } static int cmd_find(char *arg) @@ -1472,13 +1572,6 @@ static int send_presentRequest(char *arg) sprintf(setstring, "%d", setnumber); req->resultSetId = setstring; } -#if 0 - if (1) - { - static Z_Range range; - static Z_Range *rangep = ⦥ - req->num_ranges = 1; -#endif req->resultSetStartPoint = &setno; req->numberOfRecordsRequested = &nos; prefsyn.proto = protocol; @@ -1540,6 +1633,18 @@ static int send_presentRequest(char *arg) printf("Sent presentRequest (%d+%d).\n", setno, nos); return 2; } + +static void close_session (void) +{ + cs_close (conn); + conn = 0; + if (session_mem) + { + nmem_destroy (session_mem); + session_mem = NULL; + } + sent_close = 0; +} void process_close(Z_Close *req) { @@ -1563,16 +1668,7 @@ void process_close(Z_Close *req) printf("Reason: %s, message: %s\n", reasons[*req->closeReason], req->diagnosticInformation ? req->diagnosticInformation : "NULL"); if (sent_close) - { - cs_close (conn); - conn = NULL; - if (session_mem) - { - nmem_destroy (session_mem); - session_mem = NULL; - } - sent_close = 0; - } + close_session (); else { *res->closeReason = Z_Close_finished; @@ -1998,6 +2094,10 @@ int cmd_packagename(char* arg) int cmd_proxy(char* arg) { + if (*arg == '\0') { + printf("Current proxy is `%s'\n", (yazCharset)?yazProxy:NULL); + return 1; + } xfree (yazProxy); yazProxy = NULL; if (*arg) @@ -2008,6 +2108,38 @@ int cmd_proxy(char* arg) return 1; } +int cmd_charset(char* arg) +{ + if (*arg == '\0') { + printf("Current character set is `%s'\n", (yazCharset)?yazCharset:NULL); + return 1; + } + xfree (yazCharset); + yazCharset = NULL; + if (*arg) + { + yazCharset = (char *) xmalloc (strlen(arg)+1); + strcpy (yazCharset, arg); + } + return 1; +} + +int cmd_lang(char* arg) +{ + if (*arg == '\0') { + printf("Current language is `%s'\n", (yazLang)?yazLang:NULL); + return 1; + } + xfree (yazLang); + yazLang = NULL; + if (*arg) + { + yazLang = (char *) xmalloc (strlen(arg)+1); + strcpy (yazLang, arg); + } + return 1; +} + int cmd_source(char* arg) { /* first should open the file and read one line at a time.. */ @@ -2310,13 +2442,15 @@ void wait_and_handle_responce() { if ((res = cs_get(conn, &netbuffer, &netbufferlen)) < 0) { - perror("cs_get"); - exit(1); + printf("Target closed connection\n"); + close_session (); + break; } if (!res) { printf("Target closed connection.\n"); - exit(1); + close_session (); + break; } odr_reset(in); /* release APDU from last round */ record_last = 0; @@ -2330,7 +2464,8 @@ void wait_and_handle_responce() fprintf(stderr, "---------\n"); if (apdu_file) z_APDU(print, &apdu, 0, 0); - exit(1); + close_session (); + break; } if (apdu_file && !z_APDU(print, &apdu, 0, 0)) { @@ -2382,7 +2517,7 @@ void wait_and_handle_responce() default: printf("Received unknown APDU type (%d).\n", apdu->which); - exit(1); + close_session (); } } while (conn && cs_more(conn)); @@ -2404,6 +2539,8 @@ void wait_and_handle_responce() } +static int cmd_help (char *line); + static struct { char *cmd; int (*fun)(char *arg); @@ -2438,6 +2575,8 @@ static struct { {"update", cmd_update, "",NULL,0}, {"packagename", cmd_packagename, "",NULL,0}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0}, + {"charset", cmd_charset, "",NULL,0}, + {"lang", cmd_lang, "",NULL,0}, {".", cmd_source, "",NULL,1}, {"!", cmd_subshell, "Subshell command",NULL,0}, {"set_apdufile", cmd_set_apdufile, "",NULL,0}, @@ -2455,9 +2594,50 @@ static struct { {"adm-commit", cmd_adm_commit, "",NULL,0}, {"adm-shutdown", cmd_adm_shutdown, "",NULL,0}, {"adm-startup", cmd_adm_startup, "",NULL,0}, + {"help", cmd_help, "", NULL}, {0,0,0,0,0} }; +static int cmd_help (char *line) +{ + int i; + char topic[21]; + + *topic = 0; + sscanf (line, "%20s", topic); + + if (*topic == 0) + printf("Commands:\n"); + for (i = 0; cmd[i].cmd; i++) + if (*topic == 0 || strcmp (topic, cmd[i].cmd) == 0) + printf(" %s %s\n", cmd[i].cmd, cmd[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"); + } + return 1; +} + void process_cmd_line(char* line) { int i,res; @@ -2498,13 +2678,12 @@ void process_cmd_line(char* line) res = (*cmd[i].fun)(arg); break; } + if (!cmd[i].cmd) /* dump our help-screen */ { printf("Unknown command: %s.\n", word); - printf("Currently recognized commands:\n"); - for (i = 0; cmd[i].cmd; i++) - printf(" %s %s\n", cmd[i].cmd, cmd[i].ad); - return; + cmd_help (""); + res = 1; } if(apdu_file) fflush(apdu_file); @@ -2542,7 +2721,7 @@ char ** readline_completer(char *text, int start, int end) { #if HAVE_READLINE_READLINE_H if(start == 0) { -#ifdef RL_READLINE_VERSION +#if HAVE_READLINE_RL_COMPLETION_MATCHES char** res=rl_completion_matches(text, command_generator); #else @@ -2573,7 +2752,7 @@ char ** readline_completer(char *text, int start, int end) { if(!cmd[i].complete_filenames) rl_attempted_completion_over = 1; if(cmd[i].rl_completerfunction) { -#ifdef RL_READLINE_VERSION +#ifdef HAVE_READLINE_RL_COMPLETION_MATCHES char** res= rl_completion_matches(text, cmd[i].rl_completerfunction); @@ -2726,8 +2905,6 @@ int main(int argc, char **argv) } - - /* * Local variables: * tab-width: 4