📄 client.c
字号:
if (data->volumes[j]->enumAndChron) printf (" enumAndChron: %s\n", data->volumes[j]->enumAndChron); } for (j = 0; j<data->num_circulationData; j++) { printf ("circulation %d\n", j); if (data->circulationData[j]->availableNow) printf (" availableNow: %d\n", *data->circulationData[j]->availableNow); if (data->circulationData[j]->availablityDate) printf (" availabiltyDate: %s\n", data->circulationData[j]->availablityDate); if (data->circulationData[j]->availableThru) printf (" availableThru: %s\n", data->circulationData[j]->availableThru); if (data->circulationData[j]->restrictions) printf (" restrictions: %s\n", data->circulationData[j]->restrictions); if (data->circulationData[j]->itemId) printf (" itemId: %s\n", data->circulationData[j]->itemId); if (data->circulationData[j]->renewable) printf (" renewable: %d\n", *data->circulationData[j]->renewable); if (data->circulationData[j]->onHold) printf (" onHold: %d\n", *data->circulationData[j]->onHold); if (data->circulationData[j]->enumAndChron) printf (" enumAndChron: %s\n", data->circulationData[j]->enumAndChron); if (data->circulationData[j]->midspine) printf (" midspine: %s\n", data->circulationData[j]->midspine); if (data->circulationData[j]->temporaryLocation) printf (" temporaryLocation: %s\n", data->circulationData[j]->temporaryLocation); } } } } else { printf("Unknown record representation.\n"); if (!z_External(print, &r, 0, 0)) { odr_perror(print, "Printing external"); odr_reset(print); } }}static void display_diagrecs(Z_DiagRec **pp, int num){ int i; oident *ent; Z_DefaultDiagFormat *r; printf("Diagnostic message(s) from database:\n"); for (i = 0; i<num; i++) { Z_DiagRec *p = pp[i]; if (p->which != Z_DiagRec_defaultFormat) { printf("Diagnostic record not in default format.\n"); return; } else r = p->u.defaultFormat; if (!(ent = oid_getentbyoid(r->diagnosticSetId)) || ent->oclass != CLASS_DIAGSET || ent->value != VAL_BIB1) printf("Missing or unknown diagset\n"); printf(" [%d] %s", *r->condition, diagbib1_str(*r->condition)); switch (r->which) { case Z_DefaultDiagFormat_v2Addinfo: printf (" -- v2 addinfo '%s'\n", r->u.v2Addinfo); break; case Z_DefaultDiagFormat_v3Addinfo: printf (" -- v3 addinfo '%s'\n", r->u.v3Addinfo); break; } }}static void display_nameplusrecord(Z_NamePlusRecord *p){ if (p->databaseName) printf("[%s]", p->databaseName); if (p->which == Z_NamePlusRecord_surrogateDiagnostic) display_diagrecs(&p->u.surrogateDiagnostic, 1); else if (p->which == Z_NamePlusRecord_databaseRecord) display_record(p->u.databaseRecord);}static void display_records(Z_Records *p){ int i; if (p->which == Z_Records_NSD) { Z_DiagRec dr, *dr_p = &dr; dr.which = Z_DiagRec_defaultFormat; dr.u.defaultFormat = p->u.nonSurrogateDiagnostic; display_diagrecs (&dr_p, 1); } else if (p->which == Z_Records_multipleNSD) display_diagrecs (p->u.multipleNonSurDiagnostics->diagRecs, p->u.multipleNonSurDiagnostics->num_diagRecs); else { printf("Records: %d\n", p->u.databaseOrSurDiagnostics->num_records); for (i = 0; i < p->u.databaseOrSurDiagnostics->num_records; i++) display_nameplusrecord(p->u.databaseOrSurDiagnostics->records[i]); }}static int send_deleteResultSetRequest(const char *arg){ char names[8][32]; int i; Z_APDU *apdu = zget_APDU(out, Z_APDU_deleteResultSetRequest); Z_DeleteResultSetRequest *req = apdu->u.deleteResultSetRequest; req->referenceId = set_refid (out); req->num_resultSetList = sscanf (arg, "%30s %30s %30s %30s %30s %30s %30s %30s", names[0], names[1], names[2], names[3], names[4], names[5], names[6], names[7]); req->deleteFunction = (int *) odr_malloc (out, sizeof(*req->deleteFunction)); if (req->num_resultSetList > 0) { *req->deleteFunction = Z_DeleteRequest_list; req->resultSetList = (char **) odr_malloc (out, sizeof(*req->resultSetList)* req->num_resultSetList); for (i = 0; i<req->num_resultSetList; i++) req->resultSetList[i] = names[i]; } else { *req->deleteFunction = Z_DeleteRequest_all; req->resultSetList = 0; } send_apdu(apdu); printf("Sent deleteResultSetRequest.\n"); return 2;}#if HAVE_XML2static int send_srw(Z_SRW_PDU *sr){ const char *charset = negotiationCharset; const char *host_port = 0; char *path = 0; char ctype[50]; Z_SOAP_Handler h[2] = { {"http://www.loc.gov/zing/srw/v1.0/", 0, (Z_SOAP_fun) yaz_srw_codec}, {0, 0, 0} }; ODR o = odr_createmem(ODR_ENCODE); int ret; Z_SOAP *p = odr_malloc(o, sizeof(*p)); Z_GDU *gdu; path = odr_malloc(out, strlen(databaseNames[0])+2); *path = '/'; strcpy(path+1, databaseNames[0]); gdu = z_get_HTTP_Request(out); gdu->u.HTTP_Request->path = odr_strdup(out, path); if (host_port) { const char *cp0 = strstr(host_port, "://"); const char *cp1 = 0; if (cp0) cp0 = cp0+3; else cp0 = host_port; cp1 = strchr(cp0, '/'); if (!cp1) cp1 = cp0+strlen(cp0); if (cp0 && cp1) { char *h = odr_malloc(out, cp1 - cp0 + 1); memcpy (h, cp0, cp1 - cp0); h[cp1-cp0] = '\0'; z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "host", h); } } strcpy(ctype, "text/xml"); if (charset && strlen(charset) < 20) { strcat(ctype, "; charset="); strcat(ctype, charset); } z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Content-Type", ctype); z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "SOAPAction", "\"\""); p->which = Z_SOAP_generic; p->u.generic = odr_malloc(o, sizeof(*p->u.generic)); p->u.generic->no = 0; p->u.generic->ns = 0; p->u.generic->p = sr; p->ns = "http://schemas.xmlsoap.org/soap/envelope/"; ret = z_soap_codec_enc(o, &p, &gdu->u.HTTP_Request->content_buf, &gdu->u.HTTP_Request->content_len, h, charset); if (z_GDU(out, &gdu, 0, 0)) { /* encode OK */ char *buf_out; int len_out; int r; buf_out = odr_getbuf(out, &len_out, 0); /* we don't odr_reset(out), since we may need the buffer again */ r = cs_put(conn, buf_out, len_out); odr_destroy(o); if (r >= 0) return 2; } return 0;}#endif#if HAVE_XML2static int send_SRW_searchRequest(const char *arg){ Z_SRW_PDU *sr = 0; if (!srw_sr) { assert(srw_sr_odr_out == 0); srw_sr_odr_out = odr_createmem(ODR_ENCODE); } odr_reset(srw_sr_odr_out); setno = 1; /* save this for later .. when fetching individual records */ srw_sr = sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); sr->u.request->query_type = Z_SRW_query_type_cql; sr->u.request->query.cql = odr_strdup(srw_sr_odr_out, arg); sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request); sr->u.request->query_type = Z_SRW_query_type_cql; sr->u.request->query.cql = odr_strdup(out, arg); if (schema) sr->u.request->recordSchema = schema; return send_srw(sr);}#endifstatic int send_searchRequest(const char *arg){ Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest); Z_SearchRequest *req = apdu->u.searchRequest; Z_Query query; int oid[OID_SIZE]; struct ccl_rpn_node *rpn = NULL; int error, pos; char setstring[100]; Z_RPNQuery *RPNquery; Odr_oct ccl_query; YAZ_PQF_Parser pqf_parser; Z_External *ext; QueryType myQueryType = queryType; char pqfbuf[512]; if (myQueryType == QueryType_CCL2RPN) { rpn = ccl_find_str(bibset, arg, &error, &pos); if (error) { printf("CCL ERROR: %s\n", ccl_err_msg(error)); return 0; } } else if (myQueryType == QueryType_CQL2RPN) { /* ### All this code should be wrapped in a utility function */ CQL_parser parser; struct cql_node *node; const char *addinfo; if (cqltrans == 0) { printf("Can't use CQL: no translation file. Try set_cqlfile\n"); return 0; } parser = cql_parser_create(); if ((error = cql_parser_string(parser, arg)) != 0) { printf("Can't parse CQL: must be a syntax error\n"); return 0; } node = cql_parser_result(parser); if ((error = cql_transform_buf(cqltrans, node, pqfbuf, sizeof pqfbuf)) != 0) { error = cql_transform_error(cqltrans, &addinfo); printf ("Can't convert CQL to PQF: %s (addinfo=%s)\n", cql_strerror(error), addinfo); return 0; } arg = pqfbuf; myQueryType = QueryType_Prefix; } req->referenceId = set_refid (out); if (!strcmp(arg, "@big")) /* strictly for troublemaking */ { static unsigned char big[2100]; static Odr_oct bigo; /* send a very big referenceid to test transport stack etc. */ memset(big, 'A', 2100); bigo.len = bigo.size = 2100; bigo.buf = big; req->referenceId = &bigo; } if (setnumber >= 0) { sprintf(setstring, "%d", ++setnumber); req->resultSetName = setstring; } *req->smallSetUpperBound = smallSetUpperBound; *req->largeSetLowerBound = largeSetLowerBound; *req->mediumSetPresentNumber = mediumSetPresentNumber; if (smallSetUpperBound > 0 || (largeSetLowerBound > 1 && mediumSetPresentNumber > 0)) { oident prefsyn; prefsyn.proto = protocol; prefsyn.oclass = CLASS_RECSYN; prefsyn.value = recordsyntax; req->preferredRecordSyntax = odr_oiddup(out, oid_ent_to_oid(&prefsyn, oid)); req->smallSetElementSetNames = req->mediumSetElementSetNames = elementSetNames; } req->num_databaseNames = num_databaseNames; req->databaseNames = databaseNames; req->query = &query; switch (myQueryType) { case QueryType_Prefix: query.which = Z_Query_type_1; pqf_parser = yaz_pqf_create (); RPNquery = yaz_pqf_parse (pqf_parser, out, arg); if (!RPNquery) { const char *pqf_msg; size_t off; int code = yaz_pqf_error (pqf_parser, &pqf_msg, &off); printf("%*s^\n", off+4, ""); printf("Prefix query error: %s (code %d)\n", pqf_msg, code); yaz_pqf_destroy (pqf_parser); return 0; } yaz_pqf_destroy (pqf_parser); query.u.type_1 = RPNquery; break; case QueryType_CCL: query.which = Z_Query_type_2; query.u.type_2 = &ccl_query; ccl_query.buf = (unsigned char*) arg; ccl_query.len = strlen(arg); break; case QueryType_CCL2RPN: query.which = Z_Query_type_1; RPNquery = ccl_rpn_query(out, rpn); if (!RPNquery) { printf ("Couldn't convert from CCL to RPN\n"); return 0; } query.u.type_1 = RPNquery; ccl_rpn_delete (rpn); break; case QueryType_CQL: query.which = Z_Query_type_104; ext = (Z_External *) odr_malloc(out, sizeof(*ext)); ext->direct_reference = odr_getoidbystr(out, "1.2.840.10003.16.2"); ext->indirect_reference = 0; ext->descriptor = 0; ext->which = Z_External_CQL; ext->u.cql = odr_strdup(out, arg); query.u.type_104 = ext; break; default: printf ("Unsupported query type\n"); return 0; } if (send_apdu(apdu)) printf("Sent searchRequest.\n"); setno = 1; return 2;}/* display Query Expression as part of searchResult-1 */static void display_queryExpression (Z_QueryExpression *qe){ if (!qe) return; if (qe->which == Z_QueryExpression_term) { if (qe->u.term->queryTerm) { Z_Term *term = qe->u.term->queryTerm; switch (term->which) { case Z_Term_general: printf (" %.*s", term->u.general->len, term->u.general->buf); break; case Z_Term_characterString: printf (" %s", term->u.characterString); break; case Z_Term_numeric: printf (" %d", *term->u.numeric); break; case Z_Term_null: printf (" null"); break; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -