chiark / gitweb /
15afdf5f5ba287eaeeedfe96f8fe44221f20076b
[chiark-tcl.git] / cdb / writeable.c
1 /**/
2
3 #include "chiark_tcl_cdb.h"
4
5 /*---------- Pathbuf ----------*/
6
7 typedef struct {
8   char *buf, *sfx;
9 } Pathbuf;
10
11 #define MAX_SUFFIX 4
12
13 static void pathbuf_init(Pathbuf *pb, const char *pathb) {
14   int l= strlen(pathb);
15   pb->buf= TALLOC(l + 4);
16   memcpy(pb->buf, pathb, l);
17   pb->sfx= pb->buf + l;
18   *pb->sfx++= '.';
19 }
20 static const char *pathbuf_sfx(Pathbuf *pb, const char *suffix) {
21   assert(strlen(suffix) <= MAX_SUFFIX);
22   strcpy(pb->sfx, suffix);
23   return pb->buf;
24 }
25 static void pathbuf_free(Pathbuf *pb) {
26   TFREE(pb->buf);
27   pb->buf= 0;
28 }
29
30 /*---------- Rw data structure ----------*/
31
32 typedef struct {
33   Pathbuf pbsome, pbtmp;
34 } Rw;
35
36 static void destroy_cdbrw_idtabcb(Tcl_Interp *ip, void *val) { abort(); }
37
38 const IdDataSpec cdbtcl_rwdatabases= {
39   "cdb-rwdb", "cdb-openrwdatabases-table", destroy_cdbrw_idtabcb
40 };
41
42
43
44 /*---------- Misc functionality ----------*/
45
46 int cht_do_cdbwr_create_empty(ClientData cd, Tcl_Interp *ip,
47                               const char *pathb) {
48   Pathbuf pb;
49   int lock_fd=-1, fd=-1;
50
51   pathbuf_init(&pb, pathb);
52   rc= acquire_lock(ip, &pb, &lock_fd);  if (rc) goto x_rc;
53   
54   fd= open(pathbuf_sfx(".lock"), O_RDONLY
55   
56
57
58 int cht_do_cdbwr_open(ClientData cd, Tcl_Interp *ip, const char *pathb, Tcl_Obj *on_info, void **result);
59
60
61 int cht_do_cdbwr_close(ClientData cd, Tcl_Interp *ip, void *db);
62 int cht_do_cdbwr_close_quick(ClientData cd, Tcl_Interp *ip, void *db);
63 int cht_do_cdbwr_lookup(ClientData cd, Tcl_Interp *ip, void *db, Tcl_Obj *key, Tcl_Obj **result);
64 int cht_do_cdbwr_lookup_hb(ClientData cd, Tcl_Interp *ip, void *db, HBytes_Value key, HBytes_Value *result);
65 int cht_do_cdbwr_update(ClientData cd, Tcl_Interp *ip, void *db, Tcl_Obj *key, Tcl_Obj *value);
66 int cht_do_cdbwr_update_hb(ClientData cd, Tcl_Interp *ip, void *db, HBytes_Value key, HBytes_Value value);
67 int cht_do_cdbwr_update_quick(ClientData cd, Tcl_Interp *ip, void *db, Tcl_Obj *key, Tcl_Obj *value);
68 int cht_do_cdbwr_update_quick_hb(ClientData cd, Tcl_Interp *ip, void *db, HBytes_Value key, HBytes_Value value);