3 #include "chiark_tcl_cdb.h"
10 static void ro_close(Ro *ro) {
15 static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *ro_v) {
20 const IdDataSpec cdbtcl_databases= {
21 "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb
24 int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip,
25 const char *path, void **result) {
29 ro= TALLOC(sizeof(*ro));
31 ro->fd= open(path, O_RDONLY);
32 if (ro->fd<0) PE("open database file");
33 r= cdb_init(&ro->cdb, ro->fd);
34 if (r) PE("initialise cdb");
39 if (ro->fd >= 0) close(ro->fd);
43 int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) {
45 cht_tabledataid_disposing(ip, ro_v, &cdbtcl_databases);
50 int cht_do_cdb_lookup(ClientData cd, Tcl_Interp *ip, void *ro_v,
51 Tcl_Obj *keyo, Tcl_Obj *def, Tcl_Obj **result) {
57 key= Tcl_GetStringFromObj(keyo, &klen); assert(key);
59 r= cht_cdb_lookup_cdb(ip, &ro->cdb, key, klen, &data, &dlen);
62 return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
63 cht_cdb_storeanswer_string);
66 int cht_do_cdb_lookup_hb(ClientData cd, Tcl_Interp *ip, void *ro_v,
67 HBytes_Value key, Tcl_Obj *def, Tcl_Obj **result) {
72 r= cht_cdb_lookup_cdb(ip, &ro->cdb,
73 cht_hb_data(&key), cht_hb_len(&key),
77 return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
78 cht_cdb_storeanswer_hb);
81 int cht_do_cdbtoplevel_cdb(ClientData cd, Tcl_Interp *ip,
82 const Cdb_SubCommand* subcmd,
83 int objc, Tcl_Obj *const *objv) {
84 return subcmd->func((void*)subcmd,ip,objc,objv);