* Copyright (c) 2002-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: srw.c,v 1.5 2003-02-18 14:28:53 adam Exp $
+ * $Id: srw.c,v 1.7 2003-02-23 14:26:58 adam Exp $
*/
#include <yaz/srw.h>
}
-int yaz_srw_codec(ODR o, void * vptr, Z_SRW_searchRetrieve **handler_data,
+int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
void *client_data, const char *ns)
{
xmlNodePtr pptr = vptr;
return -1;
if (method && !strcmp(method->name, "searchRetrieveRequest"))
{
- Z_SRW_searchRetrieve **p = handler_data;
+ Z_SRW_PDU **p = handler_data;
xmlNodePtr ptr = method->children;
Z_SRW_searchRetrieveRequest *req;
*p = odr_malloc(o, sizeof(**p));
(*p)->which = Z_SRW_searchRetrieve_request;
req = (*p)->u.request = odr_malloc(o, sizeof(*req));
- req->query = 0;
- req->xQuery = 0;
- req->sortKeys = 0;
- req->xSortKeys = 0;
+ req->query_type = Z_SRW_query_type_cql;
+ req->query.cql = 0;
+ req->sort_type = Z_SRW_sort_type_none;
+ req->sort.none = 0;
req->startRecord = 0;
req->maximumRecords = 0;
req->recordSchema = 0;
for (; ptr; ptr = ptr->next)
{
if (match_xsd_string(ptr, "query", o,
- &req->query))
- ;
+ &req->query.cql))
+ req->query_type = Z_SRW_query_type_cql;
else if (match_xsd_string(ptr, "pQuery", o,
- &req->pQuery))
- ;
+ &req->query.pqf))
+ req->query_type = Z_SRW_query_type_pqf;
+ else if (match_xsd_string(ptr, "xQuery", o,
+ &req->query.xcql))
+ req->query_type = Z_SRW_query_type_xcql;
else if (match_xsd_string(ptr, "sortKeys", o,
- &req->sortKeys))
- ;
+ &req->sort.sortKeys))
+ req->sort_type = Z_SRW_sort_type_sort;
else if (match_xsd_string(ptr, "recordSchema", o,
&req->recordSchema))
;
}
else if (method && !strcmp(method->name, "searchRetrieveResponse"))
{
- Z_SRW_searchRetrieve **p = handler_data;
+ Z_SRW_PDU **p = handler_data;
xmlNodePtr ptr = method->children;
Z_SRW_searchRetrieveResponse *res;
}
else if (o->direction == ODR_ENCODE)
{
- Z_SRW_searchRetrieve **p = handler_data;
+ Z_SRW_PDU **p = handler_data;
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,
"searchRetrieveRequest", 0);
-
- add_xsd_string(ptr, "query", req->query);
- add_xsd_string(ptr, "pQuery", req->pQuery);
- add_xsd_string(ptr, "sortKeys", req->sortKeys);
+ switch(req->query_type)
+ {
+ case Z_SRW_query_type_cql:
+ add_xsd_string(ptr, "query", req->query.cql);
+ break;
+ case Z_SRW_query_type_xcql:
+ add_xsd_string(ptr, "xQuery", req->query.xcql);
+ break;
+ case Z_SRW_query_type_pqf:
+ add_xsd_string(ptr, "pQuery", req->query.pqf);
+ break;
+ }
+ switch(req->sort_type)
+ {
+ case Z_SRW_sort_type_none:
+ break;
+ case Z_SRW_sort_type_sort:
+ add_xsd_string(ptr, "sortKeys", req->sort.sortKeys);
+ break;
+ case Z_SRW_sort_type_xSort:
+ add_xsd_string(ptr, "xSortKeys", req->sort.xSortKeys);
+ break;
+ }
add_xsd_integer(ptr, "startRecord", req->startRecord);
add_xsd_integer(ptr, "maximumRecords", req->maximumRecords);
add_xsd_string(ptr, "recordSchema", req->recordSchema);
return 0;
}
-Z_SRW_searchRetrieve *yaz_srw_get(ODR o, int which)
+Z_SRW_PDU *yaz_srw_get(ODR o, int which)
{
- Z_SRW_searchRetrieve *sr = odr_malloc(o, sizeof(*o));
+ Z_SRW_PDU *sr = odr_malloc(o, sizeof(*o));
sr->which = which;
switch(which)
{
case Z_SRW_searchRetrieve_request:
sr->u.request = odr_malloc(o, sizeof(*sr->u.request));
- sr->u.request->query = 0;
- sr->u.request->xQuery = 0;
- sr->u.request->pQuery = 0;
- sr->u.request->sortKeys = 0;
- sr->u.request->xSortKeys = 0;
+ 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->sort.none = 0;
sr->u.request->startRecord = 0;
sr->u.request->maximumRecords = 0;
sr->u.request->recordSchema = 0;
{0, 0}
};
-const char *yaz_srw_error_str (int code)
+const char *yaz_diag_srw_str (int code)
{
int i;
for (i = 0; yaz_srw_codes[i].code; i++)
return 0;
}
+
+/* bib1:srw */
+static int srw_bib1_map[] = {
+ 1, 1,
+ 2, 2,
+ 3, 11,
+ 4, 35,
+ 5, 12,
+ 6, 38,
+ 7, 30,
+ 8, 32,
+ 9, 29,
+ 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, 1, /* bad map */
+ 24, 63, /* bad map */
+ 25, 63, /* bad map */
+ 26, 63, /* bad map */
+ 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, 10,
+ 108, 13,
+ 108, 14,
+ 108, 25,
+ 108, 26,
+ 108, 27,
+ 108, 45,
+
+ 109, 1,
+ 110, 37,
+ 111, 1,
+ 112, 58,
+ 113, 10,
+ 114, 16,
+ 115, 16,
+ 116, 16,
+ 117, 19,
+ 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, 1, /* bad map */
+ 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
+};
+
+int yaz_diag_bib1_to_srw (int code)
+{
+ const int *p = srw_bib1_map;
+ while (*p)
+ {
+ if (code == p[0])
+ return p[1];
+ p += 2;
+ }
+ return 1;
+}
+
+int yaz_diag_srw_to_bib1(int code)
+{
+ const int *p = srw_bib1_map;
+ while (*p)
+ {
+ if (code == p[1])
+ return p[0];
+ p += 2;
+ }
+ return 1;
+}