# cdb, cdb-wr - Tcl bindings for tinycdb and a journalling write extension # Copyright 2006-2012 Ian Jackson # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this library; if not, see . Table *cdbtoplevel TopLevel_Command cdb dispatch(Cdb/_SubCommand, "cdb subcommand") cdb-wr dispatch(Cdbwr/_SubCommand, "cdb-wr subcommand") Table cdb Cdb_SubCommand open path string => iddata(&cdbtcl_databases) lookup db iddata(&cdbtcl_databases) key obj ?def obj => obj lookup-hb db iddata(&cdbtcl_databases) key hb ?def obj => obj close db iddata(&cdbtcl_databases) Table cdbwr Cdbwr_SubCommand create-empty 0 pathb string # files: # .main # .lock # .cdb # .jrn # .tmp (might be new .main or new .cdb) # invariants: # .lock is an empty file # which is locked with fcntl by open # .main is a cdb native text file # and always exists # .cdb is a cdb database containing data # equivalent to and at least as recent as .main # (maybe not identical, because .cdb may # have been updated with data from .jrn but # .main not yet); if .jrn does not exist then # they are identical) # .cdb may not exist; in which case it is to # be treated as if it existed and was empty # but this is maximally early (so main must # exist and be empty since .main is never # newer than .cdb) # if .jrn exists, it is a cdb native # text file _without the trailing newline_; # its contents override values from .main or .cdb # if .main.tmp or .cdb.tmp exists it is irrelevant # zero length values mean record is deleted (in .jrn only; # forbidden elsewhere) # while db is open: # .lock is locked # .jrn and open hash table contain same info open 0 pathb string on_info obj ?on_lexminval obj # on_lexminval present and not empty list: provides a # script which returns the current lexminval. In # this case, occasionally, # on_lexminval will be called and then entries whose # value is lexically strictly less than lexminval # will be deleted automatically. The comparison # is bytewise on the UTF-8 representations. => iddata(&cdbtcl_rwdatabases) open-okjunk RWSCF_OKJUNK pathb string on_info obj ?on_lexminval obj => iddata(&cdbtcl_rwdatabases) # on_info ...: # on_info open-clean # on_info open-dirty-start # on_info open-dirty-junk \ # # on_info open-dirty-done # on_info compact-start # on_info compact-done # on_info close lookup 0 db iddata(&cdbtcl_rwdatabases) key string ?def obj => obj lookup-hb 0 db iddata(&cdbtcl_rwdatabases) key string ?def obj => obj delete 0 db iddata(&cdbtcl_rwdatabases) key string update 0 db iddata(&cdbtcl_rwdatabases) key string value obj update-hb 0 db iddata(&cdbtcl_rwdatabases) key string value hb compact-force 0 db iddata(&cdbtcl_rwdatabases) compact-check 0 db iddata(&cdbtcl_rwdatabases) compact-auto 0 # this is the default db iddata(&cdbtcl_rwdatabases) compact-explicit 0 db iddata(&cdbtcl_rwdatabases) close 0 db iddata(&cdbtcl_rwdatabases) EntryExtra Cdbwr_SubCommand unsigned flags;