1 /* This file is part of the YAZ toolkit. 2 * Copyright (C) Index Data. 3 * All rights reserved. 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * * Neither the name of Index Data nor the names of its contributors 13 * may be used to endorse or promote products derived from this 14 * software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 /** 29 * \file srw.h 30 * \brief Header for SRW/SRU 31 */ 32 33 #ifndef YAZ_SRW_H 34 #define YAZ_SRW_H 35 36 #include <yaz/soap.h> 37 #include <yaz/zgdu.h> 38 #include <yaz/diagsrw.h> 39 #include <yaz/diagsru_update.h> 40 #include <yaz/facet.h> 41 42 YAZ_BEGIN_CDECL 43 44 typedef struct { 45 char *extraRecordData_buf; 46 int extraRecordData_len; 47 char *recordIdentifier; 48 } Z_SRW_extra_record; 49 50 typedef struct { 51 char *recordSchema; 52 53 int recordPacking; /* recordXMLEscaping in SRU 2.0 */ 54 #define Z_SRW_recordPacking_string 0 55 #define Z_SRW_recordPacking_XML 1 56 #define Z_SRW_recordPacking_URL 2 57 58 char *recordData_buf; 59 int recordData_len; 60 Odr_int *recordPosition; 61 } Z_SRW_record; 62 63 typedef struct { 64 char *uri; 65 char *details; 66 char *message; 67 } Z_SRW_diagnostic; 68 69 typedef struct { 70 71 char *queryType; 72 char *query; 73 74 #define Z_SRW_sort_type_none 1 75 #define Z_SRW_sort_type_sort 2 76 #define Z_SRW_sort_type_xSort 3 77 int sort_type; 78 union { 79 char *none; 80 char *sortKeys; 81 char *xSortKeys; 82 } sort; 83 Odr_int *startRecord; 84 Odr_int *maximumRecords; 85 char *recordSchema; 86 87 char *recordPacking; /* recordXMLEscaping in SRU 2.0 */ 88 char *packing; /* recordPacking in SRU 2.0 */ 89 90 char *recordXPath; 91 char *database; 92 char *stylesheet; 93 Odr_int *resultSetTTL; 94 Z_FacetList *facetList; 95 } Z_SRW_searchRetrieveRequest; 96 97 typedef struct { 98 Odr_int *numberOfRecords; 99 char *resultCountPrecision; 100 char * resultSetId; 101 Odr_int *resultSetIdleTime; 102 103 Z_SRW_record *records; 104 int num_records; 105 106 Z_SRW_diagnostic *diagnostics; 107 int num_diagnostics; 108 Odr_int *nextRecordPosition; 109 110 Z_SRW_extra_record **extra_records; /* of size num_records */ 111 Z_FacetList *facetList; 112 char *suggestions; 113 } Z_SRW_searchRetrieveResponse; 114 115 typedef struct { 116 char *recordPacking; 117 char *packing; 118 char *database; 119 char *stylesheet; 120 } Z_SRW_explainRequest; 121 122 typedef struct { 123 Z_SRW_record record; 124 Z_SRW_diagnostic *diagnostics; 125 int num_diagnostics; 126 Z_SRW_extra_record *extra_record; 127 } Z_SRW_explainResponse; 128 129 typedef struct { 130 char *queryType; 131 char *scanClause; 132 Odr_int *responsePosition; 133 Odr_int *maximumTerms; 134 char *stylesheet; 135 char *database; 136 } Z_SRW_scanRequest; 137 138 typedef struct { 139 char *value; 140 Odr_int *numberOfRecords; 141 char *displayTerm; 142 char *whereInList; 143 } Z_SRW_scanTerm; 144 145 typedef struct { 146 Z_SRW_scanTerm *terms; 147 int num_terms; 148 Z_SRW_diagnostic *diagnostics; 149 int num_diagnostics; 150 } Z_SRW_scanResponse; 151 152 153 typedef struct { 154 char *versionType; 155 char *versionValue; 156 } Z_SRW_recordVersion; 157 158 typedef struct { 159 char *database; 160 char *operation; 161 char *recordId; 162 Z_SRW_recordVersion *recordVersions; 163 int num_recordVersions; 164 Z_SRW_record *record; 165 Z_SRW_extra_record *extra_record; 166 char *extraRequestData_buf; 167 int extraRequestData_len; 168 char *stylesheet; 169 } Z_SRW_updateRequest; 170 171 typedef struct Z_SRW_extra_arg Z_SRW_extra_arg; 172 struct Z_SRW_extra_arg { 173 char *name; 174 char *value; 175 Z_SRW_extra_arg *next; 176 }; 177 178 typedef struct { 179 char *operationStatus; 180 char *recordId; 181 Z_SRW_recordVersion *recordVersions; 182 int num_recordVersions; 183 Z_SRW_record *record; 184 Z_SRW_extra_record *extra_record; 185 char *extraResponseData_buf; 186 int extraResponseData_len; 187 Z_SRW_diagnostic *diagnostics; 188 int num_diagnostics; 189 } Z_SRW_updateResponse; 190 191 #define Z_SRW_searchRetrieve_request 1 192 #define Z_SRW_searchRetrieve_response 2 193 #define Z_SRW_explain_request 3 194 #define Z_SRW_explain_response 4 195 #define Z_SRW_scan_request 5 196 #define Z_SRW_scan_response 6 197 #define Z_SRW_update_request 7 198 #define Z_SRW_update_response 8 199 200 typedef struct { 201 int which; 202 union { 203 Z_SRW_searchRetrieveRequest *request; 204 Z_SRW_searchRetrieveResponse *response; 205 Z_SRW_explainRequest *explain_request; 206 Z_SRW_explainResponse *explain_response; 207 Z_SRW_scanRequest *scan_request; 208 Z_SRW_scanResponse *scan_response; 209 Z_SRW_updateRequest *update_request; 210 Z_SRW_updateResponse *update_response; 211 } u; 212 char *srw_version; 213 char *username; /* From HTTP header or request */ 214 char *password; /* From HTTP header or request */ 215 216 /* 1. SRU extraRequestData x-name=value for requests encoding */ 217 /* 2. SRU extraRequestData x-name=value for requests decoding */ 218 /* 3. SRU echoed data for response encoding */ 219 Z_SRW_extra_arg *extra_args; 220 221 char *extraResponseData_buf; 222 int extraResponseData_len; 223 } Z_SRW_PDU; 224 225 YAZ_EXPORT int yaz_srw_codec(ODR o, void * pptr, 226 Z_SRW_PDU **handler_data, 227 void *client_data, const char *ns); 228 YAZ_EXPORT int yaz_ucp_codec(ODR o, void * pptr, 229 Z_SRW_PDU **handler_data, 230 void *client_data, const char *ns); 231 YAZ_EXPORT Z_SRW_PDU *yaz_srw_get_core_v_2_0(ODR o); 232 YAZ_EXPORT Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version); 233 YAZ_EXPORT Z_SRW_PDU *yaz_srw_get_pdu_e(ODR o, int which, Z_SRW_PDU *req); 234 YAZ_EXPORT Z_SRW_PDU *yaz_srw_get(ODR o, int which); 235 YAZ_EXPORT Z_SRW_recordVersion *yaz_srw_get_record_versions(ODR o, int num); 236 YAZ_EXPORT Z_SRW_extra_record *yaz_srw_get_extra_record(ODR o); 237 YAZ_EXPORT Z_SRW_record *yaz_srw_get_record(ODR o); 238 YAZ_EXPORT Z_SRW_record *yaz_srw_get_records(ODR o, int num); 239 240 YAZ_EXPORT int yaz_diag_bib1_to_srw (int bib1_code); 241 242 YAZ_EXPORT int yaz_diag_srw_to_bib1(int srw_code); 243 244 YAZ_EXPORT const char *yaz_srw_pack_to_str(int pack); 245 YAZ_EXPORT int yaz_srw_str_to_pack(const char *str); 246 247 YAZ_EXPORT int yaz_uri_to_array(const char *path, ODR o, 248 char ***name, char ***val); 249 YAZ_EXPORT void yaz_array_to_uri(char **path, ODR o, 250 char **name, char **value); 251 252 /** \brief encodes URI component 253 \param dst destination string (should be at least 3*strlen(uri)+1) 254 \param uri URI component C-string (source) 255 */ 256 YAZ_EXPORT void yaz_encode_uri_component(char *dst, const char *uri); 257 258 /** \brief decodes URI component 259 \param dst destination string (should be at least strlen(uri)+1) 260 \param uri URI component buffer (source) 261 \param len number of bytes to decode from uri 262 */ 263 YAZ_EXPORT void yaz_decode_uri_component(char *dst, const char *uri, 264 size_t len); 265 266 YAZ_EXPORT int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, 267 Z_SOAP **soap_package, ODR decode, char **charset); 268 269 YAZ_EXPORT int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, 270 Z_SOAP **soap_package, ODR decode, 271 char **charset, 272 Z_SRW_diagnostic **, int *num_diagnostic); 273 274 /** \brief decode SOLR response (HTTP) 275 \param o ODR for result 276 \param hres HTTP response to be decoded 277 \param pdup SRW response pointer (set if successful) 278 \retval -1 fail 279 \retval 0 OK 280 */ 281 YAZ_EXPORT int yaz_solr_decode_response(ODR o, Z_HTTP_Response *hres, 282 Z_SRW_PDU **pdup); 283 284 285 YAZ_EXPORT void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, 286 int *num, int code, 287 const char *addinfo); 288 289 YAZ_EXPORT void yaz_add_sru_update_diagnostic(ODR o, Z_SRW_diagnostic **d, 290 int *num, int code, 291 const char *addinfo); 292 293 YAZ_EXPORT void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d, 294 int code, const char *details); 295 296 YAZ_EXPORT void yaz_add_srw_diagnostic_uri(ODR o, Z_SRW_diagnostic **d, 297 int *num, const char *uri, 298 const char *message, 299 const char *details); 300 301 YAZ_EXPORT void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, 302 const char *uri, const char *message, 303 const char *details); 304 305 YAZ_EXPORT int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, 306 ODR encode, const char *charset); 307 YAZ_EXPORT int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, 308 ODR encode, const char *charset); 309 YAZ_EXPORT int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, 310 ODR odr, const char *charset); 311 312 /** \brief encode SOLR request (HTTP) 313 \param hreq HTTP request to be modified (with encoded request) 314 \param srw_pdu SRW request 315 \param encode ODR for result 316 \param charset character set for request (may be NULL) 317 \retval -1 fail 318 \retval 0 OK 319 */ 320 YAZ_EXPORT int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, 321 ODR encode, const char *charset); 322 323 YAZ_EXPORT 324 void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args); 325 326 327 #define YAZ_XMLNS_SRU_v1_0 "http://www.loc.gov/zing/srw/v1.0/" 328 #define YAZ_XMLNS_SRU_v1_1 "http://www.loc.gov/zing/srw/" 329 #define YAZ_XMLNS_DIAG_v1_1 "http://www.loc.gov/zing/srw/diagnostic/" 330 #define YAZ_XMLNS_DIAG_v2 "http://docs.oasis-open.org/ns/search-ws/diagnostic" 331 #define YAZ_XMLNS_UPDATE_v0_9 "http://www.loc.gov/zing/srw/update/" 332 #define YAZ_XMLNS_SRU_v2_mask "http://docs.oasis-open.org/ns/search-ws/*" 333 #define YAZ_XMLNS_SRU_v1_response "http://www.loc.gov/*" 334 335 YAZ_EXPORT 336 int yaz_srw_check_content_type(Z_HTTP_Response *hres); 337 338 YAZ_EXPORT 339 int sru_decode_surrogate_diagnostics(const char *buf, size_t len, 340 Z_SRW_diagnostic **diag, 341 int *num, ODR odr); 342 343 YAZ_EXPORT 344 void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, 345 int code, const char *details); 346 347 /** \brief encode SRU database for HTTP path 348 \param out memory handle for resulting encoded database string 349 \param db source database 350 \returns encoded database path (includes leading /) 351 */ 352 YAZ_EXPORT 353 char *yaz_encode_sru_dbpath_odr(ODR out, const char *db); 354 355 /** \brief encode SRU database for HTTP path 356 \param dst destination buffer (should be at least strlen(db) +2 in size) 357 \param db source database 358 359 The resulting database (dst) includes a leading / 360 */ 361 YAZ_EXPORT 362 void yaz_encode_sru_dbpath_buf(char *dst, const char *db); 363 364 YAZ_END_CDECL 365 366 #endif 367 /* 368 * Local variables: 369 * c-basic-offset: 4 370 * c-file-style: "Stroustrup" 371 * indent-tabs-mode: nil 372 * End: 373 * vim: shiftwidth=4 tabstop=8 expandtab 374 */ 375 376