X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzserver.c;h=e2ec1b34b3c00f844ba2c24434cb3bb81b27e6a7;hb=9eaad46fe45a09ea35d9ce6561748145ebd52838;hp=d183d2d6d3b86a3c3596c21e6ffa1a2af372a0d3;hpb=6c9fcd3b5d3108702fa1ffc92dab4ab6060f9a19;p=idzebra-moved-to-github.git diff --git a/index/zserver.c b/index/zserver.c index d183d2d..e2ec1b3 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -1,4 +1,4 @@ -/* $Id: zserver.c,v 1.127 2005-01-15 19:38:29 adam Exp $ +/* $Id: zserver.c,v 1.135 2005-06-13 10:29:20 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -20,8 +20,9 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include #include +#include +#include #include #ifdef WIN32 #include @@ -35,6 +36,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include +#include #include @@ -76,7 +78,7 @@ bend_initresult *bend_init (bend_initrequest *q) if (!(zh = zebra_open (sob->handle))) { yaz_log (YLOG_WARN, "Failed to read config `%s'", sob->configname); - r->errcode = 1; + r->errcode = YAZ_BIB1_PERMANENT_SYSTEM_ERROR; return r; } r->handle = zh; @@ -102,9 +104,9 @@ bend_initresult *bend_init (bend_initrequest *q) passwd = idPass->password; } } - if (zebra_auth (zh, user, passwd)) + if (zebra_auth(zh, user, passwd) != ZEBRA_OK) { - r->errcode = 222; + r->errcode = YAZ_BIB1_INIT_AC_BAD_USERID_AND_OR_PASSWORD; r->errstring = user; return r; } @@ -169,18 +171,15 @@ bend_initresult *bend_init (bend_initrequest *q) return r; } -static void search_terms (ZebraHandle zh, bend_search_rr *r) +static void search_terms(ZebraHandle zh, bend_search_rr *r) { - zint count = 0; int no_terms; int i; int type = Z_Term_general; struct Z_External *ext; Z_SearchInfoReport *sr; - /* get no of terms for result set */ - no_terms = 0; /* zebra_resultSetTerms (zh, r->setname, 0, 0, 0, 0, 0); */ - /* FIXME - Rsets don't know number of terms no more ??? */ + zebra_result_set_term_no(zh, r->setname, &no_terms); if (!no_terms) return; @@ -208,13 +207,14 @@ static void search_terms (ZebraHandle zh, bend_search_rr *r) for (i = 0; isetname, i, - &count, &type, outbuf, &len); - */ + + zebra_result_set_term_info(zh, r->setname, i, + &count, &approx, 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, @@ -261,13 +261,12 @@ static void search_terms (ZebraHandle zh, bend_search_rr *r) int bend_search (void *handle, bend_search_rr *r) { ZebraHandle zh = (ZebraHandle) handle; + zint zhits = 0; + ZEBRA_RES res; - r->hits = 0; - r->errcode = 0; - r->errstring = NULL; - - if (zebra_select_databases (zh, r->num_bases, - (const char **) r->basenames)) + res = zebra_select_databases (zh, r->num_bases, + (const char **) r->basenames); + if (res != ZEBRA_OK) { zebra_result (zh, &r->errcode, &r->errstring); return 0; @@ -276,18 +275,25 @@ int bend_search (void *handle, bend_search_rr *r) 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) + res = zebra_search_RPN(zh, r->stream, r->query->u.type_1, + r->setname, &zhits); + if (res != ZEBRA_OK) + zebra_result(zh, &r->errcode, &r->errstring); + else + { + if (zhits > 2147483646) + r->hits = 2147483647; + else + r->hits = (int) zhits; search_terms (zh, r); + } break; case Z_Query_type_2: - r->errcode = 107; + r->errcode = YAZ_BIB1_QUERY_TYPE_UNSUPP; r->errstring = "type-2"; break; default: - r->errcode = 107; + r->errcode = YAZ_BIB1_QUERY_TYPE_UNSUPP; } return 0; } @@ -297,24 +303,28 @@ int bend_fetch (void *handle, bend_fetch_rr *r) { ZebraHandle zh = (ZebraHandle) handle; ZebraRetrievalRecord retrievalRecord; + ZEBRA_RES res; 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) + res = zebra_records_retrieve (zh, r->stream, r->setname, r->comp, + r->request_format, 1, &retrievalRecord); + if (res != ZEBRA_OK) + { + /* non-surrogate diagnostic */ + zebra_result (zh, &r->errcode, &r->errstring); + } + else if (retrievalRecord.errCode) { + /* surrogate diagnostic (diagnostic per record) */ r->surrogate_flag = 1; r->errcode = retrievalRecord.errCode; r->errstring = retrievalRecord.errString; r->basename = retrievalRecord.base; } - else if (r->errcode == 0) /* Database Record */ + else { - r->errcode = 0; r->basename = retrievalRecord.base; r->record = retrievalRecord.buf; r->len = retrievalRecord.len; @@ -328,34 +338,43 @@ static int bend_scan (void *handle, bend_scan_rr *r) ZebraScanEntry *entries; ZebraHandle zh = (ZebraHandle) handle; int is_partial, i; + ZEBRA_RES res; - if (zebra_select_databases (zh, r->num_bases, - (const char **) r->basenames)) + res = zebra_select_databases(zh, r->num_bases, + (const char **) r->basenames); + if (res != ZEBRA_OK) { zebra_result (zh, &r->errcode, &r->errstring); return 0; } if (r->step_size != 0 && *r->step_size != 0) { - r->errcode = 205; /* "Only zero step size supported for Scan" */ + r->errcode = YAZ_BIB1_ONLY_ZERO_STEP_SIZE_SUPPORTED_FOR_SCAN; r->errstring = 0; 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; + res = zebra_scan(zh, r->stream, r->term, + r->attributeset, + &r->term_position, + &r->num_entries, &entries, &is_partial); + if (res == ZEBRA_OK) + { + 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; + } + } 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; + r->status = BEND_SCAN_PARTIAL; + zebra_result(zh, &r->errcode, &r->errstring); } - zebra_result (zh, &r->errcode, &r->errstring); return 0; } @@ -381,7 +400,7 @@ int bend_delete (void *handle, bend_delete_rr *rr) { ZebraHandle zh = (ZebraHandle) handle; - rr->delete_status = zebra_deleleResultSet(zh, rr->function, + rr->delete_status = zebra_deleteResultSet(zh, rr->function, rr->num_setnames, rr->setnames, rr->statuses); return 0; @@ -450,7 +469,6 @@ static int es_admin (ZebraHandle zh, Z_Admin *r) default: break; } - return 0; } @@ -535,15 +553,19 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) else { yaz_log (YLOG_WARN, "no database supplied for ES Update"); - rr->errcode = 1008; + rr->errcode = + YAZ_BIB1_ES_MISSING_MANDATORY_PARAMETER_FOR_SPECIFIED_FUNCTION_; rr->errstring = "database"; return 0; } - if (notToKeep) + if (zebra_begin_trans(zh, 1) != ZEBRA_OK) + { + zebra_result(zh, &rr->errcode, &rr->errstring); + } + else { int i; - zebra_begin_trans (zh, 1); - for (i = 0; i < notToKeep->num; i++) + for (i = 0; notToKeep && i < notToKeep->num; i++) { Z_External *rec = notToKeep->elements[i]->record; struct oident *oident = 0; @@ -593,7 +615,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) } if (oident && oident->value != VAL_TEXT_XML) { - rr->errcode = 224; + rr->errcode = YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "only XML update supported"; break; } @@ -616,7 +638,8 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) if (!action) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "unsupported ES Update action"; break; } @@ -630,14 +653,15 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) action); if (r) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "record exchange failed"; break; } } else { - int r = -1; + ZEBRA_RES r = ZEBRA_FAIL; switch(action) { case 1: r = zebra_insert_record( @@ -649,9 +673,10 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) rec->u.octet_aligned->buf, rec->u.octet_aligned->len, 0); - if (r) + if (r == ZEBRA_FAIL) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "insert_record failed"; } break; @@ -666,9 +691,10 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) rec->u.octet_aligned->buf, rec->u.octet_aligned->len, 1); - if (r) + if (r == ZEBRA_FAIL) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "update_record failed"; } break; @@ -682,9 +708,10 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) rec->u.octet_aligned->buf, rec->u.octet_aligned->len, 0); - if (r) + if (r == ZEBRA_FAIL) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "delete_record failed"; } break; @@ -700,7 +727,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) { yaz_log (YLOG_WARN, "Unknown Extended Service(%d)", rr->esr->taskSpecificParameters->which); - rr->errcode = 221; + rr->errcode = YAZ_BIB1_ES_EXTENDED_SERVICE_TYPE_UNSUPP; } return 0;