X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=ee278ee442faa157b7f8613f361c479763fad32c;hp=53c241b30e1cb4f6443ac46e53ed65a73490276d;hb=d72929b7de6221054feb6a220dc72289b0f3e03d;hpb=c80d8f1c0245de69917debe3e918532491b87fac diff --git a/client/client.c b/client/client.c index 53c241b..ee278ee 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.352 2007-10-29 09:16:32 adam Exp $ + * $Id: client.c,v 1.356 2007-12-27 13:27:40 adam Exp $ */ /** \file client.c * \brief yaz-client program @@ -598,29 +598,27 @@ 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) +static int parse_cmd_doc(const char **arg, ODR out, char **buf, int *len) { const char *sep; while (**arg && strchr(" \t\n\r\f", **arg)) (*arg)++; - if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"'))) + if (**arg == '\0') { - (*arg)++; - *len = sep - *arg; - *buf = odr_strdupn(out, *arg, *len); - (*arg) = sep+1; - return 1; + return 0; } - else if ((*arg)[0] && (*arg)[0] != '\"') + else if ((*arg)[0] == '<') { long fsize; FILE *inf; - const char *fname = *arg; - + const char *fname; + const char *arg_start = ++(*arg); + while (**arg != '\0' && **arg != ' ') (*arg)++; + fname = odr_strdupn(out, arg_start, *arg - arg_start); + inf = fopen(fname, "rb"); if (!inf) { @@ -641,7 +639,8 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf, return 0; } *len = fsize; - *buf = (char *) odr_malloc(out, fsize); + *buf = (char *) odr_malloc(out, fsize+1); + (*buf)[fsize] = '\0'; if (fread(*buf, 1, fsize, inf) != fsize) { printf("Unable to read %s\n", fname); @@ -649,21 +648,25 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf, return 0; } fclose(inf); - return 1; } - else if (**arg == '\0') + else if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"'))) { - if (opt) - { - *len = 0; - *buf = 0; - return 1; - } - printf("Missing doc argument\n"); + (*arg)++; + *len = sep - *arg; + *buf = odr_strdupn(out, *arg, *len); + (*arg) = sep+1; } else - printf("Bad doc argument %s\n", *arg); - return 0; + { + const char *arg_start = *arg; + + while (**arg != '\0' && **arg != ' ') + (*arg)++; + + *len = *arg - arg_start; + *buf = odr_strdupn(out, arg_start, *len); + } + return 1; } static int cmd_base(const char *arg) @@ -721,8 +724,6 @@ int session_connect(const char *arg) return 0; } #if YAZ_HAVE_XML2 - if (conn->protocol == PROTO_HTTP) - queryType = QueryType_CQL; #else if (conn->protocol == PROTO_HTTP) { @@ -783,12 +784,16 @@ int session_connect(const char *arg) int cmd_open(const char *arg) { + int r; if (arg) { strncpy (cur_host, arg, sizeof(cur_host)-1); cur_host[sizeof(cur_host)-1] = 0; } - return session_connect(cur_host); + r = session_connect(cur_host); + if (conn && conn->protocol == PROTO_HTTP) + queryType = QueryType_CQL; + return r; } void try_reconnect(void) @@ -2167,17 +2172,17 @@ static int cmd_update_SRW(int action_no, const char *recid, static int cmd_update_common(const char *arg, int version) { - char action[20], recid_buf[20]; + char *action_buf; + int action_len; + char *recid_buf; + int recid_len; const char *recid = 0; char *rec_buf; int rec_len; int action_no; int noread = 0; - *action = 0; - *recid_buf = 0; - sscanf (arg, "%19s %19s%n", action, recid_buf, &noread); - if (noread == 0) + if (parse_cmd_doc(&arg, out, &action_buf, &action_len) == 0) { printf("Use: update action recid [fname]\n"); printf(" where action is one of insert,replace,delete.update\n"); @@ -2186,17 +2191,23 @@ static int cmd_update_common(const char *arg, int version) return 0; } - if (!strcmp (action, "insert")) + if (parse_cmd_doc(&arg, out, &recid_buf, &recid_len) == 0) + { + printf("Missing recid\n"); + return 0; + } + + if (!strcmp(action_buf, "insert")) action_no = Z_IUOriginPartToKeep_recordInsert; - else if (!strcmp (action, "replace")) + else if (!strcmp(action_buf, "replace")) action_no = Z_IUOriginPartToKeep_recordReplace; - else if (!strcmp (action, "delete")) + else if (!strcmp(action_buf, "delete")) action_no = Z_IUOriginPartToKeep_recordDelete; - else if (!strcmp (action, "update")) + else if (!strcmp(action_buf, "update")) action_no = Z_IUOriginPartToKeep_specialUpdate; else { - printf ("Bad action: %s\n", action); + printf ("Bad action: %s\n", action_buf); printf ("Possible values: insert, replace, delete, update\n"); return 0; } @@ -2205,14 +2216,14 @@ static int cmd_update_common(const char *arg, int version) recid = recid_buf; arg += noread; - if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len, 1) == 0) + if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len) == 0) return 0; #if YAZ_HAVE_XML2 if (protocol == PROTO_HTTP) - return cmd_update_SRW(action_no, recid, rec_buf, rec_len); + return cmd_update_SRW(action_no, recid_buf, rec_buf, rec_len); #endif - return cmd_update_Z3950(version, action_no, recid, rec_buf, rec_len); + return cmd_update_Z3950(version, action_no, recid_buf, rec_buf, rec_len); } #if YAZ_HAVE_XML2 @@ -2220,7 +2231,7 @@ static int cmd_update_SRW(int action_no, const char *recid, char *rec_buf, int rec_len) { if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; else @@ -2302,6 +2313,12 @@ static int cmd_update_Z3950(int version, int action_no, const char *recid, 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)); @@ -2344,6 +2361,12 @@ static int cmd_update_Z3950(int version, int action_no, const char *recid, 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)); @@ -2407,7 +2430,7 @@ static int cmd_xmles(const char *arg) } arg += noread; if (parse_cmd_doc(&arg, out, &asn_buf, - &ext->u.single_ASN1_type->len, 0) == 0) + &ext->u.single_ASN1_type->len) == 0) return 0; ext->u.single_ASN1_type->buf = (unsigned char *) asn_buf; @@ -2484,7 +2507,7 @@ static int cmd_explain(const char *arg) return 0; #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (conn) { Z_SRW_PDU *sr = 0; @@ -2557,7 +2580,7 @@ static int cmd_find(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; if (!send_SRW_searchRequest(arg)) @@ -2834,7 +2857,7 @@ static int cmd_show(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; if (!send_SRW_presentRequest(arg)) @@ -3181,7 +3204,7 @@ static int cmd_scan_common(const char *set, const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; if (*arg) @@ -4062,7 +4085,7 @@ void wait_and_handle_response(int one_response_only) { cs_close(conn); conn = 0; - cmd_open(0); + session_connect(cur_host); reconnect_ok = 0; if (conn) {