X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrw.c;h=e926af44be4262d1f7acda6aba336222d793a621;hp=11659999c2acc964202a32038098da7fd6fa34ec;hb=2cb1374ad9b888dcb3462ec15b977fbb3a97c7cf;hpb=fb6d99a0c7e07d9cc4a315c447deaf6564a85505 diff --git a/src/srw.c b/src/srw.c index 1165999..e926af4 100644 --- a/src/srw.c +++ b/src/srw.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: srw.c,v 1.35 2005-06-25 15:46:05 adam Exp $ + * $Id: srw.c,v 1.42 2006-01-20 10:34:52 adam Exp $ */ /** * \file srw.c @@ -10,7 +10,6 @@ */ #include - #if HAVE_XML2 #include #include @@ -22,7 +21,7 @@ static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len) xmlDocPtr doc = xmlParseMemory(val,len); if (doc) { - xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0); + xmlNodePtr c = xmlNewChild(ptr, 0, BAD_CAST elem, 0); xmlNodePtr t = xmlDocGetRootElement(doc); xmlAddChild(c, xmlCopyNode(t,1)); xmlFreeDoc(doc); @@ -35,8 +34,8 @@ xmlNodePtr add_xsd_string_n(xmlNodePtr ptr, const char *elem, const char *val, { if (val) { - xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0); - xmlNodePtr t = xmlNewTextLen(val, len); + xmlNodePtr c = xmlNewChild(ptr, 0, BAD_CAST elem, 0); + xmlNodePtr t = xmlNewTextLen(BAD_CAST val, len); xmlAddChild(c, t); return t; } @@ -46,7 +45,8 @@ xmlNodePtr add_xsd_string_n(xmlNodePtr ptr, const char *elem, const char *val, xmlNodePtr add_xsd_string(xmlNodePtr ptr, const char *elem, const char *val) { if (val) - return xmlNewTextChild(ptr, 0, elem, val); + return xmlNewTextChild(ptr, 0, BAD_CAST elem, + BAD_CAST val); return 0; } @@ -56,13 +56,13 @@ static void add_xsd_integer(xmlNodePtr ptr, const char *elem, const int *val) { char str[30]; sprintf(str, "%d", *val); - xmlNewTextChild(ptr, 0, elem, str); + xmlNewTextChild(ptr, 0, BAD_CAST elem, BAD_CAST str); } } static int match_element(xmlNodePtr ptr, const char *elem) { - if (ptr->type == XML_ELEMENT_NODE && !strcmp(ptr->name, elem)) + if (ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST elem)) return 1; return 0; } @@ -99,9 +99,9 @@ static int match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o, *val = ""; return 1; } - *val = odr_strdup(o, ptr->content); + *val = odr_strdup(o, (const char *) ptr->content); if (len) - *len = strlen(ptr->content); + *len = xmlStrlen(ptr->content); return 1; } @@ -166,24 +166,82 @@ static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val) ptr = ptr->children; if (!ptr || ptr->type != XML_TEXT_NODE) return 0; - *val = odr_intdup(o, atoi(ptr->content)); + *val = odr_intdup(o, atoi((const char *) ptr->content)); return 1; } +static int yaz_srw_extra_record(ODR o, xmlNodePtr pptr, + Z_SRW_extra_record *rec, + void *client_data, const char *ns) +{ + if (o->direction == ODR_DECODE) + { + xmlNodePtr ptr; + rec->type = 1; + rec->recordId = 0; + rec->recordReviewCode = 0; + rec->recordReviewNote = 0; + rec->recordLockStatus = 0; + rec->recordOldVersion = 0; + rec->nonDupRecordId = 0; + for (ptr = pptr->children; ptr; ptr = ptr->next) + { + if (match_xsd_string(ptr, "recordId", o, + &rec->recordId )) + ; + else if (match_xsd_string(ptr, "recordReviewCode", o, + &rec->recordReviewCode )) + ; + else if (match_xsd_string(ptr, "recordReviewNote", o, + &rec->recordReviewNote )) + ; + else if (match_xsd_string(ptr, "nonDupRecordId", o, + &rec->nonDupRecordId )) + ; + else if (match_xsd_string(ptr, "recordLockStatus", o, + &rec->recordLockStatus )) + ; + else if (match_xsd_string(ptr, "recordOldVersion", o, + &rec->recordOldVersion )) + ; + } + } + else if (o->direction == ODR_ENCODE) + { + xmlNodePtr ptr = pptr; + if ( rec->recordId ) + add_xsd_string(ptr, "recordId", rec->recordId); + if ( rec->recordReviewCode ) + add_xsd_string(ptr, "recordReviewCode", rec->recordReviewCode); + if ( rec->recordReviewNote ) + add_xsd_string(ptr, "recordReviewNote", rec->recordReviewNote); + if ( rec->nonDupRecordId ) + add_xsd_string(ptr, "nonDupRecordId", rec->nonDupRecordId); + if ( rec->recordLockStatus ) + add_xsd_string(ptr, "recordLockStatus", rec->recordLockStatus); + if ( rec->recordOldVersion ) + add_xsd_string(ptr, "recordOldVersion", rec->recordOldVersion); + } + return 0; +} + static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, + Z_SRW_extra_record **extra, void *client_data, const char *ns) { if (o->direction == ODR_DECODE) { + char *spack = 0; int pack = Z_SRW_recordPacking_string; xmlNodePtr ptr; + xmlNodePtr data_ptr = 0; rec->recordSchema = 0; rec->recordData_buf = 0; rec->recordData_len = 0; rec->recordPosition = 0; + *extra = 0; for (ptr = pptr->children; ptr; ptr = ptr->next) { - char *spack = 0; if (match_xsd_string(ptr, "recordSchema", o, &rec->recordSchema)) @@ -192,22 +250,47 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, { if (spack && !strcmp(spack, "xml")) pack = Z_SRW_recordPacking_XML; + if (spack && !strcmp(spack, "url")) + pack = Z_SRW_recordPacking_URL; if (spack && !strcmp(spack, "string")) pack = Z_SRW_recordPacking_string; } else if (match_xsd_integer(ptr, "recordPosition", o, &rec->recordPosition)) ; - else + else if (match_element(ptr, "recordData")) + { + /* save position of Data until after the loop + then we will know the packing (hopefully), and + unpacking is done once + */ + data_ptr = ptr; + } + else if (match_element(ptr, "extraRecordData")) + { + *extra = (Z_SRW_extra_record *) + odr_malloc(o, sizeof(Z_SRW_extra_record)); + yaz_srw_extra_record(o, ptr, *extra, client_data, ns); + } + } + if (data_ptr) + { + switch(pack) { - if (pack == Z_SRW_recordPacking_XML) - match_xsd_XML_n(ptr, "recordData", o, - &rec->recordData_buf, - &rec->recordData_len); - if (pack == Z_SRW_recordPacking_string) - match_xsd_string_n(ptr, "recordData", o, - &rec->recordData_buf, - &rec->recordData_len); + case Z_SRW_recordPacking_XML: + match_xsd_XML_n(data_ptr, "recordData", o, + &rec->recordData_buf, &rec->recordData_len); + break; + case Z_SRW_recordPacking_URL: + /* just store it as a string. + leave it to the backend to collect the document */ + match_xsd_string_n(data_ptr, "recordData", o, + &rec->recordData_buf, &rec->recordData_len); + break; + case Z_SRW_recordPacking_string: + match_xsd_string_n(data_ptr, "recordData", o, + &rec->recordData_buf, &rec->recordData_len); + break; } } rec->recordPacking = pack; @@ -215,8 +298,10 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, else if (o->direction == ODR_ENCODE) { xmlNodePtr ptr = pptr; + int pack = rec->recordPacking; add_xsd_string(ptr, "recordSchema", rec->recordSchema); - switch(rec->recordPacking) + + switch(pack) { case Z_SRW_recordPacking_string: add_xsd_string(ptr, "recordPacking", "string"); @@ -228,13 +313,26 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, add_XML_n(ptr, "recordData", rec->recordData_buf, rec->recordData_len); break; + case Z_SRW_recordPacking_URL: + add_xsd_string(ptr, "recordPacking", "url"); + add_xsd_string_n(ptr, "recordData", rec->recordData_buf, + rec->recordData_len); + break; + } + if (rec->recordPosition) + add_xsd_integer(ptr, "recordPosition", rec->recordPosition ); + if (extra && *extra) + { + xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "extraRecordData", + 0); + yaz_srw_extra_record(o, rptr, *extra, client_data, ns); } - add_xsd_integer(ptr, "recordPosition", rec->recordPosition); } return 0; } static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs, + Z_SRW_extra_record ***extra, int *num, void *client_data, const char *ns) { if (o->direction == ODR_DECODE) @@ -245,18 +343,19 @@ static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs, for (ptr = pptr->children; ptr; ptr = ptr->next) { if (ptr->type == XML_ELEMENT_NODE && - !strcmp(ptr->name, "record")) + !xmlStrcmp(ptr->name, BAD_CAST "record")) (*num)++; } if (!*num) return 1; *recs = (Z_SRW_record *) odr_malloc(o, *num * sizeof(**recs)); + *extra = (Z_SRW_extra_record **) odr_malloc(o, *num * sizeof(**extra)); for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next) { if (ptr->type == XML_ELEMENT_NODE && - !strcmp(ptr->name, "record")) + !xmlStrcmp(ptr->name, BAD_CAST "record")) { - yaz_srw_record(o, ptr, (*recs)+i, client_data, ns); + yaz_srw_record(o, ptr, *recs + i, *extra + i, client_data, ns); i++; } } @@ -266,8 +365,10 @@ static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs, int i; for (i = 0; i < *num; i++) { - xmlNodePtr rptr = xmlNewChild(pptr, 0, "record", 0); - yaz_srw_record(o, rptr, (*recs)+i, client_data, ns); + xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST "record", + 0); + yaz_srw_record(o, rptr, (*recs)+i, (*extra ? *extra + i : 0), + client_data, ns); } } return 0; @@ -284,7 +385,7 @@ static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs, for (ptr = pptr->children; ptr; ptr = ptr->next) { if (ptr->type == XML_ELEMENT_NODE && - !strcmp(ptr->name, "diagnostic")) + !xmlStrcmp(ptr->name, BAD_CAST "diagnostic")) (*num)++; } if (!*num) @@ -299,7 +400,7 @@ static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs, for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next) { if (ptr->type == XML_ELEMENT_NODE && - !strcmp(ptr->name, "diagnostic")) + !xmlStrcmp(ptr->name, BAD_CAST "diagnostic")) { xmlNodePtr rptr; (*recs)[i].uri = 0; @@ -325,11 +426,13 @@ static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs, { int i; xmlNsPtr ns_diag = - xmlNewNs(pptr, "http://www.loc.gov/zing/srw/diagnostic/", 0); + xmlNewNs(pptr, BAD_CAST + "http://www.loc.gov/zing/srw/diagnostic/", 0); for (i = 0; i < *num; i++) { const char *std_diag = "info:srw/diagnostic/1/"; - xmlNodePtr rptr = xmlNewChild(pptr, ns_diag, "diagnostic", 0); + xmlNodePtr rptr = xmlNewChild(pptr, ns_diag, + BAD_CAST "diagnostic", 0); add_xsd_string(rptr, "uri", (*recs)[i].uri); if ((*recs)[i].message) add_xsd_string(rptr, "message", (*recs)[i].message); @@ -394,7 +497,7 @@ static int yaz_srw_terms(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm **terms, for (ptr = pptr->children; ptr; ptr = ptr->next) { if (ptr->type == XML_ELEMENT_NODE && - !strcmp(ptr->name, "term")) + !xmlStrcmp(ptr->name, BAD_CAST "term")) (*num)++; } if (!*num) @@ -403,7 +506,7 @@ static int yaz_srw_terms(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm **terms, for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++) { if (ptr->type == XML_ELEMENT_NODE && - !strcmp(ptr->name, "term")) + !xmlStrcmp(ptr->name, BAD_CAST "term")) yaz_srw_term(o, ptr, (*terms)+i, client_data, ns); } } @@ -412,7 +515,7 @@ static int yaz_srw_terms(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm **terms, int i; for (i = 0; i < *num; i++) { - xmlNodePtr rptr = xmlNewChild(pptr, 0, "term", 0); + xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST "term", 0); yaz_srw_term(o, rptr, (*terms)+i, client_data, ns); } } @@ -439,7 +542,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(**p)); (*p)->srw_version = odr_strdup(o, "1.1"); - if (!strcmp(method->name, "searchRetrieveRequest")) + if (!xmlStrcmp(method->name, BAD_CAST "searchRetrieveRequest")) { xmlNodePtr ptr = method->children; Z_SRW_searchRetrieveRequest *req; @@ -504,7 +607,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, /* missing is xQuery, xSortKeys .. */ } } - else if (!strcmp(method->name, "searchRetrieveResponse")) + else if (!xmlStrcmp(method->name, BAD_CAST "searchRetrieveResponse")) { xmlNodePtr ptr = method->children; Z_SRW_searchRetrieveResponse *res; @@ -538,8 +641,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, ; else if (match_element(ptr, "records")) yaz_srw_records(o, ptr, &res->records, - &res->num_records, client_data, - ns); + &res->extra_records, + &res->num_records, client_data, ns); else if (match_xsd_integer(ptr, "nextRecordPosition", o, &res->nextRecordPosition)) ; @@ -549,7 +652,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, client_data, ns); } } - else if (!strcmp(method->name, "explainRequest")) + else if (!xmlStrcmp(method->name, BAD_CAST "explainRequest")) { Z_SRW_explainRequest *req; xmlNodePtr ptr = method->children; @@ -576,7 +679,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, ; } } - else if (!strcmp(method->name, "explainResponse")) + else if (!xmlStrcmp(method->name, BAD_CAST "explainResponse")) { Z_SRW_explainResponse *res; xmlNodePtr ptr = method->children; @@ -597,7 +700,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &(*p)->srw_version)) ; else if (match_element(ptr, "record")) - yaz_srw_record(o, ptr, &res->record, client_data, ns); + yaz_srw_record(o, ptr, &res->record, &res->extra_record, + client_data, ns); else if (match_element(ptr, "diagnostics")) yaz_srw_diagnostics(o, ptr, &res->diagnostics, &res->num_diagnostics, @@ -605,7 +709,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, ; } } - else if (!strcmp(method->name, "scanRequest")) + else if (!xmlStrcmp(method->name, BAD_CAST "scanRequest")) { Z_SRW_scanRequest *req; xmlNodePtr ptr = method->children; @@ -647,7 +751,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, ; } } - else if (!strcmp(method->name, "scanResponse")) + else if (!xmlStrcmp(method->name, BAD_CAST "scanResponse")) { Z_SRW_scanResponse *res; xmlNodePtr ptr = method->children; @@ -690,8 +794,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { Z_SRW_searchRetrieveRequest *req = (*p)->u.request; xmlNodePtr ptr = xmlNewChild(pptr, 0, - "searchRetrieveRequest", 0); - ns_srw = xmlNewNs(ptr, ns, "zs"); + BAD_CAST "searchRetrieveRequest", 0); + ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); if ((*p)->srw_version) @@ -732,8 +836,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { Z_SRW_searchRetrieveResponse *res = (*p)->u.response; xmlNodePtr ptr = xmlNewChild(pptr, 0, - "searchRetrieveResponse", 0); - ns_srw = xmlNewNs(ptr, ns, "zs"); + BAD_CAST "searchRetrieveResponse", 0); + ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); if ((*p)->srw_version) @@ -743,15 +847,17 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, add_xsd_integer(ptr, "resultSetIdleTime", res->resultSetIdleTime); if (res->num_records) { - xmlNodePtr rptr = xmlNewChild(ptr, 0, "records", 0); - yaz_srw_records(o, rptr, &res->records, &res->num_records, + xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "records", 0); + yaz_srw_records(o, rptr, &res->records, &res->extra_records, + &res->num_records, client_data, ns); } add_xsd_integer(ptr, "nextRecordPosition", res->nextRecordPosition); if (res->num_diagnostics) { - xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0); + xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "diagnostics", + 0); yaz_srw_diagnostics(o, rptr, &res->diagnostics, &res->num_diagnostics, client_data, ns); } @@ -759,8 +865,9 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_explain_request) { Z_SRW_explainRequest *req = (*p)->u.explain_request; - xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainRequest", 0); - ns_srw = xmlNewNs(ptr, ns, "zs"); + xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "explainRequest", + 0); + ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); add_xsd_string(ptr, "version", (*p)->srw_version); @@ -771,19 +878,22 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_explain_response) { Z_SRW_explainResponse *res = (*p)->u.explain_response; - xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainResponse", 0); - ns_srw = xmlNewNs(ptr, ns, "zs"); + xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "explainResponse", + 0); + ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); add_xsd_string(ptr, "version", (*p)->srw_version); if (1) { - xmlNodePtr ptr1 = xmlNewChild(ptr, 0, "record", 0); - yaz_srw_record(o, ptr1, &res->record, client_data, ns); + xmlNodePtr ptr1 = xmlNewChild(ptr, 0, BAD_CAST "record", 0); + yaz_srw_record(o, ptr1, &res->record, &res->extra_record, + client_data, ns); } if (res->num_diagnostics) { - xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0); + xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "diagnostics", + 0); yaz_srw_diagnostics(o, rptr, &res->diagnostics, &res->num_diagnostics, client_data, ns); } @@ -791,8 +901,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_scan_request) { Z_SRW_scanRequest *req = (*p)->u.scan_request; - xmlNodePtr ptr = xmlNewChild(pptr, 0, "scanRequest", 0); - ns_srw = xmlNewNs(ptr, ns, "zs"); + xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "scanRequest", 0); + ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); add_xsd_string(ptr, "version", (*p)->srw_version); @@ -813,21 +923,22 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_scan_response) { Z_SRW_scanResponse *res = (*p)->u.scan_response; - xmlNodePtr ptr = xmlNewChild(pptr, 0, "scanResponse", 0); - ns_srw = xmlNewNs(ptr, ns, "zs"); + xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "scanResponse", 0); + ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); add_xsd_string(ptr, "version", (*p)->srw_version); if (res->num_terms) { - xmlNodePtr rptr = xmlNewChild(ptr, 0, "terms", 0); + xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "terms", 0); yaz_srw_terms(o, rptr, &res->terms, &res->num_terms, client_data, ns); } if (res->num_diagnostics) { - xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0); + xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "diagnostics", + 0); yaz_srw_diagnostics(o, rptr, &res->diagnostics, &res->num_diagnostics, client_data, ns); } @@ -839,6 +950,191 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, return 0; } +int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, + void *client_data, const char *ns) +{ + xmlNodePtr pptr = (xmlNodePtr) vptr; + if (o->direction == ODR_DECODE) + { + Z_SRW_PDU **p = handler_data; + xmlNodePtr method = pptr->children; + + while (method && method->type == XML_TEXT_NODE) + method = method->next; + + if (!method) + return -1; + if (method->type != XML_ELEMENT_NODE) + return -1; + + *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(**p)); + (*p)->srw_version = odr_strdup(o, "1.1"); + + if (!xmlStrcmp(method->name, BAD_CAST "updateRequest")) + { + xmlNodePtr ptr = method->children; + Z_SRW_updateRequest *req; + char *oper = 0; + + (*p)->which = Z_SRW_update_request; + req = (*p)->u.update_request = (Z_SRW_updateRequest *) + odr_malloc(o, sizeof(*req)); + req->database = 0; + req->operation = 0; + req->recordId = 0; + req->recordVersion = 0; + req->recordOldVersion = 0; + req->record.recordData_buf = 0; + req->record.recordData_len = 0; + req->record.recordSchema = 0; + req->record.recordPacking = 0; + req->extra_record = 0; + req->extraRequestData = 0; + req->stylesheet = 0; + + for (; ptr; ptr = ptr->next) + { + if (match_xsd_string(ptr, "version", o, + &(*p)->srw_version)) + ; + else if (match_xsd_string(ptr, "operation", o, + &oper)){ + if ( oper ){ + if ( !strcmp(oper, "delete")) + req->operation = "delete"; + else if (!strcmp(oper,"replace" )) + req->operation = "replace"; + else if ( !strcmp( oper, "insert")) + req->operation = "insert"; + } + } + else if (match_xsd_string(ptr, "recordId", o, + &req->recordId)) + ; + else if (match_xsd_string(ptr, "recordVersion", o, + &req->recordVersion)) + ; + else if (match_element(ptr, "record")) + yaz_srw_record(o, ptr, &req->record, &req->extra_record, + client_data, ns); + else if (match_xsd_string(ptr, "stylesheet", o, + &req->stylesheet)) + ; + else if (match_xsd_string(ptr, "database", o, + &req->database)) + ; + } + } + else if (!xmlStrcmp(method->name, BAD_CAST "updateResponse")) + { + xmlNodePtr ptr = method->children; + Z_SRW_updateResponse *res; + + (*p)->which = Z_SRW_update_response; + res = (*p)->u.update_response = (Z_SRW_updateResponse *) + odr_malloc(o, sizeof(*res)); + + res->operationStatus = 0; + res->recordId = 0; + res->recordVersion = 0; + res->recordChecksum = 0; + res->diagnostics = 0; + res->num_diagnostics = 0; + res->record.recordData_buf = 0; + res->record.recordData_len = 0; + res->record.recordSchema = 0; + res->record.recordPacking = 0; + res->extra_record = 0; + res->extraResponseData = 0; + + for (; ptr; ptr = ptr->next) + { + if (match_xsd_string(ptr, "version", o, + &(*p)->srw_version)) + ; + else if (match_xsd_string(ptr, "operationStatus", o, + &res->operationStatus )) + ; + else if (match_xsd_string(ptr, "recordId", o, + &res->recordId)) + ; + else if (match_xsd_string(ptr, "recordVersion", o, + &res->recordVersion )) + ; + else if (match_element(ptr, "record")) + yaz_srw_record(o, ptr, &res->record, &res->extra_record, + client_data, ns); + else if (match_element(ptr, "diagnostics")) + yaz_srw_diagnostics(o, ptr, &res->diagnostics, + &res->num_diagnostics, + client_data, ns); + } + } + else if (!xmlStrcmp(method->name, BAD_CAST "explainUpdateRequest")) + { + } + else if (!xmlStrcmp(method->name, BAD_CAST "explainUpdateResponse")) + { + } + else + { + *p = 0; + return -1; + } + } + else if (o->direction == ODR_ENCODE) + { + Z_SRW_PDU **p = handler_data; + xmlNsPtr ns_srw; + + if ((*p)->which == Z_SRW_update_request) + { + Z_SRW_updateRequest *req = (*p)->u.update_request; + xmlNodePtr ptr = xmlNewChild(pptr, 0, "updateRequest", 0); + ns_srw = xmlNewNs(ptr, ns, "zu"); + xmlSetNs(ptr, ns_srw); + + add_xsd_string(ptr, "version", (*p)->srw_version); + add_xsd_string(ptr, "stylesheet", req->stylesheet); + add_xsd_string(ptr, "database", req->database); + } + else if ((*p)->which == Z_SRW_update_response) + { + Z_SRW_updateResponse *res = (*p)->u.update_response; + xmlNodePtr ptr = xmlNewChild(pptr, 0, (xmlChar *) + "updateResponse", 0); + ns_srw = xmlNewNs(ptr, ns, "zu"); + xmlSetNs(ptr, ns_srw); + + add_xsd_string(ptr, "version", (*p)->srw_version); + add_xsd_string(ptr, "operationStatus", res->operationStatus ); + add_xsd_string(ptr, "recordId", res->recordId ); + if (res->recordVersion) + add_xsd_string(ptr, "recordVersion", res->recordVersion ); + if (res->recordChecksum) + add_xsd_string(ptr, "recordChecksum", res->recordChecksum ); + if (res->record.recordData_len) + { + xmlNodePtr rptr = xmlNewChild(ptr, 0, "record", 0); + yaz_srw_record(o, rptr, &res->record, &res->extra_record, + client_data, ns); + } + if (res->num_diagnostics) + { + xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0); + yaz_srw_diagnostics(o, rptr, &res->diagnostics, + &res->num_diagnostics, client_data, ns); + } + if ( res->extraResponseData ) + add_xsd_string(ptr, "extraResponseData", res->extraResponseData); + } + else + return -1; + + } + return 0; +} + #endif