static Z_InitRequest *zget_InitRequest(ODR o) { Z_InitRequest *r = (Z_InitRequest *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options)); ODR_MASK_ZERO(r->options); r->protocolVersion = (Odr_bitmask *) odr_malloc(o, sizeof(*r->protocolVersion)); ODR_MASK_SET(r->options, Z_Options_search); ODR_MASK_SET(r->options, Z_Options_present); ODR_MASK_ZERO(r->protocolVersion); ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_1); ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_2); r->preferredMessageSize = odr_intdup(o, 1024*1024); r->maximumRecordSize = odr_intdup(o, 1024*1024); r->idAuthentication = 0; r->implementationId = "81"; r->implementationName = "YAZ"; r->implementationVersion = YAZ_VERSION #ifdef YAZ_VERSION_SHA1 " " YAZ_VERSION_SHA1 #endif ; r->userInformationField = 0; r->otherInfo = 0; return r; }
static Z_SortResponse *zget_SortResponse(ODR o) { Z_SortResponse *r = (Z_SortResponse *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->sortStatus = odr_intdup(o, Z_SortResponse_success); r->resultSetStatus = odr_intdup(o, Z_SortResponse_empty); r->diagnostics = 0; r->resultCount = 0; r->otherInfo = 0; return r; }
static Z_PresentResponse *zget_PresentResponse(ODR o) { Z_PresentResponse *r = (Z_PresentResponse *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->numberOfRecordsReturned = odr_intdup(o, 0); r->nextResultSetPosition = odr_intdup(o, 0); r->presentStatus = odr_intdup(o, Z_PresentStatus_success); r->records = 0; r->otherInfo = 0; return r; }
static Z_ScanResponse *zget_ScanResponse(ODR o) { Z_ScanResponse *r = (Z_ScanResponse *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->stepSize = 0; r->scanStatus = odr_intdup(o, Z_Scan_success); r->numberOfEntriesReturned = odr_intdup(o, 0); r->positionOfTerm =0; r->entries = 0; r->attributeSet = 0; r->otherInfo = 0; return r; }
void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, int code, const char *details) { const char *message = yaz_diag_srw_str(code); int len = 200; if (message) len += strlen(message); if (details) len += strlen(details); record->recordData_buf = (char *) odr_malloc(o, len); sprintf(record->recordData_buf, "<diagnostic " "xmlns=\"http://www.loc.gov/zing/srw/diagnostic/\">\n" " <uri>info:srw/diagnostic/1/%d</uri>\n", code); if (details) sprintf(record->recordData_buf + strlen(record->recordData_buf), " <details>%s</details>\n", details); if (message) sprintf(record->recordData_buf + strlen(record->recordData_buf), " <message>%s</message>\n", message); sprintf(record->recordData_buf + strlen(record->recordData_buf), "</diagnostic>\n"); record->recordData_len = strlen(record->recordData_buf); record->recordPosition = odr_intdup(o, pos); record->recordSchema = "info:srw/schema/1/diagnostics-v1.1"; }
static Z_SearchResponse *zget_SearchResponse(ODR o) { Z_SearchResponse *r = (Z_SearchResponse *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->resultCount = odr_intdup(o, 0); r->numberOfRecordsReturned = odr_intdup(o, 0); r->nextResultSetPosition = odr_intdup(o, 0); r->searchStatus = odr_booldup(o, 1); r->resultSetStatus = 0; r->presentStatus = 0; r->records = 0; r->additionalSearchInfo = 0; r->otherInfo = 0; return r; }
int yaz_match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, Odr_int **val) { #if CHECK_TYPE struct _xmlAttr *attr; #endif if (!yaz_match_xsd_element(ptr, elem)) return 0; #if CHECK_TYPE for (attr = ptr->properties; attr; attr = attr->next) if (!strcmp(attr->name, "type") && attr->children && attr->children->type == XML_TEXT_NODE) { const char *t = strchr(attr->children->content, ':'); if (t) t = t + 1; else t = attr->children->content; if (!strcmp(t, "integer")) break; } if (!attr) return 0; #endif ptr = ptr->children; if (!ptr || ptr->type != XML_TEXT_NODE) return 0; *val = odr_intdup(o, odr_atoi((const char *) ptr->content)); return 1; }
Z_FacetTerm *facet_term_create_cstr(ODR odr, const char *cstr, Odr_int freq) { Z_FacetTerm *facet_term = odr_malloc(odr, sizeof(*facet_term)); Z_Term *term = z_Term_create(odr, Z_Term_general, cstr, strlen(cstr)); facet_term->term = term; facet_term->count = odr_intdup(odr, freq); return facet_term; }
static Z_PresentRequest *zget_PresentRequest(ODR o) { Z_PresentRequest *r = (Z_PresentRequest *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->resultSetId = "default"; r->resultSetStartPoint = odr_intdup(o, 1); r->numberOfRecordsRequested = odr_intdup(o, 10); r->num_ranges = 0; r->additionalRanges = 0; r->recordComposition = 0; r->preferredRecordSyntax = 0; r->maxSegmentCount = 0; r->maxRecordSize = 0; r->maxSegmentSize = 0; r->otherInfo = 0; return r; }
static Z_ExtendedServicesRequest *zget_ExtendedServicesRequest(ODR o) { Z_ExtendedServicesRequest *r = (Z_ExtendedServicesRequest *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->function = odr_intdup(o, Z_ExtendedServicesRequest_create); r->packageType = 0; r->packageName = 0; r->userId = 0; r->retentionTime = 0; r->permissions = 0; r->description = 0; r->taskSpecificParameters = 0; r->waitAction = odr_intdup(o, Z_ExtendedServicesRequest_waitIfPossible); r->elements = 0; r->otherInfo = 0; return r; }
static Z_SearchRequest *zget_SearchRequest(ODR o) { Z_SearchRequest *r = (Z_SearchRequest *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->smallSetUpperBound = odr_intdup(o, 0); r->largeSetLowerBound = odr_intdup(o, 1); r->mediumSetPresentNumber = odr_intdup(o, 0); r->replaceIndicator = odr_booldup(o, 1); r->resultSetName = "default"; r->num_databaseNames = 0; r->databaseNames = 0; r->smallSetElementSetNames = 0; r->mediumSetElementSetNames = 0; r->preferredRecordSyntax = 0; r->query = 0; r->additionalSearchInfo = 0; r->otherInfo = 0; return r; }
static Z_Segment *zget_Segment(ODR o) { Z_Segment *r = (Z_Segment *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->numberOfRecordsReturned = odr_intdup(o, 0); r->num_segmentRecords = 0; r->segmentRecords = (Z_NamePlusRecord **) odr_nullval(); r->otherInfo = 0; return r; }
static Z_ResourceReportResponse *zget_ResourceReportResponse(ODR o) { Z_ResourceReportResponse *r = (Z_ResourceReportResponse *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->resourceReportStatus = odr_intdup(o, Z_ResourceReportResponse_success); r->resourceReport = 0; r->otherInfo = 0; return r; }
static Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o) { Z_DeleteResultSetRequest *r = (Z_DeleteResultSetRequest *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->deleteFunction = odr_intdup(o, Z_DeleteResultSetRequest_list); r->num_resultSetList = 0; r->resultSetList = 0; r->otherInfo = 0; return r; }
static Z_Close *zget_Close(ODR o) { Z_Close *r = (Z_Close *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->closeReason = odr_intdup(o, Z_Close_finished); r->diagnosticInformation = 0; r->resourceReportFormat = 0; r->resourceReport = 0; r->otherInfo = 0; return r; }
static Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o) { Z_TriggerResourceControlRequest *r = (Z_TriggerResourceControlRequest *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->requestedAction = odr_intdup(o, Z_TriggerResourceControlRequest_resourceReport); r->prefResourceReportFormat = 0; r->resultSetWanted = 0; r->otherInfo = 0; return r; }
Z_DefaultDiagFormat *zget_DefaultDiagFormat(ODR o, int error, const char *addinfo) { Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) odr_malloc(o, sizeof(*dr)); dr->diagnosticSetId = odr_oiddup(o, yaz_oid_diagset_bib_1); dr->condition = odr_intdup(o, error); dr->which = Z_DefaultDiagFormat_v2Addinfo; dr->u.v2Addinfo = odr_strdup (o, addinfo ? addinfo : ""); return dr; }
static Z_DuplicateDetectionResponse *zget_DuplicateDetectionResponse(ODR o) { Z_DuplicateDetectionResponse *r = (Z_DuplicateDetectionResponse *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->status = odr_intdup(o, Z_DuplicateDetectionResponse_success); r->resultSetCount = 0; r->num_diagnostics = 0; r->diagnostics = 0; r->otherInfo = 0; return r; }
static Z_ExtendedServicesResponse *zget_ExtendedServicesResponse(ODR o) { Z_ExtendedServicesResponse *r = (Z_ExtendedServicesResponse *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->operationStatus = odr_intdup(o, Z_ExtendedServicesResponse_done); r->num_diagnostics = 0; r->diagnostics = 0; r->taskPackage = 0; r->otherInfo = 0; return r; }
static Z_InitResponse *zget_InitResponse(ODR o) { Z_InitResponse *r = (Z_InitResponse *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options)); ODR_MASK_ZERO(r->options); r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion)); ODR_MASK_ZERO(r->protocolVersion); r->preferredMessageSize = odr_intdup(o, 30*1024); r->maximumRecordSize = odr_intdup(o, 30*1024); r->result = odr_booldup(o, 1); r->implementationId = "81"; r->implementationName = "YAZ"; r->implementationVersion = YAZ_VERSION #ifdef YAZ_VERSION_SHA1 " " YAZ_VERSION_SHA1 #endif ; r->userInformationField = 0; r->otherInfo = 0; return r; }
static Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o) { Z_DeleteResultSetResponse *r = (Z_DeleteResultSetResponse *) odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->deleteOperationStatus = odr_intdup(o, Z_DeleteStatus_success); r->deleteListStatuses = 0; r->numberNotDeleted = 0; r->bulkStatuses = 0; r->deleteMessage = 0; r->otherInfo = 0; return r; }
static Z_ScanRequest *zget_ScanRequest(ODR o) { Z_ScanRequest *r = (Z_ScanRequest *)odr_malloc(o, sizeof(*r)); r->referenceId = 0; r->num_databaseNames = 0; r->databaseNames = 0; r->attributeSet = 0; r->termListAndStartPoint = 0; r->stepSize = 0; r->numberOfTermsRequested = odr_intdup(o, 20); r->preferredPositionInResponse = 0; r->otherInfo = 0; return r; }
static int yaz_sru_decode_integer(ODR odr, const char *pname, const char *valstr, Odr_int **valp, Z_SRW_diagnostic **diag, int *num_diag, int min_value) { int ival; if (!valstr) return 0; if (sscanf(valstr, "%d", &ival) != 1) { yaz_add_srw_diagnostic(odr, diag, num_diag, YAZ_SRW_UNSUPP_PARAMETER_VALUE, pname); return 0; } if (min_value >= 0 && ival < min_value) { yaz_add_srw_diagnostic(odr, diag, num_diag, YAZ_SRW_UNSUPP_PARAMETER_VALUE, pname); return 0; } *valp = odr_intdup(odr, ival); return 1; }
static Odr_int *intVal(ODR odr, const char *str) { return odr_intdup(odr, atoi(str)); }
Z_OtherInformationUnit *yaz_oi_update( Z_OtherInformation **otherInformationP, ODR odr, const Odr_oid *oid, int categoryValue, int delete_flag) { int i; Z_OtherInformation *otherInformation; if (!otherInformationP) return 0; otherInformation = *otherInformationP; if (!otherInformation) { if (!odr) return 0; otherInformation = *otherInformationP = (Z_OtherInformation *) odr_malloc (odr, sizeof(*otherInformation)); otherInformation->num_elements = 0; otherInformation->list = 0; } for (i = 0; i<otherInformation->num_elements; i++) { if (!oid) { /* DS: Want does this do? Returns the first element without a category */ if (!otherInformation->list[i]->category) return otherInformation->list[i]; } else { if (otherInformation->list[i]->category && categoryValue == *otherInformation->list[i]->category->categoryValue && !oid_oidcmp (oid, otherInformation->list[i]->category-> categoryTypeId)) { Z_OtherInformationUnit *this_list = otherInformation->list[i]; if (delete_flag) { (otherInformation->num_elements)--; while (i < otherInformation->num_elements) { otherInformation->list[i] = otherInformation->list[i+1]; i++; } } return this_list; } } } if (!odr) return 0; else { Z_OtherInformationUnit **newlist = (Z_OtherInformationUnit**) odr_malloc(odr, (otherInformation->num_elements+1) * sizeof(*newlist)); for (i = 0; i<otherInformation->num_elements; i++) newlist[i] = otherInformation->list[i]; otherInformation->list = newlist; otherInformation->list[i] = (Z_OtherInformationUnit*) odr_malloc (odr, sizeof(Z_OtherInformationUnit)); if (oid) { otherInformation->list[i]->category = (Z_InfoCategory*) odr_malloc (odr, sizeof(Z_InfoCategory)); otherInformation->list[i]->category->categoryTypeId = (Odr_oid*) odr_oiddup (odr, oid); otherInformation->list[i]->category->categoryValue = odr_intdup(odr, categoryValue); } else otherInformation->list[i]->category = 0; otherInformation->list[i]->which = Z_OtherInfo_characterInfo; otherInformation->list[i]->information.characterInfo = 0; otherInformation->num_elements = i+1; return otherInformation->list[i]; } }
static void yaz_xml2query_operator(const xmlNode *ptr, Z_Operator **op, ODR odr, int *error_code, const char **addinfo) { const char *type = yaz_xml_get_prop((xmlNodePtr) ptr, "type"); if (!type) { *error_code = 1; *addinfo = "no operator type"; return; } *op = (Z_Operator*) odr_malloc(odr, sizeof(Z_Operator)); if (!strcmp(type, "and")) { (*op)->which = Z_Operator_and; (*op)->u.op_and = odr_nullval(); } else if (!strcmp(type, "or")) { (*op)->which = Z_Operator_or; (*op)->u.op_or = odr_nullval(); } else if (!strcmp(type, "not")) { (*op)->which = Z_Operator_and_not; (*op)->u.and_not = odr_nullval(); } else if (!strcmp(type, "prox")) { struct _xmlAttr *attr; Z_ProximityOperator *pop = (Z_ProximityOperator *) odr_malloc(odr, sizeof(*pop)); (*op)->which = Z_Operator_prox; (*op)->u.prox = pop; /* default values */ pop->exclusion = 0; pop->ordered = odr_booldup(odr, 1); pop->relationType = odr_intdup(odr, Z_ProximityOperator_Prox_lessThanOrEqual); pop->which = Z_ProximityOperator_known; pop->u.known = odr_intdup(odr, Z_ProxUnit_word); pop->distance = odr_intdup(odr, 1); for (attr = ptr->properties; attr; attr = attr->next) { const char *value = (const char *) attr->children->content; if (!xmlStrcmp(attr->name, BAD_CAST "type")) ; else if (!xmlStrcmp(attr->name, BAD_CAST "exclusion")) pop->exclusion = boolVal(odr, value); else if (!xmlStrcmp(attr->name, BAD_CAST "distance")) pop->distance = intVal(odr, value); else if (!xmlStrcmp(attr->name, BAD_CAST "ordered")) pop->ordered = boolVal(odr, value); else if (!xmlStrcmp(attr->name, BAD_CAST "relationType")) pop->relationType = intVal(odr, value); else if (!xmlStrcmp(attr->name, BAD_CAST "knownProximityUnit")) { pop->which = Z_ProximityOperator_known; pop->u.known = intVal(odr, value); } else if (!xmlStrcmp(attr->name, BAD_CAST "privateProximityUnit")) { pop->which = Z_ProximityOperator_private; pop->u.known = intVal(odr, value); } else { *error_code = 1; *addinfo = "bad proximity attribute"; break; } } } else { *error_code = 1; *addinfo = "bad operator type"; } }
Z_SortKeySpecList *yaz_sort_spec (ODR out, const char *arg) { char sort_string_buf[64], sort_flags[64]; Z_SortKeySpecList *sksl = (Z_SortKeySpecList *) odr_malloc (out, sizeof(*sksl)); int off; sksl->num_specs = 0; sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20); while ((sscanf (arg, "%63s %63s%n", sort_string_buf, sort_flags, &off)) == 2 && off > 1) { int i; char *sort_string_sep; char *sort_string = sort_string_buf; Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks)); Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk)); arg += off; sksl->specs[sksl->num_specs++] = sks; sks->sortElement = (Z_SortElement *) odr_malloc (out, sizeof(*sks->sortElement)); sks->sortElement->which = Z_SortElement_generic; sks->sortElement->u.generic = sk; if ((sort_string_sep = strchr (sort_string, '='))) { int i = 0; sk->which = Z_SortKey_sortAttributes; sk->u.sortAttributes = (Z_SortAttributes *) odr_malloc (out, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = odr_oiddup(out, yaz_oid_attset_bib_1); sk->u.sortAttributes->list = (Z_AttributeList *) odr_malloc (out, sizeof(*sk->u.sortAttributes->list)); sk->u.sortAttributes->list->attributes = (Z_AttributeElement **) odr_malloc (out, 10 * sizeof(*sk->u.sortAttributes->list->attributes)); while (i < 10 && sort_string && sort_string_sep) { Z_AttributeElement *el = (Z_AttributeElement *) odr_malloc (out, sizeof(*el)); sk->u.sortAttributes->list->attributes[i] = el; el->attributeSet = 0; el->attributeType = odr_intdup (out, atoi (sort_string)); el->which = Z_AttributeValue_numeric; el->value.numeric = odr_intdup (out, atoi (sort_string_sep + 1)); i++; sort_string = strchr(sort_string, ','); if (sort_string) { sort_string++; sort_string_sep = strchr (sort_string, '='); } } sk->u.sortAttributes->list->num_attributes = i; } else { sk->which = Z_SortKey_sortField; sk->u.sortField = odr_strdup (out, sort_string); } sks->sortRelation = odr_intdup (out, Z_SortKeySpec_ascending); sks->caseSensitivity = odr_intdup (out, Z_SortKeySpec_caseSensitive); sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); for (i = 0; sort_flags[i]; i++) { switch (sort_flags[i]) { case 'd': case 'D': case '>': *sks->sortRelation = Z_SortKeySpec_descending; break; case 'a': case 'A': case '<': *sks->sortRelation = Z_SortKeySpec_ascending; break; case 'i': case 'I': *sks->caseSensitivity = Z_SortKeySpec_caseInsensitive; break; case 'S': case 's': *sks->caseSensitivity = Z_SortKeySpec_caseSensitive; break; case '!': sks->which = Z_SortKeySpec_abort; sks->u.abort = odr_nullval(); break; case '=': sks->which = Z_SortKeySpec_missingValueData; sks->u.missingValueData = (Odr_oct*) odr_malloc(out, sizeof(Odr_oct)); i++; sks->u.missingValueData->len = strlen(sort_flags+i); sks->u.missingValueData->size = sks->u.missingValueData->len; sks->u.missingValueData->buf = (unsigned char*) odr_strdup(out, sort_flags+i); i += strlen(sort_flags+i); } } } if (!sksl->num_specs) return 0; return sksl; }
static Z_ProximityOperator *rpn_proximity (struct yaz_pqf_parser *li, ODR o) { Z_ProximityOperator *p = (Z_ProximityOperator *)odr_malloc (o, sizeof(*p)); if (!lex (li)) { li->error = YAZ_PQF_ERROR_MISSING; return NULL; } if (*li->lex_buf == '1') p->exclusion = odr_booldup(o, 1); else if (*li->lex_buf == '0') p->exclusion = odr_booldup(o, 0); else if (*li->lex_buf == 'v' || *li->lex_buf == 'n') p->exclusion = NULL; else { li->error = YAZ_PQF_ERROR_PROXIMITY; return NULL; } if (!lex (li)) { li->error = YAZ_PQF_ERROR_MISSING; return NULL; } if (*li->lex_buf >= '0' && *li->lex_buf <= '9') p->distance = odr_intdup (o, atoi (li->lex_buf)); else { li->error = YAZ_PQF_ERROR_BAD_INTEGER; return NULL; } if (!lex (li)) { li->error = YAZ_PQF_ERROR_MISSING; return NULL; } if (*li->lex_buf == '1') p->ordered = odr_booldup(o, 1); else if (*li->lex_buf == '0') p->ordered = odr_booldup(o, 0); else { li->error = YAZ_PQF_ERROR_PROXIMITY; return NULL; } if (!lex (li)) { li->error = YAZ_PQF_ERROR_MISSING; return NULL; } if (*li->lex_buf >= '0' && *li->lex_buf <= '9') p->relationType = odr_intdup (o, atoi (li->lex_buf)); else { li->error = YAZ_PQF_ERROR_BAD_INTEGER; return NULL; } if (!lex (li)) { li->error = YAZ_PQF_ERROR_MISSING; return NULL; } if (*li->lex_buf == 'k') p->which = Z_ProximityOperator_known; else if (*li->lex_buf == 'p') p->which = Z_ProximityOperator_private; else p->which = atoi (li->lex_buf); if (p->which != Z_ProximityOperator_known && p->which != Z_ProximityOperator_private) { li->error = YAZ_PQF_ERROR_PROXIMITY; return NULL; } if (!lex (li)) { li->error = YAZ_PQF_ERROR_MISSING; return NULL; } if (*li->lex_buf >= '0' && *li->lex_buf <= '9') p->u.known = odr_intdup (o, atoi(li->lex_buf)); else { li->error = YAZ_PQF_ERROR_BAD_INTEGER; return NULL; } return p; }
static Z_AttributesPlusTerm *rpn_term(struct yaz_pqf_parser *li, ODR o, int num_attr, Odr_int *attr_list, char **attr_clist, Odr_oid **attr_set) { Z_AttributesPlusTerm *zapt; Odr_oct *term_octet; Z_Term *term; Z_AttributeElement **elements; zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt)); term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet)); term = (Z_Term *)odr_malloc (o, sizeof(*term)); if (!num_attr) elements = (Z_AttributeElement**)odr_nullval(); else { int i, k = 0; Odr_int *attr_tmp; elements = (Z_AttributeElement**) odr_malloc (o, num_attr * sizeof(*elements)); attr_tmp = (Odr_int *)odr_malloc(o, num_attr * 2 * sizeof(*attr_tmp)); memcpy(attr_tmp, attr_list, num_attr * 2 * sizeof(*attr_tmp)); for (i = num_attr; --i >= 0; ) { int j; for (j = i+1; j<num_attr; j++) if (attr_tmp[2*j] == attr_tmp[2*i]) break; if (j < num_attr) continue; elements[k] = (Z_AttributeElement*)odr_malloc (o,sizeof(**elements)); elements[k]->attributeType = &attr_tmp[2*i]; elements[k]->attributeSet = attr_set[i]; if (attr_clist[i]) { elements[k]->which = Z_AttributeValue_complex; elements[k]->value.complex = (Z_ComplexAttribute *) odr_malloc (o, sizeof(Z_ComplexAttribute)); elements[k]->value.complex->num_list = 1; elements[k]->value.complex->list = (Z_StringOrNumeric **) odr_malloc (o, 1 * sizeof(Z_StringOrNumeric *)); elements[k]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc (o, sizeof(Z_StringOrNumeric)); elements[k]->value.complex->list[0]->which = Z_StringOrNumeric_string; elements[k]->value.complex->list[0]->u.string = attr_clist[i]; elements[k]->value.complex->semanticAction = 0; elements[k]->value.complex->num_semanticAction = 0; } else { elements[k]->which = Z_AttributeValue_numeric; elements[k]->value.numeric = &attr_tmp[2*i+1]; } k++; } num_attr = k; } zapt->attributes = (Z_AttributeList *) odr_malloc (o, sizeof(*zapt->attributes)); zapt->attributes->num_attributes = num_attr; zapt->attributes->attributes = elements; zapt->term = term; term_octet->buf = (unsigned char *)odr_malloc (o, 1 + li->lex_len); term_octet->size = term_octet->len = escape_string ((char *) (term_octet->buf), li->lex_buf, li->lex_len); term_octet->buf[term_octet->size] = 0; /* null terminate */ switch (li->term_type) { case Z_Term_general: term->which = Z_Term_general; term->u.general = term_octet; break; case Z_Term_characterString: term->which = Z_Term_characterString; term->u.characterString = (char*) term_octet->buf; /* null terminated above */ break; case Z_Term_numeric: term->which = Z_Term_numeric; term->u.numeric = odr_intdup (o, atoi((char*) (term_octet->buf))); break; case Z_Term_null: term->which = Z_Term_null; term->u.null = odr_nullval(); break; case Z_Term_external: term->which = Z_Term_external; term->u.external = 0; break; default: term->which = Z_Term_null; term->u.null = odr_nullval(); break; } return zapt; }
/* this huge function handles extended services */ int ztest_esrequest (void *handle, bend_esrequest_rr *rr) { /* user-defined handle - created in bend_init */ int *counter = (int*) handle; yaz_log(LOG_LOG, "ESRequest no %d", *counter); (*counter)++; if (rr->esr->packageName) yaz_log(LOG_LOG, "packagename: %s", rr->esr->packageName); yaz_log(LOG_LOG, "Waitaction: %d", *rr->esr->waitAction); yaz_log(LOG_LOG, "function: %d", *rr->esr->function); if (!rr->esr->taskSpecificParameters) { yaz_log (LOG_WARN, "No task specific parameters"); } else if (rr->esr->taskSpecificParameters->which == Z_External_itemOrder) { Z_ItemOrder *it = rr->esr->taskSpecificParameters->u.itemOrder; yaz_log (LOG_LOG, "Received ItemOrder"); if (it->which == Z_IOItemOrder_esRequest) { Z_IORequest *ir = it->u.esRequest; Z_IOOriginPartToKeep *k = ir->toKeep; Z_IOOriginPartNotToKeep *n = ir->notToKeep; if (k && k->contact) { if (k->contact->name) yaz_log(LOG_LOG, "contact name %s", k->contact->name); if (k->contact->phone) yaz_log(LOG_LOG, "contact phone %s", k->contact->phone); if (k->contact->email) yaz_log(LOG_LOG, "contact email %s", k->contact->email); } if (k->addlBilling) { yaz_log(LOG_LOG, "Billing info (not shown)"); } if (n->resultSetItem) { yaz_log(LOG_LOG, "resultsetItem"); yaz_log(LOG_LOG, "setId: %s", n->resultSetItem->resultSetId); yaz_log(LOG_LOG, "item: %d", *n->resultSetItem->item); } if (n->itemRequest) { Z_External *r = (Z_External*) n->itemRequest; ILL_ItemRequest *item_req = 0; ILL_APDU *ill_apdu = 0; if (r->direct_reference) { oident *ent = oid_getentbyoid(r->direct_reference); if (ent) yaz_log(LOG_LOG, "OID %s", ent->desc); if (ent && ent->value == VAL_TEXT_XML) { yaz_log (LOG_LOG, "ILL XML request"); if (r->which == Z_External_octet) yaz_log (LOG_LOG, "%.*s", r->u.octet_aligned->len, r->u.octet_aligned->buf); } if (ent && ent->value == VAL_ISO_ILL_1) { yaz_log (LOG_LOG, "Decode ItemRequest begin"); if (r->which == ODR_EXTERNAL_single) { odr_setbuf(rr->decode, (char *) r->u.single_ASN1_type->buf, r->u.single_ASN1_type->len, 0); if (!ill_ItemRequest (rr->decode, &item_req, 0, 0)) { yaz_log (LOG_LOG, "Couldn't decode ItemRequest %s near %d", odr_errmsg(odr_geterror(rr->decode)), odr_offset(rr->decode)); } else yaz_log(LOG_LOG, "Decode ItemRequest OK"); if (rr->print) { ill_ItemRequest (rr->print, &item_req, 0, "ItemRequest"); odr_reset (rr->print); } } if (!item_req && r->which == ODR_EXTERNAL_single) { yaz_log (LOG_LOG, "Decode ILL APDU begin"); odr_setbuf(rr->decode, (char*) r->u.single_ASN1_type->buf, r->u.single_ASN1_type->len, 0); if (!ill_APDU (rr->decode, &ill_apdu, 0, 0)) { yaz_log (LOG_LOG, "Couldn't decode ILL APDU %s near %d", odr_errmsg(odr_geterror(rr->decode)), odr_offset(rr->decode)); yaz_log(LOG_LOG, "PDU dump:"); odr_dumpBER(yaz_log_file(), (char *) r->u.single_ASN1_type->buf, r->u.single_ASN1_type->len); } else yaz_log(LOG_LOG, "Decode ILL APDU OK"); if (rr->print) { ill_APDU (rr->print, &ill_apdu, 0, "ILL APDU"); odr_reset (rr->print); } } } } if (item_req) { yaz_log (LOG_LOG, "ILL protocol version = %d", *item_req->protocol_version_num); } } if (k) { Z_External *ext = (Z_External *) odr_malloc (rr->stream, sizeof(*ext)); Z_IUOriginPartToKeep *keep = (Z_IUOriginPartToKeep *) odr_malloc (rr->stream, sizeof(*keep)); Z_IOTargetPart *targetPart = (Z_IOTargetPart *) odr_malloc (rr->stream, sizeof(*targetPart)); rr->taskPackage = (Z_TaskPackage *) odr_malloc (rr->stream, sizeof(*rr->taskPackage)); rr->taskPackage->packageType = odr_oiddup (rr->stream, rr->esr->packageType); rr->taskPackage->packageName = 0; rr->taskPackage->userId = 0; rr->taskPackage->retentionTime = 0; rr->taskPackage->permissions = 0; rr->taskPackage->description = 0; rr->taskPackage->targetReference = (Odr_oct *) odr_malloc (rr->stream, sizeof(Odr_oct)); rr->taskPackage->targetReference->buf = (unsigned char *) odr_strdup (rr->stream, "911"); rr->taskPackage->targetReference->len = rr->taskPackage->targetReference->size = strlen((char *) (rr->taskPackage->targetReference->buf)); rr->taskPackage->creationDateTime = 0; rr->taskPackage->taskStatus = odr_intdup(rr->stream, 0); rr->taskPackage->packageDiagnostics = 0; rr->taskPackage->taskSpecificParameters = ext; ext->direct_reference = odr_oiddup (rr->stream, rr->esr->packageType); ext->indirect_reference = 0; ext->descriptor = 0; ext->which = Z_External_itemOrder; ext->u.itemOrder = (Z_ItemOrder *) odr_malloc (rr->stream, sizeof(*ext->u.update)); ext->u.itemOrder->which = Z_IOItemOrder_taskPackage; ext->u.itemOrder->u.taskPackage = (Z_IOTaskPackage *) odr_malloc (rr->stream, sizeof(Z_IOTaskPackage)); ext->u.itemOrder->u.taskPackage->originPart = k; ext->u.itemOrder->u.taskPackage->targetPart = targetPart; targetPart->itemRequest = 0; targetPart->statusOrErrorReport = 0; targetPart->auxiliaryStatus = 0; } } } else if (rr->esr->taskSpecificParameters->which == Z_External_update) { Z_IUUpdate *up = rr->esr->taskSpecificParameters->u.update; yaz_log (LOG_LOG, "Received DB Update"); if (up->which == Z_IUUpdate_esRequest) { Z_IUUpdateEsRequest *esRequest = up->u.esRequest; Z_IUOriginPartToKeep *toKeep = esRequest->toKeep; Z_IUSuppliedRecords *notToKeep = esRequest->notToKeep; yaz_log (LOG_LOG, "action"); if (toKeep->action) { switch (*toKeep->action) { case Z_IUOriginPartToKeep_recordInsert: yaz_log (LOG_LOG, " recordInsert"); break; case Z_IUOriginPartToKeep_recordReplace: yaz_log (LOG_LOG, " recordReplace"); break; case Z_IUOriginPartToKeep_recordDelete: yaz_log (LOG_LOG, " recordDelete"); break; case Z_IUOriginPartToKeep_elementUpdate: yaz_log (LOG_LOG, " elementUpdate"); break; case Z_IUOriginPartToKeep_specialUpdate: yaz_log (LOG_LOG, " specialUpdate"); break; default: yaz_log (LOG_LOG, " unknown (%d)", *toKeep->action); } } if (toKeep->databaseName) { yaz_log (LOG_LOG, "database: %s", toKeep->databaseName); if (!strcmp(toKeep->databaseName, "fault")) { rr->errcode = 109; rr->errstring = toKeep->databaseName; } if (!strcmp(toKeep->databaseName, "accept")) rr->errcode = -1; } if (toKeep) { Z_External *ext = (Z_External *) odr_malloc (rr->stream, sizeof(*ext)); Z_IUOriginPartToKeep *keep = (Z_IUOriginPartToKeep *) odr_malloc (rr->stream, sizeof(*keep)); Z_IUTargetPart *targetPart = (Z_IUTargetPart *) odr_malloc (rr->stream, sizeof(*targetPart)); rr->taskPackage = (Z_TaskPackage *) odr_malloc (rr->stream, sizeof(*rr->taskPackage)); rr->taskPackage->packageType = odr_oiddup (rr->stream, rr->esr->packageType); rr->taskPackage->packageName = 0; rr->taskPackage->userId = 0; rr->taskPackage->retentionTime = 0; rr->taskPackage->permissions = 0; rr->taskPackage->description = 0; rr->taskPackage->targetReference = (Odr_oct *) odr_malloc (rr->stream, sizeof(Odr_oct)); rr->taskPackage->targetReference->buf = (unsigned char *) odr_strdup (rr->stream, "123"); rr->taskPackage->targetReference->len = rr->taskPackage->targetReference->size = strlen((char *) (rr->taskPackage->targetReference->buf)); rr->taskPackage->creationDateTime = 0; rr->taskPackage->taskStatus = odr_intdup(rr->stream, 0); rr->taskPackage->packageDiagnostics = 0; rr->taskPackage->taskSpecificParameters = ext; ext->direct_reference = odr_oiddup (rr->stream, rr->esr->packageType); ext->indirect_reference = 0; ext->descriptor = 0; ext->which = Z_External_update; ext->u.update = (Z_IUUpdate *) odr_malloc (rr->stream, sizeof(*ext->u.update)); ext->u.update->which = Z_IUUpdate_taskPackage; ext->u.update->u.taskPackage = (Z_IUUpdateTaskPackage *) odr_malloc (rr->stream, sizeof(Z_IUUpdateTaskPackage)); ext->u.update->u.taskPackage->originPart = keep; ext->u.update->u.taskPackage->targetPart = targetPart; keep->action = (int *) odr_malloc (rr->stream, sizeof(int)); *keep->action = *toKeep->action; keep->databaseName = odr_strdup (rr->stream, toKeep->databaseName); keep->schema = 0; keep->elementSetName = 0; keep->actionQualifier = 0; targetPart->updateStatus = odr_intdup (rr->stream, 1); targetPart->num_globalDiagnostics = 0; targetPart->globalDiagnostics = (Z_DiagRec **) odr_nullval(); targetPart->num_taskPackageRecords = 1; targetPart->taskPackageRecords = (Z_IUTaskPackageRecordStructure **) odr_malloc (rr->stream, sizeof(Z_IUTaskPackageRecordStructure *)); targetPart->taskPackageRecords[0] = (Z_IUTaskPackageRecordStructure *) odr_malloc (rr->stream, sizeof(Z_IUTaskPackageRecordStructure)); targetPart->taskPackageRecords[0]->which = Z_IUTaskPackageRecordStructure_record; targetPart->taskPackageRecords[0]->u.record = z_ext_record (rr->stream, VAL_SUTRS, "test", 4); targetPart->taskPackageRecords[0]->correlationInfo = 0; targetPart->taskPackageRecords[0]->recordStatus = odr_intdup (rr->stream, Z_IUTaskPackageRecordStructure_success); targetPart->taskPackageRecords[0]->num_supplementalDiagnostics = 0; targetPart->taskPackageRecords[0]->supplementalDiagnostics = 0; } if (notToKeep) { int i; for (i = 0; i < notToKeep->num; i++) { Z_External *rec = notToKeep->elements[i]->record; if (rec->direct_reference) { struct oident *oident; oident = oid_getentbyoid(rec->direct_reference); if (oident) yaz_log (LOG_LOG, "record %d type %s", i, oident->desc); } switch (rec->which) { case Z_External_sutrs: if (rec->u.octet_aligned->len > 170) yaz_log (LOG_LOG, "%d bytes:\n%.168s ...", rec->u.sutrs->len, rec->u.sutrs->buf); else yaz_log (LOG_LOG, "%d bytes:\n%s", rec->u.sutrs->len, rec->u.sutrs->buf); break; case Z_External_octet : if (rec->u.octet_aligned->len > 170) yaz_log (LOG_LOG, "%d bytes:\n%.168s ...", rec->u.octet_aligned->len, rec->u.octet_aligned->buf); else yaz_log (LOG_LOG, "%d bytes\n%s", rec->u.octet_aligned->len, rec->u.octet_aligned->buf); } } } } } else if (rr->esr->taskSpecificParameters->which == Z_External_update0) { yaz_log(LOG_LOG, "Received DB Update (version 0)"); } else { yaz_log (LOG_WARN, "Unknown Extended Service(%d)", rr->esr->taskSpecificParameters->which); } return 0; }