/*
- * Copyright (c) 1995-2004, Index Data
+ * Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.258 2004-12-02 14:04:17 adam Exp $
+ * $Id: client.c,v 1.268 2005-01-15 19:47:08 adam Exp $
*/
#include <stdio.h>
#include <io.h>
#define S_ISREG(x) (x & _S_IFREG)
#define S_ISDIR(x) (x & _S_IFDIR)
+#else
+#include <unistd.h>
#endif
#include <yaz/yaz-util.h>
#include <yaz/srw.h>
#include <yaz/yaz-ccl.h>
#include <yaz/cql.h>
-#include <yaz/ylog.h>
+#include <yaz/log.h>
#if HAVE_READLINE_READLINE_H
#include <readline/readline.h>
-#include <unistd.h>
#endif
#if HAVE_READLINE_HISTORY_H
#include <readline/history.h>
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;
out,
(const char**)&negotiationCharset,
negotiationCharset ? 1 : 0,
- (const char**)&yazLang, yazLang ? 1 : 0, 1);
+ (const char**)&yazLang, yazLang ? 1 : 0,
+ negotiationCharsetRecords);
}
}
#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;
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, 20) < 0)
+ return 0;
+ }
+ else
+ {
+ if (send_SRW_scanRequest(last_scan_line, 1, 20) < 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, 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)
*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, "-"))
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;
}
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; i<res->num_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; i<res->num_terms; i++)
+ handle_srw_scan_term(res->terms + i);
+}
+
static void http_response(Z_HTTP_Response *hres)
{
int ret = -1;
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;
}
{"packagename", cmd_packagename, "<packagename>",NULL,0,NULL},
{"proxy", cmd_proxy, "[('tcp'|'ssl')]<host>[':'<port>]",NULL,0,NULL},
{"charset", cmd_charset, "<nego_charset> <output_charset>",NULL,0,NULL},
+ {"negcharset", cmd_negcharset, "<nego_charset>",NULL,0,NULL},
+ {"displaycharset", cmd_displaycharset, "<output_charset>",NULL,0,NULL},
{"marccharset", cmd_marccharset, "<charset_name>",NULL,0,NULL},
{"lang", cmd_lang, "<language_code>",NULL,0,NULL},
{".", cmd_source_echo, "<filename>",NULL,1,NULL},