chiark / gitweb /
dispatch entrypoints
[chiark-tcl.git] / cdb / readonly.c
1 /**/
2
3 #include "chiark_tcl_cdb.h"
4
5 static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *val) { abort(); }
6
7 const IdDataSpec cdbtcl_databases= {
8   "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb
9 };
10
11 typedef struct Ro {
12   int ix, fd;
13   struct cdb cdb;
14 } Ro;
15
16 int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip,
17                     const char *path, void **result) {
18   Ro *ro;
19   int rc, r;
20
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");
26   *result= ro;
27   return TCL_OK;
28
29  x_rc:
30   if (ro->fd >= 0) close(ro->fd);
31   return rc;
32 }
33
34 int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) {
35   Ro *ro= ro_v;
36   cdb_free(&ro->cdb);
37   close(ro->fd);
38   TFREE(ro);
39   return TCL_OK;
40 }
41
42 int cht_do_cdb_lookup(ClientData cd, Tcl_Interp *ip, void *ro_v,
43                       Tcl_Obj *keyo, Tcl_Obj *def, Tcl_Obj **result) {
44   Ro *ro= ro_v;
45   const Byte *key;
46   const Byte *data;
47   int r, dlen, klen;
48
49   key= Tcl_GetStringFromObj(keyo, &klen);  assert(key);
50   
51   r= cht_cdb_lookup_cdb(ip, &ro->cdb, key, klen, &data, &dlen);
52   if (r) return r;
53   
54   return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
55                                 cht_cdb_storeanswer_string);
56 }
57
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) {
60   Ro *ro= ro_v;
61   const Byte *data;
62   int r, dlen;
63   
64   r= cht_cdb_lookup_cdb(ip, &ro->cdb,
65                         cht_hb_data(&key), cht_hb_len(&key),
66                         &data, &dlen);
67   if (r) return r;
68   
69   return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
70                                 cht_cdb_storeanswer_hb);
71 }
72
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);
77 }