X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=f5ccc78c5326a9ba9148ee347f888e39feebf5fe;hb=7dbe4028e0cb3a7ed57fb2bbb0b05e62e112f56a;hp=602dde830c226def1e01d04b30aa8b08d89835cd;hpb=d2fc23a41ae7eb6bd5f6e76a45530ede776bd018;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 602dde8..f5ccc78 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.272 2005-01-27 09:05:09 adam Exp $ + * $Id: client.c,v 1.280 2005-05-09 08:51:48 adam Exp $ */ #include @@ -130,6 +130,7 @@ static Odr_bitmask z3950_options; static int z3950_version = 3; static int scan_stepSize = 0; static int scan_position = 1; +static int scan_size = 20; static char cur_host[200]; typedef enum { @@ -601,7 +602,7 @@ int session_connect(const char *arg) strncpy(type_and_host, arg, sizeof(type_and_host)-1); type_and_host[sizeof(type_and_host)-1] = '\0'; - cmd_open_remember_last_open_command(arg,type_and_host); + cmd_open_remember_last_open_command(arg, type_and_host); if (yazProxy) conn = cs_create_host(yazProxy, 1, &add); @@ -770,8 +771,6 @@ static void print_record(const unsigned char *buf, size_t len) /* add newline if not already added ... */ if (i <= 0 || buf[i-1] != '\n') printf ("\n"); - if (marc_file) - fwrite (buf, 1, len, marc_file); } static void display_record(Z_External *r) @@ -827,8 +826,12 @@ static void display_record(Z_External *r) } } if (ent && ent->value == VAL_SOIF) + { print_record((const unsigned char *) r->u.octet_aligned->buf, r->u.octet_aligned->len); + if (marc_file) + fwrite (r->u.octet_aligned->buf, 1, r->u.octet_aligned->len, marc_file); + } else if (r->which == Z_External_octet) { const char *octet_buf = (char*)r->u.octet_aligned->buf; @@ -946,6 +949,8 @@ static void display_record(Z_External *r) return; } print_record(r->u.sutrs->buf, r->u.sutrs->len); + if (marc_file) + fwrite (r->u.sutrs->buf, 1, r->u.sutrs->len, marc_file); } else if (ent && ent->value == VAL_GRS1) { @@ -960,8 +965,7 @@ static void display_record(Z_External *r) puts (wrbuf_buf(w)); wrbuf_free(w, 1); } - else if ( /* OPAC display not complete yet .. */ - ent && ent->value == VAL_OPAC) + else if (ent && ent->value == VAL_OPAC) { int i; if (r->u.opac->bibliographicRecord) @@ -1276,6 +1280,34 @@ static int send_srw(Z_SRW_PDU *sr) #endif #if HAVE_XML2 +static char *encode_SRW_term(ODR o, const char *q) +{ + const char *in_charset = "ISO-8859-1"; + WRBUF w = wrbuf_alloc(); + yaz_iconv_t cd; + char *res; + if (outputCharset) + in_charset = outputCharset; + cd = yaz_iconv_open("UTF-8", in_charset); + if (!cd) + { + wrbuf_free(w, 1); + return odr_strdup(o, q); + } + wrbuf_iconv_write(w, cd, q, strlen(q)); + if (wrbuf_len(w)) + { + int len = wrbuf_len(w); + res = odr_strdupn(o, wrbuf_buf(w), len); + } + else + res = odr_strdup(o, q); + yaz_iconv_close(cd); + wrbuf_free(w, 1); + return res; +} + + static int send_SRW_scanRequest(const char *arg, int pos, int num) { Z_SRW_PDU *sr = 0; @@ -1287,11 +1319,11 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) { case QueryType_CQL: sr->u.scan_request->query_type = Z_SRW_query_type_cql; - sr->u.scan_request->scanClause.cql = odr_strdup(out, arg); + sr->u.scan_request->scanClause.cql = encode_SRW_term(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); + sr->u.scan_request->scanClause.pqf = encode_SRW_term(out, arg); break; default: printf ("Only CQL and PQF supported in SRW\n"); @@ -1325,17 +1357,17 @@ static int send_SRW_searchRequest(const char *arg) { case QueryType_CQL: srw_sr->u.request->query_type = Z_SRW_query_type_cql; - srw_sr->u.request->query.cql = odr_strdup(srw_sr_odr_out, arg); + srw_sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg); sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = odr_strdup(out, arg); + sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg); break; case QueryType_Prefix: srw_sr->u.request->query_type = Z_SRW_query_type_pqf; - srw_sr->u.request->query.pqf = odr_strdup(srw_sr_odr_out, arg); + srw_sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg); sr->u.request->query_type = Z_SRW_query_type_pqf; - sr->u.request->query.pqf = odr_strdup(out, arg); + sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg); break; default: printf ("Only CQL and PQF supported in SRW\n"); @@ -2081,7 +2113,7 @@ static int cmd_update_common(const char *arg, int version) FILE *inf; struct stat status; stat (fname, &status); - if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r"))) + if (S_ISREG(status.st_mode) && (inf = fopen(fname, "rb"))) { size_t len = status.st_size; char *buf = (char *) xmalloc (len); @@ -2285,9 +2317,14 @@ static int cmd_explain(const char *arg) static int cmd_init(const char *arg) { + if (*arg) + { + strncpy (cur_host, arg, sizeof(cur_host)-1); + cur_host[sizeof(cur_host)-1] = 0; + } if (!conn || protocol != PROTO_Z3950) return 0; - send_initRequest(0); + send_initRequest(cur_host); return 2; } @@ -2870,6 +2907,14 @@ int cmd_scanpos(const char *arg) return 0; } +int cmd_scansize(const char *arg) +{ + int r = sscanf(arg, "%d", &scan_size); + if (r == 0) + scan_size = 20; + return 0; +} + int cmd_scan(const char *arg) { if (protocol == PROTO_HTTP) @@ -2881,12 +2926,12 @@ int cmd_scan(const char *arg) return 0; if (*arg) { - if (send_SRW_scanRequest(arg, scan_position, 20) < 0) + if (send_SRW_scanRequest(arg, scan_position, scan_size) < 0) return 0; } else { - if (send_SRW_scanRequest(last_scan_line, 1, 20) < 0) + if (send_SRW_scanRequest(last_scan_line, 1, scan_size) < 0) return 0; } return 2; @@ -2913,12 +2958,12 @@ int cmd_scan(const char *arg) if (*arg) { strcpy (last_scan_query, arg); - if (send_scanrequest(arg, scan_position, 20, 0) < 0) + if (send_scanrequest(arg, scan_position, scan_size, 0) < 0) return 0; } else { - if (send_scanrequest(last_scan_query, 1, 20, last_scan_line) < 0) + if (send_scanrequest(last_scan_query, 1, scan_size, last_scan_line) < 0) return 0; } return 2; @@ -4052,6 +4097,7 @@ static struct { {"scan", cmd_scan, "",NULL,0,NULL}, {"scanstep", cmd_scanstep, "",NULL,0,NULL}, {"scanpos", cmd_scanpos, "",NULL,0,NULL}, + {"scansize", cmd_scansize, "",NULL,0,NULL}, {"sort", cmd_sort, " ...",NULL,0,NULL}, {"sort+", cmd_sort_newset, " ...",NULL,0,NULL}, {"authentication", cmd_authentication, "",NULL,0,NULL}, @@ -4127,29 +4173,48 @@ static int cmd_help (const char *line) for (i = 0; cmd_array[i].cmd; i++) if (*topic == 0 || strcmp (topic, cmd_array[i].cmd) == 0) printf(" %s %s\n", cmd_array[i].cmd, cmd_array[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"); + if (!strcmp(topic, "find")) + { + 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(" @prox exl dist ord rel uc ut Proximity. Use help prox\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"); + } + if (!strcmp(topic, "prox")) + { + printf("Proximity:\n"); + printf(" @prox exl dist ord rel uc ut\n"); + printf(" exl: exclude flag . 0=include, 1=exclude.\n"); + printf(" dist: distance integer.\n"); + printf(" ord: order flag. 0=unordered, 1=ordered.\n"); + printf(" rel: relation integer. 1< 2<= 3= 4>= 5> 6!= .\n"); + printf(" uc: unit class. k=known, p=private.\n"); + printf(" ut: unit type. 1=character, 2=word, 3=sentence,\n"); + printf(" 4=paragraph, 5=section, 6=chapter, 7=document,\n"); + printf(" 8=element, 9=subelement, 10=elementType, 11=byte.\n"); + printf("\nExamples:\n"); + printf(" Search for a and b in-order at most 3 words apart:\n"); + printf(" @prox 0 3 1 2 k 2 a b\n"); + printf(" Search for any order of a and b next to each other:\n"); + printf(" @prox 0 1 0 3 k 2 a b\n"); } return 1; } @@ -4239,8 +4304,7 @@ void process_cmd_line(char* line) if (!cmd_array[i].cmd) /* dump our help-screen */ { printf("Unknown command: %s.\n", word); - printf("use help for list of commands\n"); - /* cmd_help (""); */ + printf("Type 'help' for list of commands\n"); res = 1; } @@ -4429,6 +4493,12 @@ int main(int argc, char **argv) strcpy (open_command, "open "); strcat (open_command, arg); } + else + { + fprintf(stderr, "%s: Specify at most one server address\n", + prog); + exit(1); + } break; case 'd': dump_file_prefix = arg;