/*---------- 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