3 #include "chiark_tcl_cdb.h"
5 static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *val) { abort(); }
7 const IdDataSpec cdbtcl_databases= {
8 "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb
16 int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip,
17 const char *path, void **result) {
21 ro= TALLOC(sizeof(*ro));
23 ro->fd= open(path, O_RDONLY);
24 if (ro->fd<0) PE("open database file");
25 r= cdb_init(&ro->cdb, ro->fd);
26 if (r) PE("initialise cdb");
31 if (ro->fd >= 0) close(ro->fd);
35 int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) {
43 int cht_do_cdb_lookup(ClientData cd, Tcl_Interp *ip, void *ro_v,
44 Tcl_Obj *keyo, Tcl_Obj *def, Tcl_Obj **result) {
50 key= Tcl_GetStringFromObj(keyo, &klen); assert(key);
52 r= cht_cdb_lookup_cdb(ip, &ro->cdb, key, klen, &data, &dlen);
55 return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
56 cht_cdb_storeanswer_string);
59 int cht_do_cdb_lookup_hb(ClientData cd, Tcl_Interp *ip, void *ro_v,
60 HBytes_Value key, Tcl_Obj *def, Tcl_Obj **result) {
65 r= cht_cdb_lookup_cdb(ip, &ro->cdb,
66 cht_hb_data(&key), cht_hb_len(&key),
70 return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
71 cht_cdb_storeanswer_hb);
74 int cht_do_cdbtoplevel_cdb(ClientData cd, Tcl_Interp *ip,
75 const Cdb_SubCommand* subcmd,
76 int objc, Tcl_Obj *const *objv) {
77 return subcmd->func((void*)subcmd,ip,objc,objv);