19 #include <libxml/parser.h>
20 #include <libxml/tree.h>
30 if (!strcmp(input_ver,
"1.1"))
32 if (!strncmp(input_ver,
"1.", 2))
34 if (!strncmp(input_ver,
"2.", 2))
41 void *client_data,
int version2)
62 for (ptr = pptr->children; ptr; ptr = ptr->next)
78 xmlNode *p = ptr->children;
79 for (; p; p = p->next)
80 if (p->type == XML_ELEMENT_NODE)
114 xmlNodePtr ptr = pptr;
120 xmlNewChild(ptr, 0, BAD_CAST
"recordSchema", 0);
131 xmlNewChild(ptr, 0, BAD_CAST
"recordData", 0);
154 if ((*extra)->recordIdentifier)
156 (*extra)->recordIdentifier);
157 if ((*extra)->extraRecordData_buf)
159 (*extra)->extraRecordData_buf,
160 (*extra)->extraRecordData_len, 0);
168 int *num,
void *client_data,
int version2)
175 for (ptr = pptr->children; ptr; ptr = ptr->next)
177 if (ptr->type == XML_ELEMENT_NODE &&
178 !xmlStrcmp(ptr->name, BAD_CAST
"record"))
185 for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next)
187 if (ptr->type == XML_ELEMENT_NODE &&
188 !xmlStrcmp(ptr->name, BAD_CAST
"record"))
198 for (i = 0; i < *num; i++)
200 xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST
"record",
203 client_data, version2);
210 void *client_data,
const char *ns)
217 for (ptr = pptr->children; ptr; ptr = ptr->next)
230 xmlNodePtr ptr = pptr;
239 int *num,
void *client_data,
const char *ns)
246 for (ptr = pptr->children; ptr; ptr = ptr->next)
248 if (ptr->type == XML_ELEMENT_NODE &&
249 !xmlStrcmp(ptr->name, BAD_CAST
"recordVersion"))
255 for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next)
257 if (ptr->type == XML_ELEMENT_NODE &&
258 !xmlStrcmp(ptr->name, BAD_CAST
"recordVersion"))
268 for (i = 0; i < *num; i++)
270 xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST
"version",
283 node,
"facetvalue",
"est_representation");
330 for (ptr = root->children; ptr; ptr = ptr->next)
339 if (
node->type == XML_ELEMENT_NODE)
354 *facetList = facet_list;
365 void *client_data,
const char *ns)
370 for (ptr = pptr; ptr; ptr = ptr->next)
372 if (ptr->type == XML_ELEMENT_NODE &&
373 !xmlStrcmp(ptr->name, BAD_CAST
"diagnostic"))
379 for (i = 0; i < *num; i++)
382 (*recs)[i].details = 0;
383 (*recs)[i].message = 0;
385 for (i = 0, ptr = pptr; ptr; ptr = ptr->next)
387 if (ptr->type == XML_ELEMENT_NODE &&
388 !xmlStrcmp(ptr->name, BAD_CAST
"diagnostic"))
392 (*recs)[i].details = 0;
393 (*recs)[i].message = 0;
394 for (rptr = ptr->children; rptr; rptr = rptr->next)
399 &(*recs)[i].details))
403 &(*recs)[i].message);
416 xmlDocPtr doc = xmlParseMemory(buf, len);
419 xmlNodePtr ptr = xmlDocGetRootElement(doc);
420 while (ptr && ptr->type != XML_ELEMENT_NODE)
423 && !xmlStrcmp(ptr->ns->href,
424 BAD_CAST
"http://www.loc.gov/zing/srw/diagnostic/"))
434 int *num,
void *client_data,
const char *ns,
445 xmlNewNs(pptr, BAD_CAST (version2 ?
448 for (i = 0; i < *num; i++)
450 const char *std_diag =
"info:srw/diagnostic/1/";
451 const char *ucp_diag =
"info:srw/diagnostic/12/";
452 xmlNodePtr rptr = xmlNewChild(pptr, ns_diag,
453 BAD_CAST
"diagnostic", 0);
456 if ((*recs)[i].message)
458 else if ((*recs)[i].uri )
460 if (!strncmp((*recs)[i].uri, std_diag, strlen(std_diag)))
462 int no = atoi((*recs)[i].uri + strlen(std_diag));
467 else if (!strncmp((*recs)[i].uri, ucp_diag, strlen(ucp_diag)))
469 int no = atoi((*recs)[i].uri + strlen(ucp_diag));
481 void *client_data,
const char *ns)
490 for (ptr = pptr->children; ptr; ptr = ptr->next)
506 xmlNodePtr ptr = pptr;
516 int *num,
void *client_data,
const char *ns)
523 for (ptr = pptr->children; ptr; ptr = ptr->next)
525 if (ptr->type == XML_ELEMENT_NODE &&
526 !xmlStrcmp(ptr->name, BAD_CAST
"term"))
532 for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
534 if (ptr->type == XML_ELEMENT_NODE &&
535 !xmlStrcmp(ptr->name, BAD_CAST
"term"))
542 for (i = 0; i < *num; i++)
544 xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST
"term", 0);
556 xmlNode *p1 = xmlNewChild(ptr, 0, BAD_CAST
name, 0);
558 for (; ea; ea = ea->
next)
560 if (ea->
name && ea->
name[0] ==
'x' && ea->
name[1] ==
'-')
564 p2 = xmlNewChild(p1, 0,
565 BAD_CAST
"extraRequestData", 0);
576 void *client_data,
const char *ns)
578 xmlNodePtr pptr = (xmlNodePtr) vptr;
582 xmlNodePtr method = pptr->children;
585 while (method && method->type == XML_TEXT_NODE)
586 method = method->next;
590 if (method->type != XML_ELEMENT_NODE)
595 if (!xmlStrcmp(method->name, BAD_CAST
"searchRetrieveRequest"))
597 xmlNodePtr ptr = method->children;
599 char *recordPacking = 0;
600 char *recordXMLEscaping = 0;
601 const char *facetLimit = 0;
602 const char *facetStart = 0;
603 const char *facetSort = 0;
622 for (; ptr; ptr = ptr->next)
670 (
char**) &facetLimit))
673 (
char**) &facetStart))
676 (
char**) &facetSort))
686 if (!strcmp((*p)->srw_version,
"2.0"))
698 else if (!xmlStrcmp(method->name, BAD_CAST
"searchRetrieveResponse"))
700 xmlNodePtr ptr = method->children;
719 for (; ptr; ptr = ptr->next)
725 &(*p)->extraResponseData_buf,
726 &(*p)->extraResponseData_len))
760 else if (!xmlStrcmp(method->name, BAD_CAST
"explainRequest"))
763 xmlNodePtr ptr = method->children;
772 for (; ptr; ptr = ptr->next)
778 &(*p)->extraResponseData_buf,
779 &(*p)->extraResponseData_len))
791 else if (!xmlStrcmp(method->name, BAD_CAST
"explainResponse"))
794 xmlNodePtr ptr = method->children;
806 for (; ptr; ptr = ptr->next)
812 &(*p)->extraResponseData_buf,
813 &(*p)->extraResponseData_len))
825 else if (!xmlStrcmp(method->name, BAD_CAST
"scanRequest"))
828 xmlNodePtr ptr = method->children;
840 for (; ptr; ptr = ptr->next)
846 &(*p)->extraResponseData_buf,
847 &(*p)->extraResponseData_len))
870 else if (!xmlStrcmp(method->name, BAD_CAST
"scanResponse"))
873 xmlNodePtr ptr = method->children;
883 for (; ptr; ptr = ptr->next)
889 &(*p)->extraResponseData_buf,
890 &(*p)->extraResponseData_len))
909 (*p)->srw_version = neg_version;
917 strcmp((*p)->srw_version,
"2.") > 0;
923 ns =
"http://docs.oasis-open.org/ns/search-ws/sruRequest";
924 ptr = xmlNewChild(pptr, 0, BAD_CAST
"searchRetrieveRequest", 0);
925 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
926 xmlSetNs(ptr, ns_srw);
936 if (!queryType || !strcmp(queryType,
"cql"))
938 else if (!strcmp(queryType,
"xcql"))
940 else if (!strcmp(queryType,
"pqf"))
971 const char *limit = 0;
972 const char *start = 0;
973 const char *sort = 0;
985 ns =
"http://docs.oasis-open.org/ns/search-ws/sruResponse";
986 ptr = xmlNewChild(pptr, 0, BAD_CAST
"searchRetrieveResponse", 0);
987 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
988 xmlSetNs(ptr, ns_srw);
999 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"records", 0);
1002 client_data, version2);
1009 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"diagnostics",
1017 if (ptr && (*p)->extraResponseData_len)
1019 (*p)->extraResponseData_buf,
1020 (*p)->extraResponseData_len, ns_srw);
1032 ns =
"http://docs.oasis-open.org/ns/search-ws/sruRequest";
1033 ptr = xmlNewChild(pptr, 0, BAD_CAST
"explainRequest", 0);
1034 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1035 xmlSetNs(ptr, ns_srw);
1053 ns =
"http://docs.oasis-open.org/ns/search-ws/sruResponse";
1054 ptr = xmlNewChild(pptr, 0, BAD_CAST
"explainResponse", 0);
1055 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1056 xmlSetNs(ptr, ns_srw);
1061 xmlNodePtr ptr1 = xmlNewChild(ptr, 0, BAD_CAST
"record", 0);
1063 client_data, version2);
1068 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"diagnostics",
1080 ns =
"http://docs.oasis-open.org/ns/search-ws/scan";
1081 ptr = xmlNewChild(pptr, 0, BAD_CAST
"scanRequest", 0);
1082 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1083 xmlSetNs(ptr, ns_srw);
1090 if (queryType && strcmp(queryType,
"cql"))
1096 if (!queryType || !strcmp(queryType,
"cql"))
1098 else if (!strcmp(queryType,
"pqf"))
1110 ns =
"http://docs.oasis-open.org/ns/search-ws/scan";
1111 ptr = xmlNewChild(pptr, 0, BAD_CAST
"scanResponse", 0);
1112 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1113 xmlSetNs(ptr, ns_srw);
1119 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"terms", 0);
1125 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"diagnostics",
1134 if (ptr && (*p)->extraResponseData_len)
1136 (*p)->extraResponseData_buf,
1137 (*p)->extraResponseData_len, ns_srw);
1145 void *client_data,
const char *ns_ucp_str)
1147 xmlNodePtr pptr = (xmlNodePtr) vptr;
1152 xmlNodePtr method = pptr->children;
1154 while (method && method->type == XML_TEXT_NODE)
1155 method = method->next;
1159 if (method->type != XML_ELEMENT_NODE)
1164 if (!xmlStrcmp(method->name, BAD_CAST
"updateRequest"))
1166 xmlNodePtr ptr = method->children;
1184 for (; ptr; ptr = ptr->next)
1187 &(*p)->srw_version))
1193 if (!strcmp(oper,
"info:srw/action/1/delete"))
1195 else if (!strcmp(oper,
"info:srw/action/1/replace" ))
1197 else if (!strcmp(oper,
"info:srw/action/1/create"))
1221 else if (!xmlStrcmp(method->name, BAD_CAST
"updateResponse"))
1223 xmlNodePtr ptr = method->children;
1241 for (; ptr; ptr = ptr->next)
1244 &(*p)->srw_version))
1255 client_data, ns_ucp_str);
1265 client_data, ns_ucp_str, 0);
1268 else if (!xmlStrcmp(method->name, BAD_CAST
"explainUpdateRequest"))
1271 else if (!xmlStrcmp(method->name, BAD_CAST
"explainUpdateResponse"))
1283 xmlNsPtr ns_ucp, ns_srw;
1288 xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST
"updateRequest", 0);
1289 ns_ucp = xmlNewNs(ptr, BAD_CAST ns_ucp_str, BAD_CAST
"zu");
1290 xmlSetNs(ptr, ns_ucp);
1291 ns_srw = xmlNewNs(ptr, BAD_CAST ns_srw_str, BAD_CAST
"zs");
1299 client_data, ns_ucp_str);
1302 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"record", 0);
1303 xmlSetNs(rptr, ns_srw);
1319 xmlNodePtr ptr = xmlNewChild(pptr, 0, (xmlChar *)
1320 "updateResponse", 0);
1321 ns_ucp = xmlNewNs(ptr, BAD_CAST ns_ucp_str, BAD_CAST
"zu");
1322 xmlSetNs(ptr, ns_ucp);
1323 ns_srw = xmlNewNs(ptr, BAD_CAST ns_srw_str, BAD_CAST
"zs");
1331 client_data, ns_ucp_str);
1334 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"record", 0);
1335 xmlSetNs(rptr, ns_srw);
1345 xmlNodePtr rptr = xmlNewChild(ptr, ns_diag, BAD_CAST
"diagnostics", 0);
static int node(struct cql_node *cn, void(*pr)(const char *buf, void *client_data), void *client_data)
const char * yaz_diag_sru_update_str(int code)
const char * yaz_diag_srw_str(int code)
Z_FacetField * facet_field_create(ODR odr, Z_AttributeList *attributes, int num_terms)
Z_FacetTerm * facet_term_create_cstr(ODR odr, const char *cstr, Odr_int freq)
Z_FacetList * facet_list_create(ODR odr, int num_facets)
void facet_field_term_set(ODR odr, Z_FacetField *field, Z_FacetTerm *facet_term, int index)
void facet_list_field_set(ODR odr, Z_FacetList *list, Z_FacetField *field, int index)
Header for the facet utilities.
void yaz_log(int level, const char *fmt,...)
Writes log message.
#define YLOG_DEBUG
log level: debugging
Header for Nibble Memory functions + Libxml2 specific stuff.
char * nmem_text_node_cdata(const xmlNode *ptr_cdata, NMEM nmem)
copies TEXT Libxml2 node data to NMEM
Odr_int odr_atoi(const char *s)
void * odr_malloc(ODR o, size_t size)
Z_AttributeList * zget_AttributeList_use_string(ODR o, const char *name)
creates AttributeList with type=1(use) and string value
Header for Z39.50 Protocol.
int yaz_match_xsd_element(xmlNodePtr ptr, const char *elem)
xmlNodePtr add_xsd_string_ns(xmlNodePtr ptr, const char *elem, const char *val, xmlNsPtr ns_ptr)
int yaz_match_xsd_XML_n2(xmlNodePtr ptr, const char *elem, ODR o, char **val, int *len, int fixup_root)
void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len, xmlNsPtr ns_ptr)
void add_xsd_integer(xmlNodePtr ptr, const char *elem, const Odr_int *val)
xmlNodePtr add_xsd_string(xmlNodePtr ptr, const char *elem, const char *val)
const char * yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name)
void yaz_sru_facet_request(ODR, Z_FacetList **facetList, const char **limit, const char **start, const char **sort)
int yaz_match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, char **val, int *len)
int yaz_match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o, char **val, int *len)
void yaz_sru_facet_response(ODR o, Z_FacetList **facetList, xmlNodePtr n)
int yaz_match_xsd_string(xmlNodePtr ptr, const char *elem, ODR o, char **val)
xmlNodePtr add_xsd_string_n(xmlNodePtr ptr, const char *elem, const char *val, int len)
int yaz_match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, Odr_int **val)
int sru_decode_surrogate_diagnostics(const char *buf, size_t len, Z_SRW_diagnostic **diag, int *num, ODR odr)
static void encode_echoed_args(xmlNodePtr ptr, Z_SRW_PDU *p, const char *name)
static Z_FacetField * yaz_sru_proxy_decode_facet_field(ODR odr, xmlNodePtr ptr)
static int yaz_srw_version(ODR o, xmlNodePtr pptr, Z_SRW_recordVersion *rec, void *client_data, const char *ns)
static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs, int *num, void *client_data, const char *ns, int version2)
int yaz_ucp_codec(ODR o, void *vptr, Z_SRW_PDU **handler_data, void *client_data, const char *ns_ucp_str)
static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs, Z_SRW_extra_record ***extra, int *num, void *client_data, int version2)
static int yaz_srw_decode_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs, int *num, void *client_data, const char *ns)
static int yaz_srw_versions(ODR o, xmlNodePtr pptr, Z_SRW_recordVersion **vers, int *num, void *client_data, const char *ns)
char * yaz_negotiate_sru_version(char *input_ver)
Z_FacetTerm * yaz_sru_proxy_get_facet_term_count(ODR odr, xmlNodePtr node)
static int yaz_srw_terms(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm **terms, int *num, void *client_data, const char *ns)
static int yaz_srw_term(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm *term, void *client_data, const char *ns)
static int yaz_sru_proxy_decode_facets(ODR o, xmlNodePtr root, Z_FacetList **facetList)
int yaz_srw_codec(ODR o, void *vptr, Z_SRW_PDU **handler_data, void *client_data, const char *ns)
static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, Z_SRW_extra_record **extra, void *client_data, int version2)
#define Z_SRW_recordPacking_XML
#define Z_SRW_searchRetrieve_response
#define Z_SRW_explain_request
#define Z_SRW_update_request
#define Z_SRW_scan_request
#define YAZ_XMLNS_DIAG_v1_1
#define YAZ_XMLNS_SRU_v1_1
#define Z_SRW_sort_type_none
#define Z_SRW_recordPacking_string
#define Z_SRW_recordPacking_URL
#define Z_SRW_update_response
#define YAZ_XMLNS_DIAG_v2
#define Z_SRW_sort_type_sort
#define Z_SRW_explain_response
#define Z_SRW_scan_response
#define Z_SRW_sort_type_xSort
#define Z_SRW_searchRetrieve_request
const char * yaz_srw_pack_to_str(int pack)
Z_SRW_PDU * yaz_srw_get_core_v_2_0(ODR o)
Z_SRW_record * yaz_srw_get_record(ODR o)
Z_SRW_extra_arg * extra_args
Z_SRW_diagnostic * diagnostics
Z_SRW_extra_record * extra_record
Odr_int * responsePosition
Z_SRW_diagnostic * diagnostics
Odr_int * numberOfRecords
union Z_SRW_searchRetrieveRequest::@29 sort
Odr_int * numberOfRecords
Z_SRW_diagnostic * diagnostics
char * resultCountPrecision
Odr_int * nextRecordPosition
Odr_int * resultSetIdleTime
Z_SRW_extra_record ** extra_records
Z_SRW_extra_record * extra_record
Z_SRW_recordVersion * recordVersions
char * extraRequestData_buf
Z_SRW_diagnostic * diagnostics
int extraResponseData_len
Z_SRW_recordVersion * recordVersions
char * extraResponseData_buf
Z_SRW_extra_record * extra_record
Header for WRBUF (growing buffer)