/*
- * Copyright (c) 1995-2004, Index Data
+ * Copyright (c) 1995-2005, Index Data
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.259 2004-12-09 07:53:21 adam Exp $
+ * $Id: client.c,v 1.266 2005-01-09 21:52:48 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 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;
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)
*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, "-"))
}
else if (strcmp(l1, "-") && strcmp(l1, "none"))
outputCharset = xstrdup(l1);
- else
- printf ("Display character set conversion disabled\n");
}
return 1;
}
char l1[30];
*l1 = 0;
- if (sscanf(arg, "%29s", l1) < 1)
+ if (sscanf(arg, "%29s %d %d", l1, &negotiationCharsetRecords,
+ &negotiationCharsetVersion) < 1)
{
printf("Current negotiation character set is `%s'\n",
- negotiationCharset ? negotiationCharset: "none");
- return 1;
+ negotiationCharset ? negotiationCharset: "none");
+ printf("Records in charset %s\n", negotiationCharsetRecords ?
+ "yes" : "no");
+ printf("Charneg version %d\n", negotiationCharsetVersion);
}
- xfree (negotiationCharset);
- negotiationCharset = NULL;
- if (*l1 && strcmp(l1, "-") && strcmp(l1, "none"))
+ else
{
- negotiationCharset = xstrdup(l1);
- printf ("Character set negotiation : %s\n", negotiationCharset);
+ xfree (negotiationCharset);
+ negotiationCharset = NULL;
+ if (*l1 && strcmp(l1, "-") && strcmp(l1, "none"))
+ {
+ negotiationCharset = xstrdup(l1);
+ printf ("Character set negotiation : %s\n", negotiationCharset);
+ }
}
- else
- printf ("Character set negotiation disabled\n");
return 1;
}
int cmd_charset(const char* arg)
{
- char l1[30], l2[30];
+ char l1[30], l2[30], l3[30];
- *l1 = *l2 = 0;
- if (sscanf(arg, "%29s %29s", l1, l2) < 1)
+ *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);
+ 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;
}