From 6cb032fd2ece4742e3516e0941507143f677e5cd Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 11 May 2005 12:39:36 +0000 Subject: [PATCH] Align Zebra API more so that ZEBRA_RES is used to signal error/OK. Error code should only be checked when ZEBRA_FAIL is returned. Updated sort test t4.c to really do sorting! --- configure.in | 4 +- index/index.h | 24 +++++--- index/main.c | 29 ++++++---- index/zebraapi.c | 169 +++++++++++++++++++++++++++++++----------------------- index/zrpn.c | 160 +++++++++++++++++++++++++-------------------------- index/zserver.c | 107 +++++++++++++++++++--------------- index/zsets.c | 144 +++++++++++++++++++++++----------------------- test/api/t4.c | 22 ++++--- test/api/t7.c | 52 +++++++++++------ 9 files changed, 395 insertions(+), 316 deletions(-) diff --git a/configure.in b/configure.in index b142ce7..42c973b 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Zebra, Index Data ApS, 1995-2005 -dnl $Id: configure.in,v 1.121 2005-05-09 11:39:57 adam Exp $ +dnl $Id: configure.in,v 1.122 2005-05-11 12:39:36 adam Exp $ dnl AC_INIT(include/idzebra/version.h) AM_INIT_AUTOMAKE(idzebra,1.4.0) @@ -26,7 +26,7 @@ else fi dnl dnl ------ YAZ -YAZ_INIT($yazflag,2.1.3) +YAZ_INIT($yazflag,2.1.5) YAZ_DOC dnl ----- libXSLT AC_SUBST(XSLT_LIBS) diff --git a/index/index.h b/index/index.h index d9ed54e..61fe3f4 100644 --- a/index/index.h +++ b/index/index.h @@ -1,4 +1,4 @@ -/* $Id: index.h,v 1.137 2005-05-09 19:57:35 adam Exp $ +/* $Id: index.h,v 1.138 2005-05-11 12:39:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -309,6 +309,7 @@ struct zebra_session { void *store_data_buf; size_t store_data_size; + NMEM nmem_error; struct zebra_limit *m_limit; }; @@ -379,14 +380,16 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, RSET resultSetRef (ZebraHandle zh, const char *resultSetId); void resultSetDestroy (ZebraHandle zh, int num_names, char **names, int *statuses); -void resultSetSort (ZebraHandle zh, NMEM nmem, - int num_input_setnames, const char **input_setnames, - const char *output_setname, - Z_SortKeySpecList *sort_sequence, int *sort_status); -void resultSetSortSingle (ZebraHandle zh, NMEM nmem, - ZebraSet sset, RSET rset, - Z_SortKeySpecList *sort_sequence, int *sort_status); -void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem); +ZEBRA_RES resultSetSort (ZebraHandle zh, NMEM nmem, + int num_input_setnames, const char **input_setnames, + const char *output_setname, + Z_SortKeySpecList *sort_sequence, int *sort_status); +ZEBRA_RES resultSetSortSingle (ZebraHandle zh, NMEM nmem, + ZebraSet sset, RSET rset, + Z_SortKeySpecList *sort_sequence, + int *sort_status); +ZEBRA_RES resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, + NMEM nmem); void resultSetInvalidate (ZebraHandle zh); int zebra_server_lock_init (ZebraService zh); @@ -488,6 +491,9 @@ void iscz1_encode (void *vp, char **dst, const char **src); Dict dict_open_res (BFiles bfs, const char *name, int cache, int rw, int compact_flag, Res res); +void zebra_setError(ZebraHandle zh, int code, const char *addinfo); +void zebra_setError_zint(ZebraHandle zh, int code, zint i); + YAZ_END_CDECL #endif diff --git a/index/main.c b/index/main.c index c435b21..6038469 100644 --- a/index/main.c +++ b/index/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.123 2005-01-21 13:23:25 adam Exp $ +/* $Id: main.c,v 1.124 2005-05-11 12:39:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -113,8 +113,7 @@ int main (int argc, char **argv) ); exit (1); } - while ((ret = options ("sVt:c:g:d:m:v:nf:l:L" - , argv, argc, &arg)) != -2) + while ((ret = options("sVt:c:g:d:m:v:nf:l:L", argv, argc, &arg)) != -2) { if (ret == 0) { @@ -135,9 +134,11 @@ int main (int argc, char **argv) zebra_shadow_enable (zh, enable_commit); } - if (database && zebra_select_database (zh, database)) + if (database && + zebra_select_database (zh, database) == ZEBRA_FAIL) { - yaz_log(YLOG_FATAL, "Could not select database %s errCode=%d", + yaz_log(YLOG_FATAL, "Could not select database %s " + "errCode=%d", database, zebra_errCode(zh) ); exit (1); } @@ -195,33 +196,39 @@ int main (int argc, char **argv) } else { + ZEBRA_RES res = ZEBRA_OK; if (!trans_started) { trans_started=1; - if (zebra_begin_trans (zh, 1)) + if (zebra_begin_trans (zh, 1) != ZEBRA_OK) exit(1); } switch (cmd) { case 'u': - zebra_repository_update (zh, arg); + res = zebra_repository_update (zh, arg); break; case 'd': - zebra_repository_delete (zh, arg); + res = zebra_repository_delete (zh, arg); break; case 's': - zebra_repository_show (zh, arg); + res = zebra_repository_show (zh, arg); nsections = 0; break; case 'C': - zebra_create_database(zh, arg); + res = zebra_create_database(zh, arg); break; case 'D': - zebra_drop_database(zh, arg); + res = zebra_drop_database(zh, arg); break; default: nsections = 0; } + if (res != ZEBRA_OK) + { + yaz_log(YLOG_WARN, "Operation failed"); + exit(1); + } log_event_end (NULL, NULL); } } diff --git a/index/zebraapi.c b/index/zebraapi.c index 5352457..5f4a9db 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.167 2005-05-09 10:16:13 adam Exp $ +/* $Id: zebraapi.c,v 1.168 2005-05-11 12:39:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -69,7 +69,7 @@ static void zebra_flush_reg (ZebraHandle zh) { ASSERTZH; yaz_log(log_level, "zebra_flush_reg"); - zh->errCode = 0; + zebra_clearError(zh); zebraExplain_flush (zh->reg->zei, zh); extract_flushWriteKeys (zh, 1 /* final */); @@ -149,6 +149,8 @@ ZebraHandle zebra_open (ZebraService zs) zh->m_limit = zebra_limit_create(1, 0); + zh->nmem_error = nmem_create(); + return zh; } @@ -406,7 +408,7 @@ ZEBRA_RES zebra_admin_shutdown (ZebraHandle zh) { ASSERTZH; yaz_log(log_level, "zebra_admin_shutdown"); - zh->errCode = 0; + zebra_clearError(zh); zebra_mutex_cond_lock (&zh->service->session_lock); zh->service->stop_flag = 1; @@ -419,7 +421,7 @@ ZEBRA_RES zebra_admin_start (ZebraHandle zh) ZebraService zs; ASSERTZH; yaz_log(log_level, "zebra_admin_start"); - zh->errCode = 0; + zebra_clearError(zh); zs = zh->service; zebra_mutex_cond_lock (&zs->session_lock); zebra_mutex_cond_unlock (&zs->session_lock); @@ -540,6 +542,8 @@ ZEBRA_RES zebra_close (ZebraHandle zh) zebra_limit_destroy(zh->m_limit); + nmem_destroy(zh->nmem_error); + xfree(zh->path_reg); xfree(zh); return ZEBRA_OK; @@ -726,8 +730,6 @@ void map_basenames (ZebraHandle zh, ODR stream, yaz_log(log_level, "map_basenames "); assert(stream); - zh->errCode = 0; - info.zh = zh; info.num_bases = *num_bases; @@ -757,7 +759,6 @@ ZEBRA_RES zebra_select_database (ZebraHandle zh, const char *basename) ASSERTZH; yaz_log(log_level, "zebra_select_database %s",basename); assert(basename); - zh->errCode = 0; return zebra_select_databases (zh, 1, &basename); } @@ -852,7 +853,7 @@ ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query, assert(hits); assert(setname); yaz_log(log_level, "zebra_search_rpn"); - zh->errCode = 0; + zebra_clearError(zh); zh->hits = 0; *hits = 0; @@ -866,11 +867,11 @@ ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query, return r; } -ZEBRA_RES zebra_records_retrieve (ZebraHandle zh, ODR stream, - const char *setname, - Z_RecordComposition *comp, - oid_value input_format, int num_recs, - ZebraRetrievalRecord *recs) +ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream, + const char *setname, + Z_RecordComposition *comp, + oid_value input_format, int num_recs, + ZebraRetrievalRecord *recs) { ZebraMetaRecord *poset; int i; @@ -883,17 +884,15 @@ ZEBRA_RES zebra_records_retrieve (ZebraHandle zh, ODR stream, assert(num_recs>0); yaz_log(log_level, "zebra_records_retrieve n=%d", num_recs); - zh->errCode = 0; + zebra_clearError(zh); if (!zh->res) { - zh->errCode = YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST; - zh->errString = odr_strdup(stream, setname); + zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + setname); return ZEBRA_FAIL; } - zh->errCode = 0; - if (zebra_begin_read (zh) == ZEBRA_FAIL) return ZEBRA_FAIL; @@ -904,8 +903,8 @@ ZEBRA_RES zebra_records_retrieve (ZebraHandle zh, ODR stream, if (!poset) { yaz_log (YLOG_DEBUG, "zebraPosSetCreate error"); - zh->errCode = YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST; - zh->errString = nmem_strdup (stream->mem, setname); + zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + setname); ret = ZEBRA_FAIL; } else @@ -942,11 +941,10 @@ ZEBRA_RES zebra_records_retrieve (ZebraHandle zh, ODR stream, } else { - char num_str[20]; - - sprintf (num_str, ZINT_FORMAT, pos_array[i]); - zh->errCode = YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE; - zh->errString = odr_strdup (stream, num_str); + if (ret == ZEBRA_OK) /* only need to set it once */ + zebra_setError_zint(zh, + YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, + pos_array[i]); ret = ZEBRA_FAIL; break; } @@ -995,7 +993,7 @@ ZEBRA_RES zebra_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, assert(is_partial); assert(entries); yaz_log(log_level, "zebra_scan"); - zh->errCode = 0; + zebra_clearError(zh); if (zebra_begin_read (zh) == ZEBRA_FAIL) { *entries = 0; @@ -1015,6 +1013,7 @@ ZEBRA_RES zebra_sort (ZebraHandle zh, ODR stream, Z_SortKeySpecList *sort_sequence, int *sort_status) { + ZEBRA_RES res; ASSERTZH; assert(stream); assert(num_input_setnames>0); @@ -1022,12 +1021,13 @@ ZEBRA_RES zebra_sort (ZebraHandle zh, ODR stream, assert(sort_sequence); assert(sort_status); yaz_log(log_level, "zebra_sort"); - zh->errCode = 0; - if (zebra_begin_read (zh) == ZEBRA_FAIL) + zebra_clearError(zh); + if (zebra_begin_read(zh) == ZEBRA_FAIL) return ZEBRA_FAIL; - resultSetSort (zh, stream->mem, num_input_setnames, input_setnames, - output_setname, sort_sequence, sort_status); - return zebra_end_read(zh); + res = resultSetSort(zh, stream->mem, num_input_setnames, input_setnames, + output_setname, sort_sequence, sort_status); + zebra_end_read(zh); + return res; } int zebra_deleteResultSet(ZebraHandle zh, int function, @@ -1038,7 +1038,7 @@ int zebra_deleteResultSet(ZebraHandle zh, int function, ASSERTZH; assert(statuses); yaz_log(log_level, "zebra_deleteResultSet n=%d",num_setnames); - zh->errCode = 0; + zebra_clearError(zh);; if (zebra_begin_read(zh)) return Z_DeleteStatus_systemProblemAtTarget; switch (function) @@ -1073,7 +1073,7 @@ int zebra_errCode (ZebraHandle zh) const char *zebra_errString (ZebraHandle zh) { - const char *e=""; + const char *e = 0; if (zh) e= diagbib1_str (zh->errCode); yaz_log(log_level, "zebra_errString: %s",e); @@ -1082,7 +1082,7 @@ const char *zebra_errString (ZebraHandle zh) char *zebra_errAdd (ZebraHandle zh) { - char *a=""; + char *a = 0; if (zh) a= zh->errString; yaz_log(log_level, "zebra_errAdd: %s",a); @@ -1105,7 +1105,7 @@ ZEBRA_RES zebra_auth (ZebraHandle zh, const char *user, const char *pass) ZebraService zs; ASSERTZH; - zh->errCode = 0; + zebra_clearError(zh); zs= zh->service; sprintf(u, "perm.%.30s", user ? user : "anonymous"); @@ -1128,7 +1128,7 @@ ZEBRA_RES zebra_admin_import_begin (ZebraHandle zh, const char *database, ASSERTZH; yaz_log(log_level, "zebra_admin_import_begin db=%s rt=%s", database, record_type); - zh->errCode = 0; + zebra_clearError(zh); if (zebra_select_database(zh, database) == ZEBRA_FAIL) return ZEBRA_FAIL; return zebra_begin_trans(zh, 1); @@ -1138,7 +1138,7 @@ ZEBRA_RES zebra_admin_import_end (ZebraHandle zh) { ASSERTZH; yaz_log(log_level, "zebra_admin_import_end"); - zh->errCode = 0; + zebra_clearError(zh); return zebra_end_trans(zh); } @@ -1149,7 +1149,7 @@ ZEBRA_RES zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) int i; ASSERTZH; yaz_log(log_level, "zebra_admin_import_segment"); - zh->errCode = 0; + zebra_clearError(zh); for (i = 0; inum_segmentRecords; i++) { Z_NamePlusRecord *npr = segment->segmentRecords[i]; @@ -1195,7 +1195,7 @@ ZEBRA_RES zebra_admin_exchange_record (ZebraHandle zh, assert(rec_buf); yaz_log(log_level, "zebra_admin_exchange_record ac=%d", action); - zh->errCode = 0; + zebra_clearError(zh); if (!recid_buf || recid_len <= 0 || recid_len >= sizeof(recid_z)) return ZEBRA_FAIL; @@ -1282,7 +1282,7 @@ ZEBRA_RES zebra_drop_database (ZebraHandle zh, const char *database) ZEBRA_RES ret = ZEBRA_OK; ASSERTZH; yaz_log(log_level, "zebra_drop_database"); - zh->errCode = 0; + zebra_clearError(zh); if (zebra_select_database (zh, database) == ZEBRA_FAIL) return ZEBRA_FAIL; @@ -1309,7 +1309,7 @@ ZEBRA_RES zebra_create_database (ZebraHandle zh, const char *database) ASSERTZH; yaz_log(log_level, "zebra_create_database %s", database); assert(database); - zh->errCode = 0; + zebra_clearError(zh); if (zebra_select_database (zh, database) == ZEBRA_FAIL) return ZEBRA_FAIL; @@ -1321,8 +1321,7 @@ ZEBRA_RES zebra_create_database (ZebraHandle zh, const char *database) /* explainDatabase */)) { zebra_end_trans (zh); - zh->errCode = YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; - zh->errString = "database already exist"; + zebra_setError(zh, YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED, database); return ZEBRA_FAIL; } return zebra_end_trans (zh); @@ -1337,7 +1336,7 @@ int zebra_string_norm (ZebraHandle zh, unsigned reg_id, assert(input_str); assert(output_str); yaz_log(log_level, "zebra_string_norm "); - zh->errCode = 0; + zebra_clearError(zh); if (!zh->reg->zebra_maps) return -1; wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, "", @@ -1360,7 +1359,7 @@ static void zebra_set_state (ZebraHandle zh, int val, int seqno) FILE *f; ASSERTZH; yaz_log(log_level, "zebra_set_state v=%d seq=%d", val, seqno); - zh->errCode = 0; + zebra_clearError(zh); sprintf (state_fname, "state.%s.LCK", zh->reg_name); fname = zebra_mk_fname (res_get(zh->res, "lockDir"), state_fname); @@ -1380,7 +1379,7 @@ static void zebra_get_state (ZebraHandle zh, char *val, int *seqno) ASSERTZH; yaz_log(log_level, "zebra_get_state "); - zh->errCode = 0; + zebra_clearError(zh); sprintf (state_fname, "state.%s.LCK", zh->reg_name); fname = zebra_mk_fname (res_get(zh->res, "lockDir"), state_fname); f = fopen (fname, "r"); @@ -1440,8 +1439,8 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) zebra_select_default_database(zh); if (!zh->res) { - zh->errCode = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - zh->errString = "zebra_begin_trans: no database selected"; + zebra_setError(zh, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + "zebra_begin_trans: no database selected"); return ZEBRA_FAIL; } ASSERTZHRES; @@ -1451,9 +1450,10 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) { if (rw && !strchr(zh->user_perm, 'w')) { - zh->errCode = - YAZ_BIB1_ES_PERMISSION_DENIED_ON_ES_CANNOT_MODIFY_OR_DELETE; - zh->errString = 0; + zebra_setError( + zh, + YAZ_BIB1_ES_PERMISSION_DENIED_ON_ES_CANNOT_MODIFY_OR_DELETE, + 0); return ZEBRA_FAIL; } } @@ -1474,8 +1474,8 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) } if (zh->trans_no != 1) { - zh->errCode = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - zh->errString = "zebra_begin_trans: write trans not allowed within read trans"; + zebra_setError(zh, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + "zebra_begin_trans: no write trans within read"); return ZEBRA_FAIL; } if (zh->reg) @@ -1485,7 +1485,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) } zh->trans_w_no = zh->trans_no; - zh->errCode = 0; + zebra_clearError(zh); zh->records_inserted = 0; zh->records_updated = 0; @@ -1561,9 +1561,9 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) zh->trans_no--; zh->trans_w_no = 0; - zh->errCode = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - zh->errString = "zebra_begin_trans: cannot open register"; - yaz_log(YLOG_FATAL, zh->errString); + zebra_setError(zh, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + "zebra_begin_trans: cannot open register"); + yaz_log(YLOG_FATAL, "%s", zh->errString); return ZEBRA_FAIL; } } @@ -1580,7 +1580,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) zebra_flush_reg (zh); return ZEBRA_OK; } - zh->errCode = 0; + zebra_clearError(zh); #if HAVE_SYS_TIMES_H times (&zh->tms1); #endif @@ -1672,8 +1672,8 @@ ZEBRA_RES zebra_end_transaction (ZebraHandle zh, ZebraTransactionStatus *status) if (!zh->res || !zh->reg) { - zh->errCode = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - zh->errString = "zebra_end_trans: no open transaction"; + zebra_setError(zh, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + "zebra_end_trans: no open transaction"); return ZEBRA_FAIL; } if (zh->trans_no != zh->trans_w_no) @@ -1746,7 +1746,7 @@ int zebra_repository_update (ZebraHandle zh, const char *path) { ASSERTZH; assert(path); - zh->errCode = 0; + zebra_clearError(zh); yaz_log (log_level, "updating %s", path); repositoryUpdate (zh, path); return zh->errCode; @@ -1756,7 +1756,7 @@ int zebra_repository_delete (ZebraHandle zh, const char *path) { ASSERTZH; assert(path); - zh->errCode = 0; + zebra_clearError(zh); yaz_log (log_level, "deleting %s", path); repositoryDelete (zh, path); return zh->errCode; @@ -1767,7 +1767,7 @@ int zebra_repository_show (ZebraHandle zh, const char *path) ASSERTZH; assert(path); yaz_log(log_level, "zebra_repository_show"); - zh->errCode = 0; + zebra_clearError(zh); repositoryShow (zh, path); return zh->errCode; } @@ -1779,7 +1779,7 @@ static int zebra_commit_ex(ZebraHandle zh, int clean_only) const char *rval; BFiles bfs; ASSERTZH; - zh->errCode = 0; + zebra_clearError(zh); zebra_select_default_database(zh); if (!zh->res) @@ -1853,19 +1853,23 @@ ZEBRA_RES zebra_init(ZebraHandle zh) BFiles bfs = 0; ASSERTZH; yaz_log(log_level, "zebra_init"); - zh->errCode = 0; + zebra_clearError(zh); zebra_select_default_database(zh); if (!zh->res) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; + zebra_setError(zh, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + "cannot select default database"); return ZEBRA_FAIL; } rval = res_get (zh->res, "shadow"); bfs = bfs_create (res_get (zh->res, "register"), zh->path_reg); if (!bfs) + { + zebra_setError(zh, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "bfs_create"); return ZEBRA_FAIL; + } if (rval && *rval) bf_cache (bfs, rval); @@ -1880,7 +1884,7 @@ ZEBRA_RES zebra_compact(ZebraHandle zh) BFiles bfs; ASSERTZH; yaz_log(log_level, "zebra_compact"); - zh->errCode = 0; + zebra_clearError(zh); if (!zh->res) { zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; @@ -1904,7 +1908,7 @@ void zebra_shadow_enable(ZebraHandle zh, int value) { ASSERTZH; yaz_log(log_level, "zebra_shadow_enable"); - zh->errCode = 0; + zebra_clearError(zh); zh->shadow_enable = value; } @@ -1913,7 +1917,7 @@ ZEBRA_RES zebra_octet_term_encoding(ZebraHandle zh, const char *encoding) ASSERTZH; assert(encoding); yaz_log(log_level, "zebra_octet_term_encoding"); - zh->errCode = 0; + zebra_clearError(zh); if (zh->iconv_to_utf8 != 0) yaz_iconv_close(zh->iconv_to_utf8); @@ -1936,7 +1940,7 @@ ZEBRA_RES zebra_record_encoding (ZebraHandle zh, const char *encoding) { ASSERTZH; yaz_log(log_level, "zebra_record_encoding"); - zh->errCode = 0; + zebra_clearError(zh); xfree(zh->record_encoding); zh->record_encoding = 0; if (encoding) @@ -1950,7 +1954,7 @@ void zebra_set_resource(ZebraHandle zh, const char *name, const char *value) assert(name); assert(value); yaz_log(log_level, "zebra_set_resource %s:%s", name, value); - zh->errCode = 0; + zebra_clearError(zh); res_set(zh->res, name, value); } @@ -1962,7 +1966,7 @@ const char *zebra_get_resource(ZebraHandle zh, assert(name); assert(defaultvalue); v = res_get_def (zh->res, name, (char *)defaultvalue); - zh->errCode = 0; + zebra_clearError(zh); yaz_log(log_level, "zebra_get_resource %s:%s", name, v); return v; } @@ -2205,3 +2209,24 @@ ZEBRA_RES zebra_set_limit(ZebraHandle zh, int complement_flag, zint *ids) zh->m_limit = zebra_limit_create(complement_flag, ids); return ZEBRA_OK; } + +/* + Set Error code + addinfo +*/ +void zebra_setError(ZebraHandle zh, int code, const char *addinfo) +{ + zh->errCode = code; + nmem_reset(zh->nmem_error); + zh->errString = addinfo ? nmem_strdup(zh->nmem_error, addinfo) : 0; +} + +void zebra_setError_zint(ZebraHandle zh, int code, zint i) +{ + char vstr[60]; + sprintf(vstr, ZINT_FORMAT, i); + + zh->errCode = code; + nmem_reset(zh->nmem_error); + zh->errString = nmem_strdup(zh->nmem_error, vstr); +} + diff --git a/index/zrpn.c b/index/zrpn.c index e9eeea1..f3ef7a8 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.190 2005-05-09 13:24:09 adam Exp $ +/* $Id: zrpn.c,v 1.191 2005-05-11 12:39:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -975,7 +975,7 @@ static int string_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt, strcat(term_tmp, ")"); break; default: - *error_code = 117; + *error_code = YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE; return 0; } return 1; @@ -1080,8 +1080,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; - zh->errString = basenames[base_no]; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); return ZEBRA_FAIL; } if (xpath_use > 0 && use_value == -2) @@ -1200,7 +1200,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, { if (relation_error) { - zh->errCode = relation_error; + zebra_setError(zh, relation_error, 0); return ZEBRA_FAIL; } *term_sub = 0; @@ -1301,8 +1301,9 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, strcat(term_dict, ")"); break; default: - zh->errCode = YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE; - zh->errString = nmem_strdup_i(stream, truncation_value); + zebra_setError_zint(zh, + YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE, + truncation_value); return ZEBRA_FAIL; } if (attr_ok) @@ -1323,8 +1324,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!bases_ok) { - zh->errCode = errCode; - zh->errString = errString; + zebra_setError(zh, errCode, errString); return ZEBRA_FAIL; } *term_sub = termp; @@ -1356,9 +1356,11 @@ static ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (ret == (size_t)(-1)) { ret = yaz_iconv(zh->iconv_to_utf8, 0, 0, 0, 0); - zh->errCode = - YAZ_BIB1_QUERY_TERM_INCLUDES_CHARS_THAT_DO_NOT_TRANSLATE_INTO_; - return -1; + zebra_setError( + zh, + YAZ_BIB1_QUERY_TERM_INCLUDES_CHARS_THAT_DO_NOT_TRANSLATE_INTO_, + 0); + return ZEBRA_FAIL; } *outbuf = 0; } @@ -1379,7 +1381,7 @@ static ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, termz[sizez] = '\0'; break; default: - zh->errCode = YAZ_BIB1_UNSUPP_CODED_VALUE_FOR_TERM; + zebra_setError(zh, YAZ_BIB1_UNSUPP_CODED_VALUE_FOR_TERM, 0); return ZEBRA_FAIL; } return ZEBRA_OK; @@ -1475,11 +1477,10 @@ static void grep_info_delete(struct grep_info *grep_info) xfree(grep_info->isam_p_buf); } -static int grep_info_prepare(ZebraHandle zh, - Z_AttributesPlusTerm *zapt, - struct grep_info *grep_info, - int reg_type, - NMEM stream) +static ZEBRA_RES grep_info_prepare(ZebraHandle zh, + Z_AttributesPlusTerm *zapt, + struct grep_info *grep_info, + int reg_type) { AttrType termset; int termset_value_numeric; @@ -1495,7 +1496,7 @@ static int grep_info_prepare(ZebraHandle zh, grep_info->termset = 0; if (!zapt) - return 0; + return ZEBRA_OK; attr_init(&termset, zapt, 8); termset_value_numeric = attr_find_ex(&termset, NULL, &termset_value_string); @@ -1515,12 +1516,11 @@ static int grep_info_prepare(ZebraHandle zh, grep_info->termset = resultSetAdd(zh, termset_name, 1); if (!grep_info->termset) { - zh->errCode = YAZ_BIB1_ILLEGAL_RESULT_SET_NAME; - zh->errString = nmem_strdup(stream, termset_name); - return -1; + zebra_setError(zh, YAZ_BIB1_ILLEGAL_RESULT_SET_NAME, termset_name); + return ZEBRA_FAIL; } } - return 0; + return ZEBRA_OK; } @@ -1544,7 +1544,7 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, *num_result_sets = 0; *term_dst = 0; - if (grep_info_prepare(zh, zapt, &grep_info, reg_type, stream)) + if (grep_info_prepare(zh, zapt, &grep_info, reg_type) == ZEBRA_FAIL) return ZEBRA_FAIL; while(1) { @@ -1744,7 +1744,7 @@ static int numeric_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt, sprintf(term_tmp, "(0*%d)", term_value); break; default: - *error_code = 117; + *error_code = YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE; return 0; } yaz_log(log_level_rpn, "dict_lookup_grep: %s", term_tmp); @@ -1830,9 +1830,9 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; - zh->errString = basenames[base_no]; - return -1; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); + return ZEBRA_FAIL; } for (local_attr = attp.local_attributes; local_attr; local_attr = local_attr->next) @@ -1860,8 +1860,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { - errCode = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; - errString = nmem_strdup_i(stream, use_value); + zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_value); continue; } bases_ok++; @@ -1876,8 +1875,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, { if (relation_error) { - zh->errCode = relation_error; - zh->errString = 0; + zebra_setError(zh, relation_error, 0); return ZEBRA_FAIL; } *term_sub = 0; @@ -1886,8 +1884,7 @@ static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!bases_ok) { - zh->errCode = errCode; - zh->errString = errString; + zebra_setError(zh, errCode, errString); return ZEBRA_FAIL; } *term_sub = termp; @@ -1916,7 +1913,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, int alloc_sets = 0; yaz_log(log_level_rpn, "APT_numeric t='%s'", termz); - if (grep_info_prepare(zh, zapt, &grep_info, reg_type, stream)) + if (grep_info_prepare(zh, zapt, &grep_info, reg_type) == ZEBRA_FAIL) return ZEBRA_FAIL; while (1) { @@ -2108,7 +2105,7 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, int term_type = Z_Term_characterString; const char *flags = "void"; - if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, '0', stream)) + if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, '0') == ZEBRA_FAIL) return rsnull_create(rset_nmem, kc); if (ord < 0) @@ -2143,20 +2140,25 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, return rset; } -static RSET rpn_search_xpath(ZebraHandle zh, - oid_value attributeSet, - int num_bases, char **basenames, - NMEM stream, const char *rank_type, RSET rset, - int xpath_len, struct xpath_location_step *xpath, - NMEM rset_nmem, - struct rset_key_control *kc) +static +ZEBRA_RES rpn_search_xpath(ZebraHandle zh, + oid_value attributeSet, + int num_bases, char **basenames, + NMEM stream, const char *rank_type, RSET rset, + int xpath_len, struct xpath_location_step *xpath, + NMEM rset_nmem, + RSET *rset_out, + struct rset_key_control *kc) { oid_value curAttributeSet = attributeSet; int base_no; int i; if (xpath_len < 0) - return rset; + { + *rset_out = rset; + return ZEBRA_OK; + } yaz_log(YLOG_DEBUG, "xpath len=%d", xpath_len); for (i = 0; ireg->zei, basenames[base_no])) { - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; - zh->errString = basenames[base_no]; - return rset; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); + *rset_out = rset; + return ZEBRA_FAIL; } while (--level >= 0) { @@ -2283,8 +2286,8 @@ static RSET rpn_search_xpath(ZebraHandle zh, first_path = 0; } } - - return rset; + *rset_out = rset; + return ZEBRA_OK; } static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, @@ -2372,19 +2375,16 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } else { - zh->errCode = YAZ_BIB1_UNSUPP_STRUCTURE_ATTRIBUTE; - return ZEBRA_FAIL; + zebra_setError(zh, YAZ_BIB1_UNSUPP_STRUCTURE_ATTRIBUTE, 0); + res = ZEBRA_FAIL; } if (res != ZEBRA_OK) return res; if (!*rset) return ZEBRA_FAIL; - *rset = rpn_search_xpath(zh, attributeSet, num_bases, basenames, - stream, rank_type, *rset, - xpath_len, xpath, rset_nmem, kc); - if (!*rset) - return ZEBRA_FAIL; - return ZEBRA_OK; + return rpn_search_xpath(zh, attributeSet, num_bases, basenames, + stream, rank_type, *rset, + xpath_len, xpath, rset_nmem, rset, kc); } static ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, @@ -2518,15 +2518,16 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, case Z_Operator_prox: if (zop->u.prox->which != Z_ProximityOperator_known) { - zh->errCode = YAZ_BIB1_UNSUPP_PROX_UNIT_CODE; + zebra_setError(zh, + YAZ_BIB1_UNSUPP_PROX_UNIT_CODE, + 0); return ZEBRA_FAIL; } if (*zop->u.prox->u.known != Z_ProxUnit_word) { - char *val = (char *) nmem_malloc(stream, 16); - zh->errCode = YAZ_BIB1_UNSUPP_PROX_UNIT_CODE; - zh->errString = val; - sprintf(val, "%d", *zop->u.prox->u.known); + zebra_setError_zint(zh, + YAZ_BIB1_UNSUPP_PROX_UNIT_CODE, + *zop->u.prox->u.known); return ZEBRA_FAIL; } else @@ -2542,7 +2543,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } break; default: - zh->errCode = YAZ_BIB1_OPERATOR_UNSUPP; + zebra_setError(zh, YAZ_BIB1_OPERATOR_UNSUPP, 0); return ZEBRA_FAIL; } *num_result_sets = 1; @@ -2572,16 +2573,16 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, rset = resultSetRef(zh, zs->u.simple->u.resultSetId); if (!rset) { - zh->errCode = YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST; - zh->errString = - nmem_strdup(stream, zs->u.simple->u.resultSetId); + zebra_setError(zh, + YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + zs->u.simple->u.resultSetId); return ZEBRA_FAIL; } rset_dup(rset); } else { - zh->errCode = YAZ_BIB1_UNSUPP_SEARCH; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, 0); return ZEBRA_FAIL; } *num_result_sets = 1; @@ -2591,7 +2592,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } else { - zh->errCode = YAZ_BIB1_UNSUPP_SEARCH; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, 0); return ZEBRA_FAIL; } return ZEBRA_OK; @@ -2763,7 +2764,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rank_type, &complete_flag, &sort_flag)) { *num_entries = 0; - zh->errCode = YAZ_BIB1_UNSUPP_ATTRIBUTE_TYPE; + zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_TYPE, 0); return ZEBRA_FAIL; } yaz_log(YLOG_DEBUG, "use_value = %d", use_value); @@ -2778,8 +2779,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { - zh->errString = basenames[base_no]; - zh->errCode = YAZ_BIB1_DATABASE_UNAVAILABLE; + zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE, + basenames[base_no]); *num_entries = 0; return ZEBRA_FAIL; } @@ -2806,16 +2807,16 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, { errCode = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; if (use_string) - errString = odr_strdup(stream, use_string); + zebra_setError(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, + use_string); else - { - char val_str[32]; - sprintf(val_str, "%d", use_value); - errString = odr_strdup(stream, val_str); - } + zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, + use_value); } else - errCode = YAZ_BIB1_UNSUPP_ATTRIBUTE_SET; + { + zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_SET, 0); + } continue; } } @@ -2832,8 +2833,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (!bases_ok && errCode) { - zh->errCode = errCode; - zh->errString = errString; + zebra_setError(zh, errCode, errString); *num_entries = 0; return ZEBRA_FAIL; } diff --git a/index/zserver.c b/index/zserver.c index 87dab70..9e943b1 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -1,4 +1,4 @@ -/* $Id: zserver.c,v 1.131 2005-04-15 10:47:49 adam Exp $ +/* $Id: zserver.c,v 1.132 2005-05-11 12:39:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -36,6 +36,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include +#include #include @@ -77,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; @@ -103,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; } @@ -265,12 +266,9 @@ int bend_search (void *handle, bend_search_rr *r) 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; @@ -279,9 +277,11 @@ int bend_search (void *handle, bend_search_rr *r) switch (r->query->which) { case Z_Query_type_1: case Z_Query_type_101: - res = zebra_search_RPN (zh, r->stream, r->query->u.type_1, - r->setname, &zhits); - if (zebra_errCode(zh) == 0) + 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; @@ -289,15 +289,13 @@ int bend_search (void *handle, bend_search_rr *r) r->hits = (int) zhits; search_terms (zh, r); } - else - zebra_result (zh, &r->errcode, &r->errstring); 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; } @@ -307,24 +305,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, + res = 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) + 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; @@ -338,34 +340,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; } @@ -545,7 +556,8 @@ 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; } @@ -603,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; } @@ -626,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; } @@ -640,7 +653,8 @@ 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; } @@ -661,7 +675,8 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) 0); if (r == ZEBRA_FAIL) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "insert_record failed"; } break; @@ -678,7 +693,8 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) 1); if (r == ZEBRA_FAIL) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "update_record failed"; } break; @@ -694,7 +710,8 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr) 0); if (r == ZEBRA_FAIL) { - rr->errcode = 224; + rr->errcode = + YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED; rr->errstring = "delete_record failed"; } break; @@ -710,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; diff --git a/index/zsets.c b/index/zsets.c index 1f8c6a7..08a2cf4 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,4 +1,4 @@ -/* $Id: zsets.c,v 1.81 2005-04-25 11:54:08 adam Exp $ +/* $Id: zsets.c,v 1.82 2005-05-11 12:39:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -30,6 +30,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #endif #include "index.h" +#include #include #define SORT_IDX_ENTRYSIZE 64 @@ -76,7 +77,7 @@ struct zset_sort_info { }; static int log_level_set=0; -static int log_level_sorting=0; +static int log_level_sort=0; static int log_level_searchhits=0; static int log_level_searchterms=0; static int log_level_resultsets=0; @@ -85,7 +86,7 @@ static void loglevels() { if (log_level_set) return; - log_level_sorting = yaz_log_module_level("sorting"); + log_level_sort = yaz_log_module_level("sorting"); log_level_searchhits = yaz_log_module_level("searchhits"); log_level_searchterms = yaz_log_module_level("searchterms"); log_level_resultsets = yaz_log_module_level("resultsets"); @@ -99,10 +100,8 @@ ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, oident *attrset; Z_SortKeySpecList *sort_sequence; int sort_status, i; - ZEBRA_RES res; + ZEBRA_RES res = ZEBRA_OK; - zh->errCode = 0; - zh->errString = NULL; zh->hits = 0; sort_sequence = (Z_SortKeySpecList *) @@ -125,27 +124,20 @@ ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, sset->rset = 0; return res; } - - if (zh->errCode) - yaz_log(YLOG_DEBUG, "search error: %d", zh->errCode); - for (i = 0; sort_sequence->specs[i]; i++) ; sort_sequence->num_specs = i; if (!i) - resultSetRank (zh, sset, rset, rset_nmem); + { + res = resultSetRank (zh, sset, rset, rset_nmem); + } else { - yaz_log(YLOG_DEBUG, "resultSetSortSingle in rpn_search"); - resultSetSortSingle (zh, nmem, sset, rset, - sort_sequence, &sort_status); - if (zh->errCode) - { - yaz_log(YLOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode); - } + res = resultSetSortSingle (zh, nmem, sset, rset, + sort_sequence, &sort_status); } sset->rset = rset; - return ZEBRA_OK; + return res; } @@ -157,8 +149,6 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, int i; ZEBRA_RES res; - zh->errCode = 0; - zh->errString = NULL; zh->hits = 0; zebraSet = resultSetAdd (zh, setname, 1); @@ -330,8 +320,6 @@ void resultSetDestroy (ZebraHandle zh, int num, char **names,int *statuses) if (statuses) for (i = 0; ierrCode = 0; - zh->errString = NULL; while (*ss) { int i = -1; @@ -450,7 +438,7 @@ ZebraMetaRecord *zebra_meta_records_create (ZebraHandle zh, const char *name, position = positions[i]; if (position > 0 && position <= sort_info->num_entries) { - yaz_log(log_level_sorting, "got pos=" ZINT_FORMAT + yaz_log(log_level_sort, "got pos=" ZINT_FORMAT " (sorted)", position); sr[i].sysno = sort_info->entries[position-1]->sysno; sr[i].score = sort_info->entries[position-1]->score; @@ -509,7 +497,7 @@ ZebraMetaRecord *zebra_meta_records_create (ZebraHandle zh, const char *name, if (position == positions[num_i]) { sr[num_i].sysno = psysno; - yaz_log(log_level_sorting, "got pos=" ZINT_FORMAT " (unsorted)", position); + yaz_log(log_level_sort, "got pos=" ZINT_FORMAT " (unsorted)", position); sr[num_i].score = -1; num_i++; } @@ -658,40 +646,40 @@ void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info, new_entry->score = score; } -void resultSetSort (ZebraHandle zh, NMEM nmem, - int num_input_setnames, const char **input_setnames, - const char *output_setname, - Z_SortKeySpecList *sort_sequence, int *sort_status) +ZEBRA_RES resultSetSort(ZebraHandle zh, NMEM nmem, + int num_input_setnames, const char **input_setnames, + const char *output_setname, + Z_SortKeySpecList *sort_sequence, int *sort_status) { ZebraSet sset; RSET rset; if (num_input_setnames == 0) { - zh->errCode = 208; - return ; + zebra_setError(zh, YAZ_BIB1_NO_RESULT_SET_NAME_SUPPLIED_ON_SORT, 0); + return ZEBRA_FAIL; } if (num_input_setnames > 1) { - zh->errCode = 230; - return; + zebra_setError(zh, YAZ_BIB1_SORT_TOO_MANY_INPUT_RESULTS, 0); + return ZEBRA_FAIL; } if (!log_level_set) loglevels(); - yaz_log(log_level_sorting, "result set sort input=%s output=%s", + yaz_log(log_level_sort, "result set sort input=%s output=%s", *input_setnames, output_setname); sset = resultSetGet (zh, input_setnames[0]); if (!sset) { - zh->errCode = 30; - zh->errString = nmem_strdup (nmem, input_setnames[0]); - return; + zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + input_setnames[0]); + return ZEBRA_FAIL; } if (!(rset = sset->rset)) { - zh->errCode = 30; - zh->errString = nmem_strdup (nmem, input_setnames[0]); - return; + zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + input_setnames[0]); + return ZEBRA_FAIL; } if (strcmp (output_setname, input_setnames[0])) { @@ -699,12 +687,14 @@ void resultSetSort (ZebraHandle zh, NMEM nmem, sset = resultSetAdd (zh, output_setname, 1); sset->rset = rset; } - resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, sort_status); + return resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, + sort_status); } -void resultSetSortSingle (ZebraHandle zh, NMEM nmem, - ZebraSet sset, RSET rset, - Z_SortKeySpecList *sort_sequence, int *sort_status) +ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, + ZebraSet sset, RSET rset, + Z_SortKeySpecList *sort_sequence, + int *sort_status) { int i; int n = 0; @@ -740,53 +730,57 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, sort_criteria[i].relation = 'D'; else { - zh->errCode = 214; - return; + zebra_setError(zh, YAZ_BIB1_ILLEGAL_SORT_RELATION, 0); + return ZEBRA_FAIL; } if (sks->sortElement->which == Z_SortElement_databaseSpecific) { - zh->errCode = 210; - return; + zebra_setError(zh, YAZ_BIB1_DATABASE_SPECIFIC_SORT_UNSUPP, 0); + return ZEBRA_FAIL; } else if (sks->sortElement->which != Z_SortElement_generic) { - zh->errCode = 237; - return; + zebra_setError(zh, YAZ_BIB1_SORT_ILLEGAL_SORT, 0); + return ZEBRA_FAIL; } sk = sks->sortElement->u.generic; switch (sk->which) { case Z_SortKey_sortField: - yaz_log(log_level_sorting, "Sort: key %d is of type sortField", i+1); - zh->errCode = 207; - return; + yaz_log(log_level_sort, "key %d is of type sortField", + i+1); + zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); + return ZEBRA_FAIL; case Z_SortKey_elementSpec: - yaz_log(log_level_sorting, "Sort: key %d is of type elementSpec", i+1); - zh->errCode = 207; - return; + yaz_log(log_level_sort, "key %d is of type elementSpec", + i+1); + zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); + return ZEBRA_FAIL; case Z_SortKey_sortAttributes: - yaz_log(log_level_sorting, "Sort: key %d is of type sortAttributes", i+1); + yaz_log(log_level_sort, "key %d is of type sortAttributes", i+1); sort_criteria[i].attrUse = zebra_maps_sort (zh->reg->zebra_maps, sk->u.sortAttributes, &sort_criteria[i].numerical); - yaz_log(log_level_sorting, "use value = %d", sort_criteria[i].attrUse); + yaz_log(log_level_sort, "use value = %d", sort_criteria[i].attrUse); if (sort_criteria[i].attrUse == -1) { - zh->errCode = 116; - return; + zebra_setError( + zh, YAZ_BIB1_USE_ATTRIBUTE_REQUIRED_BUT_NOT_SUPPLIED, 0); + return ZEBRA_FAIL; } if (sortIdx_type (zh->reg->sortIdx, sort_criteria[i].attrUse)) { - zh->errCode = 207; - return; + zebra_setError( + zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); + return ZEBRA_FAIL; } break; } } rfd = rset_open (rset, RSETF_READ); + /* FIXME - pass a TERMID *, and use it for something below !! */ while (rset_read (rfd, &key, &termid)) - /* FIXME - pass a TERMID *, and use it for something below !! */ { zint this_sys = key.mem[0]; kno++; @@ -799,12 +793,13 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, } } rset_close (rfd); - yaz_log(log_level_sorting, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, sort", + yaz_log(log_level_sort, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, sort", kno, sset->hits); for (i = 0; i < numTerms; i++) - yaz_log(log_level_sorting, "term=\"%s\" type=%s count=" ZINT_FORMAT, + yaz_log(log_level_sort, "term=\"%s\" type=%s count=" ZINT_FORMAT, terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset)); *sort_status = Z_SortResponse_success; + return ZEBRA_OK; } RSET resultSetRef (ZebraHandle zh, const char *resultSetId) @@ -816,7 +811,8 @@ RSET resultSetRef (ZebraHandle zh, const char *resultSetId) return NULL; } -void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem) +ZEBRA_RES resultSetRank (ZebraHandle zh, ZebraSet zebraSet, + RSET rset, NMEM nmem) { zint kno = 0; struct it_key key; @@ -841,6 +837,7 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem) sort_info->num_entries = 0; zebraSet->hits = 0; rset_getterms(rset, 0, 0, &n); + yaz_log(YLOG_LOG, "Got %d terms", n); terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n); rset_getterms(rset, terms, n, &numTerms); @@ -850,7 +847,8 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem) if (!rank_class) { yaz_log(YLOG_WARN, "No such rank handler: %s", rank_handler_name); - return; + zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, "Cannot find rank handler"); + return ZEBRA_FAIL; } rc = rank_class->control; @@ -910,14 +908,16 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem) (*rc->end) (zh->reg, handle); } rset_close (rfd); - - yaz_log(log_level_searchterms, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, rank", - kno, zebraSet->hits); + + yaz_log(log_level_searchterms, ZINT_FORMAT " keys, " + ZINT_FORMAT " sysnos, rank", kno, zebraSet->hits); for (i = 0; i < numTerms; i++) { - yaz_log(log_level_searchterms, "term=\"%s\" type=%s count=" ZINT_FORMAT, - terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset)); + yaz_log(log_level_searchterms, "term=\"%s\" type=%s count=" + ZINT_FORMAT, + terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset)); } + return ZEBRA_OK; } ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name) diff --git a/test/api/t4.c b/test/api/t4.c index 3590701..fb1d82b 100644 --- a/test/api/t4.c +++ b/test/api/t4.c @@ -1,4 +1,4 @@ -/* $Id: t4.c,v 1.16 2005-04-14 12:01:50 adam Exp $ +/* $Id: t4.c,v 1.17 2005-05-11 12:39:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -59,6 +59,7 @@ int main(int argc, char **argv) for (i = 0; i<2; i++) { + ZEBRA_RES ret; ZebraRetrievalRecord retrievalRecord[NUMBER_TO_FETCH_MAX]; char setname[20]; int j; @@ -69,7 +70,13 @@ int main(int argc, char **argv) zint hits; sprintf(setname, "s%d", i+1); - zebra_search_RPN(zh, odr_input, query, setname, &hits); + ret = zebra_search_RPN(zh, odr_input, query, setname, &hits); + if (ret != ZEBRA_OK) + { + int code = zebra_errCode(zh); + yaz_log(YLOG_WARN, "Unexpected error code=%d", code); + exit(1); + } if (hits != number_to_be_inserted) { yaz_log(YLOG_WARN, "Unexpected hit count " ZINT_FORMAT @@ -86,13 +93,14 @@ int main(int argc, char **argv) for (j = 0; j < number_to_fetch; j++) retrievalRecord[j].position = j+1; - zebra_records_retrieve(zh, odr_output, setname, 0, - VAL_TEXT_XML, number_to_fetch, retrievalRecord); - - if (zebra_errCode(zh)) + ret = zebra_records_retrieve(zh, odr_output, setname, 0, + VAL_TEXT_XML, number_to_fetch, + retrievalRecord); + if (ret != ZEBRA_OK) { + int code = zebra_errCode(zh); yaz_log(YLOG_FATAL, "zebra_records_retrieve returned error %d", - zebra_errCode(zh)); + code); exit(1); } diff --git a/test/api/t7.c b/test/api/t7.c index c100a8d..0c4d308 100644 --- a/test/api/t7.c +++ b/test/api/t7.c @@ -1,4 +1,4 @@ -/* $Id: t7.c,v 1.8 2005-03-09 12:14:42 adam Exp $ +/* $Id: t7.c,v 1.9 2005-05-11 12:39:38 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -34,43 +34,59 @@ const char *recs[] = { int main(int argc, char **argv) { + const char *setname1 = "set1"; + const char *setname2 = "set2"; + const char *setname3 = "set3"; + int status; + ZEBRA_RES ret; ZebraService zs = start_up(0, argc, argv); ZebraHandle zh = zebra_open (zs); - - const char *setname1="set1"; - const char *setname2="set2"; - const char *setname3="set3"; - int status; - int rc; ODR odr_input = odr_createmem (ODR_DECODE); ODR odr_output = odr_createmem (ODR_ENCODE); YAZ_PQF_Parser parser = yaz_pqf_create(); - Z_RPNQuery *query = yaz_pqf_parse(parser, odr_input, - "@attr 1=4 my"); - Z_SortKeySpecList *spec = - yaz_sort_spec (odr_output, "@attr 1=4 id"); + Z_RPNQuery *query = yaz_pqf_parse(parser, odr_input, "@attr 1=4 my"); + Z_SortKeySpecList *spec = yaz_sort_spec (odr_output, "1=4 <"); zint hits; init_data(zh, recs); zebra_begin_trans(zh, 0); - zebra_search_RPN(zh, odr_input, query, setname1, &hits); + ret = zebra_search_RPN(zh, odr_input, query, setname1, &hits); + if (ret == ZEBRA_FAIL) + { + int code = zebra_errCode(zh); + printf("search returned ERROR, OK was expected ret=%d " + "code=%d\n", ret, code); + } - rc=zebra_sort(zh, odr_output, 1, &setname1, setname2, spec, &status); - if (rc) + ret = zebra_sort(zh, odr_output, 1, &setname1, setname2, spec, &status); + if (ret == ZEBRA_FAIL) { - printf("sort A returned %d %d \n",rc,status); + int code = zebra_errCode(zh); + printf("sort A returned ERROR, OK was expected ret=%d status=%d " + "code=%d\n", ret, status, code); exit(1); } - rc=zebra_sort(zh, odr_output, 1, &setname2, setname3, spec, &status); - if (rc) + ret = zebra_sort(zh, odr_output, 1, &setname2, setname3, spec, &status); + if (ret == ZEBRA_FAIL) { - printf("sort B returned %d %d \n",rc,status); + int code = zebra_errCode(zh); + printf("sort B returned ERROR, OK was expected ret=%d status=%d " + "code=%d\n", ret, status, code); exit(1); } + spec = yaz_sort_spec(odr_output, "1=5 <"); /* invalid sort spec */ + + ret = zebra_sort(zh, odr_output, 1, &setname1, setname2, spec, &status); + if (ret == ZEBRA_OK) + { + printf("sort C returned OK, ERROR was expected ret=%d status=%d\n", + ret, status); + exit(1); + } zebra_end_trans(zh); yaz_pqf_destroy(parser); -- 1.7.10.4