X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=bb3b465a4c7cc69707165e6bb38f7c8f2401c7b7;hp=4e77d74068300adbc9030b83803aa14529210cf3;hb=650cc0539b6a484eba203949cb43a08b9084504d;hpb=79b486cea07c6352407a289d3b4b9a8545b470e6 diff --git a/client/client.c b/client/client.c index 4e77d74..bb3b465 100644 --- a/client/client.c +++ b/client/client.c @@ -1,12 +1,20 @@ /* - * Copyright (c) 1995-2002, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.175 2002-12-05 12:19:23 adam Exp $ + * $Id: client.c,v 1.179 2003-01-27 21:31:35 adam Exp $ */ #include #include +#if HAVE_LOCALE_H +#include +#endif + +#if HAVE_LANGINFO_H +#include +#endif + #include #include @@ -49,6 +57,8 @@ #define C_PROMPT "Z> " +static char *codeset = 0; /* character set for output */ + static ODR out, in, print; /* encoding and decoding streams */ static FILE *apdu_file = 0; static COMSTACK conn = 0; /* our z-association */ @@ -87,7 +97,8 @@ static int auto_reconnect = 0; typedef enum { QueryType_Prefix, QueryType_CCL, - QueryType_CCL2RPN + QueryType_CCL2RPN, + QueryType_CQL } QueryType; static QueryType queryType = QueryType_Prefix; @@ -134,6 +145,7 @@ const char* query_type_as_string(QueryType q) case QueryType_Prefix: return "prefix (RPN sent to server)"; case QueryType_CCL: return "CCL (CCL sent to server) "; case QueryType_CCL2RPN: return "CCL -> RPN (RPN sent to server)"; + case QueryType_CQL: return "CQL (CQL sent to server)"; default: return "unknown Query type internal yaz-client error"; } @@ -156,8 +168,6 @@ void do_hex_dump(char* buf,int len) #endif } - - void add_otherInfos(Z_APDU *a) { Z_OtherInformation **oi; @@ -651,13 +661,64 @@ static void display_record(Z_External *r) #endif ) { - if (marc_display_exl (octet_buf, NULL, 0 /* debug */, - r->u.octet_aligned->len) <= 0) + char *result; + int rlen; + yaz_iconv_t cd = 0; + yaz_marc_t mt = yaz_marc_create(); + + if (yaz_marc_decode_buf(mt, octet_buf,r->u.octet_aligned->len, + &result, &rlen)> 0) + { + char *from = 0; + if (ent->value == VAL_USMARC) + { + if (octet_buf[9] == 'a') + from = "UTF-8"; + else + from = "MARC8"; + } + else + from = "ISO-8859-1"; + + if (codeset && from) + { + printf ("convert from %s to %s\n", from, codeset); + cd = yaz_iconv_open(codeset, from); + } + if (!cd) + fwrite (result, 1, rlen, stdout); + else + { + char outbuf[12]; + size_t inbytesleft = rlen; + const char *inp = result; + + while (inbytesleft) + { + size_t outbytesleft = sizeof(outbuf); + char *outp = outbuf; + size_t r = yaz_iconv (cd, (char**) &inp, + &inbytesleft, + &outp, &outbytesleft); + if (r == (size_t) (-1)) + { + int e = yaz_iconv_error(cd); + if (e != YAZ_ICONV_E2BIG) + break; + } + fwrite (outbuf, outp - outbuf, 1, stdout); + } + } + } + else { printf ("bad MARC. Dumping as it is:\n"); print_record((const unsigned char*) octet_buf, - r->u.octet_aligned->len); - } + r->u.octet_aligned->len); + } + yaz_marc_destroy(mt); + if (cd) + yaz_iconv_close(cd); } else { @@ -816,6 +877,7 @@ static int send_searchRequest(char *arg) Z_RPNQuery *RPNquery; Odr_oct ccl_query; YAZ_PQF_Parser pqf_parser; + Z_External *ext; if (queryType == QueryType_CCL2RPN) { @@ -902,6 +964,16 @@ static int send_searchRequest(char *arg) query.u.type_1 = RPNquery; ccl_rpn_delete (rpn); break; + case QueryType_CQL: + query.which = Z_Query_type_104; + ext = odr_malloc(out, sizeof(*ext)); + ext->direct_reference = odr_getoidbystr(out, "1.2.840.10003.16.2"); + ext->indirect_reference = 0; + ext->descriptor = 0; + ext->which = Z_External_CQL; + ext->u.cql = odr_strdup(out, arg); + query.u.type_104 = ext; + break; default: printf ("Unsupported query type\n"); return 0; @@ -2109,17 +2181,19 @@ int cmd_schema(char *arg) int cmd_format(char *arg) { + oid_value nsyntax; if (!arg || !*arg) { printf("Usage: format \n"); return 0; } - recordsyntax = oid_getvalbyname (arg); - if (recordsyntax == VAL_NONE) + nsyntax = oid_getvalbyname (arg); + if (strcmp(arg, "none") && nsyntax == VAL_NONE) { printf ("unknown record syntax\n"); return 0; } + recordsyntax = nsyntax; return 1; } @@ -2166,12 +2240,15 @@ int cmd_querytype (char *arg) queryType = QueryType_Prefix; else if (!strcmp (arg, "ccl2rpn") || !strcmp (arg, "cclrpn")) queryType = QueryType_CCL2RPN; + else if (!strcmp(arg, "cql")) + queryType = QueryType_CQL; else { printf ("Querytype must be one of:\n"); printf (" prefix - Prefix query\n"); printf (" ccl - CCL query\n"); printf (" ccl2rpn - CCL query converted to RPN\n"); + printf (" cql - CQL\n"); return 0; } return 1; @@ -3239,7 +3316,15 @@ int main(int argc, char **argv) char *arg; int ret; - while ((ret = options("k:c:a:m:v:p:u:", argv, argc, &arg)) != -2) +#if HAVE_LOCALE_H + if (!setlocale(LC_CTYPE, "")) + fprintf (stderr, "setlocale failed\n"); +#endif +#if HAVE_LANGINFO_H + codeset = nl_langinfo(CODESET); +#endif + + while ((ret = options("k:c:a:m:v:p:u:t:", argv, argc, &arg)) != -2) { switch (ret) { @@ -3261,19 +3346,22 @@ int main(int argc, char **argv) exit (1); } break; - case 'c': - strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); - ccl_fields[sizeof(ccl_fields)-1] = '\0'; - break; + case 't': + codeset = arg; + break; + case 'c': + strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); + ccl_fields[sizeof(ccl_fields)-1] = '\0'; + break; case 'a': if (!strcmp(arg, "-")) apdu_file=stderr; else apdu_file=fopen(arg, "a"); break; - case 'p': - yazProxy=strdup(arg); - break; + case 'p': + yazProxy=strdup(arg); + break; case 'u': if (!auth_command) {