X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebraapi.c;h=6fefbb20c66fd84498f65179763cb63d5a5f062c;hp=7e7bb799529513f6daec1eedecd38a38b5f1a44d;hb=3fcc65de3bb8ac7af03900dccf23a5b1219b2e8e;hpb=06085703f3b5bcadfaf65bb499924a1662f9289e diff --git a/index/zebraapi.c b/index/zebraapi.c index 7e7bb79..6fefbb2 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.248 2007-02-06 09:34:56 adam Exp $ +/* $Id: zebraapi.c,v 1.258 2007-08-27 17:22:22 adam Exp $ Copyright (C) 1995-2007 Index Data ApS @@ -40,6 +40,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "orddict.h" #include #include +#include #define DEFAULT_APPROX_LIMIT 2000000000 @@ -98,6 +99,12 @@ static struct zebra_register *zebra_register_open(ZebraService zs, const char *reg_path); static void zebra_register_close(ZebraService zs, struct zebra_register *reg); +const char *zebra_get_encoding(ZebraHandle zh) +{ + assert(zh && zh->session_res); + return res_get_def(zh->session_res, "encoding", "ISO-8859-1"); +} + ZebraHandle zebra_open(ZebraService zs, Res res) { ZebraHandle zh; @@ -146,7 +153,7 @@ ZebraHandle zebra_open(ZebraService zs, Res res) zh->break_handler_func = 0; zh->break_handler_data = 0; - default_encoding = res_get_def(zh->session_res, "encoding", "ISO-8859-1"); + default_encoding = zebra_get_encoding(zh); zh->iconv_to_utf8 = yaz_iconv_open ("UTF-8", default_encoding); @@ -185,6 +192,8 @@ ZebraService zebra_start(const char *configName) ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res) { Res res; + char version_str[16]; + char system_str[80]; zebra_flock_init(); @@ -194,7 +203,9 @@ ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res) log_level_initialized = 1; } - yaz_log(YLOG_LOG, "zebra_start %s %s", ZEBRAVER, + zebra_get_version(version_str, system_str); + + yaz_log(YLOG_LOG, "zebra_start %s %s", version_str, configName ? configName : ""); if ((res = res_open(def_res, over_res))) @@ -1075,7 +1086,7 @@ ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query, ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream, const char *setname, Z_RecordComposition *comp, - oid_value input_format, int num_recs, + const Odr_oid *input_format, int num_recs, ZebraRetrievalRecord *recs) { ZebraMetaRecord *poset; @@ -1119,7 +1130,7 @@ ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream, if (poset[i].term) { recs[i].errCode = 0; - recs[i].format = VAL_SUTRS; + recs[i].format = yaz_oid_recsyn_sutrs; recs[i].len = strlen(poset[i].term); recs[i].buf = poset[i].term; recs[i].base = poset[i].db; @@ -1137,7 +1148,8 @@ ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream, hit_snippet); #endif recs[i].errCode = - zebra_record_fetch(zh, poset[i].sysno, poset[i].score, + zebra_record_fetch(zh, setname, + poset[i].sysno, poset[i].score, hit_snippet, stream, input_format, comp, &recs[i].format, &buf, &len, @@ -1169,7 +1181,7 @@ ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream, recs[i].buf = 0; /* no record and no error issued */ recs[i].len = 0; recs[i].errCode = 0; - recs[i].format = VAL_NONE; + recs[i].format = 0; recs[i].sysno = 0; } } @@ -1188,7 +1200,7 @@ ZEBRA_RES zebra_scan_PQF(ZebraHandle zh, ODR stream, const char *query, { YAZ_PQF_Parser pqf_parser = yaz_pqf_create (); Z_AttributesPlusTerm *zapt; - int *attributeSet; + Odr_oid *attributeSet; ZEBRA_RES res; if (!(zapt = yaz_pqf_scan(pqf_parser, stream, &attributeSet, query))) @@ -1197,15 +1209,17 @@ ZEBRA_RES zebra_scan_PQF(ZebraHandle zh, ODR stream, const char *query, zh->errCode = YAZ_BIB1_SCAN_MALFORMED_SCAN; } else - res = zebra_scan(zh, stream, zapt, VAL_BIB1, + { + res = zebra_scan(zh, stream, zapt, yaz_oid_attset_bib_1, position, num_entries, entries, is_partial, setname); + } yaz_pqf_destroy (pqf_parser); return res; } ZEBRA_RES zebra_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, - oid_value attributeset, + const Odr_oid *attributeset, int *position, int *num_entries, ZebraScanEntry **entries, int *is_partial, @@ -1400,13 +1414,14 @@ ZEBRA_RES zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) Odr_oct *oct = fragment->u.notExternallyTagged; sysno = 0; - if (zebra_update_record(zh, - 0, /* record Type */ - &sysno, - 0, /* match */ - 0, /* fname */ - (const char *) oct->buf, oct->len, - 0) == ZEBRA_FAIL) + if (zebra_update_record( + zh, + action_update, + 0, /* record Type */ + &sysno, + 0, /* match */ + 0, /* fname */ + (const char *) oct->buf, oct->len) == ZEBRA_FAIL) res = ZEBRA_FAIL; } } @@ -1414,99 +1429,6 @@ ZEBRA_RES zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) return res; } -ZEBRA_RES zebra_admin_exchange_record(ZebraHandle zh, - const char *rec_buf, - size_t rec_len, - const char *recid_buf, size_t recid_len, - int action) - /* 1 = insert. Fail it already exists */ - /* 2 = replace. Fail it does not exist */ - /* 3 = delete. Fail if does not exist */ - /* 4 = update. Insert/replace */ -{ - ZEBRA_RES res; - zint sysno = 0; - char *rinfo = 0; - char recid_z[256]; - int db_ord; - ZEBRA_CHECK_HANDLE(zh); - assert(action>0 && action <=4); - assert(rec_buf); - - yaz_log(log_level, "zebra_admin_exchange_record ac=%d", action); - - if (!recid_buf || recid_len <= 0 || recid_len >= sizeof(recid_z)) - { - zebra_setError(zh, YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED, - "no record ID or empty record ID"); - return ZEBRA_FAIL; - } - - memcpy (recid_z, recid_buf, recid_len); - recid_z[recid_len] = 0; - - if (zebra_begin_trans(zh, 1) == ZEBRA_FAIL) - return ZEBRA_FAIL; - - db_ord = zebraExplain_get_database_ord(zh->reg->zei); - rinfo = dict_lookup_ord(zh->reg->matchDict, db_ord, recid_z); - if (rinfo) - { - if (action == 1) /* fail if insert */ - { - if (zebra_end_trans(zh) != ZEBRA_OK) - yaz_log(YLOG_WARN, "zebra_end_trans failed"); - zebra_setError(zh, YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED, - "Cannot insert record: already exist"); - return ZEBRA_FAIL; - } - - memcpy (&sysno, rinfo+1, sizeof(sysno)); - } - else - { - if (action == 2 || action == 3) /* fail if delete or update */ - { - if (zebra_end_trans(zh) != ZEBRA_OK) - yaz_log(YLOG_WARN, "zebra_end_trans failed"); - zebra_setError(zh, YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED, - "Cannot delete/update record: does not exist"); - return ZEBRA_FAIL; - } - action = 1; /* make it an insert (if it's an update).. */ - } - res = zebra_buffer_extract_record(zh, rec_buf, rec_len, - action == 3 ? 1 : 0 /* delete flag */, - 0, /* test mode */ - 0, /* recordType */ - &sysno, - 0, /* match */ - 0, /* fname */ - 0, /* force update */ - 1 /* allow update */ - ); - if (res == ZEBRA_FAIL) - { - zebra_setError(zh, YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED, - "Unable to parse record"); - } - if (action == 1) - { - dict_insert_ord(zh->reg->matchDict, db_ord, recid_z, - sizeof(sysno), &sysno); - } - else if (action == 3) - { - dict_delete_ord(zh->reg->matchDict, db_ord, recid_z); - } - if (zebra_end_trans(zh) != ZEBRA_OK) - { - yaz_log(YLOG_WARN, "zebra_end_trans failed"); - res = ZEBRA_FAIL; - } - return res; -} - int delete_w_handle(const char *info, void *handle) { ZebraHandle zh = (ZebraHandle) handle; @@ -1605,9 +1527,9 @@ ZEBRA_RES zebra_create_database (ZebraHandle zh, const char *db) return zebra_end_trans (zh); } -int zebra_string_norm (ZebraHandle zh, unsigned reg_id, - const char *input_str, int input_len, - char *output_str, int output_len) +int zebra_string_norm(ZebraHandle zh, unsigned reg_id, + const char *input_str, int input_len, + char *output_str, int output_len) { WRBUF wrbuf; ASSERTZH; @@ -1635,9 +1557,9 @@ int zebra_string_norm (ZebraHandle zh, unsigned reg_id, \param seqno sequence number val is one of: - d=writing to shadow(dirty) - o=no writing, - c=commit + d=writing to shadow(shadow enabled); writing to register (shadow disabled) + o=reading only + c=commit (writing to register, reading from shadow, shadow mode only) */ static void zebra_set_state (ZebraHandle zh, int val, int seqno) { @@ -1798,6 +1720,11 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) if (val != 'o') { /* either we didn't finish commit or shadow is dirty */ + if (!rval) + { + yaz_log(YLOG_WARN, "previous transaction did not finish " + "(shadow disabled)"); + } zebra_unlock (zh->lock_shadow); zebra_unlock (zh->lock_normal); if (zebra_commit (zh)) @@ -2083,6 +2010,7 @@ static ZEBRA_RES zebra_commit_ex(ZebraHandle zh, int clean_only) if (val == 'd') { + /* shadow area is dirty and so we must throw it away */ yaz_log(YLOG_WARN, "previous transaction didn't reach commit"); clean_only = 1; } @@ -2299,48 +2227,20 @@ void zebra_set_shadow_enable (ZebraHandle zh, int value) ZEBRA_RES zebra_add_record(ZebraHandle zh, const char *buf, int buf_size) { - return zebra_update_record(zh, 0, 0 /* sysno */, 0, 0, buf, buf_size, 0); -} - -ZEBRA_RES zebra_insert_record(ZebraHandle zh, - const char *recordType, - zint *sysno, const char *match, - const char *fname, - const char *buf, int buf_size, int force_update) -{ - ZEBRA_RES res; - ASSERTZH; - assert(sysno); - assert(buf); - yaz_log(log_level, "zebra_insert_record sysno=" ZINT_FORMAT, *sysno); - - if (buf_size < 1) - buf_size = strlen(buf); - - if (zebra_begin_trans(zh, 1) == ZEBRA_FAIL) - return ZEBRA_FAIL; - res = zebra_buffer_extract_record(zh, buf, buf_size, - 0, /* delete_flag */ - 0, /* test_mode */ - recordType, - sysno, - match, fname, - 0, - 0); /* allow_update */ - if (zebra_end_trans(zh) != ZEBRA_OK) - { - yaz_log(YLOG_WARN, "zebra_end_trans failed"); - res = ZEBRA_FAIL; - } - return res; + return zebra_update_record(zh, action_update, + 0 /* record type */, + 0 /* sysno */ , + 0 /* match */, + 0 /* fname */, + buf, buf_size); } ZEBRA_RES zebra_update_record(ZebraHandle zh, + enum zebra_recctrl_action_t action, const char *recordType, zint *sysno, const char *match, const char *fname, - const char *buf, int buf_size, - int force_update) + const char *buf, int buf_size) { ZEBRA_RES res; @@ -2352,18 +2252,18 @@ ZEBRA_RES zebra_update_record(ZebraHandle zh, if (sysno) yaz_log(log_level, " sysno=" ZINT_FORMAT, *sysno); - if (buf_size < 1) buf_size = strlen(buf); + if (buf_size < 1) + buf_size = strlen(buf); if (zebra_begin_trans(zh, 1) == ZEBRA_FAIL) return ZEBRA_FAIL; res = zebra_buffer_extract_record(zh, buf, buf_size, - 0, /* delete_flag */ + action, 0, /* test_mode */ recordType, sysno, - match, fname, - force_update, - 1); /* allow_update */ + match, + fname); if (zebra_end_trans(zh) != ZEBRA_OK) { yaz_log(YLOG_WARN, "zebra_end_trans failed"); @@ -2372,42 +2272,6 @@ ZEBRA_RES zebra_update_record(ZebraHandle zh, return res; } -ZEBRA_RES zebra_delete_record(ZebraHandle zh, - const char *recordType, - zint *sysno, const char *match, - const char *fname, - const char *buf, int buf_size, - int force_update) -{ - ZEBRA_RES res; - - ZEBRA_CHECK_HANDLE(zh); - - assert(buf); - yaz_log(log_level, "zebra_delete_record"); - if (sysno) - yaz_log(log_level, " sysno=" ZINT_FORMAT, *sysno); - - if (buf_size < 1) buf_size = strlen(buf); - - if (zebra_begin_trans(zh, 1) == ZEBRA_FAIL) - return ZEBRA_FAIL; - res = zebra_buffer_extract_record(zh, buf, buf_size, - 1, /* delete_flag */ - 0, /* test_mode */ - recordType, - sysno, - match,fname, - force_update, - 1); /* allow_update */ - if (zebra_end_trans(zh) != ZEBRA_OK) - { - yaz_log(YLOG_WARN, "zebra_end_trans failed"); - res = ZEBRA_FAIL; - } - return res; -} - /* --------------------------------------------------------------------------- Searching */ @@ -2430,7 +2294,7 @@ ZEBRA_RES zebra_search_PQF(ZebraHandle zh, const char *pqf_query, yaz_log(log_level, "zebra_search_PQF s=%s q=%s", setname, pqf_query); - query = p_query_rpn (odr, PROTO_Z3950, pqf_query); + query = p_query_rpn(odr, pqf_query); if (!query) {