X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=9f44998e74778694729ce93c7fb0762edb58ccb3;hb=4602e6f66713b5c44cebd5a8deb2790e2cdea91e;hp=a79c51c0480aa892e92dcb34d3ee8be171de2bfa;hpb=9b9bfb10cc46f2d97c38bc9a0a9f96e9a5f385f4;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index a79c51c..9f44998 100644 --- a/client/client.c +++ b/client/client.c @@ -1,20 +1,33 @@ /* - * Copyright (c) 1995-2004, Index Data + * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.264 2005-01-02 20:31:39 adam Exp $ + * $Id: client.c,v 1.276 2005-04-20 12:59:51 adam Exp $ */ #include #include #include +#include +#include +#if HAVE_SYS_TYPES_H +#include +#endif #if HAVE_LOCALE_H #include #endif - #if HAVE_LANGINFO_H #include #endif +#if HAVE_UNISTD_H +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif +#if HAVE_SYS_TIME_H +#include +#endif #if HAVE_OPENSSL_SSL_H #include @@ -25,15 +38,12 @@ #include #endif -#include -#include - #ifdef WIN32 +#include #include +#include #define S_ISREG(x) (x & _S_IFREG) #define S_ISDIR(x) (x & _S_IFDIR) -#else -#include #endif #include @@ -62,7 +72,6 @@ #include #endif -#include #include "admin.h" #include "tabcomplete.h" @@ -121,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 { @@ -377,14 +387,18 @@ static int process_initResponse(Z_InitResponse *res) render_initUserInfo(uif->u.userInfo1); } else { printf("UserInformationfield:\n"); - if (!z_External(print, (Z_External**)&uif, 0, 0)) { + if (!z_External(print, (Z_External**)&uif, 0, 0)) + { odr_perror(print, "Printing userinfo\n"); odr_reset(print); } if (uif->which == Z_External_octet) { printf("Guessing visiblestring:\n"); - printf("'%s'\n", uif->u. octet_aligned->buf); - } else if (uif->which == Z_External_single) { + printf("'%.*s'\n", uif->u.octet_aligned->len, + uif->u.octet_aligned->buf); + } + else if (uif->which == Z_External_single) + { Odr_any *sat = uif->u.single_ASN1_type; oident *oid = oid_getentbyoid(uif->direct_reference); if (oid->value == VAL_OCLCUI) { @@ -402,7 +416,8 @@ static int process_initResponse(Z_InitResponse *res) else { /* Peek at any private Init-diagnostic APDUs */ - printf("### NAUGHTY: External is '%.*s'\n", sat->len, sat->buf); + printf("### NAUGHTY: External is '%.*s'\n", + sat->len, sat->buf); } } odr_reset (print); @@ -456,11 +471,20 @@ static void render_initUserInfo(Z_OtherInformation *ui1) { Z_OtherInformationUnit *unit = ui1->list[i]; printf(" %d: otherInfo unit contains ", i+1); if (unit->which == Z_OtherInfo_externallyDefinedInfo && + unit->information.externallyDefinedInfo && unit->information.externallyDefinedInfo->which == Z_External_diag1) { render_diag(unit->information.externallyDefinedInfo->u.diag1); - } else { - printf("unsupported otherInfo unit type %d\n", unit->which); + } + else if (unit->which != Z_OtherInfo_externallyDefinedInfo) + { + printf("unsupported otherInfo unit->which = %d\n", unit->which); + } + else + { + printf("unsupported otherInfo unit external %d\n", + unit->information.externallyDefinedInfo ? + unit->information.externallyDefinedInfo->which : -2); } } } @@ -578,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); @@ -747,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) @@ -804,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; @@ -923,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) { @@ -937,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) @@ -1253,6 +1280,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; @@ -2032,7 +2085,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); @@ -2236,9 +2289,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; } @@ -2821,36 +2879,67 @@ 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 (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, scan_size) < 0) + return 0; + } + else + { + if (send_SRW_scanRequest(last_scan_line, 1, scan_size) < 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, scan_size, 0) < 0) + return 0; + } + else + { + if (send_scanrequest(last_scan_query, 1, scan_size, last_scan_line) < 0) + return 0; + } + return 2; } - return 2; } int cmd_schema(const char *arg) @@ -3476,6 +3565,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 +3634,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; } @@ -3936,6 +4069,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}, @@ -4313,6 +4447,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;