📄 zebraapi.c
字号:
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 + -