* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.282 2005-05-20 06:22:48 ja7 Exp $
+ * $Id: client.c,v 1.291 2005-06-24 19:56:52 adam Exp $
*/
#include <stdio.h>
static char *record_schema = 0;
static int sent_close = 0;
static NMEM session_mem = NULL; /* memory handle for init-response */
-static Z_InitResponse *session = 0; /* session parameters */
+static Z_InitResponse *session_initResponse = 0; /* session parameters */
static char last_scan_line[512] = "0";
static char last_scan_query[512] = "0";
static char ccl_fields[512] = "default.bib";
int ver = 0;
/* save session parameters for later use */
session_mem = odr_extract_mem(in);
- session = res;
+ session_initResponse = res;
for (ver = 0; ver < 8; ver++)
if (!ODR_MASK_GET(res->protocolVersion, ver))
return 1;
}
+static int parse_cmd_doc(const char **arg, ODR out, char **buf,
+ int *len, int opt)
+{
+ const char *sep;
+ while (**arg && strchr(" \t\n\r\f", **arg))
+ (*arg)++;
+ if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"')))
+ {
+ (*arg)++;
+ *len = sep - *arg;
+ *buf = odr_strdupn(out, *arg, *len);
+ (*arg) = sep+1;
+ return 1;
+ }
+ else if ((*arg)[0] && (*arg)[0] != '\"')
+ {
+ long fsize;
+ FILE *inf;
+ const char *fname = *arg;
+
+ while (**arg != '\0' && **arg != ' ')
+ (*arg)++;
+
+ inf = fopen(fname, "rb");
+ if (!inf)
+ {
+ printf("Couldn't open %s\n", fname);
+ return 0;
+ }
+ if (fseek(inf, 0L, SEEK_END) == -1)
+ {
+ printf("Couldn't seek in %s\n", fname);
+ fclose(inf);
+ return 0;
+ }
+ fsize = ftell(inf);
+ if (fseek(inf, 0L, SEEK_SET) == -1)
+ {
+ printf("Couldn't seek in %s\n", fname);
+ fclose(inf);
+ return 0;
+ }
+ *len = fsize;
+ *buf = odr_malloc(out, fsize);
+ if (fread(*buf, 1, fsize, inf) != fsize)
+ {
+ printf("Unable to read %s\n", fname);
+ fclose(inf);
+ return 0;
+ }
+ fclose(inf);
+ return 1;
+ }
+ else if (**arg == '\0')
+ {
+ if (opt)
+ {
+ *len = 0;
+ *buf = 0;
+ return 1;
+ }
+ printf("Missing doc argument\n");
+ }
+ else
+ printf("Bad doc argument %s\n", *arg);
+ return 0;
+}
+
static int cmd_base(const char *arg)
{
if (!*arg)
if (conn)
{
cs_close (conn);
- conn = NULL;
- if (session_mem)
- {
- nmem_destroy (session_mem);
- session_mem = NULL;
- }
+ conn = 0;
}
+ if (session_mem)
+ {
+ nmem_destroy (session_mem);
+ session_mem = NULL;
+ session_initResponse = 0;
+ }
cs_get_host_args(arg, &basep);
strncpy(type_and_host, arg, sizeof(type_and_host)-1);
}
}
}
+ if (res->taskPackage && res->taskPackage->which == Z_External_octet)
+ {
+ Odr_oct *doc = res->taskPackage->u.octet_aligned;
+ printf("%.*s\n", doc->len, doc->buf);
+ }
}
const char *get_ill_element (void *clientData, const char *element)
Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
Z_External *r;
- char action[20], recid[20], fname[80];
+ char action[20], recid[20];
+ char *rec_buf;
+ int rec_len;
int action_no;
+ int noread = 0;
Z_External *record_this = 0;
if (only_z3950())
return 0;
*action = 0;
*recid = 0;
- *fname = 0;
- sscanf (arg, "%19s %19s %79s", action, recid, fname);
+ sscanf (arg, "%19s %19s%n", action, recid, &noread);
+ if (noread == 0)
+ {
+ printf("Update must be followed by action and recid\n");
+ printf(" where action is one of insert,replace,delete.update\n");
+ printf(" recid is some record ID (any string)\n");
+ return 0;
+ }
if (!strcmp (action, "insert"))
action_no = Z_IUOriginPartToKeep_recordInsert;
return 0;
}
- if (*fname)
- {
- FILE *inf;
- struct stat status;
- stat (fname, &status);
- if (S_ISREG(status.st_mode) && (inf = fopen(fname, "rb")))
- {
- size_t len = status.st_size;
- char *buf = (char *) xmalloc (len);
-
- fread (buf, 1, len, inf);
+ arg += noread;
+ if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len, 1) == 0)
+ return 0;
- fclose (inf);
-
- record_this = z_ext_record (out, VAL_TEXT_XML, buf, len);
-
- xfree (buf);
- }
- else
- {
- printf ("File %s doesn't exist\n", fname);
- return 0;
- }
- }
+ if (rec_buf)
+ record_this = z_ext_record (out, VAL_TEXT_XML, rec_buf, rec_len);
else
{
if (!record_last)
return 2;
}
+static int cmd_xmles(const char *arg)
+{
+ int noread = 0;
+ char oid_str[51];
+ int oid_value_xmles = VAL_XMLES;
+ Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
+ Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+
+ Z_External *ext = (Z_External *) odr_malloc(out, sizeof(*ext));
+ req->taskSpecificParameters = ext;
+ ext->descriptor = 0;
+ ext->which = Z_External_octet;
+ ext->u.single_ASN1_type = (Odr_oct *) odr_malloc (out, sizeof(Odr_oct));
+
+ sscanf(arg, "%50s%n", oid_str, &noread);
+ if (noread == 0)
+ {
+ printf("Missing OID for xmles\n");
+ return 0;
+ }
+ arg += noread;
+ oid_value_xmles = oid_getvalbyname(oid_str);
+ if (oid_value_xmles == VAL_NONE)
+ {
+ printf("Bad OID: %s\n", oid_str);
+ return 0;
+ }
+
+ if (parse_cmd_doc(&arg, out, (char **) &ext->u.single_ASN1_type->buf,
+ &ext->u.single_ASN1_type->len, 0) == 0)
+ return 0;
+ req->packageType = yaz_oidval_to_z3950oid(out, CLASS_EXTSERV,
+ oid_value_xmles);
+
+ ext->direct_reference = yaz_oidval_to_z3950oid(out, CLASS_EXTSERV,
+ oid_value_xmles);
+ send_apdu(apdu);
+
+ return 2;
+}
+
static int cmd_itemorder(const char *arg)
{
char type[12];
int r;
int pos;
r = yaz_init_opt_encode(&z3950_options, arg, &pos);
+ if (r == -1)
+ printf("Unknown option(s) near %s\n", arg+pos);
}
else
{
if (conn)
cs_close (conn);
conn = 0;
- if (session_mem)
- {
- nmem_destroy (session_mem);
- session_mem = NULL;
- }
sent_close = 0;
odr_reset(out);
odr_reset(in);
}
if (only_z3950())
return 0;
- if (!ODR_MASK_GET(session->options, Z_Options_triggerResourceCtrl))
+ if (session_initResponse &&
+ !ODR_MASK_GET(session_initResponse->options,
+ Z_Options_triggerResourceCtrl))
{
printf("Target doesn't support cancel (trigger resource ctrl)\n");
return 0;
}
if (only_z3950())
return 0;
- if (!ODR_MASK_GET(session->options, Z_Options_sort))
+ if (session_initResponse &&
+ !ODR_MASK_GET(session_initResponse->options, Z_Options_sort))
{
printf("Target doesn't support sort\n");
return 0;
return 0;
}
}
- if (!ODR_MASK_GET(session->options, Z_Options_scan))
+ if (session_initResponse &&
+ !ODR_MASK_GET(session_initResponse->options, Z_Options_scan))
{
printf("Target doesn't support scan\n");
return 0;
}
#endif
-void wait_and_handle_response()
+void wait_and_handle_response(int one_response_only)
{
int reconnect_ok = 1;
int res;
http_response(gdu->u.HTTP_Response);
}
#endif
+ if (one_response_only)
+ break;
if (conn && !cs_more(conn))
break;
}
};
for( i=0 ; i < wait_for ; ++i ) {
- wait_and_handle_response( );
+ wait_and_handle_response(1);
};
return 0;
}
{"querytype", cmd_querytype, "<type>",complete_querytype,0,NULL},
{"refid", cmd_refid, "<id>",NULL,0,NULL},
{"itemorder", cmd_itemorder, "ill|item <itemno>",NULL,0,NULL},
- {"update", cmd_update, "<action> <recid> [<file>]",NULL,0,NULL},
- {"update0", cmd_update0, "<action> <recid> [<file>]",NULL,0,NULL},
+ {"update", cmd_update, "<action> <recid> [<doc>]",NULL,0,NULL},
+ {"update0", cmd_update0, "<action> <recid> [<doc>]",NULL,0,NULL},
+ {"xmles", cmd_xmles, "<OID> <doc>",NULL,0,NULL},
{"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},
if(apdu_file) fflush(apdu_file);
if (res >= 2 && auto_wait)
- wait_and_handle_response();
+ wait_and_handle_response(0);
if(apdu_file)
fflush(apdu_file);
show_version();
break;
default:
- fprintf (stderr, "Usage: %s [-m <marclog>] [ -a <apdulog>] "
- "[-b berdump] [-c cclfields] \n"
- "[-q cqlfields] [-p <proxy-addr>] [-u <auth>] "
- "[-k size] [-d dump] [-V] [<server-addr>]\n",
+ fprintf (stderr, "Usage: %s "
+ " [-a <apdulog>]"
+ " [-b berdump]"
+ " [-d dump]\n"
+ " [-c cclfields]"
+ " [-k size]"
+ " [-m <marclog>]\n"
+ " [-p <proxy-addr>]"
+ " [-q cqlfields]"
+ " [-u <auth>]"
+ " [-V]"
+ " [<server-addr>]\n",
prog);
exit (1);
}
client ();
exit (0);
}
-
-/*
- * Local variables:
- * tab-width: 8
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=8 fdm=marker
- * vim<600: sw=4 ts=8
- */