X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=cdb%2Fwriteable.c;h=2fdfc6044e39421e1452c0beffaed87f7250fbfa;hb=ff05111a769ecdc4becb7960117be4c928d23791;hp=02c98cb8ad773230984f454f02f8b3205d826213;hpb=29fc9adb0f9c6ade500203bfda4359cba1d59ff7;p=chiark-tcl.git diff --git a/cdb/writeable.c b/cdb/writeable.c index 02c98cb..2fdfc60 100644 --- a/cdb/writeable.c +++ b/cdb/writeable.c @@ -170,13 +170,17 @@ typedef struct Rw { ScriptToInvoke on_info, on_lexminval; } Rw; +static void rw_cdb_close(Tcl_Interp *ip, Rw *rw) { + if (rw->cdb_fd >= 0) cdb_free(&rw->cdb); + maybe_close(rw->cdb_fd); +} + static int rw_close(Tcl_Interp *ip, Rw *rw) { int rc, r; rc= TCL_OK; ht_destroy(&rw->logincore); - if (rw->cdb_fd >= 0) cdb_free(&rw->cdb); - maybe_close(rw->cdb_fd); + rw_cdb_close(ip,rw); maybe_close(rw->lock_fd); if (rw->logfile) { @@ -414,7 +418,7 @@ static int infocb(Tcl_Interp *ip, Rw *rw, const char *arg1, /*---------- Opening ----------*/ static int cdbinit(Tcl_Interp *ip, Rw *rw) { - /* On entry, cdb_fd >=0 but cdb is _undefined_/ + /* On entry, cdb_fd >=0 but cdb is _undefined_ * On exit, either cdb_fd<0 or cdb is initialised */ int r, rc; @@ -813,8 +817,7 @@ static int compact_keepopen(Tcl_Interp *ip, Rw *rw, int force) { rc= compact_core(ip, rw, logsz, &reccount); if (rc) goto x_rc; - maybe_close(rw->cdb_fd); - rw->cdb_fd= -1; + rw_cdb_close(ip,rw); ht_destroy(&rw->logincore); ht_setup(&rw->logincore); @@ -948,11 +951,18 @@ static int lookup_rw(Tcl_Interp *ip, void *rw_v, const char *key, val= ht_lookup(&rw->logincore, key); if (val) { if (val->len) { *data_r= val->data; *len_r= val->len; return TCL_OK; } - else { *data_r= 0; *len_r= -1; return TCL_OK; } + else goto not_found; } + if (rw->cdb_fd<0) goto not_found; + return cht_cdb_lookup_cdb(ip, &rw->cdb, key, strlen(key), data_r, len_r); -} + + not_found: + *data_r= 0; + *len_r= -1; + return TCL_OK; +} int cht_do_cdbwr_lookup(ClientData cd, Tcl_Interp *ip, void *rw_v, const char *key, Tcl_Obj *def,