* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.341 2007-05-30 08:40:26 adam Exp $
+ * $Id: client.c,v 1.353 2007-11-21 13:53:20 adam Exp $
*/
/** \file client.c
* \brief yaz-client program
static file_history_t file_history = 0;
-static char *sru_method = "soap";
+static char sru_method[10] = "soap";
+static char sru_version[10] = "1.2";
static char *codeset = 0; /* character set for output */
static int hex_dump = 0;
static char *dump_file_prefix = 0;
int rl_attempted_completion_over = 0;
#endif
-/* set this one to 1, to avoid decode of unknown MARCs */
-#define AVOID_MARC_DECODE 1
-
#define maxOtherInfosSupported 10
struct eoi {
Odr_oid oid[OID_SIZE];
#endif
static char *command_generator(const char *text, int state);
int cmd_register_tab(const char* arg);
+int cmd_querycharset(const char *arg);
static void close_session (void);
negotiationCharsetRecords);
}
}
+ else if (ODR_MASK_GET(req->options, Z_Options_negotiationModel))
+ {
+ Z_OtherInformation **p;
+ Z_OtherInformationUnit *p0;
+
+ yaz_oi_APDU(apdu, &p);
+
+ if ((p0=yaz_oi_update(p, out, NULL, 0, 0)))
+ {
+ p0->which = Z_OtherInfo_externallyDefinedInfo;
+ p0->information.externallyDefinedInfo =
+ yaz_set_proposal_charneg(out, 0, 0, 0, 0, 0);
+ }
+
+ }
if (send_apdu(apdu))
printf("Sent initrequest.\n");
}
Z_CharSetandLanguageNegotiation *p =
yaz_get_charneg_record(res->otherInfo);
- if (p) {
-
+ if (p)
+ {
char *charset=NULL, *lang=NULL;
int selected;
yaz_get_response_charneg(session_mem, p, &charset, &lang,
&selected);
- printf("Accepted character set : %s\n", charset);
- printf("Accepted code language : %s\n", lang ? lang : "none");
+ printf("Accepted character set : %s\n", charset ? charset:"none");
+ printf("Accepted code language : %s\n", lang ? lang:"none");
printf("Accepted records in ...: %d\n", selected );
- if (outputCharset && negotiationCharset) {
+ if (outputCharset && charset)
+ {
printf("Converting between %s and %s\n",
- outputCharset, negotiationCharset);
- odr_set_charset (out, charset, outputCharset);
- odr_set_charset (in, outputCharset, charset);
+ outputCharset, charset);
+ odr_set_charset(out, charset, outputCharset);
+ odr_set_charset(in, outputCharset, charset);
+ cmd_querycharset(charset);
}
- else {
- odr_set_charset (out, 0, 0);
- odr_set_charset (in, 0, 0);
+ else
+ {
+ odr_set_charset(out, 0, 0);
+ odr_set_charset(in, 0, 0);
}
}
}
au.which = Z_IdAuthentication_idPass;
au.u.idPass = &idPass;
idPass.groupId = NULL;
- idPass.userId = user;
- idPass.password = group;
+ idPass.userId = !strcmp(user, "-") ? 0 : user;
+ idPass.password = !strcmp(group, "-") ? 0 : group;
printf("Authentication set to User (%s), Pass (%s)\n", user, group);
}
if (r == 3)
gdu = z_get_HTTP_Request_host_path(out, host_port, path);
- if (!strcmp(sru_method, "get"))
+ if (!yaz_matchstr(sru_method, "get"))
{
yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset);
}
- else if (!strcmp(sru_method, "post"))
+ else if (!yaz_matchstr(sru_method, "post"))
{
yaz_sru_post_encode(gdu->u.HTTP_Request, sr, out, charset);
}
- else if (!strcmp(sru_method, "soap"))
+ else if (!yaz_matchstr(sru_method, "soap"))
{
yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset);
}
Z_SRW_PDU *sr = 0;
/* regular requestse .. */
- sr = yaz_srw_get(out, Z_SRW_scan_request);
+ sr = yaz_srw_get_pdu(out, Z_SRW_scan_request, sru_version);
switch(queryType)
{
setno = 1;
/* save this for later .. when fetching individual records */
- srw_sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request);
+ srw_sr = yaz_srw_get_pdu(srw_sr_odr_out, Z_SRW_searchRetrieve_request,
+ sru_version);
/* regular request .. */
- sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request);
+ sr = yaz_srw_get_pdu(out, Z_SRW_searchRetrieve_request, sru_version);
switch(queryType)
{
}
}
}
+ if (ext->which == Z_External_itemOrder)
+ {
+ Z_IOTaskPackage *otp = ext->u.itemOrder->u.taskPackage;
+ if (otp && otp->targetPart && otp->targetPart->itemRequest)
+ {
+ Z_External *ext = otp->targetPart->itemRequest;
+ if (ext->which == Z_External_octet)
+ {
+ Odr_oct *doc = ext->u.octet_aligned;
+ printf("Got itemRequest doc %.*s\n",
+ doc->len, doc->buf);
+ }
+ }
+ }
}
if (res->taskPackage && res->taskPackage->which == Z_External_octet)
{
toKeep->databaseName = databaseNames[0];
toKeep->schema = 0;
+ if (record_schema)
+ {
+ toKeep->schema = yaz_string_to_oid_odr(yaz_oid_std(),
+ CLASS_SCHEMA,
+ record_schema, out);
+ }
toKeep->elementSetName = 0;
toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
toKeep->databaseName = databaseNames[0];
toKeep->schema = 0;
+ if (record_schema)
+ {
+ toKeep->schema = yaz_string_to_oid_odr(yaz_oid_std(),
+ CLASS_SCHEMA,
+ record_schema, out);
+ }
toKeep->elementSetName = 0;
toKeep->actionQualifier = 0;
toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
if (!*arg)
{
printf("SRU method is: %s\n", sru_method);
+ printf("SRU version is: %s\n", sru_version);
}
else
{
- if (!yaz_matchstr(arg, "post"))
- sru_method = "post";
- else if (!yaz_matchstr(arg, "get"))
- sru_method = "get";
- else if (!yaz_matchstr(arg, "soap"))
- sru_method = "soap";
- else
+ int r;
+ r = sscanf(arg, "%9s %9s", sru_method, sru_version);
+ if (r >= 1)
{
- printf("Unknown SRU method: %s\n", arg);
- printf("Specify one of POST, GET, SOAP\n");
+ if (!yaz_matchstr(sru_method, "post"))
+ ;
+ else if (!yaz_matchstr(sru_method, "get"))
+ ;
+ else if (!yaz_matchstr(sru_method, "soap"))
+ ;
+ else
+ {
+ strcpy(sru_method, "soap");
+ printf("Unknown SRU method: %s\n", arg);
+ printf("Specify one of POST, GET, SOAP\n");
+ }
}
}
return 0;
if (t->displayTerm)
printf("%s", t->displayTerm);
else if (t->term->which == Z_Term_general)
- {
printf("%.*s", t->term->u.general->len, t->term->u.general->buf);
- sprintf(last_scan_line, "%.*s", t->term->u.general->len,
- t->term->u.general->buf);
- }
else
printf("Term (not general)");
+ if (t->term->which == Z_Term_general)
+ sprintf(last_scan_line, "%.*s", t->term->u.general->len,
+ t->term->u.general->buf);
+
if (t->globalOccurrences)
printf (" (%d)\n", *t->globalOccurrences);
else
}
xfree (marcCharset);
marcCharset = 0;
- if (strcmp(l1, "-"))
+ if (strcmp(l1, "-") && strcmp(l1, "none"))
marcCharset = xstrdup(l1);
return 1;
}
}
xfree (queryCharset);
queryCharset = 0;
- if (strcmp(l1, "-"))
+ if (strcmp(l1, "-") && strcmp(l1, "none"))
queryCharset = xstrdup(l1);
return 1;
}
if (sscanf(arg, "%29s %d %d", l1, &negotiationCharsetRecords,
&negotiationCharsetVersion) < 1)
{
- printf("Current negotiation character set is `%s'\n",
+ printf("Negotiation character set `%s'\n",
negotiationCharset ? negotiationCharset: "none");
- printf("Records in charset %s\n", negotiationCharsetRecords ?
- "yes" : "no");
- printf("Charneg version %d\n", negotiationCharsetVersion);
+ if (negotiationCharset)
+ {
+ printf("Records in charset %s\n", negotiationCharsetRecords ?
+ "yes" : "no");
+ printf("Charneg version %d\n", negotiationCharsetVersion);
+ }
}
else
{
int cmd_charset(const char* arg)
{
- char l1[30], l2[30], l3[30];
+ char l1[30], l2[30], l3[30], l4[30];
- *l1 = *l2 = *l3 = 0;
- if (sscanf(arg, "%29s %29s %29s", l1, l2, l3) < 1)
+ *l1 = *l2 = *l3 = *l4 = '\0';
+ if (sscanf(arg, "%29s %29s %29s %29s", l1, l2, l3, l4) < 1)
{
cmd_negcharset("");
cmd_displaycharset("");
cmd_marccharset("");
+ cmd_querycharset("");
}
else
{
cmd_displaycharset(l2);
if (*l3)
cmd_marccharset(l3);
+ if (*l4)
+ cmd_querycharset(l4);
}
return 1;
}
int cmd_lang(const char* arg)
{
if (*arg == '\0') {
- printf("Current language is `%s'\n", (yazLang)?yazLang:NULL);
+ printf("Current language is `%s'\n", yazLang ? yazLang : "none");
return 1;
}
xfree (yazLang);
return 1;
}
-void source_rcfile(void)
+void source_rc_file(const char *rc_file)
{
- /* Look for a $HOME/.yazclientrc and source it if it exists */
+ /* If rc_file != NULL, source that. Else
+ Look for .yazclientrc and read it if it exists.
+ If it does not exist, read $HOME/.yazclientrc instead */
struct stat statbuf;
- char fname[1000];
- char* homedir = getenv("HOME");
-
- sprintf(fname, "%.500s%s%s", homedir ? homedir : "",
- homedir ? "/" : "",
- ".yazclientrc");
- if (stat(fname,&statbuf)==0)
- cmd_source(fname, 0 );
+ if (rc_file)
+ {
+ if (stat(rc_file, &statbuf) == 0)
+ cmd_source(rc_file, 0);
+ else
+ {
+ fprintf(stderr, "yaz_client: cannot source '%s'\n", rc_file);
+ exit(1);
+ }
+ }
+ else
+ {
+ char fname[1000];
+ strcpy(fname, ".yazclientrc");
+ if (stat(fname, &statbuf)==0)
+ {
+ cmd_source(fname, 0);
+ }
+ else
+ {
+ const char* homedir = getenv("HOME");
+ if (homedir)
+ {
+ sprintf(fname, "%.800s/%s", homedir, ".yazclientrc");
+ if (stat(fname, &statbuf)==0)
+ cmd_source(fname, 0);
+ }
+ }
+ }
}
void add_to_readline_history(void *client_data, const char *line)
#endif
}
-static void initialize(void)
+static void initialize(const char *rc_file)
{
FILE *inf;
int i;
cmd_format("usmarc");
- source_rcfile();
+ source_rc_file(rc_file);
file_history = file_history_new();
file_history_load(file_history);
const char *connection_head = z_HTTP_header_lookup(hres->headers,
"Connection");
if (!yaz_srw_check_content_type(hres))
- printf("Content type does not appear to be XML");
+ printf("Content type does not appear to be XML\n");
else
{
Z_SOAP *soap_package = 0;
{"zversion", cmd_zversion, "", NULL, 0, NULL},
{"help", cmd_help, "", NULL,0,NULL},
{"init", cmd_init, "", NULL,0,NULL},
- {"sru", cmd_sru, "", NULL,0,NULL},
+ {"sru", cmd_sru, "<method> <version>", NULL,0,NULL},
{"exit", cmd_quit, "",NULL,0,NULL},
{0,0,0,0,0,0}
};
char *open_command = 0;
char *auth_command = 0;
char *arg;
+ const char *rc_file = 0;
int ret;
#if HAVE_LOCALE_H
ODR_MASK_SET(&z3950_options, Z_Options_delSet);
ODR_MASK_SET(&z3950_options, Z_Options_negotiationModel);
- while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:", argv, argc, &arg)) != -2)
+ while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:f:", argv, argc, &arg)) != -2)
{
switch (ret)
{
exit(1);
}
break;
+ case 'a':
+ if (!strcmp(arg, "-"))
+ apdu_file=stderr;
+ else
+ apdu_file=fopen(arg, "a");
+ break;
+ case 'b':
+ if (!strcmp(arg, "-"))
+ ber_file=stderr;
+ else
+ ber_file=fopen(arg, "a");
+ break;
+ case 'c':
+ strncpy (ccl_fields, arg, sizeof(ccl_fields)-1);
+ ccl_fields[sizeof(ccl_fields)-1] = '\0';
+ break;
case 'd':
dump_file_prefix = arg;
break;
+ case 'f':
+ rc_file = arg;
+ break;
case 'k':
kilobytes = atoi(arg);
break;
exit (1);
}
break;
- case 't':
- outputCharset = xstrdup(arg);
- break;
- case 'c':
- strncpy (ccl_fields, arg, sizeof(ccl_fields)-1);
- ccl_fields[sizeof(ccl_fields)-1] = '\0';
+ case 'p':
+ yazProxy = xstrdup(arg);
break;
case 'q':
strncpy (cql_fields, arg, sizeof(cql_fields)-1);
cql_fields[sizeof(cql_fields)-1] = '\0';
break;
- case 'b':
- if (!strcmp(arg, "-"))
- ber_file=stderr;
- else
- ber_file=fopen(arg, "a");
- break;
- case 'a':
- if (!strcmp(arg, "-"))
- apdu_file=stderr;
- else
- apdu_file=fopen(arg, "a");
- break;
- case 'x':
- hex_dump = 1;
- break;
- case 'p':
- yazProxy = xstrdup(arg);
+ case 't':
+ outputCharset = xstrdup(arg);
break;
case 'u':
if (!auth_command)
case 'V':
show_version();
break;
+ case 'x':
+ hex_dump = 1;
+ break;
default:
fprintf (stderr, "Usage: %s "
- " [-a <apdulog>]"
+ " [-a apdulog]"
" [-b berdump]"
- " [-d dump]\n"
- " [-c cclfields]"
+ " [-c cclfile]"
+ " [-d dump]"
+ " [-f cmdfile]"
" [-k size]"
- " [-m <marclog>]\n"
- " [-p <proxy-addr>]"
- " [-q cqlfields]"
- " [-u <auth>]"
+ " [-m marclog]"
+ " [-p proxy-addr]"
+ " [-q cqlfile]"
+ " [-t dispcharset]"
+ " [-u auth]"
+ " [-v loglevel]"
" [-V]"
- " [<server-addr>]\n",
+ " [-x]"
+ " [server-addr]\n",
prog);
exit (1);
}
}
- initialize();
+ initialize(rc_file);
if (auth_command)
{
#ifdef HAVE_GETTIMEOFDAY