chiark / gitweb /
.log -> .jrn
[chiark-tcl.git] / cdb / readonly.c
index 4cf8e2218b1a38dfb68e31fb49aa72650f910de7..3bfa98bbb68bd3a691894e7b4772973938815a96 100644 (file)
@@ -2,17 +2,25 @@
 
 #include "chiark_tcl_cdb.h"
 
-static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *val) { abort(); }
-
-const IdDataSpec cdbtcl_databases= {
-  "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb
-};
-
 typedef struct Ro {
   int ix, fd;
   struct cdb cdb;
 } Ro;
 
+static void ro_close(Ro *ro) {
+  cdb_free(&ro->cdb);
+  close(ro->fd);
+}
+
+static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *ro_v) {
+  ro_close(ro_v);
+  TFREE(ro_v);
+}
+
+const IdDataSpec cdbtcl_databases= {
+  "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb
+};
+
 int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip,
                    const char *path, void **result) {
   Ro *ro;
@@ -33,10 +41,9 @@ int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip,
 }
 
 int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) {
-  Ro *ro= ro_v;
-  cdb_free(&ro->cdb);
-  close(ro->fd);
-  TFREE(ro);
+  ro_close(ro_v);
+  cht_tabledataid_disposing(ip, ro_v, &cdbtcl_databases);
+  TFREE(ro_v);
   return TCL_OK;
 }