X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzebraapi.c;h=cb05bb6d7c12af5e3d45be3d661fe6e545a59512;hb=3c37091eb3e508bff58b297eaa0feab5e92ff53b;hp=1d6e6eceaffc4372dc584d7f7bf1c28cf94f01c6;hpb=985e74909c7e486edbb5220522796ec66c735504;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index 1d6e6ec..cb05bb6 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.200 2006-01-19 13:30:02 adam Exp $ +/* $Id: zebraapi.c,v 1.203 2006-03-13 17:42:09 mike 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 "index.h" +#include "orddict.h" #include #include @@ -183,11 +184,18 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) const char *passwd_plain = 0; const char *passwd_encrypt = 0; const char *dbaccess = 0; - ZebraService zh = xmalloc(sizeof(*zh)); + ZebraService zh = 0; if (configName) - res_read_file(res, configName); - + { + ZEBRA_RES ret = res_read_file(res, configName); + if (ret != ZEBRA_OK) + { + res_close(res); + return 0; + } + } + zh = xmalloc(sizeof(*zh)); zh->global_res = res; zh->sessions = 0; @@ -320,7 +328,14 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, data1_set_tabroot (reg->dh, reg_path); reg->recTypes = recTypes_init (zs->record_classes, reg->dh); - reg->zebra_maps = zebra_maps_open (res, reg_path); + if ((reg->zebra_maps = zebra_maps_open (res, reg_path)) == 0) { + /* ### Do we need to destroy reg->recTypes? */ + bfs_destroy(reg->bfs); + data1_destroy(reg->dh); + xfree(reg); + return 0; + } + reg->rank_classes = NULL; reg->key_buf = 0; @@ -435,6 +450,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, yaz_log (YLOG_WARN, "Cannot obtain EXPLAIN information"); return 0; } + reg->active = 2; yaz_log (YLOG_DEBUG, "zebra_register_open ok p=%p", reg); return reg; @@ -1299,6 +1315,7 @@ ZEBRA_RES zebra_admin_exchange_record(ZebraHandle zh, SYSNO sysno = 0; char *rinfo = 0; char recid_z[256]; + int db_ord; ASSERTZH; assert(action>0 && action <=4); assert(rec_buf); @@ -1318,7 +1335,8 @@ ZEBRA_RES zebra_admin_exchange_record(ZebraHandle zh, if (zebra_begin_trans(zh, 1) == ZEBRA_FAIL) return ZEBRA_FAIL; - rinfo = dict_lookup (zh->reg->matchDict, recid_z); + 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 */ @@ -1359,11 +1377,12 @@ ZEBRA_RES zebra_admin_exchange_record(ZebraHandle zh, } if (action == 1) { - dict_insert (zh->reg->matchDict, recid_z, sizeof(sysno), &sysno); + dict_insert_ord(zh->reg->matchDict, db_ord, recid_z, + sizeof(sysno), &sysno); } else if (action == 3) { - dict_delete (zh->reg->matchDict, recid_z); + dict_delete_ord(zh->reg->matchDict, db_ord, recid_z); } zebra_end_trans(zh); return res; @@ -1410,8 +1429,11 @@ ZEBRA_RES zebra_drop_database(ZebraHandle zh, const char *db) return ZEBRA_FAIL; if (zh->reg->isamb) { + int db_ord; zebraExplain_curDatabase (zh->reg->zei, db); - + db_ord = zebraExplain_get_database_ord(zh->reg->zei); + dict_delete_subtree_ord(zh->reg->matchDict, db_ord, + 0 /* handle */, 0 /* func */); zebraExplain_trav_ord(zh->reg->zei, zh, delete_SU_handle); zebraExplain_removeDatabase(zh->reg->zei, zh); } @@ -1684,6 +1706,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) yaz_log(YLOG_FATAL, "%s", zh->errString); return ZEBRA_FAIL; } + zebraExplain_curDatabase(zh->reg->zei, zh->basenames[0]); } else {