X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=index%2Fzebraapi.c;h=3e984913ad51c7fbbdceee610617c7d3b420c25b;hb=9f53cb738f15b0aa9afbedc90e3283007251b067;hp=df8b8af68904ed63200bbe0e7c53dd3ba0cb520d;hpb=23b1af194b14847f3ba187e3c5c3015797ad3c4a;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index df8b8af..3e98491 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.117 2004-01-22 15:40:25 heikki Exp $ +/* $Id: zebraapi.c,v 1.122 2004-08-04 09:05:17 adam Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -108,6 +108,7 @@ ZebraHandle zebra_open (ZebraService zs) zh->errCode = 0; zh->errString = 0; zh->res = 0; + zh->user_perm = 0; zh->reg_name = xstrdup (""); zh->path_reg = 0; @@ -146,7 +147,12 @@ ZebraHandle zebra_open (ZebraService zs) return zh; } -ZebraService zebra_start (const char *configName, Res def_res, Res over_res) +ZebraService zebra_start (const char *configName) +{ + return zebra_start_res(configName, 0, 0); +} + +ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) { Res res; @@ -243,6 +249,10 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, reg->keys.buf_max = 0; reg->keys.buf = 0; +#if IT_KEY_NEW + reg->keys.codec_handle = iscz1_start(); +#endif + reg->sortKeys.buf = 0; reg->sortKeys.buf_max = 0; @@ -253,7 +263,6 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, reg->matchDict = 0; reg->isam = 0; reg->isamc = 0; - reg->isamd = 0; reg->isamb = 0; reg->zei = 0; reg->matchDict = 0; @@ -318,17 +327,6 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, return 0; } } - if (res_get_match (res, "isam", "d", ISAM_DEFAULT)) - { - struct ISAMD_M_s isamd_m; - - if (!(reg->isamd = isamd_open (reg->bfs, FNAME_ISAMD, - rw, key_isamd_m(res, &isamd_m)))) - { - logf (LOG_WARN, "isamd_open"); - return 0; - } - } if (res_get_match (res, "isam", "b", ISAM_DEFAULT)) { struct ISAMC_M_s isamc_m; @@ -418,8 +416,6 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg) is_close (reg->isam); if (reg->isamc) isc_close (reg->isamc); - if (reg->isamd) - isamd_close (reg->isamd); if (reg->isamb) isamb_close (reg->isamb); rec_close (®->records); @@ -433,6 +429,10 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg) xfree (reg->sortKeys.buf); xfree (reg->keys.buf); +#if IT_KEY_NEW + if (reg->keys.codec_handle) + iscz1_stop(reg->keys.codec_handle); +#endif xfree (reg->key_buf); xfree (reg->name); @@ -508,6 +508,7 @@ int zebra_close (ZebraHandle zh) } zebra_mutex_cond_unlock (&zs->session_lock); xfree (zh->reg_name); + xfree (zh->user_perm); zh->service=0; /* more likely to trigger an assert */ xfree (zh->path_reg); xfree (zh); @@ -919,10 +920,10 @@ int zebra_deleleResultSet(ZebraHandle zh, int function, return Z_DeleteStatus_systemProblemAtTarget; switch (function) { - case Z_DeleteRequest_list: + case Z_DeleteResultSetRequest_list: resultSetDestroy (zh, num_setnames, setnames, statuses); break; - case Z_DeleteRequest_all: + case Z_DeleteResultSetRequest_all: resultSetDestroy (zh, -1, 0, statuses); break; } @@ -974,18 +975,25 @@ void zebra_clearError(ZebraHandle zh) int zebra_auth (ZebraHandle zh, const char *user, const char *pass) { + const char *p; + char u[40]; ZebraService zs; + ASSERTZH; - yaz_log(LOG_API,"zebra_auth u=%s p=%s",user,pass); zh->errCode=0; zs= zh->service; + + sprintf(u, "perm.%.30s", user ? user : "anonymous"); + p = res_get(zs->global_res, u); + xfree (zh->user_perm); + zh->user_perm = xstrdup(p ? p : "r"); + + /* users that don't require a password .. */ + if (zh->user_perm && strchr(zh->user_perm, 'a')) + return 0; + if (!zs->passwd_db || !passwd_db_auth (zs->passwd_db, user, pass)) - { - logf(LOG_APP,"AUTHOK:%s", user?user:"ANONYMOUS"); return 0; - } - - logf(LOG_APP,"AUTHFAIL:%s", user?user:"ANONYMOUS"); return 1; } @@ -998,7 +1006,8 @@ int zebra_admin_import_begin (ZebraHandle zh, const char *database, zh->errCode=0; if (zebra_select_database(zh, database)) return 1; - zebra_begin_trans (zh, 1); + if (zebra_begin_trans (zh, 1)) + return 1; return 0; } @@ -1013,7 +1022,7 @@ int zebra_admin_import_end (ZebraHandle zh) int zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) { - int sysno; + SYSNO sysno; int i; ASSERTZH; yaz_log(LOG_API,"zebra_admin_import_segment"); @@ -1057,7 +1066,7 @@ int zebra_admin_exchange_record (ZebraHandle zh, /* 3 = delete. Fail if does not exist */ /* 4 = update. Insert/replace */ { - int sysno = 0; + SYSNO sysno = 0; char *rinfo = 0; char recid_z[256]; ASSERTZH; @@ -1069,7 +1078,8 @@ int zebra_admin_exchange_record (ZebraHandle zh, memcpy (recid_z, recid_buf, recid_len); recid_z[recid_len] = 0; - zebra_begin_trans(zh,1); + if (zebra_begin_trans(zh, 1)) + return -1; rinfo = dict_lookup (zh->reg->matchDict, recid_z); if (rinfo) @@ -1308,6 +1318,17 @@ int zebra_begin_trans (ZebraHandle zh, int rw) } ASSERTZHRES; yaz_log(LOG_API,"zebra_begin_trans rw=%d",rw); + + if (zh->user_perm) + { + if (rw && !strchr(zh->user_perm, 'w')) + { + zh->errCode = 223; + zh->errString = 0; + return -1; + } + } + assert (zh->res); if (rw) { @@ -1318,7 +1339,10 @@ int zebra_begin_trans (ZebraHandle zh, int rw) (zh->trans_no++); if (zh->trans_w_no) + { + read_res_for_transaction(zh); return 0; + } if (zh->trans_no != 1) { zh->errCode = 2; @@ -1918,21 +1942,22 @@ NOTE: Now returns 0 at success and updates sysno, which is an int* int zebra_add_record(ZebraHandle zh, const char *buf, int buf_size) { - int sysno = 0; + SYSNO sysno = 0; return zebra_update_record(zh, 0, &sysno, 0, 0, buf, buf_size, 0); } int zebra_insert_record (ZebraHandle zh, const char *recordType, - int *sysno, const char *match, const char *fname, - const char *buf, int buf_size) + SYSNO *sysno, const char *match, const char *fname, + const char *buf, int buf_size, int force_update) { int res; - yaz_log(LOG_API,"zebra_insert_record sysno=%d", *sysno); + yaz_log(LOG_API,"zebra_insert_record sysno=" ZINT_FORMAT, *sysno); if (buf_size < 1) buf_size = strlen(buf); - zebra_begin_trans(zh, 1); + if (zebra_begin_trans(zh, 1)) + return 1; res = buffer_extract_record (zh, buf, buf_size, 0, /* delete_flag */ 0, /* test_mode */ @@ -1947,17 +1972,18 @@ int zebra_insert_record (ZebraHandle zh, int zebra_update_record (ZebraHandle zh, const char *recordType, - int* sysno, const char *match, const char *fname, + SYSNO* sysno, const char *match, const char *fname, const char *buf, int buf_size, int force_update) { int res; - yaz_log(LOG_API,"zebra_update_record sysno=%d", *sysno); + yaz_log(LOG_API,"zebra_update_record sysno=" ZINT_FORMAT, *sysno); if (buf_size < 1) buf_size = strlen(buf); - zebra_begin_trans(zh, 1); + if (zebra_begin_trans(zh, 1)) + return 1; res = buffer_extract_record (zh, buf, buf_size, 0, /* delete_flag */ 0, /* test_mode */ @@ -1972,16 +1998,17 @@ int zebra_update_record (ZebraHandle zh, int zebra_delete_record (ZebraHandle zh, const char *recordType, - int *sysno, const char *match, const char *fname, + SYSNO *sysno, const char *match, const char *fname, const char *buf, int buf_size, int force_update) { int res; - yaz_log(LOG_API,"zebra_delete_record sysno=%d", *sysno); + yaz_log(LOG_API,"zebra_delete_record sysno=" ZINT_FORMAT, *sysno); if (buf_size < 1) buf_size = strlen(buf); - zebra_begin_trans(zh, 1); + if (zebra_begin_trans(zh, 1)) + return 1; res = buffer_extract_record (zh, buf, buf_size, 1, /* delete_flag */ 0, /* test_mode */ @@ -2059,3 +2086,4 @@ int zebra_sort_by_specstr (ZebraHandle zh, zebra_end_read(zh); return sort_status; } +