chiark / gitweb /
fixes for cdb; it now works at least a bit
[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->ix= -1;
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");
27   *result= ro;
28   return TCL_OK;
29
30  x_rc:
31   if (ro->fd >= 0) close(ro->fd);
32   return rc;
33 }
34
35 int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) {
36   Ro *ro= ro_v;
37   cdb_free(&ro->cdb);
38   close(ro->fd);
39   TFREE(ro);
40   return TCL_OK;
41 }
42
43 int cht_do_cdb_lookup(ClientData cd, Tcl_Interp *ip, void *ro_v,
44                       Tcl_Obj *keyo, Tcl_Obj *def, Tcl_Obj **result) {
45   Ro *ro= ro_v;
46   const Byte *key;
47   const Byte *data;
48   int r, dlen, klen;
49
50   key= Tcl_GetStringFromObj(keyo, &klen);  assert(key);
51   
52   r= cht_cdb_lookup_cdb(ip, &ro->cdb, key, klen, &data, &dlen);
53   if (r) return r;
54   
55   return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
56                                 cht_cdb_storeanswer_string);
57 }
58
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) {
61   Ro *ro= ro_v;
62   const Byte *data;
63   int r, dlen;
64   
65   r= cht_cdb_lookup_cdb(ip, &ro->cdb,
66                         cht_hb_data(&key), cht_hb_len(&key),
67                         &data, &dlen);
68   if (r) return r;
69   
70   return cht_cdb_donesomelookup(ip, ro_v, def, result, data, dlen,
71                                 cht_cdb_storeanswer_hb);
72 }
73
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);
78 }