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

📄 zebraapi.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 4 页
字号:
        zebra_set_state (zh, 'o', seqno);    }    else    {        logf (LOG_LOG, "nothing to commit");    }    bfs_destroy (bfs);    zebra_unlock (zh->lock_shadow);    zebra_unlock (zh->lock_normal);    return 0;}int zebra_clean (ZebraHandle zh){    yaz_log(LOG_API,"zebra_clean");    return zebra_commit_ex(zh, 1);}int zebra_commit (ZebraHandle zh){    yaz_log(LOG_API,"zebra_commit");    return zebra_commit_ex(zh, 0);}int zebra_init (ZebraHandle zh){    const char *rval;    BFiles bfs = 0;    ASSERTZH;    yaz_log(LOG_API,"zebra_init");    zh->errCode=0;    if (!zh->res)    {        zh->errCode = 109;        return -1;    }    rval = res_get (zh->res, "shadow");    bfs = bfs_create (res_get (zh->service->global_res, "register"),                      zh->path_reg);    if (rval && *rval)        bf_cache (bfs, rval);        bf_reset (bfs);    bfs_destroy (bfs);    zebra_set_state (zh, 'o', 0);    return 0;}int zebra_compact (ZebraHandle zh){    BFiles bfs;    ASSERTZH;    yaz_log(LOG_API,"zebra_compact");    zh->errCode=0;    if (!zh->res)    {        zh->errCode = 109;        return -1;    }    bfs = bfs_create (res_get (zh->res, "register"), zh->path_reg);    inv_compact (bfs);    bfs_destroy (bfs);    return 0;}int zebra_record_insert (ZebraHandle zh, const char *buf, int len, int *sysno){    int sysn=0;    ASSERTZH;    yaz_log(LOG_API,"zebra_record_insert");    if (sysno)	*sysno=0;    zh->errCode=0;    if (zebra_begin_trans (zh, 1))        return -1;    extract_rec_in_mem (zh, "grs.sgml",                        buf, len,                        "Default",  /* database */                        0 /* delete_flag */,                        0 /* test_mode */,                        &sysn /* sysno */,                        1 /* store_keys */,                        1 /* store_data */,                        0 /* match criteria */);    if (zebra_end_trans (zh))        return -1;    if (sysno)	*sysno=sysn;    return 0;}int zebra_set_group (ZebraHandle zh, struct recordGroup *rg){    ASSERTZH;    yaz_log(LOG_API,"zebra_set_group");    zh->errCode=0;    memcpy (&zh->rGroup, rg, sizeof(*rg));    return 0;}int zebra_result (ZebraHandle zh, int *code, char **addinfo){    ASSERTZH;    yaz_log(LOG_API,"zebra_result");    *code = zh->errCode;    *addinfo = zh->errString;    return 0;}int zebra_shadow_enable (ZebraHandle zh, int value){    ASSERTZH;    yaz_log(LOG_API,"zebra_shadow_enable");    zh->errCode=0;    zh->shadow_enable = value;    return 0;}int zebra_record_encoding (ZebraHandle zh, const char *encoding){    ASSERTZH;    yaz_log(LOG_API,"zebra_record_encoding");    zh->errCode=0;    xfree (zh->record_encoding);    /*     * Fixme!     * Something about charset aliases. Oleg???     */    if (zh->iconv_to_utf8 != 0)        yaz_iconv_close(zh->iconv_to_utf8);    if (zh->iconv_from_utf8 != 0)        yaz_iconv_close(zh->iconv_from_utf8);        zh->record_encoding = xstrdup (encoding);        logf(LOG_DEBUG, "Reset record encoding: %s", encoding);        zh->iconv_to_utf8 =        yaz_iconv_open ("UTF-8", encoding);    if (zh->iconv_to_utf8 == 0)        yaz_log (LOG_WARN, "iconv: %s to UTF-8 unsupported", encoding);    zh->iconv_from_utf8 =        yaz_iconv_open (encoding, "UTF-8");    if (zh->iconv_to_utf8 == 0)        yaz_log (LOG_WARN, "iconv: UTF-8 to %s unsupported", encoding);    return 0;}int zebra_set_resource(ZebraHandle zh, const char *name, const char *value){    ASSERTZH;    yaz_log(LOG_API,"zebra_set_resource %s:%s",name,value);    zh->errCode=0;    res_put(zh->res, name, value);    return 0;}const char *zebra_get_resource(ZebraHandle zh,                               const char *name, const char *defaultvalue){    const char *v;    ASSERTZH;    v= res_get_def( zh->res, name, (char *)defaultvalue);    zh->errCode=0;    yaz_log(LOG_API,"zebra_get_resource %s:%s",name,v);    return v;}/* moved from zebra_api_ext.c by pop *//* FIXME: Should this really be public??? -Heikki */int zebra_trans_no (ZebraHandle zh){    ASSERTZH;    yaz_log(LOG_API,"zebra_trans_no");    return zh->trans_no;}int zebra_get_shadow_enable (ZebraHandle zh){    yaz_log(LOG_API,"zebra_get_shadow_enable");    return (zh->shadow_enable);}int zebra_set_shadow_enable (ZebraHandle zh, int value){    yaz_log(LOG_API,"zebra_set_shadow_enable %d",value);    zh->shadow_enable = value;    return 0;}int init_recordGroup (struct recordGroup *rg){    assert(rg);    yaz_log(LOG_API,"init_recordGroup");    rg->groupName = NULL;    rg->databaseName = NULL;    rg->path = NULL;    rg->recordId = NULL;    rg->recordType = NULL;    rg->flagStoreData = -1;    rg->flagStoreKeys = -1;     rg->flagRw = 1;    rg->databaseNamePath = 0;    rg->explainDatabase = 0;     rg->fileVerboseLimit = 100000;     rg->followLinks = -1;    return 0;} /* This is from extract.c... it seems useful, when extract_rec_in mem is    called... and in general... Should be moved to somewhere else */void res_get_recordGroup (ZebraHandle zh,			  struct recordGroup *rGroup,			  const char *ext){    char gprefix[128];    char ext_res[128];         yaz_log(LOG_API,"res_get_recordGroup e=%s",ext);    if (!rGroup->groupName || !*rGroup->groupName)	*gprefix = '\0';    else 	sprintf (gprefix, "%s.", rGroup->groupName);        /* determine file type - depending on extension */    if (!rGroup->recordType) {	sprintf (ext_res, "%srecordType.%s", gprefix, ext);	if (!(rGroup->recordType = res_get (zh->res, ext_res))) {	    sprintf (ext_res, "%srecordType", gprefix);	    rGroup->recordType = res_get (zh->res, ext_res);	}    }    /* determine match criteria */    if (!rGroup->recordId) { 	sprintf (ext_res, "%srecordId.%s", gprefix, ext);	if (!(rGroup->recordId = res_get (zh->res, ext_res))) {	    sprintf (ext_res, "%srecordId", gprefix);	    rGroup->recordId = res_get (zh->res, ext_res);	}    }         /* determine database name */    if (!rGroup->databaseName) {	sprintf (ext_res, "%sdatabase.%s", gprefix, ext);	if (!(rGroup->databaseName = res_get (zh->res, ext_res))) { 	    sprintf (ext_res, "%sdatabase", gprefix);	    rGroup->databaseName = res_get (zh->res, ext_res);	}    }    if (!rGroup->databaseName)	rGroup->databaseName = "Default";        /* determine if explain database */    sprintf (ext_res, "%sexplainDatabase", gprefix);    rGroup->explainDatabase =	atoi (res_get_def (zh->res, ext_res, "0"));        /* storeData */    if (rGroup->flagStoreData == -1)    {	const char *sval;	sprintf (ext_res, "%sstoreData.%s", gprefix, ext);	if (!(sval = res_get (zh->res, ext_res)))	{	    sprintf (ext_res, "%sstoreData", gprefix);	    sval = res_get (zh->res, ext_res);	}	if (sval)	    rGroup->flagStoreData = atoi (sval);    }    if (rGroup->flagStoreData == -1) 	rGroup->flagStoreData = 0;        /* storeKeys */    if (rGroup->flagStoreKeys == -1)    {	const char *sval;		sprintf (ext_res, "%sstoreKeys.%s", gprefix, ext);	sval = res_get (zh->res, ext_res);	if (!sval)	{	    sprintf (ext_res, "%sstoreKeys", gprefix);	    sval = res_get (zh->res, ext_res);	}	if (!sval)	    sval = res_get (zh->res, "storeKeys");	if (sval)	    rGroup->flagStoreKeys = atoi (sval);    }    if (rGroup->flagStoreKeys == -1)	rGroup->flagStoreKeys = 0;} /* almost the same as zebra_records_retrieve ... but how did it work?    I mean for multiple records ??? CHECK ??? */void api_records_retrieve (ZebraHandle zh, ODR stream,			   const char *setname, Z_RecordComposition *comp,			   oid_value input_format, int num_recs,			   ZebraRetrievalRecord *recs){    ZebraPosSet poset;    int i, *pos_array;    yaz_log(LOG_API,"api_records_retrieve s=%s n=%d",setname,num_recs);    if (!zh->res)    {        zh->errCode = 30;        zh->errString = odr_strdup (stream, setname);        return;    }        zh->errCode = 0;     if (zebra_begin_read (zh))	return;    pos_array = (int *) xmalloc (num_recs * sizeof(*pos_array));    for (i = 0; i<num_recs; i++)	pos_array[i] = recs[i].position;    poset = zebraPosSetCreate (zh, setname, num_recs, pos_array);    if (!poset)    {        logf (LOG_DEBUG, "zebraPosSetCreate error");        zh->errCode = 30;        zh->errString = nmem_strdup (stream->mem, setname);    }    else    {	for (i = 0; i<num_recs; i++)	{	    if (poset[i].term)	    {		recs[i].errCode = 0;		recs[i].format = VAL_SUTRS;		recs[i].len = strlen(poset[i].term);		recs[i].buf = poset[i].term;		recs[i].base = poset[i].db;		recs[i].sysno = 0;	    	    }	    else if (poset[i].sysno)	    {	      /* changed here ??? CHECK ??? */	      char *b;		recs[i].errCode =		    zebra_record_fetch (zh, poset[i].sysno, poset[i].score,					stream, input_format, comp,					&recs[i].format, 					&b,					&recs[i].len,					&recs[i].base);		recs[i].buf = (char *) odr_malloc(stream,recs[i].len);		memcpy(recs[i].buf, b, recs[i].len);		recs[i].errString = 0; /* Hmmm !!! we should get this */ 		recs[i].sysno = poset[i].sysno;		recs[i].score = poset[i].score;	    }	    else	    {	        char num_str[20];		sprintf (num_str, "%d", pos_array[i]);			zh->errCode = 13;                zh->errString = odr_strdup (stream, num_str);                break;	    }	}	zebraPosSetDestroy (zh, poset, num_recs);    }    zebra_end_read (zh);    xfree (pos_array);}/* ---------------------------------------------------------------------------  Record insert(=update), delete   If sysno is provided, then it's used to identify the reocord.  If not, and match_criteria is provided, then sysno is guessed  If not, and a record is provided, then sysno is got from thereNOTE: Now returns 0 at success and updates sysno, which is an int*  20-jun-2003 Heikki*/int zebra_insert_record (ZebraHandle zh, 			 struct recordGroup *rGroup,			 const char *recordType,			 int *sysno, const char *match, const char *fname,			 const char *buf, int buf_size,			 int force_update) /* This one is ignored */ {    int res;    yaz_log(LOG_API,"zebra_insert_record sysno=%d", *sysno);    if (buf_size < 1) buf_size = strlen(buf);    zebra_begin_trans(zh, 1);    res=bufferExtractRecord (zh, buf, buf_size, rGroup, 			     0, /* delete_flag  */			     0, /* test_mode */			     recordType,			     sysno,   			     match, fname,			     force_update, 			     0); /* allow_update */    zebra_end_trans(zh);     if (res < 0) return (res);    return res; }int zebra_update_record (ZebraHandle zh, 			 struct recordGroup *rGroup,			 const char *recordType,			 int* sysno, const char *match, const char *fname,			 const char *buf, int buf_size,			 int force_update){    int res;    yaz_log(LOG_API,"zebra_update_record sysno=%d", *sysno);    if (buf_size < 1) buf_size = strlen(buf);    zebra_begin_trans(zh, 1);    res=bufferExtractRecord (zh, buf, buf_size, rGroup, 			     0, /* delete_flag */			     0, /* test_mode */			     recordType,			     sysno,   			     match, fname,			     force_update, 			     1); /* allow_update */    zebra_end_trans(zh);     return res; }int zebra_delete_record (ZebraHandle zh, 			 struct recordGroup *rGroup, 			 const char *recordType,			 int *sysno, const char *match, const char *fname,			 const char *buf, int buf_size,			 int force_update) {    int res;    yaz_log(LOG_API,"zebra_delete_record sysno=%d", *sysno);    if (buf_size < 1) buf_size = strlen(buf);    zebra_begin_trans(zh, 1);    res=bufferExtractRecord (zh, buf, buf_size, rGroup, 			     1, /* delete_flag */			     0, /* test_mode */			     recordType,			     sysno,			     match,fname,			     force_update,			     1); /* allow_update */    zebra_end_trans(zh);    return res;   }/* ---------------------------------------------------------------------------  Searching */int zebra_search_PQF (ZebraHandle zh, const char *pqf_query,		      const char *setname, int *numhits){    int hits = 0;    int res=-1;    Z_RPNQuery *query;    ODR odr = odr_createmem(ODR_ENCODE);    yaz_log(LOG_API,"zebra_search_PQF s=%s q=%s",setname, pqf_query);        query = p_query_rpn (odr, PROTO_Z3950, pqf_query);        if (!query)        yaz_log (LOG_WARN, "bad query %s\n", pqf_query);    else        res=zebra_search_RPN (zh, odr, query, setname, &hits);        odr_destroy(odr);    yaz_log(LOG_API,"Hits: %d",hits);    if (numhits)	*numhits=hits;    return res;}/* ---------------------------------------------------------------------------  Sort - a simplified interface, with optional read locks.  FIXME - This is a horrible name, will conflict with half the applications*/int zebra_sort_by_specstr (ZebraHandle zh, 			   ODR stream,			   const char *sort_spec,			   const char *output_setname,			   const char **input_setnames) {    int num_input_setnames = 0;    int sort_status = 0;    Z_SortKeySpecList *sort_sequence = yaz_sort_spec (stream, sort_spec);    yaz_log(LOG_API,"sort (FIXME) ");    if (!sort_sequence)    {        logf(LOG_WARN,"invalid sort specs '%s'", sort_spec);        zh->errCode = 207;	return -1;    }        /* we can do this, since the perl typemap code for char** will        put a NULL at the end of list */    while (input_setnames[num_input_setnames]) num_input_setnames++;    if (zebra_begin_read (zh))        return -1;        resultSetSort (zh, stream->mem, num_input_setnames, input_setnames,                   output_setname, sort_sequence, &sort_status);        zebra_end_read(zh);    return sort_status;}

⌨️ 快捷键说明

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