X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=f009640ccc7b4a52cc7c30b6c78bf6f20af4aca8;hp=0b0e8fe843fcd1367fc48766227ff709e8e9271f;hb=975c22d3fb94aaf91399f1967dbb173129205888;hpb=06eb0818f902a5d6805b656e0ba2e39ac2ed7817 diff --git a/client/client.c b/client/client.c index 0b0e8fe..f009640 100644 --- a/client/client.c +++ b/client/client.c @@ -1,8 +1,8 @@ /* - * Copyright (c) 1995-2003, Index Data + * Copyright (c) 1995-2004, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.216 2003-12-20 00:51:19 adam Exp $ + * $Id: client.c,v 1.231 2004-02-16 21:40:39 adam Exp $ */ #include @@ -81,7 +81,7 @@ static Z_ElementSetNames *elementSetNames = 0; static int setno = 1; /* current set offset */ static enum oid_proto protocol = PROTO_Z3950; /* current app protocol */ static enum oid_value recordsyntax = VAL_USMARC; -static char *schema = 0; +static char *record_schema = 0; static int sent_close = 0; static NMEM session_mem = NULL; /* memory handle for init-response */ static Z_InitResponse *session = 0; /* session parameters */ @@ -103,6 +103,8 @@ static FILE *marc_file = 0; static char *refid = NULL; static char *last_open_command = NULL; static int auto_reconnect = 0; +static Odr_bitmask z3950_options; +static int z3950_version = 3; static char cur_host[200]; @@ -279,19 +281,13 @@ static void send_initRequest(const char* type_and_host) { Z_APDU *apdu = zget_APDU(out, Z_APDU_initRequest); Z_InitRequest *req = apdu->u.initRequest; + int i; - ODR_MASK_SET(req->options, Z_Options_search); - ODR_MASK_SET(req->options, Z_Options_present); - ODR_MASK_SET(req->options, Z_Options_namedResultSets); - ODR_MASK_SET(req->options, Z_Options_triggerResourceCtrl); - ODR_MASK_SET(req->options, Z_Options_scan); - ODR_MASK_SET(req->options, Z_Options_sort); - ODR_MASK_SET(req->options, Z_Options_extendedServices); - ODR_MASK_SET(req->options, Z_Options_delSet); + req->options = &z3950_options; - ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1); - ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2); - ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3); + ODR_MASK_ZERO(req->protocolVersion); + for (i = 0; iprotocolVersion, i); *req->maximumRecordSize = 1024*kilobytes; *req->preferredMessageSize = 1024*kilobytes; @@ -300,7 +296,7 @@ static void send_initRequest(const char* type_and_host) req->referenceId = set_refid (out); - if (yazProxy) + if (yazProxy && type_and_host) yaz_oi_set_string_oidval(&req->otherInfo, out, VAL_PROXY, 1, type_and_host); @@ -332,6 +328,11 @@ static void send_initRequest(const char* type_and_host) static void render_initUserInfo(Z_OtherInformation *ui1); static void render_diag(Z_DiagnosticFormat *diag); +static void pr_opt(const char *opt, void *clientData) +{ + printf (" %s", opt); +} + static int process_initResponse(Z_InitResponse *res) { int ver = 0; @@ -339,7 +340,7 @@ static int process_initResponse(Z_InitResponse *res) session_mem = odr_extract_mem(in); session = res; - for (ver = 0; ver<5; ver++) + for (ver = 0; ver < 8; ver++) if (!ODR_MASK_GET(res->protocolVersion, ver)) break; @@ -376,46 +377,11 @@ static int process_initResponse(Z_InitResponse *res) } } printf ("Options:"); - if (ODR_MASK_GET(res->options, Z_Options_search)) - printf (" search"); - if (ODR_MASK_GET(res->options, Z_Options_present)) - printf (" present"); - if (ODR_MASK_GET(res->options, Z_Options_delSet)) - printf (" delSet"); - if (ODR_MASK_GET(res->options, Z_Options_resourceReport)) - printf (" resourceReport"); - if (ODR_MASK_GET(res->options, Z_Options_resourceCtrl)) - printf (" resourceCtrl"); - if (ODR_MASK_GET(res->options, Z_Options_accessCtrl)) - printf (" accessCtrl"); - if (ODR_MASK_GET(res->options, Z_Options_scan)) - printf (" scan"); - if (ODR_MASK_GET(res->options, Z_Options_sort)) - printf (" sort"); - if (ODR_MASK_GET(res->options, Z_Options_extendedServices)) - printf (" extendedServices"); - if (ODR_MASK_GET(res->options, Z_Options_level_1Segmentation)) - printf (" level1Segmentation"); - if (ODR_MASK_GET(res->options, Z_Options_level_2Segmentation)) - printf (" level2Segmentation"); - if (ODR_MASK_GET(res->options, Z_Options_concurrentOperations)) - printf (" concurrentOperations"); + yaz_init_opt_decode(res->options, pr_opt, 0); + printf ("\n"); + if (ODR_MASK_GET(res->options, Z_Options_namedResultSets)) - { - printf (" namedResultSets"); setnumber = 0; - } - if (ODR_MASK_GET(res->options, Z_Options_encapsulation)) - printf (" encapsulation"); - if (ODR_MASK_GET(res->options, Z_Options_resultCount)) - printf (" resultCount"); - if (ODR_MASK_GET(res->options, Z_Options_negotiationModel)) - printf (" negotiationModel"); - if (ODR_MASK_GET(res->options, Z_Options_duplicateDetection)) - printf (" duplicateDetection"); - if (ODR_MASK_GET(res->options, Z_Options_queryType104)) - printf (" queryType104"); - printf ("\n"); if (ODR_MASK_GET(res->options, Z_Options_negotiationModel)) { @@ -745,7 +711,7 @@ static void display_record(Z_External *r) if (ent && r->which == Z_External_octet) { Z_ext_typeent *type = z_ext_getentbyref(ent->value); - void *rr; + char *rr; if (type) { @@ -754,7 +720,7 @@ static void display_record(Z_External *r) */ odr_setbuf(in, (char*)r->u.octet_aligned->buf, r->u.octet_aligned->len, 0); - if (!(*type->fun)(in, (char **)&rr, 0, 0)) + if (!(*type->fun)(in, &rr, 0, 0)) { odr_perror(in, "Decoding constructed record."); fprintf(stdout, "[Near %d]\n", odr_offset(in)); @@ -1197,8 +1163,12 @@ static int send_srw(Z_SRW_PDU *sr) char *buf_out; int len_out; int r; - if (apdu_file && !z_GDU(print, &gdu, 0, 0)) - printf ("Failed to print outgoing APDU\n"); + if (apdu_file) + { + if (!z_GDU(print, &gdu, 0, 0)) + printf ("Failed to print outgoing APDU\n"); + odr_reset(print); + } buf_out = odr_getbuf(out, &len_out, 0); /* we don't odr_reset(out), since we may need the buffer again */ @@ -1238,8 +1208,11 @@ static int send_SRW_searchRequest(const char *arg) sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request); sr->u.request->query_type = Z_SRW_query_type_cql; sr->u.request->query.cql = odr_strdup(out, arg); - if (schema) - sr->u.request->recordSchema = schema; + + sr->u.request->maximumRecords = odr_intdup(out, 0); + + if (record_schema) + sr->u.request->recordSchema = record_schema; return send_srw(sr); } #endif @@ -2133,6 +2106,36 @@ static int cmd_itemorder(const char *arg) return 2; } +static void show_opt(const char *arg, void *clientData) +{ + printf ("%s ", arg); +} + +static int cmd_zversion(const char *arg) +{ + if (*arg && arg) + z3950_version = atoi(arg); + else + printf ("version is %d\n", z3950_version); + return 0; +} + +static int cmd_options(const char *arg) +{ + if (*arg) + { + int r; + int pos; + r = yaz_init_opt_encode(&z3950_options, arg, &pos); + } + else + { + yaz_init_opt_decode(&z3950_options, show_opt, 0); + printf ("\n"); + } + return 0; +} + static int cmd_explain(const char *arg) { if (protocol != PROTO_HTTP) @@ -2140,7 +2143,7 @@ static int cmd_explain(const char *arg) #if HAVE_XML2 if (!conn) cmd_open(0); - if (1) + if (conn) { Z_SRW_PDU *sr = 0; @@ -2151,11 +2154,18 @@ static int cmd_explain(const char *arg) send_srw(sr); return 2; } -#else - return 0; #endif + return 0; } - + +static int cmd_init(const char *arg) +{ + if (!conn || protocol != PROTO_Z3950) + return 0; + send_initRequest(0); + return 2; +} + static int cmd_find(const char *arg) { if (!*arg) @@ -2168,6 +2178,8 @@ static int cmd_find(const char *arg) #if HAVE_XML2 if (!conn) cmd_open(0); + if (!conn) + return 0; if (!send_SRW_searchRequest(arg)) return 0; #else @@ -2306,13 +2318,13 @@ static int send_presentRequest(const char *arg) req->preferredRecordSyntax = odr_oiddup (out, oid_ent_to_oid(&prefsyn, oid)); - if (schema) + if (record_schema) { oident prefschema; prefschema.proto = protocol; prefschema.oclass = CLASS_SCHEMA; - prefschema.value = oid_getvalbyname(schema); + prefschema.value = oid_getvalbyname(record_schema); req->recordComposition = &compo; compo.which = Z_RecordComp_complex; @@ -2373,8 +2385,8 @@ static int send_SRW_presentRequest(const char *arg) parse_show_args(arg, setstring, &setno, &nos); sr->u.request->startRecord = odr_intdup(out, setno); sr->u.request->maximumRecords = odr_intdup(out, nos); - if (schema) - sr->u.request->recordSchema = schema; + if (record_schema) + sr->u.request->recordSchema = record_schema; return send_srw(sr); } #endif @@ -2434,6 +2446,8 @@ static int cmd_show(const char *arg) #if HAVE_XML2 if (!conn) cmd_open(0); + if (!conn) + return 0; if (!send_SRW_presentRequest(arg)) return 0; #else @@ -2750,10 +2764,10 @@ int cmd_scan(const char *arg) int cmd_schema(const char *arg) { - xfree(schema); - schema = 0; + xfree(record_schema); + record_schema = 0; if (arg && *arg) - schema = xstrdup(arg); + record_schema = xstrdup(arg); return 1; } @@ -3282,10 +3296,10 @@ static void handle_srw_record(Z_SRW_record *rec) printf (" schema=%s", rec->recordSchema); printf ("\n"); if (rec->recordData_buf && rec->recordData_len) - { fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout); - printf ("\n"); - } + else + printf ("No data!"); + printf("\n"); } static void handle_srw_explain_response(Z_SRW_explainResponse *res) @@ -3301,10 +3315,13 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res) for (i = 0; inum_diagnostics; i++) { - printf ("SRW diagnostic %d %s\n", - *res->diagnostics[i].code, - yaz_diag_srw_str(*res->diagnostics[i].code)); - + if (res->diagnostics[i].uri) + printf ("SRW diagnostic %s\n", + res->diagnostics[i].uri); + else + printf ("SRW diagnostic missing or could not be decoded\n"); + if (res->diagnostics[i].message) + printf ("Message: %s\n", res->diagnostics[i].message); if (res->diagnostics[i].details) printf ("Details: %s\n", res->diagnostics[i].details); } @@ -3443,7 +3460,10 @@ void wait_and_handle_response() odr_dumpBER(f, netbuffer, res); fprintf(f, "---------\n"); if (apdu_file) + { z_GDU(print, &gdu, 0, 0); + odr_reset(print); + } if (conn && cs_more(conn)) continue; break; @@ -3691,7 +3711,7 @@ int cmd_list_all(const char* args) { /* print present related options */ printf("Format : %s\n",yaz_z3950_oid_value_to_str(recordsyntax,CLASS_RECSYN)); - printf("Schema : %s\n",schema); + printf("Schema : %s\n",record_schema ? record_schema : "not set"); printf("Elements : %s\n",elementSetNames?elementSetNames->u.generic:""); /* loging options */ @@ -3803,7 +3823,10 @@ static struct { {"adm-shutdown", cmd_adm_shutdown, "",NULL,0,NULL}, {"adm-startup", cmd_adm_startup, "",NULL,0,NULL}, {"explain", cmd_explain, "", NULL, 0, NULL}, + {"options", cmd_options, "", NULL, 0, NULL}, + {"zversion", cmd_zversion, "", NULL, 0, NULL}, {"help", cmd_help, "", NULL,0,NULL}, + {"init", cmd_init, "", NULL,0,NULL}, {0,0,0,0,0,0} }; @@ -4101,6 +4124,15 @@ int main(int argc, char **argv) #endif if (codeset) outputCharset = xstrdup(codeset); + + ODR_MASK_SET(&z3950_options, Z_Options_search); + ODR_MASK_SET(&z3950_options, Z_Options_present); + ODR_MASK_SET(&z3950_options, Z_Options_namedResultSets); + ODR_MASK_SET(&z3950_options, Z_Options_triggerResourceCtrl); + ODR_MASK_SET(&z3950_options, Z_Options_scan); + ODR_MASK_SET(&z3950_options, Z_Options_sort); + ODR_MASK_SET(&z3950_options, Z_Options_extendedServices); + ODR_MASK_SET(&z3950_options, Z_Options_delSet); while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:", argv, argc, &arg)) != -2) {