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));
22 ro->fd= open(path, O_RDONLY);
23 if (ro->fd<0) PE("open database file");
24 r= cdb_init(&ro->cdb, ro->fd);
25 if (r) PE("initialise cdb");
30 if (ro->fd >= 0) close(ro->fd);
34 int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) {
42 int cht_do_cdb_lookup(ClientData cd, Tcl_Interp *ip, void *ro_v,
43 Tcl_Obj *keyo, Tcl_Obj *def, Tcl_Obj **result) {
49 key= Tcl_GetStringFromObj(keyo, &klen); assert(key);
51 r= cht_cdb_lookup_cdb(ip, &ro->cdb, key, klen, &data, &dlen);
54 return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
55 cht_cdb_storeanswer_string);
58 int cht_do_cdb_lookup_hb(ClientData cd, Tcl_Interp *ip, void *ro_v,
59 HBytes_Value key, Tcl_Obj *def, Tcl_Obj **result) {
64 r= cht_cdb_lookup_cdb(ip, &ro->cdb,
65 cht_hb_data(&key), cht_hb_len(&key),
69 return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
70 cht_cdb_storeanswer_hb);
73 int cht_do_cdbtoplevel_cdb(ClientData cd, Tcl_Interp *ip,
74 const Cdb_SubCommand* subcmd,
75 int objc, Tcl_Obj *const *objv) {
76 return subcmd->func((void*)subcmd,ip,objc,objv);