X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=14aa73752a41608fe491f5ea42136b63aa46f65a;hp=bfeeb4cbf21bfe78e4e65de57bfec40825242f23;hb=2ba3d1d3bf2b57c7ac462b347cb18f06820ac73a;hpb=b853eb3de1a249859eef71c9a285172a199656ce diff --git a/client/client.c b/client/client.c index bfeeb4c..14aa737 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.284 2005-06-06 10:29:33 adam Exp $ + * $Id: client.c,v 1.291 2005-06-24 19:56:52 adam Exp $ */ #include @@ -104,7 +104,7 @@ static enum oid_value recordsyntax = VAL_USMARC; 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"; @@ -365,7 +365,7 @@ static int process_initResponse(Z_InitResponse *res) 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)) @@ -561,6 +561,74 @@ static int set_base(const char *arg) 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) @@ -591,13 +659,14 @@ int session_connect(const char *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); @@ -2088,16 +2157,25 @@ static int cmd_update_common(const char *arg, int version) 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; @@ -2114,30 +2192,12 @@ static int cmd_update_common(const char *arg, int version) 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) @@ -2251,24 +2311,42 @@ static int cmd_update_common(const char *arg, int version) return 2; } -static int cmd_xmlupdate(const char *arg) +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; - req->packageType = yaz_oidval_to_z3950oid(out, CLASS_EXTSERV, - VAL_XMLUPDATE); Z_External *ext = (Z_External *) odr_malloc(out, sizeof(*ext)); req->taskSpecificParameters = ext; - ext->direct_reference = req->packageType; ext->descriptor = 0; - ext->indirect_reference = 0; - ext->which = Z_External_octet; ext->u.single_ASN1_type = (Odr_oct *) odr_malloc (out, sizeof(Odr_oct)); - - ext->u.single_ASN1_type->buf = (unsigned char*) odr_strdup(out, arg); - ext->u.single_ASN1_type->size = ext->u.single_ASN1_type->len = strlen(arg); + + 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; @@ -2582,11 +2660,6 @@ static void close_session (void) 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); @@ -2675,7 +2748,9 @@ int cmd_cancel(const char *arg) } 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; @@ -2900,7 +2975,8 @@ int cmd_sort_generic(const char *arg, int newset) } 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; @@ -2981,7 +3057,8 @@ int cmd_scan(const char *arg) 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; @@ -3766,7 +3843,7 @@ static void http_response(Z_HTTP_Response *hres) } #endif -void wait_and_handle_response() +void wait_and_handle_response(int one_response_only) { int reconnect_ok = 1; int res; @@ -3900,6 +3977,8 @@ void wait_and_handle_response() http_response(gdu->u.HTTP_Response); } #endif + if (one_response_only) + break; if (conn && !cs_more(conn)) break; } @@ -4147,7 +4226,7 @@ int cmd_wait_response(const char *arg) }; for( i=0 ; i < wait_for ; ++i ) { - wait_and_handle_response( ); + wait_and_handle_response(1); }; return 0; } @@ -4192,9 +4271,9 @@ static struct { {"querytype", cmd_querytype, "",complete_querytype,0,NULL}, {"refid", cmd_refid, "",NULL,0,NULL}, {"itemorder", cmd_itemorder, "ill|item ",NULL,0,NULL}, - {"update", cmd_update, " []",NULL,0,NULL}, - {"update0", cmd_update0, " []",NULL,0,NULL}, - {"xmlupdate", cmd_xmlupdate, " ",NULL,0,NULL}, + {"update", cmd_update, " []",NULL,0,NULL}, + {"update0", cmd_update0, " []",NULL,0,NULL}, + {"xmles", cmd_xmles, " ",NULL,0,NULL}, {"packagename", cmd_packagename, "",NULL,0,NULL}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, {"charset", cmd_charset, " ",NULL,0,NULL}, @@ -4390,7 +4469,7 @@ void process_cmd_line(char* line) 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); @@ -4636,10 +4715,18 @@ int main(int argc, char **argv) show_version(); break; default: - fprintf (stderr, "Usage: %s [-m ] [ -a ] " - "[-b berdump] [-c cclfields] \n" - "[-q cqlfields] [-p ] [-u ] " - "[-k size] [-d dump] [-V] []\n", + fprintf (stderr, "Usage: %s " + " [-a ]" + " [-b berdump]" + " [-d dump]\n" + " [-c cclfields]" + " [-k size]" + " [-m ]\n" + " [-p ]" + " [-q cqlfields]" + " [-u ]" + " [-V]" + " []\n", prog); exit (1); } @@ -4670,12 +4757,3 @@ int main(int argc, char **argv) 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 - */