From: ian Date: Sat, 11 Feb 2006 19:08:36 +0000 (+0000) Subject: working on lookups X-Git-Tag: debian/1.1.1~69 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=commitdiff_plain;h=06eaf80321d3b1a19358927c18d0b95523b9c74b working on lookups --- diff --git a/cdb/writeable.c b/cdb/writeable.c index 14d81ad..fb7a67f 100644 --- a/cdb/writeable.c +++ b/cdb/writeable.c @@ -847,19 +847,73 @@ int cht_do_cdbwr_delete(ClientData cd, Tcl_Interp *ip, void *rw_v, /*---------- Lookups ----------*/ -static int lookup(Tcl_Interp *ip, Rw *rw, const char *key, ) { - const HashValue val; +static int wrlookup(Tcl_Interp *ip, void *rw_v, const char *key, + const Byte **data_r, int *len_r /* -1 => notfound */) { + Rw *rw= rw_v; + const HashValue *val; + int r, l; val= ht_lookup(&rw->logincore, key); - if (!val) { - cdb_ &rw->cdb + 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; } + } - return notfound; + r= cdb_find(&rw->cdb, key, strlen(key)); + if (!r) { *data_r= 0; *len_r= -1; return TCL_OK; } + if (r<0) return cht_posixerr(ip, errno, "cdb_find failed"); + assert(r==1); + *len_r= cdb_datalen(&rw->cdb); + assert(*len_r > 0); + *data_r= cdb_getdata(&rw->cdb); + if (!*data_r) return cht_posixerr(ip, errno, "cdb_getdata failed"); + return TCL_OK; +} + +int cht_cdb_dosomelookup(ClientData cd, Tcl_Interp *ip, void *db_v, + int (*somelookup)(Tcl_Interp *ip, void *db_v, + const char *key, + const Byte **data_r, int *len_r), + const char *key, Tcl_Obj *def, + Tcl_Obj **result) { + int r, len; + const Byte *data; - -int cht_do_cdbwr_lookup(ClientData cd, Tcl_Interp *ip, void *db, - const char *key, Tcl_Obj *def, Tcl_Obj **result) { + r= somelookup(ip, db_v, key, &data, &len); + if (r) return r; + if (len>0) { + r= storeanswer(); + } + if (def) { + *result= def; + return TCL_OK; + } + return cht_staticerr(ip, "cdbwr lookup key not found", "CDB NOTFOUND"); + if (len<0) *result= def; + else *result= Tcl_NewStringObj( } -int cht_do_cdbwr_lookup_hb(ClientData cd, Tcl_Interp *ip, void *db, const char *key, HBytes_Value def, HBytes_Value *result); +static int storeanswer + +int cht_do_cdbwr_lookup(ClientData cd, Tcl_Interp *ip, void *rw_v, + const char *key, HBytes_Value def, + HBytes_Value *result) { + *result= Tcl_NewStringObj(data, len); + if (!*result) return cht_staticerr(ip, "Tcl_NewStringObj failed for" + " lookup (utf-8 encoding problem?)", "CDB BADSTRING"); + return TCL_OK; +int cht_do_cdbwr_lookup_hb(ClientData cd, Tcl_Interp *ip, void *rw_v, + const char *key, HBytes_Value def, + HBytes_Value *result) { + Rw *rw= rw_v; + int r; + + r= lookup(ip, rw, key, &data, &len); + if (r) return r; + if (len>0) { + cht_hb_array(result, data, len); + return TCL_OK; + } + if (!HBYTES_ISSENTINEL(def)) { + cht_hb_array(result, cht_hb_data(&def), cht_hb