# 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;