X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=f66d601a2fa629c270c2b41d538ffdc054ccefe3;hb=7ab87517b1d480eb94e95658ab9acbe8ce24648e;hp=619f963cf8c188a4ed9c7d8a6ce011c8816fed36;hpb=1e49cc7bdcdeb5cb9e7b2e709c5322acccec90df;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 619f963..f66d601 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.339 2007-05-23 11:54:46 adam Exp $ + * $Id: client.c,v 1.341 2007-05-30 08:40:26 adam Exp $ */ /** \file client.c * \brief yaz-client program @@ -63,6 +63,7 @@ #include #include #include +#include #include #include @@ -133,6 +134,7 @@ static int negotiationCharsetRecords = 1; static int negotiationCharsetVersion = 3; static char *outputCharset = 0; static char *marcCharset = 0; +static char *queryCharset = 0; static char* yazLang = 0; static char last_cmd[32] = "?"; @@ -1396,6 +1398,22 @@ static int send_SRW_searchRequest(const char *arg) } #endif +static void query_charset_convert(Z_RPNQuery *q) +{ + if (queryCharset && outputCharset) + { + yaz_iconv_t cd = yaz_iconv_open(queryCharset, outputCharset); + if (!cd) + { + printf("Conversion from %s to %s unsupported\n", + outputCharset, queryCharset); + return; + } + yaz_query_charset_convert_rpnquery(q, out, cd); + yaz_iconv_close(cd); + } +} + static int send_searchRequest(const char *arg) { Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest); @@ -1501,6 +1519,7 @@ static int send_searchRequest(const char *arg) return 0; } yaz_pqf_destroy (pqf_parser); + query_charset_convert(RPNquery); query.u.type_1 = RPNquery; break; case QueryType_CCL: @@ -1517,6 +1536,7 @@ static int send_searchRequest(const char *arg) printf ("Couldn't convert from CCL to RPN\n"); return 0; } + query_charset_convert(RPNquery); query.u.type_1 = RPNquery; ccl_rpn_delete (rpn); break; @@ -2853,7 +2873,8 @@ int cmd_cancel_find(const char *arg) { return fres; } -int send_scanrequest(const char *query, int pp, int num, const char *term) +int send_scanrequest(const char *set, const char *query, + int pp, int num, const char *term) { Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest); Z_ScanRequest *req = apdu->u.scanRequest; @@ -2899,6 +2920,18 @@ int send_scanrequest(const char *query, int pp, int num, const char *term) } yaz_pqf_destroy (pqf_parser); } + if (queryCharset && outputCharset) + { + yaz_iconv_t cd = yaz_iconv_open(queryCharset, outputCharset); + if (!cd) + { + printf("Conversion from %s to %s unsupported\n", + outputCharset, queryCharset); + return -1; + } + yaz_query_charset_convert_apt(req->termListAndStartPoint, out, cd); + yaz_iconv_close(cd); + } if (term && *term) { if (req->termListAndStartPoint->term && @@ -2918,6 +2951,11 @@ int send_scanrequest(const char *query, int pp, int num, const char *term) req->numberOfTermsRequested = # req->preferredPositionInResponse = &pp; req->stepSize = odr_intdup(out, scan_stepSize); + + if (set) + yaz_oi_set_string_oid(&req->otherInfo, out, + yaz_oid_userinfo_scan_set, 1, set); + send_apdu(apdu); return 2; } @@ -3098,7 +3136,7 @@ int cmd_scansize(const char *arg) return 0; } -int cmd_scan(const char *arg) +static int cmd_scan_common(const char *set, const char *arg) { if (protocol == PROTO_HTTP) { @@ -3142,18 +3180,37 @@ int cmd_scan(const char *arg) if (*arg) { strcpy (last_scan_query, arg); - if (send_scanrequest(arg, scan_position, scan_size, 0) < 0) + if (send_scanrequest(set, arg, + scan_position, scan_size, 0) < 0) return 0; } else { - if (send_scanrequest(last_scan_query, 1, scan_size, last_scan_line) < 0) + if (send_scanrequest(set, last_scan_query, + 1, scan_size, last_scan_line) < 0) return 0; } return 2; } } +int cmd_scan(const char *arg) +{ + return cmd_scan_common(0, arg); +} + +int cmd_setscan(const char *arg) +{ + char setstring[100]; + int nor; + if (sscanf(arg, "%99s%n", setstring, &nor) < 1) + { + printf("missing set for setscan\n"); + return 0; + } + return cmd_scan_common(setstring, arg + nor); +} + int cmd_schema(const char *arg) { xfree(record_schema); @@ -3296,6 +3353,24 @@ int cmd_marccharset(const char *arg) return 1; } +int cmd_querycharset(const char *arg) +{ + char l1[30]; + + *l1 = 0; + if (sscanf(arg, "%29s", l1) < 1) + { + printf("Query character set is `%s'\n", + queryCharset ? queryCharset: "none"); + return 1; + } + xfree (queryCharset); + queryCharset = 0; + if (strcmp(l1, "-")) + queryCharset = xstrdup(l1); + return 1; +} + int cmd_displaycharset(const char *arg) { char l1[30]; @@ -4328,6 +4403,7 @@ static struct { {"delete", cmd_delete, "",NULL,0,NULL}, {"base", cmd_base, "",NULL,0,NULL}, {"show", cmd_show, "['+'<#recs>['+']]",NULL,0,NULL}, + {"setscan", cmd_setscan, "",NULL,0,NULL}, {"scan", cmd_scan, "",NULL,0,NULL}, {"scanstep", cmd_scanstep, "",NULL,0,NULL}, {"scanpos", cmd_scanpos, "",NULL,0,NULL}, @@ -4358,6 +4434,7 @@ static struct { {"negcharset", cmd_negcharset, "",NULL,0,NULL}, {"displaycharset", cmd_displaycharset, "",NULL,0,NULL}, {"marccharset", cmd_marccharset, "",NULL,0,NULL}, + {"querycharset", cmd_querycharset, "",NULL,0,NULL}, {"lang", cmd_lang, "",NULL,0,NULL}, {"source", cmd_source_echo, "",NULL,1,NULL}, {".", cmd_source_echo, "",NULL,1,NULL},