X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=b92581044fe40e20a3da2b2a44bce8ea686a372e;hb=f64aa61c61bf8bf851d7b66a5fc137669dc77452;hp=0aad3806887267e6ff000cf590cf19a834515324;hpb=d4f295af18b4678342ac477c3cbc6705438a035b;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 0aad380..b925810 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.254 2004-11-01 21:19:08 adam Exp $ + * $Id: client.c,v 1.265 2005-01-08 01:20:18 adam Exp $ */ #include @@ -32,6 +32,8 @@ #include #define S_ISREG(x) (x & _S_IFREG) #define S_ISDIR(x) (x & _S_IFDIR) +#else +#include #endif #include @@ -51,10 +53,10 @@ #include #include #include +#include #if HAVE_READLINE_READLINE_H #include -#include #endif #if HAVE_READLINE_HISTORY_H #include @@ -103,6 +105,8 @@ static char *esPackageName = 0; static char *yazProxy = 0; static int kilobytes = 1024; static char *negotiationCharset = 0; +static int negotiationCharsetRecords = 1; +static int negotiationCharsetVersion = 3; static char *outputCharset = 0; static char *marcCharset = 0; static char* yazLang = 0; @@ -326,7 +330,8 @@ static void send_initRequest(const char* type_and_host) out, (const char**)&negotiationCharset, negotiationCharset ? 1 : 0, - (const char**)&yazLang, yazLang ? 1 : 0, 1); + (const char**)&yazLang, yazLang ? 1 : 0, + negotiationCharsetRecords); } } @@ -1248,6 +1253,32 @@ static int send_srw(Z_SRW_PDU *sr) #endif #if HAVE_XML2 +static int send_SRW_scanRequest(const char *arg, int num, int pos) +{ + Z_SRW_PDU *sr = 0; + + /* regular request .. */ + 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; @@ -2818,34 +2849,49 @@ int cmd_scanpos(const char *arg) int cmd_scan(const char *arg) { - if (only_z3950()) - return 0; - if (!conn) + if (protocol == PROTO_HTTP) { - try_reconnect(); - - if (!conn) { - printf("Session not initialized yet\n"); +#if HAVE_XML2 + if (!conn) + cmd_open(0); + if (!conn) + return 0; + if (send_SRW_scanRequest(arg, 20, 0) < 0) return 0; - } - } - if (!ODR_MASK_GET(session->options, Z_Options_scan)) - { - printf("Target doesn't support scan\n"); + 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, 20, 0) < 0) + return 0; + } + else + { + if (send_scanrequest(last_scan_query, 1, 20, last_scan_line) < 0) + return 0; + } + return 2; } - return 2; } int cmd_schema(const char *arg) @@ -2986,7 +3032,11 @@ int cmd_marccharset(const char *arg) *l1 = 0; if (sscanf(arg, "%29s", l1) < 1) + { + printf("MARC character set is `%s'\n", + marcCharset ? marcCharset: "none"); return 1; + } xfree (marcCharset); marcCharset = 0; if (strcmp(l1, "-")) @@ -2994,50 +3044,82 @@ int cmd_marccharset(const char *arg) return 1; } -int cmd_charset(const char* arg) +int cmd_displaycharset(const char *arg) { - char l1[30], l2[30]; + char l1[30]; - *l1 = *l2 = 0; - if (sscanf(arg, "%29s %29s", l1, l2) < 1) + *l1 = 0; + if (sscanf(arg, "%29s", l1) < 1) { - printf("Current negotiation character set is `%s'\n", - negotiationCharset ? negotiationCharset: "none"); - printf("Current output character set is `%s'\n", + printf("Display character set is `%s'\n", outputCharset ? outputCharset: "none"); - return 1; - } - xfree (negotiationCharset); - negotiationCharset = NULL; - if (*l1 && strcmp(l1, "-")) - { - negotiationCharset = xstrdup(l1); - printf ("Character set negotiation : %s\n", negotiationCharset); } else - printf ("Character set negotiation disabled\n"); - if (*l2) { xfree (outputCharset); outputCharset = 0; - if (!strcmp(l2, "auto") && codeset) + if (!strcmp(l1, "auto") && codeset) { if (codeset) { - printf ("output charset: %s\n", codeset); + printf ("Display character set: %s\n", codeset); outputCharset = xstrdup(codeset); - - } else printf ("No codeset found on this system\n"); } - else if (strcmp(l2, "-")) - outputCharset = xstrdup(l2); - else - printf ("Output charset conversion disabled\n"); + else if (strcmp(l1, "-") && strcmp(l1, "none")) + outputCharset = xstrdup(l1); } + return 1; +} + +int cmd_negcharset(const char *arg) +{ + char l1[30]; + + *l1 = 0; + if (sscanf(arg, "%29s %d %d", l1, &negotiationCharsetRecords, + &negotiationCharsetVersion) < 1) + { + printf("Current negotiation character set is `%s'\n", + negotiationCharset ? negotiationCharset: "none"); + printf("Records in charset %s\n", negotiationCharsetRecords ? + "yes" : "no"); + printf("Charneg version %d\n", negotiationCharsetVersion); + } + else + { + xfree (negotiationCharset); + negotiationCharset = NULL; + if (*l1 && strcmp(l1, "-") && strcmp(l1, "none")) + { + negotiationCharset = xstrdup(l1); + printf ("Character set negotiation : %s\n", negotiationCharset); + } + } + return 1; +} +int cmd_charset(const char* arg) +{ + char l1[30], l2[30], l3[30]; + + *l1 = *l2 = *l3 = 0; + if (sscanf(arg, "%29s %29s %29s", l1, l2, l3) < 1) + { + cmd_negcharset(""); + cmd_displaycharset(""); + cmd_marccharset(""); + } + else + { + cmd_negcharset(l1); + if (*l2) + cmd_displaycharset(l2); + if (*l3) + cmd_marccharset(l3); + } return 1; } @@ -3054,7 +3136,7 @@ int cmd_lang(const char* arg) return 1; } -int cmd_source(const char* arg) +int cmd_source(const char* arg, int echo ) { /* first should open the file and read one line at a time.. */ FILE* includeFile; @@ -3081,7 +3163,10 @@ int cmd_source(const char* arg) if ((cp = strrchr (line, '\n'))) *cp = '\0'; - + + if( echo ) { + printf( "processing line: %s\n",line ); + }; process_cmd_line(line); } @@ -3092,6 +3177,19 @@ int cmd_source(const char* arg) return 1; } +int cmd_source_echo(const char* arg) +{ + cmd_source(arg, 1); + return 1; +} + +int cmd_source_noecho(const char* arg) +{ + cmd_source(arg, 0); + return 1; +} + + int cmd_subshell(const char* args) { if(strlen(args)) @@ -3305,17 +3403,19 @@ void source_rcfile() struct stat statbuf; char buffer[1000]; char* homedir=getenv("HOME"); - - if(!homedir) return; - - sprintf(buffer,"%s/.yazclientrc",homedir); - - if(stat(buffer,&statbuf)==0) { - cmd_source(buffer); - } + + if( homedir ) { + + sprintf(buffer,"%s/.yazclientrc",homedir); + + if(stat(buffer,&statbuf)==0) { + cmd_source(buffer, 0 ); + } + + }; if(stat(".yazclientrc",&statbuf)==0) { - cmd_source(".yazclientrc"); + cmd_source(".yazclientrc", 0 ); } } @@ -3417,6 +3517,40 @@ 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); + if (term->value) + printf ("%s: ", term->value); + if (term->numberOfRecords) + printf ("%d", *term->numberOfRecords); + 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; @@ -3444,6 +3578,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; } @@ -3900,9 +4036,11 @@ static struct { {"packagename", cmd_packagename, "",NULL,0,NULL}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, {"charset", cmd_charset, " ",NULL,0,NULL}, + {"negcharset", cmd_negcharset, "",NULL,0,NULL}, + {"displaycharset", cmd_displaycharset, "",NULL,0,NULL}, {"marccharset", cmd_marccharset, "",NULL,0,NULL}, {"lang", cmd_lang, "",NULL,0,NULL}, - {".", cmd_source, "",NULL,1,NULL}, + {".", cmd_source_echo, "",NULL,1,NULL}, {"!", cmd_subshell, "Subshell command",NULL,1,NULL}, {"set_apdufile", cmd_set_apdufile, "",NULL,1,NULL}, {"set_berfile", cmd_set_berfile, "",NULL,1,NULL},