📄 zserver.c
字号:
/* $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 + -