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

📄 zserver.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: zserver.c,v 1.112 2003/11/09 11:48:16 oleg Exp $   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003   Index Data ApsThis file is part of the Zebra server.Zebra is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.Zebra is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public Licensealong with Zebra; see the file LICENSE.zebra.  If not, write to theFree Software Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA.*/#include <stdio.h>#include <assert.h>#include <fcntl.h>#ifdef WIN32#include <io.h>#include <process.h>#include <sys/locking.h>#else#include <unistd.h>#endif#include <errno.h>#include <yaz/log.h>#include <yaz/ill.h>#include <yaz/yaz-util.h>#include <sys/types.h>#include "zserver.h"static int bend_sort (void *handle, bend_sort_rr *rr);static int bend_delete (void *handle, bend_delete_rr *rr);static int bend_esrequest (void *handle, bend_esrequest_rr *rr);static int bend_segment (void *handle, bend_segment_rr *rr);static int bend_search (void *handle, bend_search_rr *r);static int bend_fetch (void *handle, bend_fetch_rr *r);static int bend_scan (void *handle, bend_scan_rr *r);bend_initresult *bend_init (bend_initrequest *q){    bend_initresult *r = (bend_initresult *)	odr_malloc (q->stream, sizeof(*r));    ZebraHandle zh;    struct statserv_options_block *sob;    char *user = NULL;    char *passwd = NULL;    r->errcode = 0;    r->errstring = 0;    q->bend_sort = bend_sort;    q->bend_delete = bend_delete;    q->bend_esrequest = bend_esrequest;    q->bend_segment = bend_segment;    q->bend_search = bend_search;    q->bend_fetch = bend_fetch;    q->bend_scan = bend_scan;    q->implementation_name = "Zebra Information Server";    q->implementation_version = "Zebra " ZEBRAVER;    yaz_log (LOG_DEBUG, "bend_init");    sob = statserv_getcontrol ();    if (!(zh = zebra_open (sob->handle)))    {	yaz_log (LOG_WARN, "Failed to read config `%s'", sob->configname);	r->errcode = 1;	return r;    }    if (q->auth)    {	if (q->auth->which == Z_IdAuthentication_open)	{	    char *openpass = xstrdup (q->auth->u.open);	    char *cp = strchr (openpass, '/');	    if (cp)	    {		*cp = '\0';		user = nmem_strdup (odr_getmem (q->stream), openpass);		passwd = nmem_strdup (odr_getmem (q->stream), cp+1);	    }	    xfree (openpass);	}    }    if (zebra_auth (zh, user, passwd))    {	r->errcode = 222;	r->errstring = user;	zebra_close (zh);	return r;    }    r->handle = zh;    if (q->charneg_request) /* characater set and langauge negotiation? */    {        char **charsets = 0;        int num_charsets;        char **langs = 0;        int num_langs = 0;        int selected = 0;        int i;        NMEM nmem = nmem_create();        yaz_log (LOG_LOG, "character set and language negotiation");        yaz_get_proposal_charneg (nmem, q->charneg_request,                                  &charsets, &num_charsets,                                  &langs, &num_langs, &selected);                for (i = 0; i < num_charsets; i++)        {            const char *right_name = "";    	    /*	     * FIXME! It is like rudiment :-))    	     * We have to support this short names of character sets,    	     * because a lot servers in Russia to use own in during    	     * character set and language negotiation still.    	     */                        if (!yaz_matchstr(charsets[i], "win")) {                right_name = "WINDOWS-1251";            } else if (!yaz_matchstr(charsets[i], "koi")) {                right_name = "KOI8-R";            } else if (!yaz_matchstr(charsets[i], "iso")) {                right_name = "ISO-8859-5";            } else if (!yaz_matchstr(charsets[i], "dos")) {                right_name = "CP866";            } else if (!yaz_matchstr(charsets[i], "uni")) {                right_name = "UTF-8";            } else {                right_name = charsets[i];            }            if (odr_set_charset (q->decode, "UTF-8", right_name) == 0)            {                yaz_log (LOG_LOG, "charset %d %s (proper name %s): OK", i,                         charsets[i], right_name);                odr_set_charset (q->stream, right_name, "UTF-8");                if (selected)                    zebra_record_encoding (zh, right_name);        	q->charneg_response =        	    yaz_set_response_charneg (q->stream, charsets[i],                                              0, selected);        	break;            } else {                yaz_log (LOG_LOG, "charset %d %s (proper name %s): unsupported", i,                         charsets[i], right_name);            }        }        nmem_destroy(nmem);    }    return r;}static void search_terms (ZebraHandle zh, bend_search_rr *r){    int count;    int no_terms;    int i;    int type;    struct Z_External *ext;    Z_SearchInfoReport *sr;    /* get no of terms for result set */    no_terms = zebra_resultSetTerms (zh, r->setname, 0, 0, 0, 0, 0);    if (!no_terms)        return;    r->search_info = odr_malloc (r->stream, sizeof(*r->search_info));    r->search_info->num_elements = 1;    r->search_info->list =        odr_malloc (r->stream, sizeof(*r->search_info->list));    r->search_info->list[0] =        odr_malloc (r->stream, sizeof(**r->search_info->list));    r->search_info->list[0]->category = 0;    r->search_info->list[0]->which = Z_OtherInfo_externallyDefinedInfo;    ext = odr_malloc (r->stream, sizeof(*ext));    r->search_info->list[0]->information.externallyDefinedInfo = ext;    ext->direct_reference =        yaz_oidval_to_z3950oid (r->stream, CLASS_USERINFO, VAL_SEARCHRES1);    ext->indirect_reference = 0;    ext->descriptor = 0;    ext->which = Z_External_searchResult1;    sr = odr_malloc (r->stream, sizeof(Z_SearchInfoReport));    ext->u.searchResult1 = sr;    sr->num = no_terms;    sr->elements = odr_malloc (r->stream, sr->num *                               sizeof(*sr->elements));    for (i = 0; i<no_terms; i++)    {        Z_Term *term;        char outbuf[1024];        size_t len = sizeof(outbuf);        zebra_resultSetTerms (zh, r->setname, i,                              &count, &type, outbuf, &len);                sr->elements[i] = odr_malloc (r->stream, sizeof(**sr->elements));        sr->elements[i]->subqueryId = 0;        sr->elements[i]->fullQuery = odr_malloc (r->stream,                                                  sizeof(bool_t));        *sr->elements[i]->fullQuery = 0;        sr->elements[i]->subqueryExpression =             odr_malloc (r->stream, sizeof(Z_QueryExpression));        sr->elements[i]->subqueryExpression->which =             Z_QueryExpression_term;        sr->elements[i]->subqueryExpression->u.term =            odr_malloc (r->stream, sizeof(Z_QueryExpressionTerm));        term = odr_malloc (r->stream, sizeof(Z_Term));        sr->elements[i]->subqueryExpression->u.term->queryTerm = term;        switch (type)        {        case Z_Term_characterString:            yaz_log (LOG_DEBUG, "term as characterString");            term->which = Z_Term_characterString;            term->u.characterString = odr_strdup (r->stream, outbuf);            break;        case Z_Term_general:            yaz_log (LOG_DEBUG, "term as general");            term->which = Z_Term_general;            term->u.general = odr_malloc (r->stream, sizeof(*term->u.general));            term->u.general->size = term->u.general->len = len;            term->u.general->buf = odr_malloc (r->stream, len);            memcpy (term->u.general->buf, outbuf, len);            break;        default:            term->which = Z_Term_general;            term->u.null = odr_nullval();        }        sr->elements[i]->subqueryExpression->u.term->termComment = 0;        sr->elements[i]->subqueryInterpretation = 0;        sr->elements[i]->subqueryRecommendation = 0;        sr->elements[i]->subqueryCount = odr_intdup (r->stream, count);        sr->elements[i]->subqueryWeight = 0;        sr->elements[i]->resultsByDB = 0;    }}int bend_search (void *handle, bend_search_rr *r){    ZebraHandle zh = (ZebraHandle) handle;    r->hits = 0;    r->errcode = 0;    r->errstring = NULL;        if (zebra_select_databases (zh, r->num_bases,                                (const char **) r->basenames))    {        zebra_result (zh, &r->errcode, &r->errstring);        return 0;    }    yaz_log (LOG_LOG, "ResultSet '%s'", r->setname);    switch (r->query->which)    {    case Z_Query_type_1: case Z_Query_type_101:	zebra_search_RPN (zh, r->stream, r->query->u.type_1,			  r->setname, &r->hits);        zebra_result (zh, &r->errcode, &r->errstring);        if (!r->errcode)            search_terms (zh, r);        break;    case Z_Query_type_2:	r->errcode = 107;	r->errstring = "type-2";	break;    default:        r->errcode = 107;    }    return 0;}int bend_fetch (void *handle, bend_fetch_rr *r){    ZebraHandle zh = (ZebraHandle) handle;    ZebraRetrievalRecord retrievalRecord;    retrievalRecord.position = r->number;        r->last_in_set = 0;    zebra_records_retrieve (zh, r->stream, r->setname, r->comp,			    r->request_format, 1, &retrievalRecord);    zebra_result (zh, &r->errcode, &r->errstring);    /*  non Surrogate Diagnostic OR Surrogate Diagnostic */    if (r->errcode == 0 && retrievalRecord.errCode)    {	r->surrogate_flag = 1;	r->errcode = retrievalRecord.errCode;	r->errstring = retrievalRecord.errString;	r->basename = retrievalRecord.base;    }    else if (r->errcode == 0)        /* Database Record */    {	r->errcode = 0;	r->basename = retrievalRecord.base;	r->record = retrievalRecord.buf;	r->len = retrievalRecord.len;	r->output_format = retrievalRecord.format;    }    return 0;}static int bend_scan (void *handle, bend_scan_rr *r){    ZebraScanEntry *entries;    ZebraHandle zh = (ZebraHandle) handle;    int is_partial, i;    if (zebra_select_databases (zh, r->num_bases,                                 (const char **) r->basenames))    {        zebra_result (zh, &r->errcode, &r->errstring);        return 0;    }    r->entries = (struct scan_entry *)	odr_malloc (r->stream, sizeof(*r->entries) * r->num_entries);    zebra_scan (zh, r->stream, r->term,		r->attributeset,		&r->term_position,		&r->num_entries, &entries, &is_partial);    if (is_partial)	r->status = BEND_SCAN_PARTIAL;    else	r->status = BEND_SCAN_SUCCESS;    for (i = 0; i < r->num_entries; i++)    {	r->entries[i].term = entries[i].term;	r->entries[i].occurrences = entries[i].occurrences;    }    zebra_result (zh, &r->errcode, &r->errstring);    return 0;}void bend_close (void *handle){    zebra_close ((ZebraHandle) handle);    xmalloc_trav("bend_close");    nmem_print_list();}int bend_sort (void *handle, bend_sort_rr *rr){    ZebraHandle zh = (ZebraHandle) handle;    zebra_sort (zh, rr->stream,                rr->num_input_setnames, (const char **) rr->input_setnames,		rr->output_setname, rr->sort_sequence, &rr->sort_status);    zebra_result (zh, &rr->errcode, &rr->errstring);    return 0;}int bend_delete (void *handle, bend_delete_rr *rr){    ZebraHandle zh = (ZebraHandle) handle;    rr->delete_status =	zebra_deleleResultSet(zh, rr->function,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -