* Copyright (c) 2002-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: srw.c,v 1.6 2003-12-22 22:47:20 adam Exp $
+ * $Id: srw.c,v 1.9 2003-12-30 00:16:24 adam Exp $
*/
#include <yaz/srw.h>
}
add_xsd_integer(ptr, "recordPosition", rec->recordPosition);
}
+ return 0;
}
static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs,
return 0;
}
+static int yaz_srw_term(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm *term,
+ void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ xmlNodePtr ptr;
+ term->value = 0;
+ term->numberOfRecords = 0;
+ term->displayTerm = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+ char *spack = 0;
+
+ if (match_xsd_string(ptr, "value", o, &term->value))
+ ;
+ else if (match_xsd_integer(ptr, "numberOfRecords", o,
+ &term->numberOfRecords))
+ ;
+ else if (match_xsd_string(ptr, "displayTerm", o,
+ &term->displayTerm))
+ ;
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ xmlNodePtr ptr = pptr;
+ add_xsd_string(ptr, "value", term->value);
+ add_xsd_integer(ptr, "value", term->numberOfRecords);
+ add_xsd_string(ptr, "displayTerm", term->displayTerm);
+ }
+ return 0;
+}
+
+static int yaz_srw_terms(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm **terms,
+ int *num, void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ int i;
+ xmlNodePtr ptr;
+ *num = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->name, "term"))
+ (*num)++;
+ }
+ if (!*num)
+ return 1;
+ *terms = odr_malloc(o, *num * sizeof(**terms));
+ for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp(ptr->name, "term"))
+ yaz_srw_term(o, ptr, (*terms)+i, client_data, ns);
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ int i;
+ for (i = 0; i < *num; i++)
+ {
+ xmlNodePtr rptr = xmlNewChild(pptr, 0, "term", 0);
+ yaz_srw_term(o, rptr, (*terms)+i, client_data, ns);
+ }
+ }
+ return 0;
+}
int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
void *client_data, const char *ns)
req->maximumRecords = 0;
req->recordSchema = 0;
req->recordPacking = 0;
+ req->recordXPath = 0;
+ req->resultSetTTL = 0;
+ req->stylesheet = 0;
req->database = 0;
for (; ptr; ptr = ptr->next)
else if (match_xsd_string(ptr, "recordPacking", o,
&req->recordPacking))
;
+ else if (match_xsd_string(ptr, "recordXPath", o,
+ &req->recordXPath))
+ ;
else if (match_xsd_integer(ptr, "startRecord", o,
&req->startRecord))
;
else if (match_xsd_integer(ptr, "maximumRecords", o,
&req->maximumRecords))
;
+ else if (match_xsd_string(ptr, "stylesheet", o,
+ &req->stylesheet))
+ ;
else if (match_xsd_string(ptr, "database", o,
&req->database))
;
+ else if (match_xsd_string(ptr, "resultSetTTL", o,
+ &req->database))
+ ;
else if (match_xsd_string(ptr, "version", o,
&(*p)->srw_version))
;
req->database = 0;
for (; ptr; ptr = ptr->next)
{
- if (match_xsd_string(ptr, "recordPacking", o,
+ if (match_xsd_string(ptr, "database", o,
+ &req->database))
+ ;
+ else if (match_xsd_string(ptr, "recordPacking", o,
&req->recordPacking))
;
else if (match_xsd_string(ptr, "version", o,
(*p)->which = Z_SRW_explain_response;
res = (*p)->u.explain_response = odr_malloc(o, sizeof(*res));
-
+ res->diagnostics = 0;
+ res->num_diagnostics = 0;
+
for (; ptr; ptr = ptr->next)
{
if (match_element(ptr, "record"))
else if (match_xsd_string(ptr, "version", o,
&(*p)->srw_version))
;
+ else if (match_element(ptr, "diagnostics"))
+ yaz_srw_diagnostics(o, ptr, &res->diagnostics,
+ &res->num_diagnostics,
+ client_data, ns);
+ ;
+ }
+ }
+ else if (!strcmp(method->name, "scanRequest"))
+ {
+ Z_SRW_scanRequest *req;
+ xmlNodePtr ptr = method->children;
+
+ (*p)->which = Z_SRW_scan_request;
+ req = (*p)->u.scan_request = odr_malloc(o, sizeof(*req));
+ req->database = 0;
+ req->scanClause = 0;
+ req->stylesheet = 0;
+ req->responsePosition = 0;
+ req->maximumTerms = 0;
+
+ for (; ptr; ptr = ptr->next)
+ {
+ if (match_xsd_string(ptr, "version", o,
+ &(*p)->srw_version))
+ ;
+ else if (match_xsd_string(ptr, "scanClause", o,
+ &req->scanClause))
+ ;
+ else if (match_xsd_string(ptr, "database", o,
+ &req->database))
+ ;
+ else if (match_xsd_string(ptr, "stylesheet", o,
+ &req->stylesheet))
+ ;
+ else if (match_xsd_integer(ptr, "responsePosition", o,
+ &req->responsePosition))
+ ;
+ else if (match_xsd_integer(ptr, "maximumTerms", o,
+ &req->maximumTerms))
+ ;
+ }
+ }
+ else if (!strcmp(method->name, "scanResponse"))
+ {
+ Z_SRW_scanResponse *res;
+ xmlNodePtr ptr = method->children;
+
+ (*p)->which = Z_SRW_scan_response;
+ res = (*p)->u.scan_response = odr_malloc(o, sizeof(*res));
+ res->terms = 0;
+ res->num_terms = 0;
+ res->diagnostics = 0;
+ res->num_diagnostics = 0;
+
+ for (; ptr; ptr = ptr->next)
+ {
+ if (match_element(ptr, "terms"))
+ yaz_srw_terms(o, ptr, &res->terms,
+ &res->num_terms, client_data,
+ ns);
+ else if (match_element(ptr, "diagnostics"))
+ yaz_srw_diagnostics(o, ptr, &res->diagnostics,
+ &res->num_diagnostics,
+ client_data, ns);
+ else if (match_xsd_string(ptr, "version", o,
+ &(*p)->srw_version))
+ ;
}
}
else
add_xsd_integer(ptr, "maximumRecords", req->maximumRecords);
add_xsd_string(ptr, "recordSchema", req->recordSchema);
add_xsd_string(ptr, "recordPacking", req->recordPacking);
+ add_xsd_string(ptr, "recordXPath", req->recordXPath);
add_xsd_string(ptr, "database", req->database);
+ add_xsd_integer(ptr, "resultSetTTL", req->resultSetTTL);
+ add_xsd_string(ptr, "stylesheet", req->stylesheet);
}
else if ((*p)->which == Z_SRW_searchRetrieve_response)
{
ns_srw = xmlNewNs(ptr, ns, "zs");
xmlSetNs(ptr, ns_srw);
- if ((*p)->srw_version)
- add_xsd_string(ptr, "version", (*p)->srw_version);
+ add_xsd_string(ptr, "version", (*p)->srw_version);
}
else if ((*p)->which == Z_SRW_explain_response)
{
ns_srw = xmlNewNs(ptr, ns, "zs");
xmlSetNs(ptr, ns_srw);
- if ((*p)->srw_version)
- add_xsd_string(ptr, "version", (*p)->srw_version);
- ptr = xmlNewChild(ptr, 0, "record", 0);
- yaz_srw_record(o, ptr, &res->record, client_data, ns);
+ 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);
+ }
+ if (res->num_diagnostics)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0);
+ yaz_srw_diagnostics(o, rptr, &res->diagnostics,
+ &res->num_diagnostics, client_data, ns);
+ }
+ }
+ 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");
+ xmlSetNs(ptr, ns_srw);
+
+ add_xsd_string(ptr, "version", (*p)->srw_version);
+ add_xsd_string(ptr, "scanClause", req->scanClause);
+ add_xsd_integer(ptr, "responsePosition", req->responsePosition);
+ add_xsd_integer(ptr, "maximumTerms", req->maximumTerms);
+ add_xsd_string(ptr, "stylesheet", req->stylesheet);
+ }
+ 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");
+ xmlSetNs(ptr, ns_srw);
+
+ add_xsd_string(ptr, "version", (*p)->srw_version);
+
+ if (res->num_terms)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, "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);
+ yaz_srw_diagnostics(o, rptr, &res->diagnostics,
+ &res->num_diagnostics, client_data, ns);
+ }
}
else
return -1;
sr->u.request->maximumRecords = 0;
sr->u.request->recordSchema = 0;
sr->u.request->recordPacking = 0;
+ sr->u.request->recordXPath = 0;
sr->u.request->database = 0;
+ sr->u.request->resultSetTTL = 0;
+ sr->u.request->stylesheet = 0;
break;
case Z_SRW_searchRetrieve_response:
sr->u.response = (Z_SRW_searchRetrieveResponse *)
sr->u.explain_response->record.recordData_len = 0;
sr->u.explain_response->record.recordSchema = 0;
sr->u.explain_response->record.recordPosition = 0;
- sr->u.explain_response->record.recordPacking = Z_SRW_recordPacking_string;
+ sr->u.explain_response->record.recordPacking =
+ Z_SRW_recordPacking_string;
+ sr->u.explain_response->diagnostics = 0;
+ sr->u.explain_response->num_diagnostics = 0;
}
return sr;
}