Z_External *zget_init_diagnostics_octet(ODR odr, int error, const char *addinfo) { Z_External *x, *x2; Z_OtherInformation *u; Z_OtherInformationUnit *l; Z_DiagnosticFormat *d; Z_DiagnosticFormat_s *e; char *octet_buf; int octet_len; ODR encode; u = (Z_OtherInformation *) odr_malloc(odr, sizeof *u); u->num_elements = 1; u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list); u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]); l = u->list[0]; l->category = 0; l->which = Z_OtherInfo_externallyDefinedInfo; x2 = (Z_External*) odr_malloc(odr, sizeof *x); l->information.externallyDefinedInfo = x2; x2->descriptor = 0; x2->indirect_reference = 0; x2->direct_reference = odr_oiddup(odr, yaz_oid_diagset_diag_1); x2->which = Z_External_diag1; d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d); x2->u.diag1 = d; d->num = 1; d->elements = (Z_DiagnosticFormat_s**) odr_malloc(odr, sizeof *d->elements); d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc(odr, sizeof *d->elements[0]); e = d->elements[0]; e->which = Z_DiagnosticFormat_s_defaultDiagRec; e->u.defaultDiagRec = zget_DefaultDiagFormat(odr, error, addinfo); e->message = 0; encode = odr_createmem(ODR_ENCODE); z_OtherInformation(encode, &u, 0, 0); octet_buf = odr_getbuf(encode, &octet_len, 0); x = (Z_External*) odr_malloc(odr, sizeof *x); x->descriptor = 0; x->indirect_reference = 0; x->direct_reference = odr_oiddup(odr, yaz_oid_userinfo_userinfo_1); x->which = Z_External_octet; x->u.octet_aligned = (Odr_oct *) odr_malloc(odr, sizeof(Odr_oct)); x->u.octet_aligned->buf = (unsigned char *) odr_malloc(odr, octet_len); memcpy(x->u.octet_aligned->buf, octet_buf, octet_len); x->u.octet_aligned->len = octet_len; odr_destroy(encode); return x; }
/* retrieval of a single record (present, and piggy back search) */ static int my_fetch(void *handle, bend_fetch_rr *r) { const Odr_oid *oid = r->request_format; r->last_in_set = 0; r->basename = "Default"; r->output_format = r->request_format; /* if no record syntax was given assume XML */ if (!oid || !oid_oidcmp(oid, yaz_oid_recsyn_xml)) { char buf[40]; yaz_snprintf(buf, sizeof(buf), "<record>%d</record>\n", r->number); r->output_format = odr_oiddup(r->stream, yaz_oid_recsyn_xml); r->record = odr_strdup(r->stream, buf); r->len = strlen(r->record); } else { /* only xml syntax supported . Return diagnostic */ char buf[OID_STR_MAX]; r->errcode = YAZ_BIB1_RECORD_SYNTAX_UNSUPP; r->errstring = odr_strdup(r->stream, oid_oid_to_dotstring(oid, buf)); } return 0; }
Z_External *zget_init_diagnostics(ODR odr, int error, const char *addinfo) { Z_External *x, *x2; Z_OtherInformation *u; Z_OtherInformationUnit *l; Z_DiagnosticFormat *d; Z_DiagnosticFormat_s *e; x = (Z_External*) odr_malloc(odr, sizeof *x); x->descriptor = 0; x->indirect_reference = 0; x->direct_reference = odr_oiddup(odr, yaz_oid_userinfo_userinfo_1); x->which = Z_External_userInfo1; u = (Z_OtherInformation *) odr_malloc(odr, sizeof *u); x->u.userInfo1 = u; u->num_elements = 1; u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list); u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]); l = u->list[0]; l->category = 0; l->which = Z_OtherInfo_externallyDefinedInfo; x2 = (Z_External*) odr_malloc(odr, sizeof *x); l->information.externallyDefinedInfo = x2; x2->descriptor = 0; x2->indirect_reference = 0; x2->direct_reference = odr_oiddup(odr, yaz_oid_diagset_diag_1); x2->which = Z_External_diag1; d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d); x2->u.diag1 = d; d->num = 1; d->elements = (Z_DiagnosticFormat_s**) odr_malloc(odr, sizeof *d->elements); d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc(odr, sizeof *d->elements[0]); e = d->elements[0]; e->which = Z_DiagnosticFormat_s_defaultDiagRec; e->u.defaultDiagRec = zget_DefaultDiagFormat(odr, error, addinfo); e->message = 0; return x; }
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; }
/* Create charset response. Server side */ Z_External *yaz_set_response_charneg(ODR o, const char *charset, const char *lang, int selected) { Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p)); p->descriptor = 0; p->indirect_reference = 0; p->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_3); p->which = Z_External_charSetandLanguageNegotiation; p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o); p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_response; p->u.charNeg3->u.response = z_get_TargetResponse(o, charset, lang, selected); return p; }
Z_RPNQuery *p_query_rpn_mk(ODR o, struct yaz_pqf_parser *li, const char *qbuf) { Z_RPNQuery *zq; Odr_int attr_array[1024]; char *attr_clist[512]; Odr_oid *attr_set[512]; Odr_oid *top_set = 0; zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq)); lex (li); if (li->query_look == 'r') { lex (li); top_set = query_oid_getvalbyname(li, o); if (!top_set) { li->error = YAZ_PQF_ERROR_ATTSET; return NULL; } lex (li); } if (!top_set) { top_set = odr_oiddup(o, yaz_oid_attset_bib_1); } zq->attributeSetId = top_set; if (!zq->attributeSetId) { li->error = YAZ_PQF_ERROR_ATTSET; return 0; } if (!(zq->RPNStructure = rpn_structure(li, o, 0, 512, attr_array, attr_clist, attr_set))) return 0; if (li->query_look) { li->error = YAZ_PQF_ERROR_EXTRA; return 0; } return zq; }
void yaz_oi_set_facetlist( Z_OtherInformation **otherInformation, ODR odr, Z_FacetList *facet_list) { int categoryValue = 1; Z_External *z_external = 0; Z_OtherInformationUnit *oi = yaz_oi_update(otherInformation, odr, yaz_oid_userinfo_facet_1, categoryValue, 0); if (!oi) return; oi->which = Z_OtherInfo_externallyDefinedInfo; z_external = odr_malloc(odr, sizeof(*z_external)); z_external->which = Z_External_userFacets; z_external->direct_reference = odr_oiddup(odr, yaz_oid_userinfo_facet_1); z_external->indirect_reference = 0; z_external->descriptor = 0; z_external->u.facetList = facet_list; oi->information.externallyDefinedInfo = z_external; }
/* Create EXTERNAL for negotation proposal. Client side */ Z_External *yaz_set_proposal_charneg(ODR o, const char **charsets, int num_charsets, const char **langs, int num_langs, int selected) { Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p)); p->descriptor = 0; p->indirect_reference = 0; p->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_3); p->which = Z_External_charSetandLanguageNegotiation; p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o); p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_proposal; p->u.charNeg3->u.proposal = z_get_OriginProposal(o, charsets, num_charsets, langs, num_langs, selected); return p; }
static Z_External* z_ext_record2(ODR o, const char *buf) { Z_External *p; int len = strlen(buf); if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0; p->descriptor = 0; p->indirect_reference = 0; p->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_id); p->which = Z_External_octet; if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) return 0; if (!(p->u.octet_aligned->buf = (unsigned char *)odr_malloc(o, len))) return 0; p->u.octet_aligned->len = p->u.octet_aligned->size = len; memcpy(p->u.octet_aligned->buf, buf, len); return p; }
/* 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; }
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]; } }
int sendAdminES(int type, char* param1) { ODR out = getODROutputStream(); char *dbname = odr_strdup (out, databaseNames[0]); /* Type: 1=reindex, 2=truncate, 3=delete, 4=create, 5=import, 6=refresh, 7=commit */ Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest ); Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; Z_External *r; Odr_oid *oid; Z_ESAdminOriginPartToKeep *toKeep; Z_ESAdminOriginPartNotToKeep *notToKeep; printf ("Admin request\n"); fflush(stdout); oid = odr_oiddup(out, yaz_oid_extserv_admin); req->packageType = oid; req->packageName = "1.Extendedserveq"; /* Allocate the external */ r = req->taskSpecificParameters = (Z_External *) odr_malloc (out, sizeof(*r)); r->direct_reference = odr_oiddup(out,oid); r->indirect_reference = 0; r->descriptor = 0; r->which = Z_External_ESAdmin; r->u.adminService = (Z_Admin *) odr_malloc(out, sizeof(*r->u.adminService)); r->u.adminService->which = Z_Admin_esRequest; r->u.adminService->u.esRequest = (Z_AdminEsRequest *) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest)); toKeep = r->u.adminService->u.esRequest->toKeep = (Z_ESAdminOriginPartToKeep *) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->toKeep)); toKeep->which=type; toKeep->databaseName = dbname; switch ( type ) { case Z_ESAdminOriginPartToKeep_reIndex: toKeep->u.reIndex=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_truncate: toKeep->u.truncate=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_drop: toKeep->u.drop=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_create: toKeep->u.create=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_import: toKeep->u.import = (Z_ImportParameters*) odr_malloc(out, sizeof(*toKeep->u.import)); toKeep->u.import->recordType=param1; /* Need to add additional setup of records here */ break; case Z_ESAdminOriginPartToKeep_refresh: toKeep->u.refresh=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_commit: toKeep->u.commit=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_shutdown: toKeep->u.commit=odr_nullval(); break; case Z_ESAdminOriginPartToKeep_start: toKeep->u.commit=odr_nullval(); break; default: /* Unknown admin service */ break; } notToKeep = r->u.adminService->u.esRequest->notToKeep = (Z_ESAdminOriginPartNotToKeep *) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->notToKeep)); notToKeep->which=Z_ESAdminOriginPartNotToKeep_recordsWillFollow; notToKeep->u.recordsWillFollow=odr_nullval(); send_apdu(apdu); return 0; }
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; }
Z_AttributesPlusTerm *p_query_scan_mk(struct yaz_pqf_parser *li, ODR o, oid_proto proto, Odr_oid **attributeSetP, const char *qbuf) { Odr_int attr_list[1024]; char *attr_clist[512]; Odr_oid *attr_set[512]; int num_attr = 0; int max_attr = 512; Odr_oid *top_set = 0; Z_AttributesPlusTerm *apt; lex (li); if (li->query_look == 'r') { lex (li); top_set = query_oid_getvalbyname(li, o); if (!top_set) { li->error = YAZ_PQF_ERROR_ATTSET; return NULL; } lex (li); } if (!top_set) { top_set = odr_oiddup(o, yaz_oid_attset_bib_1); } *attributeSetP = top_set; while (1) { if (li->query_look == 'l') { lex (li); if (!li->query_look) { li->error = YAZ_PQF_ERROR_MISSING; return 0; } if (num_attr >= max_attr) { li->error = YAZ_PQF_ERROR_TOOMANY; return 0; } if (!p_query_parse_attr(li, o, num_attr, attr_list, attr_clist, attr_set)) return 0; num_attr++; lex (li); } else if (li->query_look == 'y') { lex (li); rpn_term_type (li, o); } else break; } if (!li->query_look) { li->error = YAZ_PQF_ERROR_MISSING; return 0; } apt = rpn_term(li, o, num_attr, attr_list, attr_clist, attr_set); lex (li); if (li->query_look != 0) { li->error = YAZ_PQF_ERROR_EXTRA; return 0; } return apt; }