* Copyright (c) 2002-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: srw.c,v 1.8 2003-03-03 19:57:37 adam Exp $
+ * $Id: srw.c,v 1.12 2003-03-24 22:26:51 adam Exp $
*/
#include <yaz/srw.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
+static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len)
+{
+ if (val)
+ {
+ xmlDocPtr doc = xmlParseMemory(val,len);
+ if (doc)
+ {
+ xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0);
+ xmlNodePtr t = xmlDocGetRootElement(doc);
+ xmlAddChild(c, xmlCopyNode(t,1));
+ xmlFreeDoc(doc);
+ }
+ }
+}
+
static void add_xsd_string_n(xmlNodePtr ptr, const char *elem, char *val,
int len)
{
{
xmlNodePtr rptr;
(*recs)[i].recordSchema = 0;
+ (*recs)[i].recordPacking = Z_SRW_recordPacking_string;
(*recs)[i].recordData_buf = 0;
(*recs)[i].recordData_len = 0;
(*recs)[i].recordPosition = 0;
{
xmlNodePtr rptr = xmlNewChild(pptr, 0, "record", 0);
add_xsd_string(rptr, "recordSchema", (*recs)[i].recordSchema);
- add_xsd_string_n(rptr, "recordData", (*recs)[i].recordData_buf,
- (*recs)[i].recordData_len);
+ switch((*recs)[i].recordPacking)
+ {
+ case Z_SRW_recordPacking_string:
+ add_xsd_string_n(rptr, "recordData", (*recs)[i].recordData_buf,
+ (*recs)[i].recordData_len);
+ break;
+ case Z_SRW_recordPacking_XML:
+ add_XML_n(rptr, "recordXML", (*recs)[i].recordData_buf,
+ (*recs)[i].recordData_len);
+ break;
+ }
add_xsd_integer(rptr, "recordPosition", (*recs)[i].recordPosition);
}
}
while (method && method->type == XML_TEXT_NODE)
method = method->next;
- if (method->type != XML_ELEMENT_NODE)
+ if (!method || method->type != XML_ELEMENT_NODE)
return -1;
- if (method && !strcmp(method->name, "searchRetrieveRequest"))
+ if (!strcmp(method->name, "searchRetrieveRequest"))
{
Z_SRW_PDU **p = handler_data;
xmlNodePtr ptr = method->children;
/* missing is xQuery, xSortKeys .. */
}
}
- else if (method && !strcmp(method->name, "searchRetrieveResponse"))
+ else if (!strcmp(method->name, "searchRetrieveResponse"))
{
Z_SRW_PDU **p = handler_data;
xmlNodePtr ptr = method->children;
&res->nextRecordPosition))
;
}
+ }
+ else if (!strcmp(method->name, "explainRequest"))
+ {
+ Z_SRW_PDU **p = handler_data;
+ Z_SRW_explainRequest *req;
+
+ *p = odr_malloc(o, sizeof(**p));
+ (*p)->which = Z_SRW_explain_request;
+ req = (*p)->u.explain_request = odr_malloc(o, sizeof(*req));
+ req->dummy = 0;
+ }
+ else if (!strcmp(method->name, "explainResponse"))
+ {
+ Z_SRW_PDU **p = handler_data;
+ Z_SRW_explainResponse *res;
+ xmlNodePtr ptr = method->children;
+ *p = odr_malloc(o, sizeof(**p));
+ (*p)->which = Z_SRW_explain_response;
+ res = (*p)->u.explain_response = odr_malloc(o, sizeof(*res));
+ res->explainData_buf = 0;
+ res->explainData_len = 0;
+ res->explainPacking = Z_SRW_recordPacking_string;
+ for (; ptr; ptr = ptr->next)
+ {
+ match_xsd_string_n(ptr, "Explain", o,
+ &res->explainData_buf,
+ &res->explainData_len);
+ }
}
else
return -1;
if ((*p)->which == Z_SRW_searchRetrieve_request)
{
Z_SRW_searchRetrieveRequest *req = (*p)->u.request;
- xmlNsPtr ns_srw = xmlNewNs(pptr, ns, "zs");
- xmlNodePtr ptr = xmlNewChild(pptr, ns_srw,
+ xmlNodePtr ptr = xmlNewChild(pptr, 0,
"searchRetrieveRequest", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+
switch(req->query_type)
{
case Z_SRW_query_type_cql:
else if ((*p)->which == Z_SRW_searchRetrieve_response)
{
Z_SRW_searchRetrieveResponse *res = (*p)->u.response;
- xmlNsPtr ns_srw = xmlNewNs(pptr, ns, "zs");
- xmlNodePtr ptr = xmlNewChild(pptr, ns_srw,
+ xmlNodePtr ptr = xmlNewChild(pptr, 0,
"searchRetrieveResponse", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+ xmlSetNs(ptr, ns_srw);
add_xsd_integer(ptr, "numberOfRecords", res->numberOfRecords);
add_xsd_string(ptr, "resultSetId", res->resultSetId);
add_xsd_integer(ptr, "resultSetIdleTime", res->resultSetIdleTime);
}
add_xsd_integer(ptr, "nextRecordPosition", res->nextRecordPosition);
}
+ else if ((*p)->which == Z_SRW_explain_request)
+ {
+ Z_SRW_explainRequest *req = (*p)->u.explain_request;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainRequest", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+ }
+ else if ((*p)->which == Z_SRW_explain_response)
+ {
+ Z_SRW_explainResponse *res = (*p)->u.explain_response;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainResponse", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+
+ add_xsd_string_n(ptr, "Explain", res->explainData_buf,
+ res->explainData_len);
+ }
else
return -1;
switch(which)
{
case Z_SRW_searchRetrieve_request:
- sr->u.request = odr_malloc(o, sizeof(*sr->u.request));
+ sr->u.request = (Z_SRW_searchRetrieveRequest *)
+ odr_malloc(o, sizeof(*sr->u.request));
sr->u.request->query_type = Z_SRW_query_type_cql;
sr->u.request->query.cql = 0;
sr->u.request->sort_type = Z_SRW_sort_type_none;
sr->u.request->database = 0;
break;
case Z_SRW_searchRetrieve_response:
- sr->u.response = odr_malloc(o, sizeof(*sr->u.response));
+ sr->u.response = (Z_SRW_searchRetrieveResponse *)
+ odr_malloc(o, sizeof(*sr->u.response));
sr->u.response->numberOfRecords = 0;
sr->u.response->resultSetId = 0;
sr->u.response->resultSetIdleTime = 0;
sr->u.response->diagnostics = 0;
sr->u.response->num_diagnostics = 0;
sr->u.response->nextRecordPosition = 0;
+ break;
+ case Z_SRW_explain_request:
+ sr->u.explain_request = (Z_SRW_explainRequest *)
+ odr_malloc(o, sizeof(*sr->u.explain_request));
+ sr->u.explain_request->dummy = 0;
+ break;
+ case Z_SRW_explain_response:
+ sr->u.explain_response = (Z_SRW_explainResponse *)
+ odr_malloc(o, sizeof(*sr->u.explain_response));
+ sr->u.explain_response->explainPacking = 0;
+ sr->u.explain_response->explainData_buf = 0;
+ sr->u.explain_response->explainData_len = 0;
}
return sr;
}