X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=001e0ad7afaf7c29da584b6f67d9ea9405bd66d0;hb=2b3dd45defce5c722aea0d5cecfbd8db7df55818;hp=51bc87c0ccbcd7d2e23aa98d4dc494db5710d951;hpb=f2f3c5ba7374be95aba4f8f35bccd3c4c067e625;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 51bc87c..001e0ad 100644 --- a/client/client.c +++ b/client/client.c @@ -1,8 +1,8 @@ /* - * Copyright (c) 1995-2004, Index Data + * Copyright (c) 1995-2005, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.263 2004-12-30 00:20:15 adam Exp $ + * $Id: client.c,v 1.267 2005-01-11 12:07:55 adam Exp $ */ #include @@ -105,7 +105,7 @@ static char *esPackageName = 0; static char *yazProxy = 0; static int kilobytes = 1024; static char *negotiationCharset = 0; -static char negotiationCharsetRecords = 1; +static int negotiationCharsetRecords = 1; static int negotiationCharsetVersion = 3; static char *outputCharset = 0; static char *marcCharset = 0; @@ -1253,6 +1253,32 @@ static int send_srw(Z_SRW_PDU *sr) #endif #if HAVE_XML2 +static int send_SRW_scanRequest(const char *arg, int pos, int num) +{ + Z_SRW_PDU *sr = 0; + + /* regular requestse .. */ + sr = yaz_srw_get(out, Z_SRW_scan_request); + + switch(queryType) + { + case QueryType_CQL: + sr->u.scan_request->query_type = Z_SRW_query_type_cql; + sr->u.scan_request->scanClause.cql = odr_strdup(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); + break; + default: + printf ("Only CQL and PQF supported in SRW\n"); + return 0; + } + sr->u.scan_request->responsePosition = odr_intdup(out, pos); + sr->u.scan_request->maximumTerms = odr_intdup(out, num); + return send_srw(sr); +} + static int send_SRW_searchRequest(const char *arg) { Z_SRW_PDU *sr = 0; @@ -2823,34 +2849,57 @@ int cmd_scanpos(const char *arg) int cmd_scan(const char *arg) { - if (only_z3950()) - return 0; - if (!conn) - { - try_reconnect(); - - if (!conn) { - printf("Session not initialized yet\n"); - return 0; - } - } - if (!ODR_MASK_GET(session->options, Z_Options_scan)) + if (protocol == PROTO_HTTP) { - printf("Target doesn't support scan\n"); +#if HAVE_XML2 + if (!conn) + cmd_open(0); + if (!conn) + return 0; + if (*arg) + { + if (send_SRW_scanRequest(arg, scan_position, 20) < 0) + return 0; + } + else + { + if (send_SRW_scanRequest(last_scan_line, 1, 20) < 0) + return 0; + } + return 2; +#else return 0; - } - if (*arg) - { - strcpy (last_scan_query, arg); - if (send_scanrequest(arg, scan_position, 20, 0) < 0) - return 0; +#endif } else { - if (send_scanrequest(last_scan_query, 1, 20, last_scan_line) < 0) - return 0; + if (!conn) + { + try_reconnect(); + + if (!conn) { + printf("Session not initialized yet\n"); + return 0; + } + } + if (!ODR_MASK_GET(session->options, Z_Options_scan)) + { + printf("Target doesn't support scan\n"); + return 0; + } + if (*arg) + { + strcpy (last_scan_query, arg); + if (send_scanrequest(arg, scan_position, 20, 0) < 0) + return 0; + } + else + { + if (send_scanrequest(last_scan_query, 1, 20, last_scan_line) < 0) + return 0; + } + return 2; } - return 2; } int cmd_schema(const char *arg) @@ -3476,6 +3525,48 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res) handle_srw_record(res->records + i); } +static void handle_srw_scan_term(Z_SRW_scanTerm *term) +{ + if (term->displayTerm) + printf("%s:", term->displayTerm); + else if (term->value) + printf("%s:", term->value); + else + printf("No value:"); + if (term->numberOfRecords) + printf(" %d", *term->numberOfRecords); + if (term->whereInList) + printf(" %s", term->whereInList); + if (term->value && term->displayTerm) + printf(" %s", term->value); + + strcpy(last_scan_line, term->value); + printf("\n"); +} + +static void handle_srw_scan_response(Z_SRW_scanResponse *res) +{ + int i; + + printf ("Received SRW Scan Response\n"); + + for (i = 0; inum_diagnostics; i++) + { + 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); + } + if (res->terms) + for (i = 0; inum_terms; i++) + handle_srw_scan_term(res->terms + i); +} + static void http_response(Z_HTTP_Response *hres) { int ret = -1; @@ -3503,6 +3594,8 @@ static void http_response(Z_HTTP_Response *hres) handle_srw_response(sr->u.response); else if (sr->which == Z_SRW_explain_response) handle_srw_explain_response(sr->u.explain_response); + else if (sr->which == Z_SRW_scan_response) + handle_srw_scan_response(sr->u.scan_response); else ret = -1; }