X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=444aa962f766a628e6c35d4f70181de9273973b4;hb=9510c6c592b84da4a6b2616a61f0cebfce5a1c87;hp=9c340ab22390e8cc31558fb9cff73be664dbeb26;hpb=6e8e985ed2ed85ebad7ee26a86dabcafebc18573;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 9c340ab..444aa96 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2004, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.244 2004-05-27 21:24:44 ja7 Exp $ + * $Id: client.c,v 1.252 2004-09-22 13:21:37 adam Exp $ */ #include @@ -115,7 +115,8 @@ static char *last_open_command = NULL; static int auto_reconnect = 0; static Odr_bitmask z3950_options; static int z3950_version = 3; - +static int scan_stepSize = 0; +static int scan_position = 1; static char cur_host[200]; typedef enum { @@ -379,9 +380,25 @@ static int process_initResponse(Z_InitResponse *res) printf("Guessing visiblestring:\n"); printf("'%s'\n", uif->u. octet_aligned->buf); } else if (uif->which == Z_External_single) { - /* Peek at any private Init-diagnostic APDUs */ Odr_any *sat = uif->u.single_ASN1_type; - printf("### NAUGHTY: External is '%s'\n", sat->buf); + oident *oid = oid_getentbyoid(uif->direct_reference); + if (oid->value == VAL_OCLCUI) { + Z_OCLC_UserInformation *oclc_ui; + ODR decode = odr_createmem(ODR_DECODE); + odr_setbuf(decode, sat->buf, sat->len, 0); + if (!z_OCLC_UserInformation(decode, &oclc_ui, 0, 0)) + printf ("Bad OCLC UserInformation:\n"); + else + printf ("OCLC UserInformation:\n"); + if (!z_OCLC_UserInformation(print, &oclc_ui, 0, 0)) + printf ("Bad OCLC UserInformation spec\n"); + odr_destroy(decode); + } + else + { + /* Peek at any private Init-diagnostic APDUs */ + printf("### NAUGHTY: External is '%.*s'\n", sat->len, sat->buf); + } } odr_reset (print); } @@ -568,6 +585,8 @@ int session_connect(const char *arg) return 0; } #if HAVE_XML2 + if (conn->protocol == PROTO_HTTP) + queryType = QueryType_CQL; #else if (conn->protocol == PROTO_HTTP) { @@ -723,6 +742,8 @@ 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) @@ -1241,14 +1262,31 @@ static int send_SRW_searchRequest(const char *arg) setno = 1; /* save this for later .. when fetching individual records */ - srw_sr = sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); - sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = odr_strdup(srw_sr_odr_out, arg); - + srw_sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); + + /* regular request .. */ sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request); - sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = odr_strdup(out, arg); + switch(queryType) + { + 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); + + sr->u.request->query_type = Z_SRW_query_type_cql; + sr->u.request->query.cql = odr_strdup(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); + + sr->u.request->query_type = Z_SRW_query_type_pqf; + sr->u.request->query.pqf = odr_strdup(out, arg); + break; + default: + printf ("Only CQL and PQF supported in SRW\n"); + return 0; + } sr->u.request->maximumRecords = odr_intdup(out, 0); if (record_schema) @@ -2601,6 +2639,7 @@ int send_scanrequest(const char *query, int pp, int num, const char *term) req->databaseNames = databaseNames; req->numberOfTermsRequested = # req->preferredPositionInResponse = &pp; + req->stepSize = odr_intdup(out, scan_stepSize); send_apdu(apdu); return 2; } @@ -2763,6 +2802,20 @@ int cmd_sort_newset (const char *arg) return cmd_sort_generic (arg, 1); } +int cmd_scanstep(const char *arg) +{ + scan_stepSize = atoi(arg); + return 0; +} + +int cmd_scanpos(const char *arg) +{ + int r = sscanf(arg, "%d", &scan_position); + if (r == 0) + scan_position = 1; + return 0; +} + int cmd_scan(const char *arg) { if (only_z3950()) @@ -2784,7 +2837,7 @@ int cmd_scan(const char *arg) if (*arg) { strcpy (last_scan_query, arg); - if (send_scanrequest(arg, 1, 20, 0) < 0) + if (send_scanrequest(arg, scan_position, 20, 0) < 0) return 0; } else @@ -3210,7 +3263,7 @@ int cmd_register_oid(const char* args) { name = oid_str; val = 0; - while (isdigit (*name)) + while (isdigit (*(unsigned char *) name)) { val = val*10 + (*name - '0'); name++; @@ -3325,7 +3378,11 @@ static void handle_srw_record(Z_SRW_record *rec) printf (" schema=%s", rec->recordSchema); printf ("\n"); if (rec->recordData_buf && rec->recordData_len) + { fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout); + if (marc_file) + fwrite (rec->recordData_buf, 1, rec->recordData_len, marc_file); + } else printf ("No data!"); printf("\n"); @@ -3804,6 +3861,8 @@ static struct { {"base", cmd_base, "",NULL,0,NULL}, {"show", cmd_show, "['+'<#recs>['+']]",NULL,0,NULL}, {"scan", cmd_scan, "",NULL,0,NULL}, + {"scanstep", cmd_scanstep, "",NULL,0,NULL}, + {"scanpos", cmd_scanpos, "",NULL,0,NULL}, {"sort", cmd_sort, " ...",NULL,0,NULL}, {"sort+", cmd_sort_newset, " ...",NULL,0,NULL}, {"authentication", cmd_authentication, "",NULL,0,NULL}, @@ -3970,7 +4029,7 @@ void process_cmd_line(char* line) char* lastnonspace=NULL; for(;*p; ++p) { - if(!isspace(*p)) { + if(!isspace(*(unsigned char *) p)) { lastnonspace = p; } }