X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzebraapi.c;h=d419085e21b8e5653ab69d0650d12c8b90d78423;hb=593927cb1897c1e3163c284448eff7fee6ddad51;hp=59956109607cdefe2595faeaffce70e2c408a044;hpb=aa7cc3c1655c632a7b3a7053fb5b46b8ce0d3aeb;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index 5995610..d419085 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.180 2005-08-09 09:35:25 adam Exp $ +/* $Id: zebraapi.c,v 1.192 2005-10-28 07:25:30 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -49,8 +49,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA static int log_level = 0; static int log_level_initialized = 0; -static Res zebra_open_res (ZebraHandle zh); -static void zebra_close_res (ZebraHandle zh); +static void zebra_open_res(ZebraHandle zh); +static void zebra_close_res(ZebraHandle zh); static void zebra_chdir (ZebraService zs) { @@ -79,14 +79,14 @@ static void zebra_flush_reg (ZebraHandle zh) zebra_index_merge (zh ); } -static struct zebra_register *zebra_register_open (ZebraService zs, - const char *name, - int rw, int useshadow, - Res res, - const char *reg_path); +static struct zebra_register *zebra_register_open(ZebraService zs, + const char *name, + int rw, int useshadow, + Res res, + const char *reg_path); static void zebra_register_close (ZebraService zs, struct zebra_register *reg); -ZebraHandle zebra_open (ZebraService zs) +ZebraHandle zebra_open(ZebraService zs, Res res) { ZebraHandle zh; const char *default_encoding; @@ -111,7 +111,9 @@ ZebraHandle zebra_open (ZebraService zs) zh->errCode = 0; zh->errString = 0; zh->res = 0; + zh->session_res = res_open(zs->global_res, res); zh->user_perm = 0; + zh->dbaccesslist = 0; zh->reg_name = xstrdup (""); zh->path_reg = 0; @@ -126,8 +128,9 @@ ZebraHandle zebra_open (ZebraService zs) zh->lock_shadow = 0; zh->shadow_enable = 1; + zh->m_staticrank = 0; - default_encoding = res_get_def(zs->global_res, "encoding", "ISO-8859-1"); + default_encoding = res_get_def(zh->session_res, "encoding", "ISO-8859-1"); zh->iconv_to_utf8 = yaz_iconv_open ("UTF-8", default_encoding); @@ -172,20 +175,21 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) log_level = yaz_log_module_level("zebraapi"); log_level_initialized = 1; } + + yaz_log(YLOG_LOG, "zebra_start %s %s", ZEBRAVER, + configName ? configName : ""); - yaz_log(YLOG_LOG, "zebra_start %s %s",configName, ZEBRAVER); - assert(configName); - - if ((res = res_open (configName, def_res, over_res))) + if ((res = res_open(def_res, over_res))) { const char *passwd_plain = 0; const char *passwd_encrypt = 0; + const char *dbaccess = 0; ZebraService zh = xmalloc(sizeof(*zh)); - yaz_log (YLOG_DEBUG, "Read resources `%s'", configName); - + if (configName) + res_read_file(res, configName); + zh->global_res = res; - zh->configName = xstrdup(configName); zh->sessions = 0; zebra_chdir (zh); @@ -193,10 +197,11 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) zebra_mutex_cond_init (&zh->session_lock); passwd_plain = res_get (zh->global_res, "passwd"); passwd_encrypt = res_get (zh->global_res, "passwd.c"); + dbaccess = res_get (zh->global_res, "dbaccess"); if (!passwd_plain && !passwd_encrypt) zh->passwd_db = NULL; - else + else { zh->passwd_db = passwd_db_open(); if (!zh->passwd_db) @@ -209,6 +214,17 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) passwd_db_file_crypt(zh->passwd_db, passwd_encrypt); } } + + if (!dbaccess) + zh->dbaccess = NULL; + else { + zh->dbaccess = res_open(NULL, NULL); + if (res_read_file(zh->dbaccess, dbaccess) != ZEBRA_OK) { + yaz_log(YLOG_FATAL, "Failed to read %s", dbaccess); + return NULL; + } + } + zh->path_root = res_get (zh->global_res, "root"); zh->nmem = nmem_create(); zh->record_classes = recTypeClass_create (zh->global_res, zh->nmem); @@ -248,9 +264,9 @@ Dict dict_open_res (BFiles bfs, const char *name, int cache, int rw, } static -struct zebra_register *zebra_register_open (ZebraService zs, const char *name, - int rw, int useshadow, Res res, - const char *reg_path) +struct zebra_register *zebra_register_open(ZebraService zs, const char *name, + int rw, int useshadow, Res res, + const char *reg_path) { struct zebra_register *reg; int record_compression = REC_COMPRESS_NONE; @@ -310,9 +326,13 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, reg->key_buf = 0; +#if NEW_REC_KEYS + reg->keys = zebra_rec_keys_open(); +#else reg->keys.buf_max = 0; reg->keys.buf = 0; reg->keys.codec_handle = iscz1_start(); +#endif reg->sortKeys.buf = 0; reg->sortKeys.buf_max = 0; @@ -332,8 +352,9 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, reg->key_file_no = 0; reg->ptr_i = 0; - zebraRankInstall (reg, rank1_class); - zebraRankInstall (reg, rankzv_class); + zebraRankInstall (reg, rank_1_class); + zebraRankInstall (reg, rank_zv_class); + zebraRankInstall (reg, rank_static_class); recordCompression = res_get_def (res, "recordCompression", "none"); if (!strcmp (recordCompression, "none")) @@ -480,6 +501,9 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg) data1_destroy (reg->dh); xfree(reg->sortKeys.buf); +#if NEW_REC_KEYS + zebra_rec_keys_close(reg->keys); +#else xfree(reg->keys.buf); if (reg->keys.codec_handle) iscz1_stop(reg->keys.codec_handle); @@ -487,6 +511,8 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg) if (reg->sortKeys.codec_handle) iscz1_stop(reg->sortKeys.codec_handle); #endif +#endif + xfree(reg->key_buf); xfree(reg->name); xfree(reg); @@ -511,7 +537,6 @@ ZEBRA_RES zebra_stop(ZebraService zs) recTypeClass_destroy(zs->record_classes); nmem_destroy(zs->nmem); res_close (zs->global_res); - xfree(zs->configName); xfree(zs); return ZEBRA_OK; } @@ -535,9 +560,12 @@ ZEBRA_RES zebra_close (ZebraHandle zh) if (zh->reg) zebra_register_close (zh->service, zh->reg); zebra_close_res (zh); + res_close(zh->session_res); xfree(zh->record_encoding); + xfree(zh->dbaccesslist); + for (i = 0; i < zh->num_basenames; i++) xfree(zh->basenames[i]); xfree(zh->basenames); @@ -585,38 +613,34 @@ struct map_baseinfo { int new_num_max; }; -static Res zebra_open_res (ZebraHandle zh) +static void zebra_open_res(ZebraHandle zh) { - Res res = 0; char fname[512]; ASSERTZH; zh->errCode = 0; if (zh->path_reg) { - sprintf (fname, "%.200s/zebra.cfg", zh->path_reg); - res = res_open (fname, zh->service->global_res, 0); - if (!res) - res = zh->service->global_res; + sprintf(fname, "%.200s/zebra.cfg", zh->path_reg); + zh->res = res_open(zh->session_res, 0); + res_read_file(zh->res, fname); } else if (*zh->reg_name == 0) { - res = zh->service->global_res; + zh->res = res_open(zh->session_res, 0); } else { yaz_log (YLOG_WARN, "no register root specified"); - return 0; /* no path for register - fail! */ + zh->res = 0; /* no path for register - fail! */ } - return res; } static void zebra_close_res (ZebraHandle zh) { ASSERTZH; zh->errCode = 0; - if (zh->res != zh->service->global_res) - res_close (zh->res); + res_close (zh->res); zh->res = 0; } @@ -657,7 +681,7 @@ static void zebra_select_register (ZebraHandle zh, const char *new_reg) strcat (zh->path_reg, zh->reg_name); } } - zh->res = zebra_open_res (zh); + zebra_open_res(zh); if (zh->lock_normal) zebra_lock_destroy (zh->lock_normal); @@ -670,7 +694,7 @@ static void zebra_select_register (ZebraHandle zh, const char *new_reg) if (zh->res) { char fname[512]; - const char *lock_area =res_get (zh->res, "lockDir"); + const char *lock_area = res_get (zh->res, "lockDir"); if (!lock_area && zh->path_reg) res_set (zh->res, "lockDir", zh->path_reg); @@ -703,6 +727,13 @@ static void zebra_select_register (ZebraHandle zh, const char *new_reg) if (res_get_int(zh->res, "estimatehits", &approx) == ZEBRA_OK) zebra_set_approx_limit(zh, approx); } + if (zh->res) + { + if (res_get_int(zh->res, "staticrank", &zh->m_staticrank) == ZEBRA_OK) + yaz_log(YLOG_LOG, "static rank set and is %d", zh->m_staticrank); + else + yaz_log(YLOG_LOG, "static rank unset"); + } } void map_basenames_func (void *vp, const char *name, const char *value) @@ -744,8 +775,8 @@ int zebra_select_default_database(ZebraHandle zh) /* no database has been selected - so we select based on resource setting (including group) */ - const char *group = res_get(zh->service->global_res, "group"); - const char *v = res_get_prefix(zh->service->global_res, + const char *group = res_get(zh->session_res, "group"); + const char *v = res_get_prefix(zh->session_res, "database", group, "Default"); return zebra_select_database(zh, v); } @@ -772,7 +803,7 @@ void map_basenames (ZebraHandle zh, ODR stream, odr_malloc (stream, sizeof(*info.new_basenames) * info.new_num_max); info.mem = stream->mem; - res_trav (zh->service->global_res, "mapdb", &info, map_basenames_func); + res_trav (zh->session_res, "mapdb", &info, map_basenames_func); for (i = 0; inum_bases; i++) if (p->basenames[i] && p->new_num_bases < p->new_num_max) @@ -813,6 +844,32 @@ ZEBRA_RES zebra_select_databases (ZebraHandle zh, int num_bases, zh->errCode = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP; return ZEBRA_FAIL; } + + /* Check if the user has access to all databases (Seb) */ + /* You could argue that this should happen later, after we have + * determined that the database(s) exist. */ + if (zh->dbaccesslist) { + for (i = 0; i < num_bases; i++) { + const char *db = basenames[i]; + char *p, *pp; + for (p = zh->dbaccesslist; p && *p; p = pp) { + int len; + if ((pp = strchr(p, '+'))) { + len = pp - p; + pp++; + } + else + len = strlen(p); + if (len == strlen(db) && !strncmp(db, p, len)) + break; + } + if (!p) { + zh->errCode = YAZ_BIB1_ACCESS_TO_SPECIFIED_DATABASE_DENIED; + return ZEBRA_FAIL; + } + } + } + for (i = 0; i < zh->num_basenames; i++) xfree(zh->basenames[i]); xfree(zh->basenames); @@ -1173,6 +1230,7 @@ void zebra_clearError(ZebraHandle zh) ZEBRA_RES zebra_auth (ZebraHandle zh, const char *user, const char *pass) { const char *p; + const char *astring; char u[40]; ZebraService zs; @@ -1185,6 +1243,13 @@ ZEBRA_RES zebra_auth (ZebraHandle zh, const char *user, const char *pass) xfree(zh->user_perm); zh->user_perm = xstrdup(p ? p : "r"); + /* Determine database access list */ + astring = res_get(zs->dbaccess, user ? user : "anonymous"); + if (astring) + zh->dbaccesslist = xstrdup(astring); + else + zh->dbaccesslist = 0; + /* users that don't require a password .. */ if (zh->user_perm && strchr(zh->user_perm, 'a')) return ZEBRA_OK; @@ -1234,13 +1299,13 @@ 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 */ - oct->buf, oct->len, - 0) == ZEBRA_FAIL) + if (zebra_update_record(zh, + 0, /* record Type */ + &sysno, + 0, /* match */ + 0, /* fname */ + (const char *) oct->buf, oct->len, + 0) == ZEBRA_FAIL) res = ZEBRA_FAIL; } } @@ -1618,9 +1683,9 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) } zebra_set_state (zh, 'd', seqno); - zh->reg = zebra_register_open (zh->service, zh->reg_name, - 1, rval ? 1 : 0, zh->res, - zh->path_reg); + zh->reg = zebra_register_open(zh->service, zh->reg_name, + 1, rval ? 1 : 0, zh->res, + zh->path_reg); if (zh->reg) zh->reg->seqno = seqno; else @@ -1699,9 +1764,9 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) resultSetInvalidate (zh); zebra_register_close (zh->service, zh->reg); } - zh->reg = zebra_register_open (zh->service, zh->reg_name, - 0, val == 'c' ? 1 : 0, - zh->res, zh->path_reg); + zh->reg = zebra_register_open(zh->service, zh->reg_name, + 0, val == 'c' ? 1 : 0, + zh->res, zh->path_reg); if (!zh->reg) { zebra_unlock (zh->lock_normal); @@ -1988,7 +2053,7 @@ ZEBRA_RES zebra_octet_term_encoding(ZebraHandle zh, const char *encoding) { ASSERTZH; assert(encoding); - yaz_log(log_level, "zebra_octet_term_encoding"); + yaz_log(log_level, "zebra_octet_term_encoding %s", encoding); zebra_clearError(zh); if (zh->iconv_to_utf8 != 0) @@ -2036,7 +2101,6 @@ const char *zebra_get_resource(ZebraHandle zh, const char *v; ASSERTZH; assert(name); - assert(defaultvalue); v = res_get_def (zh->res, name, (char *)defaultvalue); zebra_clearError(zh); yaz_log(log_level, "zebra_get_resource %s:%s", name, v);