+ xmlNodePtr ptr = pptr;
+ if ( rec->recordId )
+ add_xsd_string(ptr, "recordId", rec->recordId);
+ if ( rec->recordReviewCode )
+ add_xsd_string(ptr, "recordReviewCode", rec->recordReviewCode);
+ if ( rec->recordReviewNote )
+ add_xsd_string(ptr, "recordReviewNote", rec->recordReviewNote);
+ if ( rec->nonDupRecordId )
+ add_xsd_string(ptr, "nonDupRecordId", rec->nonDupRecordId);
+ if ( rec->recordLockStatus )
+ add_xsd_string(ptr, "recordLockStatus", rec->recordLockStatus);
+ if ( rec->recordOldVersion )
+ add_xsd_string(ptr, "recordOldVersion", rec->recordOldVersion);
+ }
+ return 0;
+}
+
+static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec,
+ Z_SRW_extra_record **extra,
+ void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ char *spack = 0;
+ int pack = Z_SRW_recordPacking_string;
+ xmlNodePtr ptr;
+ xmlNodePtr data_ptr = 0;
+ rec->recordSchema = 0;
+ rec->recordData_buf = 0;
+ rec->recordData_len = 0;
+ rec->recordPosition = 0;
+ *extra = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+
+ if (match_xsd_string(ptr, "recordSchema", o,
+ &rec->recordSchema))
+ ;
+ else if (match_xsd_string(ptr, "recordPacking", o, &spack))
+ {
+ if (spack && !strcmp(spack, "xml"))
+ pack = Z_SRW_recordPacking_XML;
+ if (spack && !strcmp(spack, "url"))
+ pack = Z_SRW_recordPacking_URL;
+ if (spack && !strcmp(spack, "string"))
+ pack = Z_SRW_recordPacking_string;
+ }
+ else if (match_xsd_integer(ptr, "recordPosition", o,
+ &rec->recordPosition))
+ ;
+ else if (match_element(ptr, "recordData"))
+ {
+ /* save position of Data until after the loop
+ then we will know the packing (hopefully), and
+ unpacking is done once
+ */
+ data_ptr = ptr;
+ }
+ else if (match_element(ptr, "extraRecordData"))
+ {
+ *extra = (Z_SRW_extra_record *)
+ odr_malloc(o, sizeof(Z_SRW_extra_record));
+ yaz_srw_extra_record(o, ptr, *extra, client_data, ns);
+ }
+ }
+ if (data_ptr)
+ {
+ switch(pack)
+ {
+ case Z_SRW_recordPacking_XML:
+ match_xsd_XML_n(data_ptr, "recordData", o,
+ &rec->recordData_buf, &rec->recordData_len);
+ break;
+ case Z_SRW_recordPacking_URL:
+ /* just store it as a string.
+ leave it to the backend to collect the document */
+ match_xsd_string_n(data_ptr, "recordData", o,
+ &rec->recordData_buf, &rec->recordData_len);
+ break;
+ case Z_SRW_recordPacking_string:
+ match_xsd_string_n(data_ptr, "recordData", o,
+ &rec->recordData_buf, &rec->recordData_len);
+ break;
+ }
+ }
+ rec->recordPacking = pack;
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ xmlNodePtr ptr = pptr;
+ int pack = rec->recordPacking;
+ add_xsd_string(ptr, "recordSchema", rec->recordSchema);
+
+ switch(pack)
+ {
+ case Z_SRW_recordPacking_string:
+ add_xsd_string(ptr, "recordPacking", "string");
+ add_xsd_string_n(ptr, "recordData", rec->recordData_buf,
+ rec->recordData_len);
+ break;
+ case Z_SRW_recordPacking_XML:
+ add_xsd_string(ptr, "recordPacking", "xml");
+ add_XML_n(ptr, "recordData", rec->recordData_buf,
+ rec->recordData_len);
+ break;
+ case Z_SRW_recordPacking_URL:
+ add_xsd_string(ptr, "recordPacking", "url");
+ add_xsd_string_n(ptr, "recordData", rec->recordData_buf,
+ rec->recordData_len);
+ break;
+ }
+ if (rec->recordPosition)
+ add_xsd_integer(ptr, "recordPosition", rec->recordPosition );
+ if (extra && *extra)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "extraRecordData",
+ 0);
+ yaz_srw_extra_record(o, rptr, *extra, client_data, ns);
+ }