X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrwutil.c;h=3f42ff67fadbe3e0eceedc997f96d2e47951e90b;hp=f6dfdc4724965fa5fc17216777fee5507831a26a;hb=b0be69c0a676f1702f12b2ea17cd73f9ebb08ea2;hpb=1fbd038d97d6e1bfe97270ecc17cca123bcc435c diff --git a/src/srwutil.c b/src/srwutil.c index f6dfdc4..3f42ff6 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) 1995-2012 Index Data * See the file LICENSE for details. */ /** @@ -14,9 +14,12 @@ #include #include #include +#include #include #include "sru-p.h" +#define MAX_SRU_PARAMETERS 30 + static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len) { return odr_strdupn(n, uri, len); @@ -36,28 +39,27 @@ char *yaz_encode_sru_dbpath_odr(ODR out, const char *db) return dst; } -Z_AttributeList *yaz_use_attribute_create(ODR o, const char *name) { - Z_AttributeList *attributes= (Z_AttributeList *) odr_malloc(o, sizeof(*attributes)); +Z_AttributeList *yaz_use_attribute_create(ODR o, const char *name) +{ + Z_AttributeList *attributes= (Z_AttributeList *) + odr_malloc(o, sizeof(*attributes)); Z_AttributeElement ** elements; attributes->num_attributes = 1; - /* TODO check on name instead - if (!attributes->num_attributes) { - attributes->attributes = (Z_AttributeElement**)odr_nullval(); - return attributes; - } - */ - elements = (Z_AttributeElement**) odr_malloc (o, attributes->num_attributes * sizeof(*elements)); - elements[0] = (Z_AttributeElement*)odr_malloc(o,sizeof(**elements)); - elements[0]->attributeType = odr_malloc(o, sizeof(*elements[0]->attributeType)); - *elements[0]->attributeType = 1; + elements = (Z_AttributeElement**) + odr_malloc(o, attributes->num_attributes * sizeof(*elements)); + elements[0] = (Z_AttributeElement*) odr_malloc(o,sizeof(**elements)); + elements[0]->attributeType = odr_intdup(o, 1); elements[0]->attributeSet = odr_nullval(); elements[0]->which = Z_AttributeValue_complex; - elements[0]->value.complex = (Z_ComplexAttribute *) odr_malloc(o, sizeof(Z_ComplexAttribute)); + elements[0]->value.complex = (Z_ComplexAttribute *) + odr_malloc(o, sizeof(Z_ComplexAttribute)); elements[0]->value.complex->num_list = 1; - elements[0]->value.complex->list = (Z_StringOrNumeric **) odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *)); - elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric)); + elements[0]->value.complex->list = (Z_StringOrNumeric **) + odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *)); + elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) + odr_malloc(o, sizeof(Z_StringOrNumeric)); elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string; - elements[0]->value.complex->list[0]->u.string = (Z_InternationalString *) odr_strdup(o, name); + elements[0]->value.complex->list[0]->u.string = odr_strdup(o, name); elements[0]->value.complex->semanticAction = 0; elements[0]->value.complex->num_semanticAction = 0; attributes->attributes = elements; @@ -65,67 +67,23 @@ Z_AttributeList *yaz_use_attribute_create(ODR o, const char *name) { } #if YAZ_HAVE_XML2 -const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name) { - +const char *yaz_element_attribute_value_get(xmlNodePtr ptr, + const char *node_name, + const char *attribute_name) +{ struct _xmlAttr *attr; // check if the node name matches if (strcmp((const char*) ptr->name, node_name)) return 0; // check if the attribute name and return the value for (attr = ptr->properties; attr; attr = attr->next) - if (attr->children && attr->children->type == XML_TEXT_NODE) { + if (attr->children && attr->children->type == XML_TEXT_NODE) + { if (!strcmp((const char *) attr->name, attribute_name)) return (const char *) attr->children->content; } return 0; } - - -static int yaz_base64decode(const char *in, char *out) -{ - const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz0123456789+/"; - int olen = 0; - int len = strlen(in); - - while (len >= 4) - { - char i0, i1, i2, i3; - char *p; - - if (!(p = strchr(map, in[0]))) - return 0; - i0 = p - map; - len--; - if (!(p = strchr(map, in[1]))) - return 0; - i1 = p - map; - len--; - *(out++) = i0 << 2 | i1 >> 4; - olen++; - if (in[2] == '=') - break; - if (!(p = strchr(map, in[2]))) - return 0; - i2 = p - map; - len--; - *(out++) = i1 << 4 | i2 >> 2; - olen++; - if (in[3] == '=') - break; - if (!(p = strchr(map, in[3]))) - return 0; - i3 = p - map; - len--; - *(out++) = i2 << 6 | i3; - olen++; - - in += 4; - } - - *out = '\0'; - return olen; -} #endif int yaz_srw_check_content_type(Z_HTTP_Response *hres) @@ -146,7 +104,6 @@ int yaz_srw_check_content_type(Z_HTTP_Response *hres) * Look for authentication tokens in HTTP Basic parameters or in x-username/x-password * parameters. Added by SH. */ -#if YAZ_HAVE_XML2 static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, char *username, char *password, ODR decode) { @@ -157,8 +114,9 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, if (password) sr->password = password; - if (basic) { - int len, olen; + if (basic) + { + int len; char out[256]; char ubuf[256] = "", pbuf[256] = "", *p; if (strncmp(basic, "Basic ", 6)) @@ -167,10 +125,11 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, len = strlen(basic); if (!len || len > 256) return; - olen = yaz_base64decode(basic, out); + yaz_base64decode(basic, out); /* Format of out should be username:password at this point */ strcpy(ubuf, out); - if ((p = strchr(ubuf, ':'))) { + if ((p = strchr(ubuf, ':'))) + { *(p++) = '\0'; if (*p) strcpy(pbuf, p); @@ -181,7 +140,6 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, sr->password = odr_strdup(decode, pbuf); } } -#endif void yaz_uri_val_int(const char *path, const char *name, ODR o, Odr_int **intp) { @@ -219,9 +177,9 @@ void yaz_add_srw_diagnostic_uri(ODR o, Z_SRW_diagnostic **d, const char *message, const char *details) { Z_SRW_diagnostic *d_new; - d_new = (Z_SRW_diagnostic *) odr_malloc (o, (*num + 1)* sizeof(**d)); + d_new = (Z_SRW_diagnostic *) odr_malloc(o, (*num + 1)* sizeof(**d)); if (*num) - memcpy (d_new, *d, *num *sizeof(**d)); + memcpy(d_new, *d, *num *sizeof(**d)); *d = d_new; yaz_mk_srw_diagnostic(o, *d + *num, uri, message, details); @@ -434,7 +392,6 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char *startRecord = 0; char *maximumTerms = 0; char *responsePosition = 0; - char *extraRequestData = 0; Z_SRW_extra_arg *extra_args = 0; #endif char **uri_name; @@ -497,7 +454,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, else if (!strcmp(n, "responsePosition")) responsePosition = v; else if (!strcmp(n, "extraRequestData")) - extraRequestData = v; + ; /* ignoring extraRequestData */ else if (n[0] == 'x' && n[1] == '-') { Z_SRW_extra_arg **l = &extra_args; @@ -810,6 +767,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) sr->u.response->nextRecordPosition = 0; sr->u.response->extra_records = 0; sr->u.response->facetList = 0; + sr->u.response->suggestions = 0; break; case Z_SRW_explain_request: sr->u.explain_request = (Z_SRW_explainRequest *) @@ -880,222 +838,6 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) return sr; } -/* bib1:srw */ -static int bib1_srw_map[] = { - 1, 1, - 2, 2, - 3, 11, - 4, 35, - 5, 12, - 6, 38, - 7, 30, - 8, 32, - 9, 29, - 108, 10, /* Malformed query : Syntax error */ - 10, 10, - 11, 12, - 11, 23, - 12, 60, - 13, 61, - 13, 62, - 14, 63, - 14, 64, - 14, 65, - 15, 68, - 15, 69, - 16, 70, - 17, 70, - 18, 50, - 19, 55, - 20, 56, - 21, 52, - 22, 50, - 23, 3, - 24, 66, - 25, 66, - 26, 66, - 27, 51, - 28, 52, - 29, 52, - 30, 51, - 31, 57, - 32, 58, - 33, 59, - 100, 1, /* bad map */ - 101, 3, - 102, 3, - 103, 3, - 104, 3, - 105, 3, - 106, 66, - 107, 11, - 108, 13, - 108, 14, - 108, 25, - 108, 26, - 108, 27, - 108, 45, - - 109, 2, - 110, 37, - 111, 1, - 112, 58, - 113, 10, - 114, 16, - 115, 16, - 116, 16, - 117, 19, - 117, 20, - 118, 22, - 119, 32, - 119, 31, - 120, 28, - 121, 15, - 122, 32, - 123, 22, - 123, 17, - 123, 18, - 124, 24, - 125, 36, - 126, 36, - 127, 36, - 128, 51, - 129, 39, - 130, 43, - 131, 40, - 132, 42, - 201, 44, - 201, 33, - 201, 34, - 202, 41, - 203, 43, - 205, 1, /* bad map */ - 206, 1, /* bad map */ - 207, 89, - 208, 1, /* bad map */ - 209, 80, - 210, 80, - 210, 81, - 211, 84, - 212, 85, - 213, 92, - 214, 90, - 215, 91, - 216, 92, - 217, 63, - 218, 1, /* bad map */ - 219, 1, /* bad map */ - 220, 1, /* bad map */ - 221, 1, /* bad map */ - 222, 3, - 223, 1, /* bad map */ - 224, 1, /* bad map */ - 225, 1, /* bad map */ - 226, 1, /* bad map */ - 227, 66, - 228, 1, /* bad map */ - 229, 36, - 230, 83, - 231, 89, - 232, 1, - 233, 1, /* bad map */ - 234, 1, /* bad map */ - 235, 2, - 236, 3, - 237, 82, - 238, 67, - 239, 66, - 240, 1, /* bad map */ - 241, 1, /* bad map */ - 242, 70, - 243, 1, /* bad map */ - 244, 66, - 245, 10, - 246, 10, - 247, 10, - 1001, 1, /* bad map */ - 1002, 1, /* bad map */ - 1003, 1, /* bad map */ - 1004, 1, /* bad map */ - 1005, 1, /* bad map */ - 1006, 1, /* bad map */ - 1007, 100, - 1008, 1, - 1009, 1, - 1010, 3, - 1011, 3, - 1012, 3, - 1013, 3, - 1014, 3, - 1015, 3, - 1015, 3, - 1016, 3, - 1017, 3, - 1018, 2, - 1019, 2, - 1020, 2, - 1021, 3, - 1022, 3, - 1023, 3, - 1024, 16, - 1025, 3, - 1026, 64, - 1027, 1, - 1028, 65, - 1029, 1, - 1040, 1, - /* 1041-1065 */ - 1066, 66, - 1066, 67, - 0 -}; - -/* - * This array contains overrides for when the first occurrence of a - * particular SRW error in the array above does not correspond with - * the best back-translation of that SRW error. - */ -static int srw_bib1_map[] = { - 66, 238, - /* No doubt there are many more */ - 0 -}; - - -int yaz_diag_bib1_to_srw (int code) -{ - const int *p = bib1_srw_map; - while (*p) - { - if (code == p[0]) - return p[1]; - p += 2; - } - return 1; -} - -int yaz_diag_srw_to_bib1(int code) -{ - /* Check explicit reverse-map first */ - const int *p = srw_bib1_map; - while (*p) - { - if (code == p[0]) - return p[1]; - p += 2; - } - - /* Fall back on reverse lookup in main map */ - p = bib1_srw_map; - while (*p) - { - if (code == p[1]) - return p[0]; - p += 2; - } - return 1; -} - void yaz_add_name_value_int(ODR o, char **name, char **value, int *i, char *a_name, Odr_int *val) { @@ -1222,13 +964,13 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset) { - char *name[30], *value[30]; /* definite upper limit for SRU params */ + char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */ char *uri_args; char *path; z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); - if (yaz_get_sru_parms(srw_pdu, encode, name, value, 30)) + if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS)) return -1; yaz_array_to_uri(&uri_args, encode, name, value); @@ -1249,12 +991,12 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset) { - char *name[30], *value[30]; /* definite upper limit for SRU params */ + char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */ char *uri_args; z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); - if (yaz_get_sru_parms(srw_pdu, encode, name, value, 30)) + if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS)) return -1; yaz_array_to_uri(&uri_args, encode, name, value); @@ -1308,12 +1050,13 @@ int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, charset); } -Z_SRW_recordVersion *yaz_srw_get_record_versions(ODR odr, int num ) +Z_SRW_recordVersion *yaz_srw_get_record_versions(ODR odr, int num) { Z_SRW_recordVersion *ver - = (Z_SRW_recordVersion *) odr_malloc( odr, num * sizeof(*ver) ); + = (Z_SRW_recordVersion *) odr_malloc(odr,num * sizeof(*ver)); int i; - for ( i=0; i < num; ++i ){ + for (i = 0; i < num; ++i) + { ver[i].versionType = 0; ver[i].versionValue = 0; }