⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 5 页
字号:
		    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 + -