X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=index%2Fzebraapi.c;h=3e984913ad51c7fbbdceee610617c7d3b420c25b;hb=9f53cb738f15b0aa9afbedc90e3283007251b067;hp=e4ea55574962a5e9a704ce96efef549787b50b09;hpb=2a6f64379961f30bfe6376964ce279ab5242da1f;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index e4ea555..3e98491 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.116 2004-01-22 11:27:21 adam 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 @@ -77,8 +77,8 @@ static void zebra_flush_reg (ZebraHandle zh) zh->errCode=0; zebraExplain_flush (zh->reg->zei, zh); - extract_flushWriteKeys (zh); - zebra_index_merge (zh); + extract_flushWriteKeys (zh,1 /* final */); + zebra_index_merge (zh ); } static struct zebra_register *zebra_register_open (ZebraService zs, @@ -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,11 +263,11 @@ 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; reg->key_file_no = 0; + reg->ptr_i=0; zebraRankInstall (reg, rank1_class); zebraRankInstall (reg, rankzv_class); @@ -317,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; @@ -417,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); @@ -432,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); @@ -507,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); @@ -918,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; } @@ -973,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; } @@ -997,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; } @@ -1012,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"); @@ -1056,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; @@ -1068,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) @@ -1307,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) { @@ -1317,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; @@ -1917,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 */ @@ -1946,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 */ @@ -1971,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 */ @@ -2058,3 +2086,4 @@ int zebra_sort_by_specstr (ZebraHandle zh, zebra_end_read(zh); return sort_status; } +