static Odr_oid *query_oid_getvalbyname(struct yaz_pqf_parser *li, ODR o) { char buf[32]; if (li->lex_len >= sizeof(buf)-1) return 0; memcpy (buf, li->lex_buf, li->lex_len); buf[li->lex_len] = '\0'; return yaz_string_to_oid_odr(yaz_oid_std(), CLASS_ATTSET, buf, o); }
static void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, int *error_code, const char **addinfo) { const char *set = yaz_xml_get_prop((xmlNodePtr) ptr, "set"); *query = (Z_RPNQuery*) odr_malloc(odr, sizeof(Z_RPNQuery)); if (set) { (*query)->attributeSetId = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_ATTSET, set, odr); } else (*query)->attributeSetId = 0; yaz_xml2query_rpnstructure(ptr->children, &(*query)->RPNStructure, odr, error_code, addinfo); }
Zlint_code Zlint_test_search_01::sendTest(Zlint *z) { if (!m_got_result_set) { Z_APDU *apdu = zget_APDU(z->odr_encode(), Z_APDU_searchRequest); Z_SearchRequest *sr; sr = apdu->u.searchRequest; sr->query = (Z_Query *) odr_malloc(z->odr_encode(), sizeof(*sr->query)); if (try_query[m_query_no] && sr) { sr->query->which = Z_Query_type_1; Z_RPNQuery *rpn; YAZ_PQF_Parser pqf_parser = yaz_pqf_create (); z->getDatabase(&sr->databaseNames, &sr->num_databaseNames); rpn = yaz_pqf_parse(pqf_parser, z->odr_encode(), try_query[m_query_no]); yaz_pqf_destroy (pqf_parser); if (!rpn) { z->msg_check_fail("Query %s invalid", try_query[m_query_no]); return TEST_FINISHED; } int len; sr->query->u.type_1 = rpn; z->send_Z_PDU(apdu, &len); } else { z->msg_check_notapp(); z->msg_check_info("unable to get any hit count"); return TEST_FINISHED; } } else if (m_got_result_set && try_syntax[m_record_syntax_no]) { int len; Z_APDU *apdu = zget_APDU(z->odr_encode(), Z_APDU_presentRequest); Z_PresentRequest *pr = apdu->u.presentRequest; *pr->numberOfRecordsRequested = 1; *pr->resultSetStartPoint = 1; z->msg_check_for("record syntax %s", try_syntax[m_record_syntax_no]); pr->preferredRecordSyntax = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, try_syntax[m_record_syntax_no], z->odr_encode()); z->send_Z_PDU(apdu, &len); return TEST_CONTINUE; } else if(m_got_result_set && !try_syntax[m_record_syntax_no]) { Z_APDU *apdu = zget_APDU(z->odr_encode(), Z_APDU_sortRequest); if (apdu && try_sort[m_sort_no]) { z->msg_check_for("sort %s", try_sort[m_sort_no]); const char *setstring = "default"; int len; Z_SortRequest *sr = apdu->u.sortRequest; sr->num_inputResultSetNames = 1; sr->num_inputResultSetNames = 1; sr->inputResultSetNames = (Z_InternationalString **) odr_malloc (z->odr_encode(), sizeof(*sr->inputResultSetNames)); sr->inputResultSetNames[0] = odr_strdup (z->odr_encode(), setstring); sr->sortedResultSetName = odr_strdup(z->odr_encode(), setstring); sr->sortSequence = yaz_sort_spec(z->odr_encode(), try_sort[m_sort_no]); z->send_Z_PDU(apdu, &len); } else return TEST_FINISHED; } else { printf ("finished...\n"); return TEST_FINISHED; } return TEST_CONTINUE; }
Zlint_code Zlint_test_search_01::recv_gdu(Zlint *z, Z_GDU *gdu) { if (gdu->which == Z_GDU_Z3950 && gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_initResponse) { Z_InitResponse *init = gdu->u.z3950->u.initResponse; int result = init->result ? *init->result : 0; if (!result) { z->msg_check_notapp(); z->msg_check_info ("init rejected (result false)"); return TEST_FINISHED; } return sendTest(z); } else if (gdu->which == Z_GDU_Z3950 && gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_searchResponse) { Z_SearchResponse *sr = gdu->u.z3950->u.searchResponse; if (sr->records && (sr->records->which == Z_Records_NSD || sr->records->which == Z_Records_multipleNSD)) m_query_no++; else if (!sr->resultCount || *sr->resultCount == 0) m_query_no++; else { z->msg_check_ok(); z->msg_check_info("got %d result count with %s", *sr->resultCount, try_query[m_query_no]); m_got_result_set = 1; } return sendTest(z); } else if (gdu->which == Z_GDU_Z3950 && gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_presentResponse) { Z_PresentResponse *sr = gdu->u.z3950->u.presentResponse; if (sr->records && (sr->records->which == Z_Records_NSD || sr->records->which == Z_Records_multipleNSD)) { z->msg_check_ok(); z->msg_check_info("present returned NSD for %s", try_syntax[m_record_syntax_no]); } else if (sr->records && sr->records->which == Z_Records_DBOSD && sr->records->u.databaseOrSurDiagnostics->num_records>0 && sr->records->u.databaseOrSurDiagnostics->records[0]) { if (sr->records->u.databaseOrSurDiagnostics->records[0]->which == Z_NamePlusRecord_databaseRecord) { Z_External *ext = sr->records->u.databaseOrSurDiagnostics->records[0]->u.databaseRecord; Odr_oid *expectRecordSyntax = yaz_string_to_oid_odr( yaz_oid_std(), CLASS_RECSYN, try_syntax[m_record_syntax_no], z->odr_decode()); if (oid_oidcmp(expectRecordSyntax, ext->direct_reference)) { z->msg_check_fail("Got Record in different syntax " "from that requested %s", try_syntax[m_record_syntax_no]); } else z->msg_check_ok(); } else if (sr->records->u.databaseOrSurDiagnostics->records[0]->which == Z_NamePlusRecord_surrogateDiagnostic) { z->msg_check_ok(); z->msg_check_info("present returned SD %s", try_syntax[m_record_syntax_no]); } else { z->msg_check_ok(); z->msg_check_info("present returned fragment %s", try_syntax[m_record_syntax_no]); } } else { z->msg_check_fail("present returned no records or diagnostics"); } m_record_syntax_no++; return sendTest(z); } else if (gdu->which == Z_GDU_Z3950 && gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_sortResponse) { Z_SortResponse *sr = gdu->u.z3950->u.sortResponse; z->msg_check_ok(); if (sr->diagnostics) z->msg_check_info( "sort NSD for %s", try_sort[m_sort_no]); m_sort_no++; return sendTest(z); } else z->msg_check_fail("did not receive init/search/present response " "as expected"); return TEST_FINISHED; }
static void yaz_xml2query_attribute_element(const xmlNode *ptr, Z_AttributeElement **elem, ODR odr, int *error_code, const char **addinfo) { int i; xmlChar *set = 0; xmlChar *type = 0; xmlChar *value = 0; int num_values = 0; struct _xmlAttr *attr; for (attr = ptr->properties; attr; attr = attr->next) { if (!xmlStrcmp(attr->name, BAD_CAST "set") && attr->children && attr->children->type == XML_TEXT_NODE) set = attr->children->content; else if (!xmlStrcmp(attr->name, BAD_CAST "type") && attr->children && attr->children->type == XML_TEXT_NODE) type = attr->children->content; else if (!xmlStrcmp(attr->name, BAD_CAST "value") && attr->children && attr->children->type == XML_TEXT_NODE) { value = attr->children->content; num_values++; } else { *error_code = 1; *addinfo = "bad attribute for attr content"; return; } } if (!type) { *error_code = 1; *addinfo = "missing type attribute for att content"; return; } if (!value) { *error_code = 1; *addinfo = "missing value attribute for att content"; return; } *elem = (Z_AttributeElement *) odr_malloc(odr, sizeof(**elem)); if (set) (*elem)->attributeSet = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_ATTSET, (const char *) set, odr); else (*elem)->attributeSet = 0; (*elem)->attributeType = intVal(odr, (const char *) type); /* looks like a number ? */ for (i = 0; value[i] && value[i] >= '0' && value[i] <= '9'; i++) ; if (num_values > 1 || value[i]) { /* multiple values or string, so turn to complex attribute */ (*elem)->which = Z_AttributeValue_complex; (*elem)->value.complex = (Z_ComplexAttribute*) odr_malloc(odr, sizeof(Z_ComplexAttribute)); (*elem)->value.complex->num_list = num_values; (*elem)->value.complex->list = (Z_StringOrNumeric **) odr_malloc(odr, sizeof(Z_StringOrNumeric*) * num_values); /* second pass over attr values */ i = 0; for (attr = ptr->properties; attr; attr = attr->next) { if (!xmlStrcmp(attr->name, BAD_CAST "value") && attr->children && attr->children->type == XML_TEXT_NODE) { const char *val = (const char *) attr->children->content; assert (i < num_values); (*elem)->value.complex->list[i] = (Z_StringOrNumeric *) odr_malloc(odr, sizeof(Z_StringOrNumeric)); (*elem)->value.complex->list[i]->which = Z_StringOrNumeric_string; (*elem)->value.complex->list[i]->u.string = odr_strdup(odr, val); i++; } } (*elem)->value.complex->num_semanticAction = 0; (*elem)->value.complex->semanticAction = 0; } else { /* good'ld numeric value */ (*elem)->which = Z_AttributeValue_numeric; (*elem)->value.numeric = intVal(odr, (const char *) value); } }