# 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 <http://www.gnu.org/licenses/>.


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:
		#	<pathb>.main
		#	<pathb>.lock
		#	<pathb>.cdb
		#	<pathb>.jrn
		#	<pathb>.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 <event> <xinfo>...:
		# on_info open-clean <statistics-info-string>
		# on_info open-dirty-start <statistics-info-string>
		# on_info open-dirty-junk <problem-info-string> \
		#		<problem-error-code-list>
		# on_info open-dirty-done <statistics-info-string>
		# on_info compact-start <statistics-info-string>
		# on_info compact-done <statistics-info-string>
		# on_info close <statistics-info-string>
	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;
