diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-12-25 15:59:16 +0000 |
---|---|---|
committer | <> | 2015-02-03 11:29:43 +0000 |
commit | 5919c67c0cc46fea1ad0f884c04d7ea8a463fce7 (patch) | |
tree | 860f08eda66df9272df23fe4ba0f79e26560ea88 /doc | |
download | gdbm-tarball-e5faeaaf75ecfb705a9b643b3e4cb881ebb69f48.tar.gz |
Diffstat (limited to 'doc')
-rw-r--r-- | doc/Makefile.am | 83 | ||||
-rw-r--r-- | doc/Makefile.in | 967 | ||||
-rw-r--r-- | doc/fdl.texi | 507 | ||||
-rw-r--r-- | doc/gdbm.3 | 469 | ||||
-rw-r--r-- | doc/gdbm.info | 3013 | ||||
-rw-r--r-- | doc/gdbm.texinfo | 2567 | ||||
-rw-r--r-- | doc/gdbm_dump.1 | 88 | ||||
-rw-r--r-- | doc/gdbm_load.1 | 108 | ||||
-rw-r--r-- | doc/gdbmtool.1 | 443 | ||||
-rw-r--r-- | doc/stamp-vti | 4 | ||||
-rw-r--r-- | doc/version.texi | 4 |
11 files changed, 8253 insertions, 0 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..223c892 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,83 @@ +# This file is part of GDBM. -*- Makefile -*- +# Copyright (C) 2007, 2011 Free Software Foundation, Inc. +# +# GDBM 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 3, or (at your option) +# any later version. +# +# GDBM 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 GDBM. If not, see <http://www.gnu.org/licenses/>. */ + +# Documentation + +info_TEXINFOS = gdbm.texinfo +gdbm_TEXINFOS=\ + fdl.texi + +man_MANS = gdbm.3 gdbm_dump.1 gdbm_load.1 gdbmtool.1 +EXTRA_DIST = $(man_MANS) + +GENDOCS=gendocs.sh + +TEXI2DVI=texi2dvi -E + +# Make sure you set TEXINPUTS. +# TEXINPUTS=/usr/share/texmf/pdftex/plain/misc/ is ok for most distributions +.PHONY: manual +manual: + TEXINPUTS=$(srcdir):$(top_srcdir)/build-aux:$(TEXINPUTS) \ + MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \ + TEXI2DVI="$(TEXI2DVI) -t @finalout" \ + $(GENDOCS) --texi2html $(PACKAGE) '$(PACKAGE_NAME) manual' + +# Checking +check-tabs: + @if test -n "`cat $(info_TEXINFOS) $(gdbm_TEXINFOS) | tr -d -c '\t'`"; then \ + echo "Sources contain tabs; run make untabify"; \ + false; \ + fi + +check-sentence-spacing: + @if grep -q '\. [@A-Z]' $(info_TEXINFOS) $(gdbm_TEXINFOS); then \ + echo >&2 "Sources contain single-space sentence separators"; \ + echo >&2 "Run make fix-sentence-spacing to fix"; \ + fi + +check-fixmes: + @for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \ + do \ + sed -e = $$file | \ + sed -n 'N;/@c *FIXME:/{s/\(^[0-9][0-9]*\).*@c *FIXME:\(.*\)/'$$file':\1: \2/gp}'; \ + done > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unresolved FIXMEs:"; \ + cat $@-t; \ + rm $@-t; \ + false; \ + else \ + rm -f $@-t; \ + fi + +check-format: check-tabs check-sentence-spacing + +check-docs: check-format check-fixmes + +untabify: + emacs -batch -l untabify.el $(info_TEXINFOS) $(gdbm_TEXINFOS) + +fix-sentence-spacing: + for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \ + do \ + if grep -q '\. [@A-Z]' $$file; then \ + mv $$file $${file}~; \ + sed -r 's/\. ([@A-Z])/. \1/g' $${file}~ > $$file; \ + fi; \ + done + +final: untabify fix-sentence-spacing
\ No newline at end of file diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..c121eb0 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,967 @@ +# Makefile.in generated by automake 1.14 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file is part of GDBM. -*- Makefile -*- +# Copyright (C) 2007, 2011 Free Software Foundation, Inc. +# +# GDBM 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 3, or (at your option) +# any later version. +# +# GDBM 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 GDBM. If not, see <http://www.gnu.org/licenses/>. */ + +# Documentation +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(gdbm_TEXINFOS) $(top_srcdir)/build-aux/mdate-sh \ + $(srcdir)/version.texi $(srcdir)/stamp-vti \ + $(top_srcdir)/build-aux/texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/autoconf.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) +am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) +am__v_DVIPS_0 = @echo " DVIPS " $@; +am__v_DVIPS_1 = +AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) +am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) +am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; +am__v_MAKEINFO_1 = +AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) +am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) +am__v_INFOHTML_0 = @echo " INFOHTML" $@; +am__v_INFOHTML_1 = +AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) +am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) +am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; +am__v_TEXI2DVI_1 = +AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) +am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) +am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; +am__v_TEXI2PDF_1 = +AM_V_texinfo = $(am__v_texinfo_@AM_V@) +am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) +am__v_texinfo_0 = -q +am__v_texinfo_1 = +AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) +am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) +am__v_texidevnull_0 = > /dev/null +am__v_texidevnull_1 = +INFO_DEPS = $(srcdir)/gdbm.info +TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex +am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux +DVIS = gdbm.dvi +PDFS = gdbm.pdf +PSS = gdbm.ps +HTMLS = gdbm.html +TEXINFOS = gdbm.texinfo +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(man3dir)" +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +man3dir = $(mandir)/man3 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GDBM183_INCLUDEDIR = @GDBM183_INCLUDEDIR@ +GDBM183_LIBDIR = @GDBM183_LIBDIR@ +GDBM183_LIBRARY = @GDBM183_LIBRARY@ +GDBM_COUNT_T = @GDBM_COUNT_T@ +GDBM_VERSION_MAJOR = @GDBM_VERSION_MAJOR@ +GDBM_VERSION_MINOR = @GDBM_VERSION_MINOR@ +GDBM_VERSION_PATCH = @GDBM_VERSION_PATCH@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +info_TEXINFOS = gdbm.texinfo +gdbm_TEXINFOS = \ + fdl.texi + +man_MANS = gdbm.3 gdbm_dump.1 gdbm_load.1 gdbmtool.1 +EXTRA_DIST = $(man_MANS) +GENDOCS = gendocs.sh +TEXI2DVI = texi2dvi -E +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texinfo +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnits doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +.texinfo.info: + $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +.texinfo.dvi: + $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ + $< + +.texinfo.pdf: + $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ + $< + +.texinfo.html: + $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) + $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $(@:.html=.htp) $<; \ + then \ + rm -rf $@ && mv $(@:.html=.htp) $@; \ + else \ + rm -rf $(@:.html=.htp); exit 1; \ + fi +$(srcdir)/gdbm.info: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS) +gdbm.dvi: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS) +gdbm.pdf: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS) +gdbm.html: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS) +$(srcdir)/version.texi: $(srcdir)/stamp-vti +$(srcdir)/stamp-vti: gdbm.texinfo $(top_srcdir)/configure + @(dir=.; test -f ./gdbm.texinfo || dir=$(srcdir); \ + set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/gdbm.texinfo`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp + @cmp -s vti.tmp $(srcdir)/version.texi \ + || (echo "Updating $(srcdir)/version.texi"; \ + cp vti.tmp $(srcdir)/version.texi) + -@rm -f vti.tmp + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp + +maintainer-clean-vti: + -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi +.dvi.ps: + $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) $(AM_V_texinfo) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf gdbm.t2d gdbm.t2p + +clean-aminfo: + -test -z "gdbm.dvi gdbm.pdf gdbm.ps gdbm.html" \ + || rm -rf gdbm.dvi gdbm.pdf gdbm.ps gdbm.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-man3: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man3dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.3[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info +check-am: all-am +check: check-am +all-am: Makefile $(INFO_DEPS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: $(DVIS) + +html: html-am + +html-am: $(HTMLS) + +info: info-am + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am install-man + +install-dvi: install-dvi-am + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: + +install-html: install-html-am + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + d2=$$d$$p; \ + if test -d "$$d2"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d2"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-am + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ + fi; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: install-man1 install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-am + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ + mostlyclean-libtool mostlyclean-vti + +pdf: pdf-am + +pdf-am: $(PDFS) + +ps: ps-am + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-man uninstall-pdf-am uninstall-ps-am + +uninstall-man: uninstall-man1 uninstall-man3 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-aminfo clean-generic \ + clean-libtool cscopelist-am ctags-am dist-info distclean \ + distclean-generic distclean-libtool distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-man3 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti mostlyclean \ + mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool \ + mostlyclean-vti pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-dvi-am uninstall-html-am \ + uninstall-info-am uninstall-man uninstall-man1 uninstall-man3 \ + uninstall-pdf-am uninstall-ps-am + + +# Make sure you set TEXINPUTS. +# TEXINPUTS=/usr/share/texmf/pdftex/plain/misc/ is ok for most distributions +.PHONY: manual +manual: + TEXINPUTS=$(srcdir):$(top_srcdir)/build-aux:$(TEXINPUTS) \ + MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \ + TEXI2DVI="$(TEXI2DVI) -t @finalout" \ + $(GENDOCS) --texi2html $(PACKAGE) '$(PACKAGE_NAME) manual' + +# Checking +check-tabs: + @if test -n "`cat $(info_TEXINFOS) $(gdbm_TEXINFOS) | tr -d -c '\t'`"; then \ + echo "Sources contain tabs; run make untabify"; \ + false; \ + fi + +check-sentence-spacing: + @if grep -q '\. [@A-Z]' $(info_TEXINFOS) $(gdbm_TEXINFOS); then \ + echo >&2 "Sources contain single-space sentence separators"; \ + echo >&2 "Run make fix-sentence-spacing to fix"; \ + fi + +check-fixmes: + @for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \ + do \ + sed -e = $$file | \ + sed -n 'N;/@c *FIXME:/{s/\(^[0-9][0-9]*\).*@c *FIXME:\(.*\)/'$$file':\1: \2/gp}'; \ + done > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unresolved FIXMEs:"; \ + cat $@-t; \ + rm $@-t; \ + false; \ + else \ + rm -f $@-t; \ + fi + +check-format: check-tabs check-sentence-spacing + +check-docs: check-format check-fixmes + +untabify: + emacs -batch -l untabify.el $(info_TEXINFOS) $(gdbm_TEXINFOS) + +fix-sentence-spacing: + for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \ + do \ + if grep -q '\. [@A-Z]' $$file; then \ + mv $$file $${file}~; \ + sed -r 's/\. ([@A-Z])/. \1/g' $${file}~ > $$file; \ + fi; \ + done + +final: untabify fix-sentence-spacing + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/fdl.texi b/doc/fdl.texi new file mode 100644 index 0000000..20fe23a --- /dev/null +++ b/doc/fdl.texi @@ -0,0 +1,507 @@ +@c The GNU Free Documentation License. +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008, 2011 Free Software +Foundation, Inc. +@uref{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input +format, @acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML}, +PostScript or @acronym{PDF} designed for human modification. Examples +of transparent image formats include @acronym{PNG}, @acronym{XCF} and +@acronym{JPG}. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, @acronym{SGML} or +@acronym{XML} for which the @acronym{DTD} and/or processing tools are +not generally available, and the machine-generated @acronym{HTML}, +PostScript or @acronym{PDF} produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + diff --git a/doc/gdbm.3 b/doc/gdbm.3 new file mode 100644 index 0000000..c08ece3 --- /dev/null +++ b/doc/gdbm.3 @@ -0,0 +1,469 @@ +.\" This file is part of GDBM. +.\" Copyright (C) 2011, 2013 Free Software Foundation, Inc. +.\" +.\" GDBM 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 3, or (at your option) +.\" any later version. +.\" +.\" GDBM 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 GDBM. If not, see <http://www.gnu.org/licenses/>. */ +.TH GDBM 3 "May 8, 2013" "GDBM" "GDBM User Reference" +.SH NAME +GDBM \- The GNU database manager. Includes \fBdbm\fR and \fBndbm\fR +compatibility. +.SH SYNOPSIS +.nf +.B #include <gdbm.h> +.sp +.BI "extern gdbm_error" " gdbm_errno"; +.br +.BI "extern char *" gdbm_version ; +.br +.BI "GDBM_FILE gdbm_open (const char *" name ", int " block_size ", " +.ti +21 +.BI "int " flags ", int " mode ", " +.ti +21 +.BI "void (*" fatal_func ")(const char *))"; +.br +.BI "void gdbm_close (GDBM_FILE " dbf ");" +.br +.BI "int gdbm_store (GDBM_FILE " dbf ", datum " key ", datum " content ", int " flag ); +.br +.BI "datum gdbm_fetch (GDBM_FILE " dbf ", datum " key ); +.br +.BI "int gdbm_delete (GDBM_FILE " dbf ", datum " key ); +.br +.BI "datum gdbm_firstkey (GDBM_FILE " dbf ");" +.br +.BI "datum gdbm_nextkey (GDBM_FILE " dbf ", datum " key ); +.br +.BI "int gdbm_reorganize (GDBM_FILE " dbf ");" +.br +.BI "void gdbm_sync (GDBM_FILE " dbf ");" +.br +.BI "int gdbm_exists (GDBM_FILE " dbf ", datum " key ); +.br +.BI "const char *gdbm_strerror (gdbm_error " errno ); +.br +.BI "int gdbm_setopt (GDBM_FILE " dbf ", int " option ", int " value ", int " size ); +.br +.BI "int gdbm_fdesc (GDBM_FILE " dbf ); +.br +.PP +.SS DBM Compatability routines: +.PP +.B #include <dbm.h> +.sp +.BI "int dbminit (const char *" name ");" +.br +.BI "int store (datum " key ", datum " content ); +.br +.BI "datum fetch (datum " key ); +.br +.BI "int delete (datum " key ); +.br +.BI "datum firstkey (void);" +.br +.BI "datum nextkey (datum " key ); +.br +.BI "int dbmclose (void);" +.PP +.SS NDBM Compatability routines: +.PP +.B #include <ndbm.h> +.sp +.BI "DBM *dbm_open (const char *" name ", int " flags ", int " mode ); +.br +.BI "void dbm_close (DBM *" file ); +.BI datum dbm_fetch (DBM *" file ", datum " key ); +.br +.BI "int dbm_store (DBM *" file ", datum " key ", datum " content ", int " flags ); +.br +.BI "int dbm_delete (DBM *" file ", datum " key ); +.br +.BI "datum dbm_firstkey (DBM *" file ); +.br +.BI "datum dbm_nextkey (DBM *" file ", datum " key ); +.br +.BI "int dbm_error (DBM *" file ); +.br +.BI "int dbm_clearerr (DBM *" file ); +.br +.BI "int dbm_pagfno (DBM *" file ); +.br +.BI "int dbm_dirfno (DBM *" file ); +.br +.BI "int dbm_rdonly (DBM *" file ); +.SH DESCRIPTION +\fBGNU dbm\fR is a library of routines that manages data files that contain +key/data pairs. The access provided is that of storing, +retrieval, and deletion by key and a non-sorted traversal of all +keys. A process is allowed to use multiple data files at the +same time. + +This manpage is a short description of the \fBGDBM\fR library. +For a detailed discussion, including examples of the configuration and +usage recommendations, refer to the \fBGDBM Manual\fR available in +Texinfo format. To access it, run: + + \fBinfo gdbm\fR + +Should any discrepancies occur between this manpage and the +\fBGDBM Manual\fR, the later shall be considered the authoritative +source. + +A process that opens a gdbm file is designated as a "reader" or a +"writer". Only one writer may open a gdbm file and many readers may +open the file. Readers and writers can not open the gdbm file at the +same time. The procedure for opening a gdbm file is: + +.BI "GDBM_FILE gdbm_open (const char *" name ", int " block_size ", " +.ti +21 +.BI "int " flags ", int " mode ", " +.ti +21 +.BI "void (*" fatal_func ")(const char *))"; + +\fIName\fR is the name of the file (the complete name, +gdbm does not append any characters to this name). \fIBlock_size\fR is +the size of a single transfer from disk to memory. This parameter is +ignored unless the file is a new file. The minimum size is 512. If +it is less than 512, dbm will use the stat block size for the file system. +\fIRead_write\fR can have one of the following values: +.TP +.B GDBM_READER +reader +.TP +.B GDBM_WRITER +writer +.TP +.B GDBM_WRCREAT +writer - if database does not exist create new one +.TP +.B GDBM_NEWDB +writer - create new database regardless if one exists +.PP +The \fBGDBM_NOMMAP\fR added to \fIread_write\fR by bitwise or instructs +\fBgdbm_open\fR to disable the use of +.BR mmap (2). +.PP +For the last three (writers of the database) the following may be added +added to \fIread_write\fR by bitwise or: +.TP +.B GDBM_SYNC +Causes all database operations to be synchronized to the disk, +.TP +.B GDBM_NOLOCK +Pevents the library from performing any locking on the database file. +.PP +The option +.B GDBM_FAST +is now obsolete, since gdbm defaults to no-sync mode. +.PP +\fIMode\fR is the file mode (see \fBchmod(2)\fR and \fBopen(2)\fR) if the +file is created. \fI(*Fatal_func) ()\fR is a function for dbm to call +if it detects a fatal error. The only parameter of this function is a string. +If the value of 0 is provided, \fBgdbm\fR will use a default function. + +The return value is the pointer needed by all other routines to +access that gdbm file. If the return is the NULL pointer, \fBgdbm_open\fR +was not successful. The errors can be found in \fIgdbm_errno\fR for gdbm +errors and in \fIerrno\fR for system errors. (For error codes, see +gdbmerrno.h.) + +In all of the following calls, the parameter \fIdbf\fR refers to the pointer +returned from \fBgdbm_open\fR. + +It is important that every file opened is also closed. This is needed to +update the reader/writer count on the file. This is done by: + +.BI "void gdbm_close (GDBM_FILE " dbf ");" + +The database is used by 3 primary routines. The first stores data in the +database. + +.BI "int gdbm_store (GDBM_FILE " dbf ", datum " key ", datum " content ", int " flag ); + +\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is the +key data. \fIContent\fR is the data to be associated with the \fIkey\fR. +\fIFlag\fR can have one of the following values: +.TP +.B GDBM_INSERT +Insert only, generate an error if key exists; +.TP +.B GDBM_REPLACE +Replace contents if key exists. +.PP +If a reader calls \fBgdbm_store\fR, the return value will be \-1. +If called with \fBGDBM_INSERT\fR and \fIkey\fR is in the database, the return +value will be 1. Otherwise, the return value is 0. + +\fINOTICE: If you store data for a key that is already in the data base, +\fBgdbm\fI replaces the old data with the new data if called with \fBGDBM_REPLACE\fI. +You do not get two data items for the same key and you do not get an +error from \fBgdbm_store\fI. + +NOTICE: The size in \fBgdbm\fI is not restricted like in \fBdbm\fI or \fBndbm\fI. Your data +can be as large as you want.\fR + +To search for some data, use: + +.BI "datum gdbm_fetch (GDBM_FILE " dbf ", datum " key ); + +\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is +the key data. + +If the \fIdptr\fR element of the return value is NULL, no data was +found. Otherwise the return value is a pointer to the found data. +The storage space for the \fIdptr\fR element is allocated using +\fBmalloc(3)\fR. \fBGdbm\fI does not automatically free this data. +It is the programmer's responsibility to free this storage when it is +no longer needed. + +To search for some data, without retrieving it: + +.BI "int gdbm_exists (GDBM_FILE " dbf ", datum " key ); + +\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is +the key data to search for. + +If the \fIkey\fR is found within the database, the return value +will be true. If nothing appropiate is found, false is returned. +This routine is useful for checking for the existence of a record, +without performing the memory allocation done by \fBgdbm_fetch\fR. +.PP +To remove some data from the database: + +.BI "int gdbm_delete (GDBM_FILE " dbf ", datum " key ); + +\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is the +key data. + +The return value is \-1 if the item is not present or the requester is a reader. +The return value is 0 if there was a successful delete. + +The next two routines allow for accessing all items in the database. This +access is not key sequential, but it is guaranteed to visit every key in +the database once. (The order has to do with the hash values.) + +.BI "datum gdbm_firstkey (GDBM_FILE " dbf ");" +.br +.BI "datum gdbm_nextkey (GDBM_FILE " dbf ", datum " key ); + +\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is the +key data. + +The return values are both of type \fBdatum\fR. If the \fIdptr\fR +element of the return value is NULL, there is no first key or next key. +Again notice that \fIdptr\fR points to data allocated by \fBmalloc(3)\fR +and \fBgdbm\fR will not free it for you. + +These functions were intended to visit the database in read-only algorithms, +for instance, to validate the database or similar operations. + +File `visiting' is based on a `hash table'. \fIgdbm_delete\fR re-arranges the +hash table to make sure that any collisions in the table do not leave some item +`un-findable'. The original key order is NOT guaranteed to remain unchanged in +ALL instances. It is possible that some key will not be visited if a loop like +the following is executed: +.sp +.nf +.in +5 +key = gdbm_firstkey (dbf); +while (key.dptr) + { + nextkey = gdbm_nextkey (dbf, key); + if (some condition) + gdbm_delete ( dbf, key ); + free (key.dptr); + key = nextkey; + } +.in +.fi +.PP +The following routine should be used very infrequently. + +.BI "int gdbm_reorganize (GDBM_FILE " dbf ");" + +If you have had a lot of deletions and would like to shrink the space +used by the \fBgdbm\fR file, this routine will reorganize the database. +\fBGdbm\fR will not shorten the length of a \fBgdbm\fR file except by +using this reorganization. (Deleted file space will be reused.) + +Unless your database was opened with the \fBGDBM_SYNC\fR flag, \fBgdbm\fR does not +wait for writes to be flushed to the disk before continuing. +The following routine can be used to guarantee that the database is +physically written to the disk file. + +.BI "void gdbm_sync (GDBM_FILE " dbf ");" + +It will not return until the disk file state is syncronized with the +in-memory state of the database. + +To convert a \fBgdbm\fR error code into English text, use this routine: + +.BI "const char *gdbm_strerror (gdbm_error " errno ); + +\fBGdbm\fR now supports the ability to set certain options on an +already open database. + +.BI "int gdbm_setopt (GDBM_FILE " dbf ", int " option ", int " value ", int " size ); + +Where \fIdbf\fR is the return value from a previous call to \fBgdbm_open\fR, +and \fIoption\fR specifies which option to set. The valid options are +currently: +.TP +.B GDBM_CACHESIZE +Set the size of the internal bucket cache. This option may only be set once +on each \fIGDBM_FILE\fR descriptor, and is set automatically to 100 upon the +first access to the database. +.TP +.B GDBM_FASTMODE + Set \fBfast mode\fR to either on or off. This allows \fBfast mode\fR to +be toggled on an already open and active database. \fIvalue\fR (see below) +should be set to either TRUE or FALSE. \fIThis option is now obsolete.\fR +.TP +.B GDBM_SYNCMODE +Turn on or off file system synchronization operations. This setting defaults +to off; \fIvalue\fR (see below) should be set to either TRUE or FALSE. +.TP +.B GDBM_CENTFREE +Set \fBcentral free block pool\fR to either on or off. +The default is off, which is how previous versions of \fBGdbm\fR +handled free blocks. If set, this option causes all subsequent free +blocks to be placed in the \fBglobal\fR pool, allowing (in thoery) +more file space to be reused more quickly. \fIvalue\fR (see below) should +be set to either TRUE or FALSE. +\fINOTICE: This feature is still under study.\fR +.TP +.B GDBM_COALESCEBLKS +Set \fBfree block merging\fR to either on or off. +The default is off, which is how previous versions of \fBGdbm\fR +handled free blocks. If set, this option causes adjacent free blocks +to be merged. This can become a CPU expensive process with time, though, +especially if used in conjunction with \fBGDBM_CENTFREE\fR. \fIvalue\fR +(see below) should be set to either TRUE or FALSE. +\fINOTICE: This feature is still under study.\fR +.PP +\fIvalue\fR is the value to set \fIoption\fR to, specified as an integer +pointer. \fIsize\fR is the size of the data pointed to by \fIvalue\fR. +The return value will be \-1 upon failure, or 0 upon success. The global +variable \fIgdbm_errno\fR will be set upon failure. + +For instance, to set a database to use a cache of 10, after opening it +with \fBgdbm_open\fR, but prior to accessing it in any way, the following +code could be used: +.sp +.nf +.in +5 +int value = 10; + +ret = gdbm_setopt( dbf, GDBM_CACHESIZE, &value, sizeof(int)); +.in +.fi +.PP +If the database was opened with the \fBGDBM_NOLOCK\fR flag, the user may +wish to perform their own file locking on the database file in order to +prevent multiple writers operating on the same file simultaneously. + +In order to support this, the \fIgdbm_fdesc\fR routine is provided. + +.BI "int gdbm_fdesc (GDBM_FILE " dbf ); + +Where \fIdbf\fR is the return value from a previous call to \fBgdbm_open\fR. +The return value will be the file descriptor of the database. + +The following two external variables may be useful: + +\fIgdbm_errno\fR is the variable that contains more information about +gdbm errors. (gdbm.h has the definitions of the error values and +defines gdbm_errno as an external variable.) + +\fIgdbm_version\fR is the string containing the version information. + +There are a few more things of interest. First, \fBgdbm\fR files are +not "sparse". You can copy them with the UNIX \fBcp(1)\fR command and +they will not expand in the copying process. Also, there is a +compatibility mode for use with programs that already use UNIX +\fBdbm\fR. In this compatibility mode, no \fRgdbm\fR file pointer is +required by the programmer, and only one file may be opened at a time. +All users in compatibility mode are assumed to be writers. If the +\fBgdbm\fR file is a read only, it will fail as a writer, but will +also try to open it as a reader. All returned pointers in datum +structures point to data that \fBgdbm\fR WILL free. They should be +treated as static pointers (as standard UNIX \fBdbm\fR does). +.SH LINKING +This library is accessed by specifying \fI\-lgdbm\fR as the last +parameter to the compile line, e.g.: +.sp +.nf +.in +5 +gcc \-o prog prog.c \-lgdbm +.in +.fi +.PP +If you wish to use the \fBdbm\fR or \fBndbm\fR compatibility routines, +you must link in the \fIgdbm_compat\fR library as well. For example: +.sp +.nf +.in +5 +gcc \-o prog proc.c \-lgdbm \-lgdbm_compat +.in +.fi +.\" .SH BUGS + +.SH "BUG REPORTS" +Send bug reports to <bug\-gdbm@gnu.org>. +.SH "SEE ALSO" +.BR gdbm_dump (1), +.BR gdbm_load (1), +.BR gdbmtool (1). +.SH AUTHORS +by Philip A. Nelson, Jason Downs and Sergey Poznyakoff. +.SH COPYRIGHT +Copyright \(co 1990 - 2011 Free Software Foundation, Inc. + +GDBM 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 1, or (at your option) +any later version. + +GDBM 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 GDBM. If not, see <http://gnu.org/licenses/gpl.html> +.SH CONTACTS +You may contact the original author by: +.br + e-mail: phil@cs.wwu.edu +.br + us-mail: Philip A. Nelson +.br +Computer Science Department +.br +Western Washington University +.br +Bellingham, WA 98226 + +You may contact the current maintainers by: +.br + e-mail: downsj@downsj.com +.br +and + e-mail: gray@gnu.org + +.\" Local variables: +.\" eval: (add-hook 'write-file-hooks 'time-stamp) +.\" time-stamp-start: ".TH GDBM 3 \"" +.\" time-stamp-format: "%:B %:d, %:y" +.\" time-stamp-end: "\"" +.\" time-stamp-line-limit: 20 +.\" end: diff --git a/doc/gdbm.info b/doc/gdbm.info new file mode 100644 index 0000000..4e086e6 --- /dev/null +++ b/doc/gdbm.info @@ -0,0 +1,3013 @@ +This is gdbm.info, produced by makeinfo version 4.13 from gdbm.texinfo. + +INFO-DIR-SECTION Programming & development tools +START-INFO-DIR-ENTRY +* GDBM: (gdbm). The GNU database manager. +* gdbm_dump: gdbm_dump(gdbm). Dump the GDBM database into a flat file. +* gdbm_load: gdbm_load(gdbm). Load the database from a flat file. +END-INFO-DIR-ENTRY + + Published by the Free Software Foundation, 51 Franklin Street, Fifth +Floor Boston, MA 02110-1301, USA + + Copyright (C) 1989-1999, 2007-2011 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover, and no Back-Cover texts. A copy of +the license is included in the section entitled "GNU Free Documentation +License." + + +File: gdbm.info, Node: Top, Next: Copying, Up: (dir) + +The GNU database manager. +************************* + +GNU `dbm' is a library of functions implementing a hashed database on a +disk file. This manual documents GNU `dbm' Version 1.11 (`gdbm'). The +software was originally written by Philip A. Nelson. This document +was originally written by Pierre Gaumond from texts written by Phil. + +* Menu: + +Introduction: + +* Copying:: Your rights. +* Intro:: Introduction to GNU dbm. +* List:: List of functions. + +Functions: + +* Open:: Opening the database. +* Close:: Closing the database. +* Count:: Counting records in the database. +* Store:: Inserting and replacing records in the database. +* Fetch:: Searching records in the database. +* Delete:: Removing records from the database. +* Sequential:: Sequential access to records. +* Reorganization:: Database reorganization. +* Sync:: Insure all writes to disk have competed. +* Flat files:: Export and import to Flat file format. +* Errors:: Convert internal error codes into English. +* Options:: Setting internal options. +* Locking:: File locking. + +* Error codes:: Error codes returned by `gdbm' calls. +* Variables:: Two useful variables. +* Compatibility:: Compatibility with UNIX dbm and ndbm. + +Programs + +* gdbmtool:: Examine and modify a GDBM database. +* gdbm_dump:: Dump the database into a flat file. +* gdbm_load:: Load the database from a flat file. +* gdbmexport:: Export a database into a portable format. +* Exit codes:: Exit codes returned by GDBM utilities. + +Other topics: + +* Bugs:: Problems and bugs. +* Resources:: Additional resources, + +* GNU Free Documentation License:: Document license. +* Index:: Index + + +File: gdbm.info, Node: Copying, Next: Intro, Prev: Top, Up: Top + +1 Copying Conditions. +********************* + +This library is "free"; this means that everyone is free to use it and +free to redistribute it on a free basis. GNU `dbm' (`gdbm') is not in +the public domain; it is copyrighted and there are restrictions on its +distribution, but these restrictions are designed to permit everything +that a good cooperating citizen would want to do. What is not allowed +is to try to prevent others from further sharing any version of `gdbm' +that they might get from you. + + Specifically, we want to make sure that you have the right to give +away copies `gdbm', that you receive source code or else can get it if +you want it, that you can change these functions or use pieces of them +in new free programs, and that you know you can do these things. + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies `gdbm', you must give the recipients all the rights that you +have. You must make sure that they, too, receive or can get the source +code. And you must tell them their rights. + + Also, for our own protection, we must make certain that everyone +finds out that there is no warranty for anything in the `gdbm' +distribution. If these functions are modified by someone else and +passed on, we want their recipients to know that what they have is not +what we distributed, so that any problems introduced by others will not +reflect on our reputation. + + `Gdbm' is currently distributed under the terms of the GNU General +Public License, Version 3. (_NOT_ under the GNU General Library Public +License.) A copy the GNU General Public License is included with the +distribution of `gdbm'. + + +File: gdbm.info, Node: Intro, Next: List, Prev: Copying, Up: Top + +2 Introduction to GNU `dbm'. +**************************** + +GNU `dbm' (`gdbm') is a library of database functions that use +extensible hashing and works similar to the standard UNIX `dbm' +functions. These routines are provided to a programmer needing to +create and manipulate a hashed database. (`gdbm' is _NOT_ a complete +database package for an end user.) + + The basic use of `gdbm' is to store key/data pairs in a data file. +Each key must be unique and each key is paired with only one data item. +The keys can not be directly accessed in sorted order. The basic unit +of data in `gdbm' is the structure: + + typedef struct { + char *dptr; + int dsize; + } datum; + + This structure allows for arbitrary sized keys and data items. + + The key/data pairs are stored in a `gdbm' disk file, called a `gdbm' +database. An application must open a `gdbm' database to be able +manipulate the keys and data contained in the database. `gdbm' allows +an application to have multiple databases open at the same time. When +an application opens a `gdbm' database, it is designated as a `reader' +or a `writer'. A `gdbm' database can be opened by at most one writer +at a time. However, many readers may open the database simultaneously. +Readers and writers can not open the `gdbm' database at the same time. + + +File: gdbm.info, Node: List, Next: Open, Prev: Intro, Up: Top + +3 List of functions. +******************** + +The following is a quick list of the functions contained in the `gdbm' +library. The include file `gdbm.h', that can be included by the user, +contains a definition of these functions. + + #include <gdbm.h> + + GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func); + void gdbm_close(dbf); + int gdbm_store(dbf, key, content, flag); + datum gdbm_fetch(dbf, key); + int gdbm_delete(dbf, key); + datum gdbm_firstkey(dbf); + datum gdbm_nextkey(dbf, key); + int gdbm_reorganize(dbf); + void gdbm_sync(dbf); + int gdbm_exists(dbf, key); + char *gdbm_strerror(errno); + int gdbm_setopt(dbf, option, value, size); + int gdbm_fdesc(dbf); + int gdbm_export (GDBM_FILE, const char *, int, int); + int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp); + int gdbm_import (GDBM_FILE, const char *, int); + int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag); + int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount); + int gdbm_version_cmp (int const a[], int const b[]); + + The `gdbm.h' include file is often in the `/usr/local/include' +directory. (The actual location of `gdbm.h' depends on your local +installation of `gdbm'.) + + +File: gdbm.info, Node: Open, Next: Close, Prev: List, Up: Top + +4 Opening the database. +*********************** + + -- gdbm interface: GDBM_FILE gdbm_open (const char *NAME, int + BLOCK_SIZE, int FLAGS, int MODE, void (*fatal_func)(const + char *)) + Initializes `gdbm' system. If the file has a size of zero bytes, + a file initialization procedure is performed, setting up the + initial structure in the file. + + The arguments are: + + NAME + The name of the file (the complete name, `gdbm' does not + append any characters to this name). + + BLOCK_SIZE + It is used during initialization to determine the size of + various constructs. It is the size of a single transfer from + disk to memory. This parameter is ignored if the file has + been previously initialized. The minimum size is 512. If + the value is less than 512, the file system block size is + used, otherwise the value of BLOCK_SIZE is used. + + FLAGS + If `flags' is set to `GDBM_READER', the user wants to just + read the database and any call to `gdbm_store' or + `gdbm_delete' will fail. Many readers can access the + database at the same time. If `flags' is set to + `GDBM_WRITER', the user wants both read and write access to + the database and requires exclusive access. If `flags' is set + to `GDBM_WRCREAT', the user wants both read and write access + to the database and wants it created if it does not already + exist. If `flags' is set to `GDBM_NEWDB', the user want a + new database created, regardless of whether one existed, and + wants read and write access to the new database. + + The following may also be logically or'd into the database + flags: `GDBM_SYNC', which causes all database operations to be + synchronized to the disk, `GDBM_NOLOCK', which prevents the + library from performing any locking on the database file, and + `GDBM_NOMMAP', which disables the memory mapping mechanism. + The option `GDBM_FAST' is now obsolete, since `gdbm' defaults + to no-sync mode. + + If the host `open' call (*note open: (open(2))open.) + supports the `O_CLOEXEC' flag, the `GDBM_CLOEXEC' can be or'd + into the flags, to enable the close-on-exec flag for the + database file descriptor. + + MODE + File mode (see *note change permissions of a file: + (chmod(2))chmod, and *note open a file: (open(2))open.), + which is used if the file is created). + + FATAL_FUNC + A function for `gdbm' to call if it detects a fatal error. + The only parameter of this function is a string. If the + value of `NULL' is provided, `gdbm' will use a default + function. + + The return value, is the pointer needed by all other functions to + access that `gdbm' file. If the return is the `NULL' pointer, + `gdbm_open' was not successful. The errors can be found in + `gdbm_errno' variable (*note gdbm_errno: Variables.). Available + error codes are discussed in *note Error codes::. + + In all of the following calls, the parameter DBF refers to the + pointer returned from `gdbm_open'. + + +File: gdbm.info, Node: Close, Next: Count, Prev: Open, Up: Top + +5 Closing the database. +*********************** + +It is important that every file opened is also closed. This is needed +to update the reader/writer count on the file: + + -- gdbm interface: void gdbm_close (GDBM_FILE DBF) + This function closes the `gdbm' file and frees all memory + associated with it. The parameter is: + + DBF + The pointer returned by `gdbm_open'. + + +File: gdbm.info, Node: Count, Next: Store, Prev: Close, Up: Top + +6 Number of Records +******************* + + -- gdbm interface: int gdbm_count (GDBM_FILE DBF, gdbm_count_t *PCOUNT) + Counts number of records in the database DBF. On success, stores + it in the memory location pointed to by PCOUNT and return 0. On + error, sets `gdbm_errno' (if relevant, also `errno') and returns + -1. + + +File: gdbm.info, Node: Store, Next: Fetch, Prev: Count, Up: Top + +7 Inserting and replacing records in the database. +************************************************** + + -- gdbm interface: int gdbm_store (GDBM_FILE DBF, datum KEY, datum + CONTENT, int FLAG) + The function `gdbm_store' inserts or replaces records in the + database. + + The parameters are: + + DBF + The pointer returned by `gdbm_open'. + + KEY + The search key. + + CONTENT + The data to be associated with the key. + + FLAG + Defines the action to take when the key is already in the + database. The value `GDBM_REPLACE' (defined in `gdbm.h') + asks that the old data be replaced by the new CONTENT. The + value `GDBM_INSERT' asks that an error be returned and no + action taken if the KEY already exists. + + This function can return the following values: + + -1 + The item was not stored in the database because the caller + was not an official writer or either KEY or CONTENT have a + `NULL' `dptr' field. + + Both KEY and CONTENT must have the `dptr' field be a + non-`NULL' value. Since a `NULL' `dptr' field is used by + other functions to indicate an error, it cannot be valid data. + + +1 + The item was not stored because the argument FLAG was + `GDBM_INSERT' and the KEY was already in the database. + + 0 + No error. The value of CONTENT is keyed by KEY. The file on + disk is updated to reflect the structure of the new database + before returning from this function. + +If you store data for a KEY that is already in the data base, `gdbm' +replaces the old data with the new data if called with `GDBM_REPLACE'. +You do not get two data items for the same `key' and you do not get an +error from `gdbm_store'. + + The size in `gdbm' is not restricted like `dbm' or `ndbm'. Your +data can be as large as you want. + + +File: gdbm.info, Node: Fetch, Next: Delete, Prev: Store, Up: Top + +8 Searching for records in the database. +**************************************** + + -- gdbm interface: datum gdbm_fetch (GDBM_FILE DBF, datum KEY) + Looks up a given KEY and returns the information associated with + it. The `dptr' field in the structure that is returned points to a + memory block allocated by `malloc'. It is the caller's + responsibility to free it when no longer needed. + + If the `dptr' is `NULL', no data was found. + + The parameters are: + + DBF + The pointer returned by `gdbm_open'. + + KEY + The search key. + +An example of using this function: + + content = gdbm_fetch (dbf, key); + if (content.dptr == NULL) + { + fprintf(stderr, "key not found\n"); + } + else + { + /* do something with content.dptr */ + } + + You may also search for a particular key without retrieving it: + + -- gdbm interface: int gdbm_exists (GDBM_FILE DBF, datum KEY) + Returns `true' (`1') if the KEY exists in DBF and `false' (`0') + otherwise. + + The parameters are: + + DBF + The pointer returned by `gdbm_open'. + + KEY + The search key. + + +File: gdbm.info, Node: Delete, Next: Sequential, Prev: Fetch, Up: Top + +9 Removing records from the database. +************************************* + +To remove some data from the database, use the `gdbm_delete' function. + + -- gdbm interface: int gdbm_delete (GDBM_FILE DBF, datum KEY) + Deletes the data associated with the given KEY, if it exists in + the database DBF. The file on disk is updated to reflect the + structure of the new database before returning from this function. + + The parameters are: + + DBF + The pointer returned by `gdbm_open'. + + DATUM KEY + The search key. + + The function returns `-1' if the item is not present or the + requester is a reader. The return of `0' marks a successful + delete. + + +File: gdbm.info, Node: Sequential, Next: Reorganization, Prev: Delete, Up: Top + +10 Sequential access to records. +******************************** + +The next two functions allow for accessing all items in the database. +This access is not `key' sequential, but it is guaranteed to visit every +`key' in the database once. The order has to do with the hash values. +`gdbm_firstkey' starts the visit of all keys in the database. +`gdbm_nextkey' finds and reads the next entry in the hash structure for +`dbf'. + + -- gdbm interface: datum gdbm_firstkey (GDBM_FILE DBF) + Initiate sequential access to the database DBF. The returned + value is the first key accessed in the database. If the `dptr' + field in the returned datum is `NULL', the database contains no + data. + + Otherwise, `dptr' points to a memory block obtained from `malloc', + which holds the key value. The caller is responsible for freeing + this memory block when no longer needed. + + -- gdbm interface: datum gdbm_nextkey (GDBM_FILE DBF, datum PREV) + This function continues the iteration over the keys in DBF, + initiated by `gdbm_firstkey'. The parameter PREV holds the value + returned from a previous call to `gdbm_nextkey' or `gdbm_firstkey'. + + The function returns next key from the database. If the `dptr' + field in the returned datum is `NULL', all keys in the database + has been visited. + + Otherwise, `dptr' points to a memory block obtained from `malloc', + which holds the key value. The caller is responsible for freeing + this memory block when no longer needed. + + These functions were intended to visit the database in read-only +algorithms, for instance, to validate the database or similar +operations. The usual algorithm for sequential access is: + + key = gdbm_firstkey (dbf); + while (key.dptr) + { + datum nextkey; + + /* do something with the key */ + ... + + /* Obtain the next key */ + nextkey = gdbm_nextkey (dbf, key); + /* Reclaim the memory used by the key */ + free (key.dptr); + /* Use nextkey in the next iteration. */ + key = nextkey; + } + + Care should be taken when the `gdbm_delete' function is used in such +a loop. File visiting is based on a "hash table". The `gdbm_delete' +function re-arranges the hash table to make sure that any collisions in +the table do not leave some item "un-findable". The original key order +is _not_ guaranteed to remain unchanged in all instances. So it is +possible that some key will not be visited if a loop like the following +is executed: + + key = gdbm_firstkey (dbf); + while (key.dptr) + { + datum nextkey; + if (some condition) + { + gdbm_delete (dbf, key); + } + nextkey = gdbm_nextkey (dbf, key); + free (key.dptr); + key = nextkey; + } + + +File: gdbm.info, Node: Reorganization, Next: Sync, Prev: Sequential, Up: Top + +11 Database reorganization. +*************************** + +The following function should be used very seldom. + + -- gdbm interface: int gdbm_reorganize (GDBM_FILE DBF) + Reorganizes the database. + + The parameter is: + + DBF + The pointer returned by `gdbm_open'. + + If you have had a lot of deletions and would like to shrink the space +used by the `gdbm' file, this function will reorganize the database. +This results, in particular, in shortening the length of a `gdbm' file +by removing the space occupied by deleted records. + + This reorganization requires creating a new file and inserting all +the elements in the old file DBF into the new file. The new file is +then renamed to the same name as the old file and DBF is updated to +contain all the correct information about the new file. If an error is +detected, the return value is negative. The value zero is returned +after a successful reorganization. + + +File: gdbm.info, Node: Sync, Next: Flat files, Prev: Reorganization, Up: Top + +12 Database Synchronization +*************************** + +Unless your database was opened with the `GDBM_SYNC' flag, `gdbm' does +not wait for writes to be flushed to the disk before continuing. This +allows for faster writing of databases at the risk of having a +corrupted database if the application terminates in an abnormal +fashion. The following function allows the programmer to make sure the +disk version of the database has been completely updated with all +changes to the current time. + + -- gdbm interface: void gdbm_sync (GDBM_FILE DBF) + Synchronizes the changes in DBF with its disk file. The parameter + is a pointer returned by `gdbm_open'. + + This function would usually be called after a complete set of + changes have been made to the database and before some long + waiting time. The `gdbm_close' function automatically calls the + equivalent of `gdbm_sync' so no call is needed if the database is + to be closed immediately after the set of changes have been made. + + +File: gdbm.info, Node: Flat files, Next: Errors, Prev: Sync, Up: Top + +13 Export and Import +******************** + +`Gdbm' databases can be converted into so-called "flat format" files. +Such files cannot be used for searching, their sole purpose is to keep +the data from the database for restoring it when the need arrives. +There are two flat file formats, which differ in the way they represent +the data and in the amount of meta-information stored. Both formats +can be used, for example, to migrate between the different versions of +`gdbm' databases. Generally speaking, flat files are safe to send over +the network, and can be used to recreate the database on another +machine. The recreated database is guaranteed to be a byte-to-byte +equivalent of the database from which the flat file was created. This +does not necessarily mean, however, that this file can be used in the +same way as the original one. For example, if the original database +contained non-ASCII data (e.g. C structures, integers etc.), the +recreated database can be of any use only if the target machine has the +same integer size and byte ordering as the source one and if its C +compiler uses the same packing conventions as the one which generated C +which populated the original database. In general, such binary +databases are not portable between machines, unless you follow some +stringent rules on what data is written to them and how it is +interpreted. + + The GDBM version 1.11 supports two flat file formats. The "binary" +flat file format was first implemented in GDBM version 1.9.1. This +format stores only key/data pairs, it does not keep information about +the database file itself. As its name implies, files in this format +are binary files. + + The "ascii" flat file format encodes all data in base64 and stores +not only key/data pairs, but also the original database file metadata, +such as file name, mode and ownership. Files in this format can be +sent without additional encapsulation over transmission channels that +normally allow only ASCII data, such as, e.g. SMTP. Due to additional +metadata they allow for restoring an exact copy of the database, +including file ownership and privileges, which is especially important +if the database in question contained some security-related data. + + We call a process of creating a flat file from a database +"exporting" or "dumping" this database. The reverse process, creating +the database from a flat file is called "importing" or "loading" the +database. + + -- gdbm interface: int gdbm_dump (GDBM_FILE DBF, const char *FILENAME, + int FORMAT, int OPEN_FLAGS, int MODE) + Dumps the database file to the named file in requested format. + Arguments are: + + DBF + A pointer to the source database, returned by a prior call to + `gdbm_open'. + + FILENAME + Name of the dump file. + + FORMAT + Output file format. Allowed values are: + `GDBM_DUMP_FMT_BINARY' to create a binary dump and + `GDBM_DUMP_FMT_ASCII' to create an ASCII dump file. + + OPEN_FLAGS + How to create the output file. If FLAG is `GDBM_WRCREAT' the + file will be created if it does not exist. If it does exist, + the `gdbm_dump' will fail. + + If FLAG is `GDBM_NEWDB', the function will create a new + output file, replacing it if it already exists. + + MODE + The permissions to use when creating the output file. See + *note open a file: (open(2))open, for a detailed discussion. + + -- gdbm interface: int gdbm_load (GDBM_FILE *PDBF, const char + *FILENAME, int FLAG, int META_MASK, unsigned long *ERRLINE) + Loads data from the dump file FILENAME into the database pointed + to by PDBF. The latter can point to `NULL', in which case the + function will try to create a new database. If it succeeds, the + function will return, in the memory location pointed to by PDBF, a + pointer to the newly created database. If the dump file carries no + information about the original database file name, the function + will set `gdbm_errno' to `GDBM_NO_DBNAME' and return `-1', + indicating failure. + + The FLAG has the same meaning as the FLAG argument to the + `gdbm_store' function (*note Store::). + + The META_MASK argument can be used to disable restoring certain + bits of file's meta-data from the information in the input dump + file. It is a binary OR of zero or more of the following: + + GDBM_META_MASK_MODE + Do not restore file mode. + + GDBM_META_MASK_OWNER + Do not restore file owner. + + The function returns 0 upon successful completion or -1 on fatal + errors and 1 on mild (non-fatal) errors. + + If a fatal error occurs, `gdbm_errno' will be set to one of the + following values: + + GDBM_FILE_OPEN_ERROR + Input file (FILENAME) cannot be opened. The `errno' variable + can be used to get more detail about the failure. + + GDBM_MALLOC_ERROR + Not enough memory to load data. + + GDBM_FILE_READ_ERROR + Reading from FILENAME failed. The `errno' variable can be + used to get more detail about the failure. + + GDBM_ILLEGAL_DATA + Input contained some illegal data. + + GDBM_ITEM_NOT_FOUND + This error can occur only when the input file is in ASCII + format. It indicates that the data part of the record about + to be read lacked length specification. Application + developers are advised to treat this error equally as + `GDBM_ILLEGAL_DATA'. + + Mild errors mean that the function was able to successfully load + and restore the data, but was unable to change database file + metadata afterward. The table below lists possible values for + `gdbm_errno' in this case. To get more detail, inspect the system + `errno' variable. + + GDBM_ERR_FILE_OWNER + The function was unable to restore database file owner. + + GDBM_ERR_FILE_MODE + The function was unable to restore database file mode + (permission bits). + + If an error occurs while loading data from an input file in ASCII + format, the number of line in which the error occurred will be + stored in the location pointed to by the ERRLINE parameter, unless + it is `NULL'. + + If the line information is not available or applicable, ERRLINE + will be set to `0'. + + -- gdbm interface: int gdbm_dump_to_file (GDBM_FILE DBF, FILE *FP, int + FORMAT) + This is an alternative entry point to `gdbm_dump' (which see). + Arguments are: + + DBF + A pointer to the source database, returned by a call to + `gdbm_open'. + + FP + File to write the data to. + + FORMAT + Format of the dump file. See the FORMAT argument to the + `gdbm_dump' function. + + -- gdbm interface: int gdbm_load_from_file (GDBM_FILE *PDBF, FILE *FP, + int REPLACE, int META_MASK, unsigned long *LINE) + This is an alternative entry point to `gdbm_dump'. It writes the + output to FP which must be a file open for writing. The rest of + arguments is the same as for `gdbm_load' (excepting of course + FLAG, which is not needed in this case). + + -- gdbm interface: int gdbm_export (GDBM_FILE DBF, const char + *EXPORTFILE, int FLAG, int MODE) + This function is retained for compatibility with GDBM 1.10 and + earlier. It dumps the database to a file in binary dump format and + is entirely equivalent to + + gdbm_dump(DBF, EXPORTFILE, GDBM_DUMP_FMT_BINARY, + FLAG, MODE) + + + -- gdbm interface: int gdbm_export_to_file (GDBM_FILE DBF, FILE *FP) + This is an alternative entry point to `gdbm_export'. This + function writes to file FP a binary dump of the database DBF. + + -- gdbm interface: int gdbm_import (GDBM_FILE DBF, const char + *IMPORTFILE, int FLAG) + This function is retained for compatibility with GDBM 1.10 and + earlier. It loads the file IMPORTFILE, which must be a binary + flat file, into the database DBF and is equivalent to the + following construct: + + DBF = gdbm_open (IMPORTFILE, 0, + FLAG == GDBM_REPLACE ? + GDBM_WRCREAT : GDBM_NEWDB, + 0600, NULL); + gdbm_load (&DBF, EXPORTFILE, 0, FLAG, NULL) + + -- gdbm interface: int gdbm_import_from_file (GDBM_FILE DBF, FILE *FP, + int FLAG) + An alternative entry point to `gdbm_import'. Reads the binary + dump from the file FP and stores the key/value pairs to DBF. + *Note Store::, for a description of FLAG. + + This function is equivalent to: + + DBF = gdbm_open (IMPORTFILE, 0, + FLAG == GDBM_REPLACE ? + GDBM_WRCREAT : GDBM_NEWDB, + 0600, NULL); + gdbm_load_from_file (DBF, FP, FLAG, 0, NULL); + + +File: gdbm.info, Node: Errors, Next: Options, Prev: Flat files, Up: Top + +14 Error strings. +***************** + +To convert a `gdbm' error code into English text, use this routine: + + -- gdbm interface: const char * gdbm_strerror (gdbm_error ERRNO) + Converts ERRNO (which is an integer value) into a human-readable + descriptive text. Returns a pointer to a static string. The + caller must not alter or free the returned pointer. + + The ERRNO argument is usually the value of the global variable + `gdbm_errno'. *Note gdbm_errno: Variables. + + +File: gdbm.info, Node: Options, Next: Locking, Prev: Errors, Up: Top + +15 Setting options +****************** + +`Gdbm' supports the ability to set certain options on an already open +database. + + -- gdbm interface: int gdbm_setopt (GDBM_FILE DBF, int OPTION, void + *VALUE, int SIZE) + Sets an option on the database or returns the value of an option. + + The parameters are: + + DBF + The pointer returned by `gdbm_open'. + + OPTION + The option to be set or retrieved. + + VALUE + A pointer to the value to which OPTION will be set or where to + place the option value (depending on the option). + + SIZE + The length of the data pointed to by VALUE. + + The valid options are: + +GDBM_SETCACHESIZE +GDBM_CACHESIZE + Set the size of the internal bucket cache. This option may only be + set once on each GDBM_FILE descriptor, and is set automatically to + 100 upon the first access to the database. The VALUE should point + to a `size_t' holding the desired cache size. + + The `GDBM_CACHESIZE' option is provided for compatibility with + earlier versions. + +GDBM_GETCACHESIZE + Return the size of the internal bucket cache. The VALUE should + point to a `size_t' variable, where the size will be stored. + +GDBM_GETFLAGS + Return the flags describing the state of the database. The VALUE + should point to a `int' variable where to store the flags. The + return is the same as the flags used when opening the database + (*note gdbm_open: Open.), except that it reflects the current + state (which may have been altered by another calls to + `gdbm_setopt'. + +GDBM_FASTMODE + Enable or disable the "fast writes mode", i.e. writes without + subsequent synchronization. The VALUE should point to an integer: + `TRUE' to enable fast mode, and `FALSE' to disable it. + + This option is retained for compatibility with previous versions of + `gdbm'. Its effect is the reverse of `GDBM_SETSYNCMODE' (see + below). + +GDBM_SETSYNCMODE +GDBM_SYNCMODE + Turn on or off file system synchronization operations. This + setting defaults to off. The VALUE should point to an integer: + `TRUE' to turn synchronization on, and `FALSE' to turn it off. + + Note, that this option is a reverse of `GDBM_FASTMODE', i.e. + calling `GDBM_SETSYNCMODE' with `TRUE' has the same effect as + calling `GDBM_FASTMODE' with `FALSE'. + + The `GDBM_SYNCMODE' option is provided for compatibility with + earlier versions. + +GDBM_GETSYNCMODE + Return the current synchronization status. The VALUE should point + to an `int' where the status will be stored. + +GDBM_SETCENTFREE +GDBM_CENTFREE + _NOTICE: This feature is still under study._ + + Set central free block pool to either on or off. The default is + off, which is how previous versions of `gdbm' handled free blocks. + If set, this option causes all subsequent free blocks to be placed + in the _global_ pool, allowing (in theory) more file space to be + reused more quickly. The VALUE should point to an integer: `TRUE' + to turn central block pool on, and `FALSE' to turn it off. + + The `GDBM_CENTFREE' option is provided for compatibility with + earlier versions. + +GDBM_SETCOALESCEBLKS +GDBM_COALESCEBLKS + _NOTICE: This feature is still under study._ + + Set free block merging to either on or off. The default is off, + which is how previous versions of `gdbm' handled free blocks. If + set, this option causes adjacent free blocks to be merged. This + can become a CPU expensive process with time, though, especially if + used in conjunction with GDBM_CENTFREE. The VALUE should point to + an integer: `TRUE' to turn free block merging on, and `FALSE' to + turn it off. + +GDBM_GETCOALESCEBLKS + Return the current status of free block merging. The VALUE should + point to an `int' where the status will be stored. + +GDBM_SETMAXMAPSIZE + Sets maximum size of a memory mapped region. The VALUE should + point to a value of type `size_t', `unsigned long' or `unsigned'. + The actual value is rounded to the nearest page boundary (the page + size is obtained from `sysconf(_SC_PAGESIZE)'). + +GDBM_GETMAXMAPSIZE + Return the maximum size of a memory mapped region. The VALUE + should point to a value of type `size_t' where to return the data. + +GDBM_SETMMAP + Enable or disable memory mapping mode. The VALUE should point to + an integer: `TRUE' to enable memory mapping or `FALSE' to disable + it. + +GDBM_GETMMAP + Check whether memory mapping is enabled. The VALUE should point + to an integer where to return the status. + +GDBM_GETDBNAME + Return the name of the database disk file. The VALUE should point + to a variable of type `char**'. A pointer to the newly allocated + copy of the file name will be placed there. The caller is + responsible for freeing this memory when no longer needed. For + example: + + char *name; + + if (gdbm_setopt (dbf, GDBM_GETDBNAME, &name, sizeof (name))) + { + fprintf (stderr, "gdbm_setopt failed: %s\n", + gdbm_strerror (gdbm_errno)); + } + else + { + printf ("database name: %s\n", name); + free (name); + } + + + The return value will be `-1' upon failure, or `0' upon success. +The global variable `gdbm_errno' will be set upon failure. + + For instance, to set a database to use a cache of 10, after opening +it with `gdbm_open', but prior to accessing it in any way, the following +code could be used: + + int value = 10; + ret = gdbm_setopt (dbf, GDBM_CACHESIZE, &value, sizeof (int)); + + +File: gdbm.info, Node: Locking, Next: Error codes, Prev: Options, Up: Top + +16 File Locking. +**************** + +With locking disabled (if `gdbm_open' was called with `GDBM_NOLOCK'), +the user may want to perform their own file locking on the database file +in order to prevent multiple writers operating on the same file +simultaneously. + + In order to support this, the `gdbm_fdesc' routine is provided. + + -- gdbm interface: int gdbm_fdesc (GDBM_FILE DBF) + Returns the file descriptor of the database DBF. This value can + be used as an argument to `flock', `lockf' or similar calls. + + +File: gdbm.info, Node: Variables, Next: Compatibility, Prev: Error codes, Up: Top + +17 Useful global variables. +*************************** + +The following global variables and constants are available: + + -- Variable: gdbm_error gdbm_errno + This variable contains error code from the last failed `gdbm' + call. *Note Error codes::, for a list of available error codes and + their descriptions. + + Use `gdbm_strerror' (*note Errors::) to convert it to a + descriptive text. + + -- Variable: const char * gdbm_errlist[] + This variable is an array of error descriptions, which is used by + `gdbm_strerror' to convert error codes to human-readable text + (*note Errors::). You can access it directly, if you wish so. It + contains `_GDBM_MAX_ERRNO + 1' elements and can be directly + indexed by the error code to obtain a corresponding descriptive + text. + + -- Constant: _GDBM_MIN_ERRNO + The minimum error code used by `gdbm'. + + -- Constant: _GDBM_MAX_ERRNO + The maximum error code used by `gdbm'. + + -- Variable: const char * gdbm_version + A string containing the version information. + + -- Variable: int const gdbm_version_number[3] + This variable contains the `gdbm' version numbers: + + Index Meaning + --------------------------------------------------------------- + 0 Major number + 1 Minor number + 2 Patchlevel number + + Additionally, the following constants are defined in the `gdbm.h' + file: + + GDBM_VERSION_MAJOR + Major number. + + GDBM_VERSION_MINOR + Minor number. + + GDBM_VERSION_PATCH + Patchlevel number. + + These can be used to verify whether the header file matches the + library. + + To compare two split-out version numbers, use the following function: + + -- gdbm interface: int gdbm_version_cmp (int const A[3], int const + B[3]) + Compare two version numbers. Return `-1' if A is less than B, `1' + if A is greater than B and `0' if they are equal. + + Comparison is done from left to right, so that: + + a = { 1, 8, 3 }; + b = { 1, 8, 3 }; + gdbm_version_cmp (a, b) => 0 + + a = { 1, 8, 3 }; + b = { 1, 8, 2 }; + gdbm_version_cmp (a, b) => 1 + + a = { 1, 8, 3 }; + b = { 1, 9. 0 }; + gdbm_version_cmp (a, b) => -1 + + +File: gdbm.info, Node: Error codes, Next: Variables, Prev: Locking, Up: Top + +18 Error codes +************** + +This chapter summarizes error codes which can be set by the functions +in `gdbm' library. + +GDBM_NO_ERROR + No error occurred. + +GDBM_MALLOC_ERROR + Memory allocation failed. Not enough memory. + +GDBM_BLOCK_SIZE_ERROR + This error is set by the `gdbm_open' function (*note Open::), if + the value of its BLOCK_SIZE argument is incorrect. + +GDBM_FILE_OPEN_ERROR + The library was not able to open a disk file. This can be set by + `gdbm_open' (*note Open::), `gdbm_export' and `gdbm_import' + functions (*note Flat files::). + + Inspect the value of the system `errno' variable to get more + detailed diagnostics. + +GDBM_FILE_WRITE_ERROR + Writing to a disk file failed. This can be set by `gdbm_open' + (*note Open::), `gdbm_export' and `gdbm_import' functions. + + Inspect the value of the system `errno' variable to get more + detailed diagnostics. + +GDBM_FILE_SEEK_ERROR + Positioning in a disk file failed. This can be set by `gdbm_open' + (*note Open::) function. + + Inspect the value of the system `errno' variable to get a more + detailed diagnostics. + +GDBM_FILE_READ_ERROR + Reading from a disk file failed. This can be set by `gdbm_open' + (*note Open::), `gdbm_export' and `gdbm_import' functions. + + Inspect the value of the system `errno' variable to get a more + detailed diagnostics. + +GDBM_BAD_MAGIC_NUMBER + The file given as argument to `gdbm_open' function is not a valid + `gdbm' file: it has a wrong magic number. + +GDBM_EMPTY_DATABASE + The file given as argument to `gdbm_open' function is not a valid + `gdbm' file: it has zero length. + +GDBM_CANT_BE_READER + This error code is set by the `gdbm_open' function if it is not + able to lock file when called in `GDBM_READER' mode (*note + GDBM_READER: Open.). + +GDBM_CANT_BE_WRITER + This error code is set by the `gdbm_open' function if it is not + able to lock file when called in writer mode (*note Open::). + +GDBM_READER_CANT_DELETE + Set by the `gdbm_delete' (*note Delete::) if it attempted to + operate on a database that is open in read-only mode (*note + GDBM_READER: Open.). + +GDBM_READER_CANT_STORE + Set by the `gdbm_store' (*note Store::) if it attempted to operate + on a database that is open in read-only mode (*note GDBM_READER: + Open.). + +GDBM_READER_CANT_REORGANIZE + Set by the `gdbm_reorganize' (*note Reorganization::) if it + attempted to operate on a database that is open in read-only mode + (*note GDBM_READER: Open.). + +GDBM_UNKNOWN_UPDATE + Currently unused. Reserved for future uses. + +GDBM_ITEM_NOT_FOUND + Requested item was not found. This error is set by `gdbm_delete' + (*note Delete::) and `gdbm_fetch' (*note Fetch::) when the + requested KEY value is not found in the database. + +GDBM_REORGANIZE_FAILED + The `gdbm_reorganize' function is not able to create a temporary + database. *Note Reorganization::. + +GDBM_CANNOT_REPLACE + Cannot replace existing item. This error is set by the + `gdbm_store' if the requested KEY value is found in the database + and the FLAG parameter is not `GDBM_REPLACE'. *Note Store::, for + a detailed discussion. + +GDBM_ILLEGAL_DATA + Either KEY or CONTENT parameter was wrong in a call to to + `gdbm_store' (*note Store::). + +GDBM_OPT_ALREADY_SET + Requested option can be set only once and was already set. This + error is returned by the `gdbm_setopt' function. *Note + GDBM_CACHESIZE: Options. + +GDBM_OPT_ILLEGAL + The OPTION argument is not valid or the VALUE argument points to + an invalid value in a call to `gdbm_setopt' function. *Note + Options::. + +GDBM_BYTE_SWAPPED + The `gdbm_open' function (*note Open::) attempts to open a + database which is created on a machine with different byte + ordering. + +GDBM_BAD_FILE_OFFSET + The `gdbm_open' function (*note Open::) sets this error code if + the file it tries to open has a wrong magic number. + +GDBM_BAD_OPEN_FLAGS + Set by the `gdbm_export' function if supplied an invalid FLAGS + argument. *Note Flat files::. + +GDBM_FILE_STAT_ERROR + Getting information about a disk file failed. The system `errno' + will give more details about the error. + + This error can be set by the following functions: `gdbm_open', + `gdbm_reorganize'. + +GDBM_FILE_EOF + End of file was encountered where more data was expected to be + present. This error can occur when fetching data from the database + and usually means that the database is truncated or otherwise + corrupted. + + This error can be set by any GDBM function that does I/O. Some of + these functions are: `gdbm_delete', `gdbm_exists', `gdbm_fetch', + `gdbm_export', `gdbm_import', `gdbm_reorganize', `gdbm_firstkey', + `gdbm_nextkey', `gdbm_store'. + +GDBM_NO_DBNAME + Output database name is not specified. This error code is set by + `gdbm_load' (*note gdbm_load: gdbm_load function.) if the first + argument points to `NULL' and the input file does not specify the + database name. + +GDBM_ERR_FILE_OWNER + This error code is set by `gdbm_load' if it is unable to restore + database file owner. It is a mild error condition, meaning that + the data have been restored successfully, only changing the target + file owner failed. Inspect the system `errno' variable to get a + more detailed diagnostics. + +GDBM_ERR_FILE_MODE + This error code is set by `gdbm_load' if it is unable to restore + database file mode. It is a mild error condition, meaning that + the data have been restored successfully, only changing the target + file owner failed. Inspect the system `errno' variable to get a + more detailed diagnostics. + + + +File: gdbm.info, Node: Compatibility, Next: gdbmtool, Prev: Variables, Up: Top + +19 Compatibility with standard `dbm' and `ndbm'. +************************************************ + +`Gdbm' includes a compatibility layer, which provides traditional +`ndbm' and older `dbm' functions. The layer is compiled and installed +if the `--enable-libgdbm-compat' option is used when configuring the +package. + + The compatibility layer consists of two header files: `ndbm.h' and +`dbm.h' and the `libgdbm_compat' library. + + Older programs using `ndbm' or `dbm' interfaces can use +`libgdbm_compat' without any changes. To link a program with the +compatibility library, add the following two options to the `cc' +invocation: `-lgdbm -lgdbm_compat'. The `-L' option may also be +required, depending on where `gdbm' is installed, e.g.: + + cc ... -L/usr/local/lib -lgdbm -lgdbm_compat + + Databases created and manipulated by the compatibility interfaces +consist of two different files: `FILE.dir' and `FILE.pag'. This is +required by the POSIX specification and corresponds to the traditional +usage. Note, however, that despite the similarity of the naming +convention, actual data stored in these files has not the same format as +in the databases created by other `dbm' or `ndbm' libraries. In other +words, you cannot access a standard UNIX `dbm' file with GNU `dbm'! + + GNU `dbm' files are not `sparse'. You can copy them with the usual +`cp' command and they will not expand in the copying process. + +* Menu: + +* ndbm:: NDBM interface functions. +* dbm:: DBM interface functions. + + +File: gdbm.info, Node: ndbm, Next: dbm, Up: Compatibility + +19.1 NDBM interface functions. +============================== + +The functions below implement the POSIX `ndbm' interface: + + -- ndbm: DBM * dbm_open (char *FILE, int FLAGS, int MODE) + Opens a database. The FILE argument is the full name of the + database file to be opened. The function opens two files: + `FILE.pag' and `FILE.dir'. The FLAGS and MODE arguments have the + same meaning as the second and third arguments of `open' (*note + open a file: (open(2))open.), except that a database opened for + write-only access opens the files for read and write access and + the behavior of the `O_APPEND' flag is unspecified. + + The function returns a pointer to the `DBM' structure describing + the database. This pointer is used to refer to this database in + all operations described below. + + Any error detected will cause a return value of `NULL' and an + appropriate value will be stored in `gdbm_errno' (*note + Variables::). + + -- ndbm: void dbm_close (DBM *DBF) + Closes the database. The DBF argument must be a pointer returned + by an earlier call to `dbm_open'. + + -- ndbm: datum dbm_fetch (DBM *DBF, datum KEY) + Reads a record from the database with the matching key. The KEY + argument supplies the key that is being looked for. + + If no matching record is found, the `dptr' member of the returned + datum is `NULL'. Otherwise, the `dptr' member of the returned + datum points to the memory managed by the compatibility library. + The application should never free it. + + -- ndbm: int dbm_store (DBM *DBF, datum KEY, datum CONTENT, int MODE) + Writes a key/value pair to the database. The argument DBF is a + pointer to the `DBM' structure returned from a call to `dbm_open'. + The KEY and CONTENT provide the values for the record key and + content. The MODE argument controls the behavior of `dbm_store' + in case a matching record already exists in the database. It can + have one of the following two values: + + `DBM_REPLACE' + Replace existing record with the new one. + + `DBM_INSERT' + The existing record is left unchanged, and the function + returns `1'. + + If no matching record exists in the database, new record will be + inserted no matter what the value of the MODE is. + + -- ndbm: int dbm_delete (DBM *DBF, datum KEY) + Deletes the record with the matching key from the database. If the + function succeeds, `0' is returned. Otherwise, if no matching + record is found or if an error occurs, `-1' is returned. + + -- ndbm: datum dbm_firstkey (DBM *DBF) + Initializes iteration over the keys from the database and returns + the first key. Note, that the word `first' does not imply any + specific ordering of the keys. + + If there are no records in the database, the `dptr' member of the + returned datum is `NULL'. Otherwise, the `dptr' member of the + returned datum points to the memory managed by the compatibility + library. The application should never free it. + + -- ndbm: datum dbm_nextkey (DBM *DBF) + Continues the iteration started by `dbm_firstkey'. Returns the + next key in the database. If the iteration covered all keys in the + database, the `dptr' member of the returned datum is `NULL'. + Otherwise, the `dptr' member of the returned datum points to the + memory managed by the compatibility library. The application + should never free it. + + The usual way of iterating over all the records in the database is: + + for (key = dbm_firstkey (dbf); + key.ptr; + key = dbm_nextkey (dbf)) + { + /* do something with the key */ + } + + The loop above should not try to delete any records from the + database, otherwise the iteration is not guaranteed to cover all + the keys. *Note Sequential::, for a detailed discussion of this. + + -- ndbm: int dbm_error (DBM *DBF) + Returns the error condition of the database: `0' if no errors + occurred so far while manipulating the database, and a non-zero + value otherwise. + + -- ndbm: void dbm_clearerr (DBM *DBF) + Clears the error condition of the database. + + -- ndbm: int dbm_dirfno (DBM *DBF) + Returns the file descriptor of the `dir' file of the database. It + is guaranteed to be different from the descriptor returned by the + `dbm_pagfno' function (see below). + + The application can lock this descriptor to serialize accesses to + the database. + + -- ndbm: int dbm_pagfno (DBM *DBF) + Returns the file descriptor of the `pag' file of the database. + See also `dbm_dirfno'. + + -- ndbm: int dbm_rdonly (DBM *DBF) + Returns `1' if the database DBF is open in a read-only mode and + `0' otherwise. + + +File: gdbm.info, Node: dbm, Prev: ndbm, Up: Compatibility + +19.2 DBM interface functions. +============================= + +The functions below are provided for compatibility with the old UNIX +`DBM' interface. Only one database at a time can be manipulated using +them. + + -- dbm: int dbminit (char *FILE) + Opens a database. The FILE argument is the full name of the + database file to be opened. The function opens two files: + `FILE.pag' and `FILE.dir'. If any of them does not exist, the + function fails. It never attempts to create the files. + + The database is opened in the read-write mode, if its disk + permissions permit. + + The application must ensure that the functions described below in + this section are called only after a successful call to `dbminit'. + + -- dbm: int dbmclose (void) + Closes the database opened by an earlier call to `dbminit'. + + -- dbm: datum fetch (datum KEY) + Reads a record from the database with the matching key. The KEY + argument supplies the key that is being looked for. + + If no matching record is found, the `dptr' member of the returned + datum is `NULL'. Otherwise, the `dptr' member of the returned + datum points to the memory managed by the compatibility library. + The application should never free it. + + -- dbm: int store (datum KEY, datum CONTENT) + Stores the key/value pair in the database. If a record with the + matching key already exists, its content will be replaced with the + new one. + + Returns `0' on success and `-1' on error. + + -- dbm: int delete (datum KEY) + Deletes a record with the matching key. + + If the function succeeds, `0' is returned. Otherwise, if no + matching record is found or if an error occurs, `-1' is returned. + + -- dbm: datum firstkey (void) + Initializes iteration over the keys from the database and returns + the first key. Note, that the word `first' does not imply any + specific ordering of the keys. + + If there are no records in the database, the `dptr' member of the + returned datum is `NULL'. Otherwise, the `dptr' member of the + returned datum points to the memory managed by the compatibility + library. The application should never free it. + + -- dbm: datum nextkey (datum KEY) + Continues the iteration started by a call to `firstkey'. Returns + the next key in the database. If the iteration covered all keys + in the database, the `dptr' member of the returned datum is `NULL'. + Otherwise, the `dptr' member of the returned datum points to the + memory managed by the compatibility library. The application + should never free it. + + +File: gdbm.info, Node: gdbmtool, Next: gdbm_dump, Prev: Compatibility, Up: Top + +20 Examine and modify a GDBM database. +************************************** + +The `gdbmtool' utility allows you to view and modify an existing GDBM +database or to create a new one. + + When invoked without arguments, it tries to open a database file +called `junk.gdbm', located in the current working directory. You can +change this default by supplying the name of the database to use as an +argument to the program, e.g.: + + $ gdbmtool file.db + + The database will be opened in read-write mode, unless the `-r' +(`--read-only') option is specified, in which case it will be opened +only for reading. + + If the database does not exist, `gdbmtool' will create it. There is +a special option `-n' (`--newdb', which instructs the utility to create +a new database. If it is used and if the database already exists, it +will be deleted, so use it sparingly. + +* Menu: + +* invocation:: +* shell:: + + +File: gdbm.info, Node: invocation, Next: shell, Up: gdbmtool + +20.1 gdbmtool invocation +======================== + +The following table summarizes all `gdbmtool' command line options: + +`-b SIZE' +`--block-size=SIZE' + Set block size. + +`-c SIZE' +`--cache-size=SIZE' + Set cache size. + +`-f FILE' + +`--file FILE' + Read commands from FILE, instead of the standard input. + +`-h' +`--help' + Print a concise help summary. + +`-N' +`--norc' + Don't read startup files (*note startup files::). + +`-n' +`--newdb' + Create the database. + +`-l' +`--no-lock' + Disable file locking. + +`-m' +`--no-mmap' + Disable mmap. + +`-q' +`--quiet' + Don't print the usual welcome banner at startup. This is the same + as setting the variable `quiet' in the startup file. *Note + quiet::. + +`-r' +`--read-only' + Open the database in read-only mode. + +`-s' +`--synchronize' + Synchronize to the disk after each write. + +`-V' +`--version' + Print program version and licensing information and exit. + +`--usage' + Print a terse invocation syntax summary along with a list of + available command line options. + + +File: gdbm.info, Node: shell, Prev: invocation, Up: gdbmtool + +20.2 gdbmtool interactive mode +============================== + +After successful startup, `gdbmtool' starts a loop, in which it reads +commands from the standard input, executes them and prints the results +on the standard output. If the standard input is attached to a +console, `gdbmtool' runs in interactive mode, which is indicated by its +"prompt": + + gdbmtool> _ + + The utility finishes when it reads the `quit' command (see below) or +detects end-of-file on its standard input, whichever occurs first. + + A `gdbmtool' command consists of a "command verb", optionally +followed by "arguments", separated by any amount of white space. A +command verb can be entered either in full or in an abbreviated form, +as long as that abbreviation does not match any other verb. For +example, `co' can be used instead of `count' and `ca' instead of +`cache'. + + Any sequence of non-whitespace characters appearing after the command +verb forms an argument. If the argument contains whitespace or +unprintable characters it must be enclosed in double quotes. Within +double quotes the usual "escape sequences" are understood, as shown in +the table below: + +Sequence Replaced with +\a Audible bell character (ASCII 7) +\b Backspace character (ASCII 8) +\f Form-feed character (ASCII 12) +\n Newline character (ASCII 10) +\r Carriage return character (ASCII 13) +\t Horizontal tabulation character + (ASCII 9) +\v Vertical tabulation character + (ASCII 11) +\\ Single slash +\" Double quote + +Table 20.1: Backslash escapes + + In addition, a backslash immediately followed by the end-of-line +character effectively removes that character, allowing to split long +arguments over several input lines. + + Command parameters may be optional or mandatory. If the number of +actual arguments is less than the number of mandatory parameters, +`gdbmtool' will prompt you to supply missing arguments. For example, +the `store' command takes two mandatory parameters, so if you invoked +it with no arguments, you would be prompted twice to supply the +necessary data, as shown in example below: + + gdbmtool> store + key? three + data? 3 + + However, such prompting is possible only in interactive mode. In +non-interactive mode (e.g. when running a script), all arguments must +be supplied with each command, otherwise `gdbmtool' will report an +error and exit immediately. + +* Menu: + +* variables:: shell variables. +* commands:: shell commands. +* definitions:: how to define structured data. +* startup files:: + + +File: gdbm.info, Node: variables, Next: commands, Up: shell + +20.2.1 Shell Variables +---------------------- + +A number of `gdbmtool' parameters is kept in its internal variables. + + -- gdbmtool variable: bool confirm + Whether to ask for confirmation before certain destructive + operations, such as truncating the existing database. + + Default is `true'. + + -- gdbmtool variable: string ps1 + Primary prompt string. Its value can contain "conversion + specifiers", consisting of the `%' character followed by another + character. These specifiers are expanded in the resulting prompt + as follows: + + Sequence Expansion + --------------------------------------------------------------- + %f name of the current database file + %p program invocation name + %P package name (`GDBM') + %v program version + %_ single space character + %% % + + The default value is `%p>%_', i.e. the program name, followed by a + "greater than" sign, followed by a single space. + + -- gdbmtool variable: string ps2 + Secondary prompt. See `ps1' for a description of its value. This + prompt is displayed before reading the second and subsequent lines + of a multi-line command. + + The default value is `%_>%_'. + + -- gdbmtool variable: string delim1 + A string used to delimit fields of a structured datum on output + (*note definitions::). + + Default is `,' (a comma). This variable cannot be unset. + + -- gdbmtool variable: string delim2 + A string used to delimit array items when printing a structured + datum (*note definitions::). + + Default is `,' (a comma). This variable cannot be unset. + + -- gdbmtool variable: string pager + The name and command line of the pager program to pipe output to. + This program is used in interactive mode when the estimated number + of output lines is greater then the number of lines on your screen. + + The default value is inherited from the environment variable + `PAGER'. Unsetting this variable disables paging. + + -- gdbmtool variable: bool quiet + Whether to display a welcome banner at startup. This variable + should be set in a startup script file (*note startup files::). + *Note -q option::. + + The following variables control how the database is opened: + + -- gdbmtool variable: numeric blocksize + Sets the block size. *Note block_size: Open. Unset by default. + + -- gdbmtool variable: numeric cachesize + Sets the cache size. *Note GDBM_SETCACHESIZE: Options. By + default this variable is not set. + + -- gdbmtool variable: string open + Open mode. The following values are allowed: + + newdb + Truncate the database if it exists or create a new one. Open + it in read-write mode. + + Technically, this sets the `GDBM_NEWDB' flag in call to + `gdbm_open'. *Note GDBM_NEWDB: Open. + + wrcreat + rw + Open the database in read-write mode. Create it if it does + not exist. This is the default. + + Technically speaking, it sets the `GDBM_WRCREAT' flag in call + to `gdbm_open'. *Note GDBM_WRCREAT: Open. + + reader + readonly + Open the database in read-only mode. Signal an error if it + does not exist. + + This sets the `GDBM_READER' flag (*note GDBM_READER: Open.). + + Attempting to set any other value or to unset this variable + produces an error. + + -- gdbmtool variable: number filemode + File mode (in octal) for creating new database files and database + dumps. + + -- gdbmtool variable: bool lock + Lock the database. This is the default. + + Setting this variable to false or unsetting it results in passing + `GDBM_NOLOCK' flag to `gdbm_open' (*note GDBM_NOLOCK: Open.). + + -- gdbmtool variable: bool mmap + Use memory mapping. This is the default. + + Setting this variable to false or unsetting it results in passing + `GDBM_NOMMAP' flag to `gdbm_open' (*note GDBM_NOMMAP: Open.). + + -- gdbmtool variable: bool sync + Flush all database writes on disk immediately. Default is false. + *Note GDBM_SYNC: Open. + + The following commands are used to list or modify the variables: + + -- command verb: set [ASSIGNMENTS] + When used without arguments, lists all variables and their values. + Unset variables are shown after a comment sign (`#'). For string + and numeric variables, values are shown after an equals sign. For + boolean variables, only the variable name is displayed if the + variable is `true'. If it is `false', its name is prefixed with + `no'. + + For example: + + ps1="%p>%_" + ps2="%_>%_" + delim1="," + delim2="," + confirm + # cachesize is unset + # blocksize is unset + open="wrcreat" + lock + mmap + nosync + pager="less" + # quiet is unset + + If used with arguments, the `set' command alters the specified + variables. In this case, arguments are variable assignments in the + form `NAME=VALUE'. For boolean variables, the VALUE is + interpreted as follows: if it is numeric, `0' stands for `false', + any non-zero value stands for `true'. Otherwise, the values `on', + `true', and `yes' denote `true', and `off', `false', `no' stand for + `false'. Alternatively, only the name of a boolean variable can be + supplied to set it to `true', and its name prefixed with `no' can + be used to set it to false. For example, the following command + sets the `delim2' variable to `;' and the `confirm' variable to + `false': + + set delim2=";" noconfirm + + -- command verb: unset VARIABLES + Unsets the listed variables. The effect of unsetting depends on + the variable. Unless explicitly described in the discussion of the + variables above, unsetting a boolean variable is equivalent to + setting it to `false'. Unsetting a string variable is equivalent + to assigning it an empty string. + + +File: gdbm.info, Node: commands, Next: definitions, Prev: variables, Up: shell + +20.2.2 Gdbmtool Commands +------------------------ + + -- command verb: avail + Print the "avail list". + + -- command verb: bucket NUM + Print the bucket number NUM and set it as the current one. + + -- command verb: cache + Print the bucket cache. + + -- command verb: close + Close the currently open database. + + -- command verb: count + Print the number of entries in the database. + + -- command verb: current + Print the current bucket. + + -- command verb: delete KEY + Delete record with the given KEY + + -- command verb: dir + Print hash directory. + + -- command verb: export FILE-NAME [truncate] [binary|ascii] + Export the database to the flat file FILE-NAME. *Note Flat + files::, for a description of the flat file format and its + purposes. This command will not overwrite an existing file, + unless the `truncate' parameter is also given. Another optional + argument determines the type of the dump (*note Flat files::). By + default, ASCII dump is created. + + The global variable `filemode' specifies the permissions to use + for the created output file. + + See also *note gdbmexport::. + + -- command verb: fetch KEY + Fetch and display the record with the given KEY. + + -- command verb: first + Fetch and display the first record in the database. Subsequent + records can be fetched using the `next' command (see below). + *Note Sequential::, for more information on sequential access. + + -- command verb: hash KEY + Compute and display the hash value for the given KEY. + + -- command verb: header + Print file header. + + -- command verb: help + -- command verb: ? + Print a concise command summary, showing each command verb with + its parameters and a short description of what it does. Optional + arguments are enclosed in square brackets. + + -- command verb: import FILE-NAME [replace] [nometa] + Import data from a flat dump file FILE-NAME (*note Flat files::). + If the word `replace' is given as an argument, any records with + the same keys as the already existing ones will replace them. The + word `nometa' turns off restoring meta-information from the dump + file. + + -- command verb: list + List the contents of the database. + + -- command verb: next [KEY] + Sequential access: fetch and display the next record. If the KEY + is given, the record following the one with this key will be + fetched. + + See also `first', above. + + *Note Sequential::, for more information on sequential access. + + -- command verb: open FILENAME + Open the database file FILENAME. If successful, any previously + open database is closed. Otherwise, if the operation fails, the + currently opened database remains unchanged. + + This command takes additional information from the following + variables: + + `open' + The database access mode. *Note The OPEN variable: openvar, + for a list of its values. + + `lock' + Whether or not to lock the database. Default is `on'. + + `mmap' + Use the memory mapping. Default is `on'. + + `sync' + Synchronize after each write. Default is `off'. + + `filemode' + Specifies the permissions to use in case a new file is + created. + + *Note open parameters::, for a detailed description of these + variables. + + -- command verb: quit + Close the database and quit the utility. + + -- command verb: reorganize + Reorganize the database (*note Reorganization::). + + -- command verb: source FILENAME + Read `gdbmtool' commands from the file FILENAME. + + -- command verb: status + Print current program status. The following example shows the + information displayed: + + Database file: junk.gdbm + Database is open + define key string + define content string + + The two `define' strings show the defined formats for key and + content data. *Note definitions::, for a detailed discussion of + their meaning. + + -- command verb: store KEY DATA + Store the DATA with KEY in the database. If KEY already exists, + its data will be replaced. + + -- command verb: version + Print the version of `gdbm'. + + +File: gdbm.info, Node: definitions, Next: startup files, Prev: commands, Up: shell + +20.2.3 Data Definitions +----------------------- + +GDBM databases are able to keep data of any type, both in the key and +in the content part of a record. Quite often these data are +structured, i.e. they consist of several fields of various types. +`Gdbmtool' provides a mechanism for handling such kind of records. + + The `define' command defines a record structure. The general syntax +is: + + define WHAT DEFINITION + +where WHAT is `key' to defining the structure of key data and `content' +to define the structure of the content records. + + The DEFINITION can be of two distinct formats. In the simplest case +it is a single data type. For example, + + define content int + +defines content records consisting of a single integer field. +Supported data types are: + +char + Single byte (signed). + +short + Signed short integer. + +ushort + Unsigned short integer. + +int + Signed integer. + +unsigned +uint + Unsigned integer. + +long + Signed long integer. + +ulong + Unsigned long integer. + +llong + Signed long long integer. + +ullong + Unsigned long long integer. + +float + A floating point number. + +double + Double-precision floating point number. + +string + Array of bytes. + +stringz + Null-terminated string, trailing null being part of the string. + + All numeric data types (integer as well as floating point) have the +same respective widths as in C language on the host where the database +file resides. + + The `string' and `stringz' are special. Both define a string of +bytes, similar to `char x[]' in C. The former defines an array of +bytes, the latter - a null-terminated string. This makes a difference, +in particular, when the string is the only part of datum. Consider the +following two definitions: + + 1. `define key string' + + 2. `define key stringz' + +Now, suppose we want to store the string "ab" in the key. Using the +definition (1), the `dptr' member of GDBM `datum' will contain two +bytes: `a', and `b'. Consequently, the `dsize' member will have the +value 2. Using the definition (2), the `dptr' member will contain +three bytes: `a', `b', and ASCII 0. The `dsize' member will have the +value 3. + + The definition (1) is the default for both key and content. + + The second form of the `define' statement is similar to the C +`struct' statement and allows for defining structural data. In this +form, the DEFINITION part is a comma-separated list of data types and +variables enclosed in curly braces. In contrast to the rest of `gdbm' +commands, this command is inherently multiline and is terminated with +the closing curly brace. For example: + + define content { + int status, + pad 8, + char id[3], + string name + } + +This defines a structure consisting of three members: an integer +`status', an array of 8 bytes `id', and a null-terminated string +`name'. Notice the `pad' statement: it allows to introduce padding +between structure members. Another useful statement is `offset': it +specifies that the member following it begins at the given offset in +the structure. Assuming the size of `int' is 8 bytes, the above +definition can also be written as + + define content { + int status, + offset 16, + char id[3], + string name + } + + _NOTE_: The `string' type can reasonably be used only if it is the +last or the only member of the data structure. That's because it +provides no information about the number of elements in the array, so +it is interpreted to contain all bytes up to the end of the datum. + + When displaying the structured data, `gdbmtool' precedes each value +with the corresponding field name and delimits parts of the structure +with the string defined in the `delim1' variable (*note variables::). +Array elements are delimited using the string from `delim2'. For +example: + + gdbmtool> fetch foo + status=2,id={ a, u, x },name="quux" + + To supply a structured datum as an argument to a `gdbmtool' command, +use the same notation, but without field names, e.g.: + + gdbmtool> hash { 2, {a,u,x}, "quux" } + hash value = 13089969. + + +File: gdbm.info, Node: startup files, Prev: definitions, Up: shell + +20.2.4 Startup Files +-------------------- + +Upon startup `gdbmtool' looks for a file named `.gdbmtoolrc' first in +the current working directory and, if not found, in the home directory +of the user who started the command. + + If found, this file is read and interpreted as a list of `gdbmtool' +commands. This allows you to customize the program behavior. + + Following is an example startup file which disables the welcome +banner, sets command line prompt to contain the name of the database +file in parentheses and defines the structure of the database content +records: + + set quiet + set ps1="(%f) " + define key stringz + define content { + int time, + pad 4, + int status + } + + +File: gdbm.info, Node: gdbm_dump, Next: gdbm_load, Prev: gdbmtool, Up: Top + +21 The `gdbm_dump' utility +************************** + +The `gdbm_dump' utility creates a flat file dump of a GDBM database +(*note Flat files::). It takes one mandatory argument: the name of the +source database file. The second argument, if given, specifies the +name of the output file. If not given, `gdbm_dump' will produce the +dump on the standard output. + + For example, the following invocation creates a dump of the database +`file.db' in the file `file.dump': + + $ gdbm_dump file.db file.dump + + By default the utility creates dumps in ASCII format (*note ASCII: +Flat files.). Another format can be requested using the `--format' +(`-H') option. + + The `gdbm_dump' utility understands the following command line +options: + +`-H FMT' +`--format=FMT' + Select output format. Valid values for FMT are: `binary' or `0' + to select binary dump format, and `ascii' or `1' to select ASCII + format. + +`-h' +`--help' + Print a concise help summary. + +`-V' +`--version' + Print program version and licensing information and exit. + +`--usage' + Print a terse invocation syntax summary along with a list of + available command line options. + + +File: gdbm.info, Node: gdbm_load, Next: gdbmexport, Prev: gdbm_dump, Up: Top + +22 The `gdbm_load' utility +************************** + +The `gdbm_load' utility restores a GDBM database from a flat file. The +utility requires at least one argument: the name of the input flat +file. If it is `-', the standard input will be read. The format of +the input file is detected automatically. + + By default the utility attempts to restore the database under its +original name, as stored in the input file. It will fail to do so if +the input is in binary format. In that case, the name of the database +must be given as the second argument. + + In general, if two arguments are given the second one is treated as +the name of the database to create, overriding the file name specified +in the flat file. + + The utility understands the following command line arguments: + +`-b NUM' +`--block-size=NUM' + Sets block size. *Note block_size: Open. + +`-c NUM' +`--cache-size=NUM' + Sets cache size. *Note GDBM_SETCACHESIZE: Options. + +`-M' +`--mmap' + Use memory mapping. + +`-m MODE' + +`--mode=MODE' + Sets the file mode. The argument is the desired file mode in + octal. + +`-n' +`--no-meta' + Do not restore file meta-data (ownership and mode) from the flat + file. + +`-r' +`--replace' + Replace existing keys. + +`-u USER[:GROUP]' +`--user=USER[:GROUP]' + Set file owner. The USER can be either a valid user name or UID. + Similarly, the GROUP is either a valid group name or GID. If + GROUP is not given, the main group of USER is used. + + User and group parts can be separated by a dot, instead of the + colon. + +`-h' +`--help' + Print a concise help summary. + +`-V' +`--version' + Print program version and licensing information and exit. + +`--usage' + Print a terse invocation syntax summary along with a list of + available command line options. + + +File: gdbm.info, Node: gdbmexport, Next: Exit codes, Prev: gdbm_load, Up: Top + +23 Export a database into a portable format. +******************************************** + +The `gdbmexport' utility converts the database of an older GDBM version +into a binary flat format. + + The utility takes two mandatory arguments: the name of the database +file to convert and the output file name, e.g.: + + $ gdbmexport junk.gdbm junk.flat + + In addition the following two options are understood: + +`-h' + Display short usage summary and exit. + +`-v' + Display program version and licensing information, and exit. + + +File: gdbm.info, Node: Exit codes, Next: Bugs, Prev: gdbmexport, Up: Top + +24 Exit codes +************* + +All GDBM utilities return uniform exit codes. These are summarized in +the table below: + +Code Meaning +-------------------------------------------------------------------------- +0 Successful termination. +1 A fatal error occurred. +2 Program was unable to restore file ownership or + mode. +3 Command line usage error. + + +File: gdbm.info, Node: Bugs, Next: Resources, Prev: Exit codes, Up: Top + +25 Problems and bugs. +********************* + +If you have problems with GNU `dbm' or think you've found a bug, please +report it. Before reporting a bug, make sure you've actually found a +real bug. Carefully reread the documentation and see if it really says +you can do what you're trying to do. If it's not clear whether you +should be able to do something or not, report that too; it's a bug in +the documentation! + + Before reporting a bug or trying to fix it yourself, try to isolate +it to the smallest possible input file that reproduces the problem. +Then send us the input file and the exact results `gdbm' gave you. Also +say what you expected to occur; this will help us decide whether the +problem was really in the documentation. + + Once you've got a precise problem, send e-mail to <bug-gdbm@gnu.org>. + + Please include the version number of GNU `dbm' you are using. You +can get this information by printing the variable `gdbm_version' (*note +Variables::). + + Non-bug suggestions are always welcome as well. If you have +questions about things that are unclear in the documentation or are +just obscure features, please report them too. + + You may contact the authors and maintainers by e-mail: + <phil@cs.wwu.edu>, <downsj@downsj.com>, <gray@gnu.org.ua> + + +File: gdbm.info, Node: Resources, Next: GNU Free Documentation License, Prev: Bugs, Up: Top + +26 Additional resources +*********************** + +For the latest updates and pointers to additional resources, visit +`http://www.gnu.org/software/gdbm'. + + In particular, a copy of `gdbm' documentation in various formats is +available online at `http://www.gnu.org/software/gdbm/manual.html'. + + Latest versions of `gdbm' can be downloaded from anonymous FTP: +`ftp://ftp.gnu.org/gnu/gdbm', or via HTTP from +`http://ftp.gnu.org/gnu/gdbm', or from any GNU mirror worldwide. See +`http://www.gnu.org/order/ftp.html', for a list of mirrors. + + To track `gdbm' development, visit +`http://puszcza.gnu.org.ua/projects/gdbm'. + + +File: gdbm.info, Node: GNU Free Documentation License, Next: Index, Prev: Resources, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008, 2011 Free Software + Foundation, Inc. + `http://fsf.org/' + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. + We recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it + can be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You + accept the license if you copy, modify or distribute the work in a + way requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in + the notice that says that the Document is released under this + License. If a section does not fit the above definition of + Secondary then it is not allowed to be designated as Invariant. + The Document may contain zero Invariant Sections. If the Document + does not identify any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images + composed of pixels) generic paint programs or (for drawings) some + widely available drawing editor, and that is suitable for input to + text formatters or for automatic translation to a variety of + formats suitable for input to text formatters. A copy made in an + otherwise Transparent file format whose markup, or absence of + markup, has been arranged to thwart or discourage subsequent + modification by readers is not Transparent. An image format is + not Transparent if used for any substantial amount of text. A + copy that is not "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and + standard-conforming simple HTML, PostScript or PDF designed for + human modification. Examples of transparent image formats include + PNG, XCF and JPG. Opaque formats include proprietary formats that + can be read and edited only by proprietary word processors, SGML or + XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML, PostScript or PDF + produced by some word processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow + the conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the + title equally prominent and visible. You may add other material + on the covers in addition. Copying with changes limited to the + covers, as long as they preserve the title of the Document and + satisfy these conditions, can be treated as verbatim copying in + other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a computer-network location from + which the general network-using public has access to download + using public-standard network protocols a complete Transparent + copy of the Document, free of added material. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of + copies, to give them a chance to provide you with an updated + version of the Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with + the Modified Version filling the role of the Document, thus + licensing distribution and modification of the Modified Version to + whoever possesses a copy of it. In addition, you must do these + things in the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of + previous versions (which should, if there were any, be listed + in the History section of the Document). You may use the + same title as a previous version if the original publisher of + that version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on + the Title Page. If there is no section Entitled "History" in + the Document, create one stating the title, year, authors, + and publisher of the Document as given on its Title Page, + then add an item describing the Modified Version as stated in + the previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in + the "History" section. You may omit a network location for a + work that was published at least four years before the + Document itself, or if the original publisher of the version + it refers to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the + section all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section + titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end + of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the + documents in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow + this License in all other respects regarding verbatim copying of + that document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly + and finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from + you under this License. If your rights have been terminated and + not permanently reinstated, receipt of a copy of some or all of + the same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + `http://www.gnu.org/copyleft/'. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. If the Document specifies that a proxy + can decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, to +permit their use in free software. + + +File: gdbm.info, Node: Index, Prev: GNU Free Documentation License, Up: Top + +Index +***** + + +* Menu: + +* --newdb, gdbmtool option: gdbmtool. (line 20) +* --read-only, gdbmtool option: gdbmtool. (line 16) +* -n, gdbmtool option: gdbmtool. (line 20) +* -r, gdbmtool option: gdbmtool. (line 16) +* .gdbmtoolrc: startup files. (line 6) +* ?: commands. (line 59) +* _GDBM_MAX_ERRNO: Variables. (line 28) +* _GDBM_MIN_ERRNO: Variables. (line 25) +* avail: commands. (line 7) +* blocksize: variables. (line 67) +* bucket: commands. (line 10) +* cache: commands. (line 13) +* cachesize: variables. (line 70) +* close: commands. (line 16) +* close-on-exec: Open. (line 48) +* closing database: Close. (line 6) +* command line options, gdbmtool: invocation. (line 6) +* compatibility layer: Compatibility. (line 6) +* confirm: variables. (line 9) +* count: commands. (line 19) +* creating a database, gdbmtool: gdbmtool. (line 20) +* current: commands. (line 22) +* database options: Options. (line 6) +* database reorganization: Reorganization. (line 6) +* database synchronization: Sync. (line 6) +* database, closing: Close. (line 6) +* database, opening or creating: Open. (line 6) +* DBM functions: dbm. (line 6) +* dbm.h: Compatibility. (line 11) +* dbm_clearerr: ndbm. (line 98) +* dbm_close: ndbm. (line 26) +* dbm_delete: ndbm. (line 57) +* dbm_dirfno: ndbm. (line 101) +* dbm_error: ndbm. (line 93) +* dbm_fetch: ndbm. (line 30) +* dbm_firstkey: ndbm. (line 62) +* DBM_INSERT: ndbm. (line 49) +* dbm_nextkey: ndbm. (line 72) +* dbm_open: ndbm. (line 9) +* dbm_pagfno: ndbm. (line 109) +* dbm_rdonly: ndbm. (line 113) +* DBM_REPLACE: ndbm. (line 46) +* dbm_store: ndbm. (line 39) +* dbmclose: dbm. (line 23) +* dbminit: dbm. (line 11) +* default database, gdbmtool: gdbmtool. (line 9) +* delete <1>: commands. (line 25) +* delete: dbm. (line 42) +* deleting records: Delete. (line 6) +* deletion in iteration loops: Sequential. (line 56) +* delim1: variables. (line 40) +* delim2: variables. (line 46) +* dir: commands. (line 28) +* dir file: Compatibility. (line 22) +* error codes: Error codes. (line 6) +* error strings: Errors. (line 6) +* exit code: Exit codes. (line 6) +* export <1>: commands. (line 31) +* export: Flat files. (line 6) +* fetch <1>: commands. (line 44) +* fetch: dbm. (line 26) +* fetching records: Fetch. (line 6) +* filemode: variables. (line 102) +* first: commands. (line 47) +* firstkey: dbm. (line 48) +* Flat file format: Flat files. (line 6) +* GDBM_BAD_FILE_OFFSET: Error codes. (line 117) +* GDBM_BAD_MAGIC_NUMBER: Error codes. (line 48) +* GDBM_BAD_OPEN_FLAGS: Error codes. (line 121) +* GDBM_BLOCK_SIZE_ERROR: Error codes. (line 15) +* GDBM_BYTE_SWAPPED: Error codes. (line 112) +* GDBM_CACHESIZE: Options. (line 30) +* GDBM_CANNOT_REPLACE: Error codes. (line 92) +* GDBM_CANT_BE_READER: Error codes. (line 56) +* GDBM_CANT_BE_WRITER: Error codes. (line 61) +* GDBM_CENTFREE: Options. (line 78) +* GDBM_CLOEXEC: Open. (line 48) +* gdbm_close: Close. (line 10) +* GDBM_COALESCEBLKS: Options. (line 92) +* gdbm_count: Count. (line 7) +* gdbm_delete: Delete. (line 9) +* gdbm_delete and sequential access: Sequential. (line 56) +* gdbm_dump <1>: gdbm_dump. (line 6) +* gdbm_dump: Flat files. (line 49) +* gdbm_dump_to_file: Flat files. (line 150) +* GDBM_EMPTY_DATABASE: Error codes. (line 52) +* GDBM_ERR_FILE_MODE <1>: Error codes. (line 156) +* GDBM_ERR_FILE_MODE: Flat files. (line 136) +* GDBM_ERR_FILE_OWNER <1>: Error codes. (line 149) +* GDBM_ERR_FILE_OWNER: Flat files. (line 133) +* gdbm_errlist: Variables. (line 17) +* gdbm_errno: Variables. (line 9) +* gdbm_exists: Fetch. (line 37) +* gdbm_export: Flat files. (line 173) +* gdbm_export_to_file: Flat files. (line 182) +* GDBM_FASTMODE: Options. (line 52) +* gdbm_fdesc: Locking. (line 14) +* gdbm_fetch: Fetch. (line 7) +* GDBM_FILE_EOF: Error codes. (line 132) +* GDBM_FILE_OPEN_ERROR: Error codes. (line 19) +* GDBM_FILE_READ_ERROR: Error codes. (line 41) +* GDBM_FILE_SEEK_ERROR: Error codes. (line 34) +* GDBM_FILE_STAT_ERROR: Error codes. (line 125) +* GDBM_FILE_WRITE_ERROR: Error codes. (line 27) +* gdbm_firstkey: Sequential. (line 14) +* GDBM_GETCACHESIZE: Options. (line 40) +* GDBM_GETCOALESCEBLKS: Options. (line 104) +* GDBM_GETDBNAME: Options. (line 127) +* GDBM_GETFLAGS: Options. (line 44) +* GDBM_GETMAXMAPSIZE: Options. (line 114) +* GDBM_GETMMAP: Options. (line 123) +* GDBM_GETSYNCMODE: Options. (line 74) +* GDBM_ILLEGAL_DATA: Error codes. (line 98) +* gdbm_import: Flat files. (line 187) +* gdbm_import_from_file: Flat files. (line 200) +* GDBM_INSERT: Store. (line 23) +* GDBM_ITEM_NOT_FOUND: Error codes. (line 83) +* gdbm_load <1>: gdbm_load. (line 6) +* gdbm_load: Flat files. (line 78) +* gdbm_load_from_file: Flat files. (line 166) +* GDBM_MALLOC_ERROR: Error codes. (line 12) +* GDBM_NEWDB: Open. (line 28) +* gdbm_nextkey: Sequential. (line 24) +* GDBM_NO_DBNAME: Error codes. (line 143) +* GDBM_NO_ERROR: Error codes. (line 9) +* GDBM_NOLOCK <1>: Locking. (line 6) +* GDBM_NOLOCK: Open. (line 40) +* GDBM_NOMMAP: Open. (line 40) +* gdbm_open: Open. (line 9) +* GDBM_OPT_ALREADY_SET: Error codes. (line 102) +* GDBM_OPT_ILLEGAL: Error codes. (line 107) +* GDBM_READER: Open. (line 28) +* GDBM_READER_CANT_DELETE: Error codes. (line 65) +* GDBM_READER_CANT_REORGANIZE: Error codes. (line 75) +* GDBM_READER_CANT_STORE: Error codes. (line 70) +* gdbm_reorganize: Reorganization. (line 9) +* GDBM_REORGANIZE_FAILED: Error codes. (line 88) +* GDBM_REPLACE: Store. (line 23) +* GDBM_SETCACHESIZE: Options. (line 30) +* GDBM_SETCENTFREE: Options. (line 78) +* GDBM_SETCOALESCEBLKS: Options. (line 92) +* GDBM_SETMAXMAPSIZE: Options. (line 108) +* GDBM_SETMMAP: Options. (line 118) +* gdbm_setopt: Options. (line 11) +* GDBM_SETSYNCMODE: Options. (line 61) +* gdbm_store: Store. (line 8) +* gdbm_strerror: Errors. (line 9) +* gdbm_sync: Sync. (line 15) +* GDBM_SYNC <1>: Sync. (line 6) +* GDBM_SYNC: Open. (line 40) +* GDBM_SYNCMODE: Options. (line 61) +* GDBM_UNKNOWN_UPDATE: Error codes. (line 80) +* gdbm_version: Variables. (line 31) +* gdbm_version_cmp: Variables. (line 61) +* GDBM_VERSION_MAJOR: Variables. (line 45) +* GDBM_VERSION_MINOR: Variables. (line 48) +* gdbm_version_number: Variables. (line 34) +* GDBM_VERSION_PATCH: Variables. (line 51) +* GDBM_WRCREAT: Open. (line 28) +* GDBM_WRITER: Open. (line 28) +* gdbmexport: gdbmexport. (line 6) +* gdbmtool: gdbmtool. (line 6) +* hash: commands. (line 52) +* header: commands. (line 55) +* help: commands. (line 58) +* import <1>: commands. (line 64) +* import: Flat files. (line 6) +* init file, gdbmtool: startup files. (line 6) +* interactive mode, gdbmtool: shell. (line 6) +* iterating over records: Sequential. (line 6) +* iteration and gdbm_delete: Sequential. (line 56) +* iteration loop: Sequential. (line 36) +* iteration loop, using NDBM: ndbm. (line 79) +* junk.gdbm: gdbmtool. (line 9) +* libgdbm_compat: Compatibility. (line 11) +* list: commands. (line 71) +* lock: variables. (line 106) +* locking: Locking. (line 6) +* looking up records: Fetch. (line 6) +* mmap: variables. (line 112) +* NDBM functions: ndbm. (line 6) +* ndbm.h: Compatibility. (line 11) +* next: commands. (line 74) +* nextkey: dbm. (line 58) +* number of records: Count. (line 6) +* open <1>: commands. (line 83) +* open: variables. (line 74) +* opening the database: Open. (line 6) +* options, database: Options. (line 6) +* pag file: Compatibility. (line 22) +* pager: variables. (line 52) +* ps1: variables. (line 15) +* ps2: variables. (line 33) +* quiet: variables. (line 60) +* quit: commands. (line 111) +* read-only mode, gdbmtool: gdbmtool. (line 16) +* record, deleting: Delete. (line 6) +* record, fetching: Fetch. (line 6) +* records, iterating over: Sequential. (line 6) +* records, storing: Store. (line 6) +* records, testing existence: Fetch. (line 34) +* reorganization, database: Reorganization. (line 6) +* reorganize: commands. (line 114) +* sequential access: Sequential. (line 6) +* sequential access, using NDBM: ndbm. (line 79) +* set: variables. (line 124) +* source: commands. (line 117) +* startup file, gdbmtool: startup files. (line 6) +* status: commands. (line 120) +* store <1>: commands. (line 133) +* store: dbm. (line 35) +* storing records: Store. (line 6) +* sync: variables. (line 118) +* synchronization, database: Sync. (line 6) +* unset: variables. (line 162) +* variables, gdbmtool: variables. (line 6) +* version: commands. (line 137) +* version number: Variables. (line 30) + + + +Tag Table: +Node: Top905 +Node: Copying3070 +Node: Intro4853 +Node: List6273 +Node: Open7574 +Node: Close10888 +Node: Count11342 +Node: Store11748 +Node: Fetch13724 +Node: Delete14946 +Node: Sequential15712 +Node: Reorganization18705 +Node: Sync19714 +Node: Flat files20804 +Ref: gdbm_load function24322 +Node: Errors29758 +Node: Options30322 +Node: Locking36056 +Node: Variables36652 +Node: Error codes39083 +Node: Compatibility44928 +Node: ndbm46506 +Node: dbm51344 +Node: gdbmtool54004 +Node: invocation54983 +Ref: -q option55605 +Node: shell56098 +Ref: backslash-interpretation57312 +Node: variables58897 +Ref: quiet61106 +Ref: open parameters61302 +Ref: openvar61624 +Ref: filemode62484 +Node: commands65062 +Ref: gdbmtool export65717 +Ref: gdbmtool import66972 +Node: definitions69328 +Node: startup files73533 +Node: gdbm_dump74335 +Node: gdbm_load75576 +Node: gdbmexport77456 +Node: Exit codes78070 +Node: Bugs78619 +Node: Resources79971 +Node: GNU Free Documentation License80690 +Node: Index105862 + +End Tag Table diff --git a/doc/gdbm.texinfo b/doc/gdbm.texinfo new file mode 100644 index 0000000..4f05796 --- /dev/null +++ b/doc/gdbm.texinfo @@ -0,0 +1,2567 @@ +\input texinfo @c -*- Texinfo -*- +@comment $Id: gdbm.texinfo,v 1.34 2013/12/25 09:31:59 gray Exp $ +@comment %**start of header (This is for running Texinfo on a region.) +@setfilename gdbm.info +@include version.texi +@settitle GDBM manual + +@ifinfo +@dircategory Programming & development tools +@direntry +* GDBM: (gdbm). The GNU database manager. +* gdbm_dump: gdbm_dump(gdbm). Dump the GDBM database into a flat file. +* gdbm_load: gdbm_load(gdbm). Load the database from a flat file. +@end direntry +@end ifinfo + +@c @setchapternewpage odd +@comment %**end of header (This is for running Texinfo on a region.) + +@c Use @kwindex for keywords +@defcodeindex kw +@syncodeindex kw cp +@c Use @flindex for files +@defcodeindex fl +@syncodeindex fl cp +@c Use @prindex for programs +@defcodeindex pr +@syncodeindex pr cp + +@c Merge all indices into a single one +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex ky cp +@syncodeindex pg cp +@syncodeindex tp cp + +@iftex +@finalout +@end iftex + +@copying +Published by the Free Software Foundation, +51 Franklin Street, Fifth Floor +Boston, MA 02110-1301, USA + +Copyright @copyright{} 1989-1999, 2007-2011 Free Software Foundation, Inc. + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover, and no Back-Cover texts. +A copy of the license is included in the section entitled ``GNU Free +Documentation License.'' +@end copying + +@titlepage +@sp 6 +@center @titlefont{GNU dbm} +@sp 2 +@center A Database Manager +@sp 2 +@center by Philip A. Nelson, Jason Downs and Sergey Poznyakoff +@sp 4 +@center Manual by Pierre Gaumond, Philip A. Nelson, Jason Downs +@center and Sergey Poznyakoff +@sp 1 +@center Edition @value{EDITION} +@sp 1 +@center for GNU @code{dbm}, Version @value{VERSION} +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@ifnothtml +@page +@summarycontents +@page +@end ifnothtml +@contents + +@ifnottex +@node Top +@top The GNU database manager. + +GNU @code{dbm} is a library of functions implementing a hashed database +on a disk file. This manual documents GNU @code{dbm} Version @value{VERSION} +(@code{gdbm}). The software was originally written by Philip A.@: +Nelson. This document was originally written by Pierre Gaumond from +texts written by Phil. +@end ifnottex + +@menu +Introduction: + +* Copying:: Your rights. +* Intro:: Introduction to GNU dbm. +* List:: List of functions. + +Functions: + +* Open:: Opening the database. +* Close:: Closing the database. +* Count:: Counting records in the database. +* Store:: Inserting and replacing records in the database. +* Fetch:: Searching records in the database. +* Delete:: Removing records from the database. +* Sequential:: Sequential access to records. +* Reorganization:: Database reorganization. +* Sync:: Insure all writes to disk have competed. +* Flat files:: Export and import to Flat file format. +* Errors:: Convert internal error codes into English. +* Options:: Setting internal options. +* Locking:: File locking. + +* Error codes:: Error codes returned by @code{gdbm} calls. +* Variables:: Two useful variables. +* Compatibility:: Compatibility with UNIX dbm and ndbm. + +Programs + +* gdbmtool:: Examine and modify a GDBM database. +* gdbm_dump:: Dump the database into a flat file. +* gdbm_load:: Load the database from a flat file. +* gdbmexport:: Export a database into a portable format. +* Exit codes:: Exit codes returned by GDBM utilities. + +Other topics: + +* Bugs:: Problems and bugs. +* Resources:: Additional resources, + +* GNU Free Documentation License:: Document license. +* Index:: Index +@end menu + +@node Copying +@chapter Copying Conditions. +This library is @dfn{free}; this means that everyone is free to use +it and free to redistribute it on a free basis. GNU @code{dbm} (@code{gdbm}) +is not in the public domain; it is copyrighted and there +are restrictions on its distribution, but these restrictions are +designed to permit everything that a good cooperating citizen would want +to do. What is not allowed is to try to prevent others from further +sharing any version of @code{gdbm} that they might get from +you.@refill + + Specifically, we want to make sure that you have the right to give +away copies @code{gdbm}, that you receive +source code or else can get it if you want it, that you can change these +functions or use pieces of them in new free programs, and that you know +you can do these things.@refill + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies @code{gdbm}, you must give the recipients all +the rights that you have. You must make sure that they, too, receive or +can get the source code. And you must tell them their rights.@refill + + Also, for our own protection, we must make certain that everyone finds +out that there is no warranty for anything in the @code{gdbm} distribution. +If these functions are modified by someone else and passed on, we want +their recipients to know that what they have is not what we distributed, +so that any problems introduced by others will not reflect on our +reputation.@refill + +@code{Gdbm} is currently distributed under the terms of the GNU General +Public License, Version 3. (@emph{NOT} under the GNU General Library +Public License.) A copy the GNU General Public License is included with +the distribution of @code{gdbm}. + +@node Intro +@chapter Introduction to GNU @code{dbm}. + +GNU @code{dbm} (@code{gdbm}) is a library of database functions that use +extensible hashing and works similar to the standard UNIX @code{dbm} +functions. These routines are provided to a programmer needing to +create and manipulate a hashed database. (@code{gdbm} is @emph{NOT} a +complete database package for an end user.) + +The basic use of @code{gdbm} is to store key/data pairs in a data file. +Each key must be unique and each key is paired with only one data item. +The keys can not be directly accessed in sorted order. The basic unit +of data in @code{gdbm} is the structure: + +@example + typedef struct @{ + char *dptr; + int dsize; + @} datum; +@end example + +This structure allows for arbitrary sized keys and data items. + +The key/data pairs are stored in a @code{gdbm} disk file, called a +@code{gdbm} database. An application must open a @code{gdbm} database +to be able manipulate the keys and data contained in the database. +@code{gdbm} allows an application to have multiple databases open at the +same time. When an application opens a @code{gdbm} database, it is +designated as a @code{reader} or a @code{writer}. A @code{gdbm} +database can be opened by at most one writer at a time. However, many readers +may open the database simultaneously. Readers and writers can not +open the @code{gdbm} database at the same time. + +@node List +@chapter List of functions. + +The following is a quick list of the functions contained in the @code{gdbm} +library. The include file @code{gdbm.h}, that can be included by the user, +contains a definition of these functions. + +@example +#include <gdbm.h> + +GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func); +void gdbm_close(dbf); +int gdbm_store(dbf, key, content, flag); +datum gdbm_fetch(dbf, key); +int gdbm_delete(dbf, key); +datum gdbm_firstkey(dbf); +datum gdbm_nextkey(dbf, key); +int gdbm_reorganize(dbf); +void gdbm_sync(dbf); +int gdbm_exists(dbf, key); +char *gdbm_strerror(errno); +int gdbm_setopt(dbf, option, value, size); +int gdbm_fdesc(dbf); +int gdbm_export (GDBM_FILE, const char *, int, int); +int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp); +int gdbm_import (GDBM_FILE, const char *, int); +int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag); +int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount); +int gdbm_version_cmp (int const a[], int const b[]); +@end example + +The @code{gdbm.h} include file is often in the @file{/usr/local/include} +directory. (The actual location of @code{gdbm.h} depends on your local +installation of @code{gdbm}.) + +@node Open +@chapter Opening the database. + +@cindex opening the database +@cindex database, opening or creating +@deftypefn {gdbm interface} GDBM_FILE gdbm_open (const char *@var{name}, int @var{block_size}, @ + int @var{flags}, int @var{mode}, void (*fatal_func)(const char *)) +Initializes @code{gdbm} system. If the file has a size of zero bytes, a file +initialization procedure is performed, setting up the initial structure in the +file. + +The arguments are: + +@table @var +@item name +The name of the file (the complete name, @code{gdbm} does not append any +characters to this name). +@item block_size +It is used during initialization to determine the size of various +constructs. It is the size of a single transfer from disk to +memory. This parameter is ignored if the file has been previously +initialized. The minimum size is 512. If the value is less than 512, +the file system block size is used, otherwise the value of +@var{block_size} is used. +@item flags +@kwindex GDBM_READER +@kwindex GDBM_WRITER +@kwindex GDBM_WRCREAT +@kwindex GDBM_NEWDB +If @code{flags} is set to @samp{GDBM_READER}, the user wants to just read the +database and any call to @code{gdbm_store} or @code{gdbm_delete} will fail. +Many readers can access the database at the same time. If @code{flags} is +set to @samp{GDBM_WRITER}, the user wants both read and write access +to the database and requires exclusive access. If @code{flags} is set +to @samp{GDBM_WRCREAT}, the user wants both read and write access to +the database and wants it created if it does not already exist. If +@code{flags} is set to @samp{GDBM_NEWDB}, the user want a new database +created, regardless of whether one existed, and wants read and write +access to the new database. + +@kwindex GDBM_SYNC +@kwindex GDBM_NOLOCK +@kwindex GDBM_NOMMAP +The following may also be logically or'd into the database flags: +@samp{GDBM_SYNC}, which causes all database operations to be +synchronized to the disk, @samp{GDBM_NOLOCK}, which prevents the library +from performing any locking on the database file, and @samp{GDBM_NOMMAP}, +which disables the memory mapping mechanism. The option @samp{GDBM_FAST} is +now obsolete, since @code{gdbm} defaults to no-sync mode. + +@kwindex GDBM_CLOEXEC +@cindex close-on-exec +If the host @samp{open} call +@ifhtml +(@uref{http://www.manpagez.com/man/2/open, open(2)}) +@end ifhtml +@ifnothtml +(@pxref{open,,,open(2),open(2) man page}) +@end ifnothtml +supports the @samp{O_CLOEXEC} flag, the @samp{GDBM_CLOEXEC} can be +or'd into the flags, to enable the close-on-exec flag for the +database file descriptor. +@item mode +File mode (see +@ifhtml +@uref{http://www.manpagez.com/man/2/chmod}, +@end ifhtml +@ifnothtml +@ref{chmod,,change permissions of a file,chmod(2), +chmod(2) man page}, +@end ifnothtml +and +@ifhtml +@uref{http://www.manpagez.com/man/2/open}), +@end ifhtml +@ifnothtml +@pxref{open,,open a file,open(2), open(2) man page}), +@end ifnothtml +which is used if the file is created). +@item fatal_func +A function for @code{gdbm} to call if it detects a fatal error. The only +parameter of this function is a string. If the value of @samp{NULL} is +provided, @code{gdbm} will use a default function. +@end table + +The return value, is the pointer needed by all other functions to +access that @code{gdbm} file. If the return is the @samp{NULL} pointer, +@code{gdbm_open} was not successful. The errors can be found in +@code{gdbm_errno} variable (@pxref{Variables, gdbm_errno}). Available +error codes are discussed in @ref{Error codes}. + +In all of the following calls, the parameter @var{dbf} refers to the pointer +returned from @code{gdbm_open}. +@end deftypefn + +@node Close +@chapter Closing the database. +@cindex closing database +@cindex database, closing + +It is important that every file opened is also closed. This is needed to +update the reader/writer count on the file: + +@deftypefn {gdbm interface} void gdbm_close (GDBM_FILE @var{dbf}) +This function closes the @code{gdbm} file and frees all memory +associated with it. The parameter is: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@end table +@end deftypefn + +@node Count +@chapter Number of Records +@cindex number of records +@deftypefn {gdbm interface} int gdbm_count (GDBM_FILE @var{dbf}, @ + gdbm_count_t *@var{pcount}) +Counts number of records in the database @var{dbf}. On success, +stores it in the memory location pointed to by @var{pcount} and return +0. On error, sets @code{gdbm_errno} (if relevant, also @code{errno}) +and returns -1. +@end deftypefn + +@node Store +@chapter Inserting and replacing records in the database. +@cindex storing records +@cindex records, storing + +@deftypefn {gdbm interface} int gdbm_store (GDBM_FILE @var{dbf}, datum @var{key}, @ + datum @var{content}, int @var{flag}) +The function @code{gdbm_store} inserts or replaces records in the database. + +The parameters are: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@item key +The search key. +@item content +The data to be associated with the key. +@item flag +@kwindex GDBM_REPLACE +@kwindex GDBM_INSERT +Defines the action to take when the key is already in the database. The value +@samp{GDBM_REPLACE} (defined in @file{gdbm.h}) asks that the old data +be replaced by the new @var{content}. The value @samp{GDBM_INSERT} +asks that an error be returned and no action taken if the @var{key} +already exists. +@end table + +This function can return the following values: + +@table @asis +@item -1 +The item was not stored in the database because the caller was not an +official writer or either @var{key} or @var{content} have a +@samp{NULL} @samp{dptr} field. + +Both @var{key} and @var{content} must have the @samp{dptr} field be a +non-@samp{NULL} value. Since a @samp{NULL} @samp{dptr} field is used by +other functions to indicate an error, it cannot be valid data. +@item +1 +The item was not stored because the argument @var{flag} was +@samp{GDBM_INSERT} and the @var{key} was already in the database. +@item 0 +No error. The value of @var{content} is keyed by @var{key}. The file +on disk is updated to reflect the structure of the new database before +returning from this function. +@end table +@end deftypefn + +If you store data for a @var{key} that is already in the data base, +@code{gdbm} replaces the old data with the new data if called with +@samp{GDBM_REPLACE}. You do not get two data items for the same +@code{key} and you do not get an error from @code{gdbm_store}. + +The size in @code{gdbm} is not restricted like @code{dbm} or @code{ndbm}. Your +data can be as large as you want. + +@node Fetch +@chapter Searching for records in the database. +@cindex fetching records +@cindex looking up records +@cindex record, fetching + +@deftypefn {gdbm interface} datum gdbm_fetch (GDBM_FILE @var{dbf}, datum @var{key}) +Looks up a given @var{key} and returns the information associated with it. +The @samp{dptr} field in the structure that is returned points to a +memory block allocated by @code{malloc}. It is the caller's +responsibility to free it when no longer needed. + +If the @samp{dptr} is @samp{NULL}, no data was found. + +The parameters are: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@item key +The search key. +@end table +@end deftypefn + +An example of using this function: + +@example +content = gdbm_fetch (dbf, key); +if (content.dptr == NULL) + @{ + fprintf(stderr, "key not found\n"); + @} +else + @{ + /* do something with content.dptr */ + @} +@end example + +@cindex records, testing existence +You may also search for a particular key without retrieving it: + +@deftypefn {gdbm interface} int gdbm_exists (GDBM_FILE @var{dbf}, datum @var{key}) +Returns @samp{true} (@samp{1}) if the @var{key} exists in @var{dbf} +and @samp{false} (@samp{0}) otherwise. + +The parameters are: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@item key +The search key. +@end table +@end deftypefn + +@node Delete +@chapter Removing records from the database. +@cindex deleting records +@cindex record, deleting + +To remove some data from the database, use the @code{gdbm_delete} +function. + +@deftypefn {gdbm interface} int gdbm_delete (GDBM_FILE @var{dbf}, datum @var{key}) +Deletes the data associated with the given @var{key}, if it exists in +the database @var{dbf}. The file on disk is updated to reflect the +structure of the new database before returning from this function. + +The parameters are: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@item datum key +The search key. +@end table + +The function returns @samp{-1} if the item is not present or the +requester is a reader. The return of @samp{0} marks a successful delete. +@end deftypefn + +@node Sequential +@chapter Sequential access to records. +@cindex sequential access +@cindex iterating over records +@cindex records, iterating over + +The next two functions allow for accessing all items in the database. This +access is not @code{key} sequential, but it is guaranteed to visit every +@code{key} in the database once. The order has to do with the hash values. +@code{gdbm_firstkey} starts the visit of all keys in the database. +@code{gdbm_nextkey} finds and reads the next entry in the hash structure for +@code{dbf}. + +@deftypefn {gdbm interface} datum gdbm_firstkey (GDBM_FILE @var{dbf}) +Initiate sequential access to the database @var{dbf}. The returned +value is the first key accessed in the database. If the @samp{dptr} +field in the returned datum is @samp{NULL}, the database contains no +data. + +Otherwise, @samp{dptr} points to a memory block obtained from +@code{malloc}, which holds the key value. The caller is responsible +for freeing this memory block when no longer needed. +@end deftypefn + +@deftypefn {gdbm interface} datum gdbm_nextkey (GDBM_FILE @var{dbf}, datum @var{prev}) +This function continues the iteration over the keys in @var{dbf}, +initiated by @code{gdbm_firstkey}. The parameter @var{prev} holds the +value returned from a previous call to @code{gdbm_nextkey} or +@code{gdbm_firstkey}. + +The function returns next key from the database. If the @samp{dptr} +field in the returned datum is @samp{NULL}, all keys in the database +has been visited. + +Otherwise, @samp{dptr} points to a memory block obtained from +@code{malloc}, which holds the key value. The caller is responsible +for freeing this memory block when no longer needed. +@end deftypefn + +@cindex iteration loop +These functions were intended to visit the database in read-only algorithms, +for instance, to validate the database or similar operations. The +usual algorithm for sequential access is: + +@example +@group + key = gdbm_firstkey (dbf); + while (key.dptr) + @{ + datum nextkey; + + /* do something with the key */ + ... + + /* Obtain the next key */ + nextkey = gdbm_nextkey (dbf, key); + /* Reclaim the memory used by the key */ + free (key.dptr); + /* Use nextkey in the next iteration. */ + key = nextkey; + @} +@end group +@end example + +@cindex iteration and @code{gdbm_delete} +@cindex deletion in iteration loops +@cindex @code{gdbm_delete} and sequential access +Care should be taken when the @code{gdbm_delete} function is used in +such a loop. File visiting is based on a @dfn{hash table}. The +@code{gdbm_delete} function re-arranges the hash table to make sure +that any collisions in the table do not leave some item +@dfn{un-findable}. The original key order is @emph{not} guaranteed to +remain unchanged in all instances. So it is possible that some key +will not be visited if a loop like the following is executed: + +@example +@group + key = gdbm_firstkey (dbf); + while (key.dptr) + @{ + datum nextkey; + if (some condition) + @{ + gdbm_delete (dbf, key); + @} + nextkey = gdbm_nextkey (dbf, key); + free (key.dptr); + key = nextkey; + @} +@end group +@end example + +@node Reorganization +@chapter Database reorganization. +@cindex database reorganization +@cindex reorganization, database + +The following function should be used very seldom. + +@deftypefn {gdbm interface} int gdbm_reorganize (GDBM_FILE @var{dbf}) +Reorganizes the database. + +The parameter is: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@end table +@end deftypefn + +If you have had a lot of deletions and would like to shrink the space +used by the @code{gdbm} file, this function will reorganize the database. +This results, in particular, in shortening the length of a @code{gdbm} +file by removing the space occupied by deleted records. + +This reorganization requires creating a new file and inserting all the elements +in the old file @var{dbf} into the new file. The new file is then renamed to +the same name as the old file and @var{dbf} is updated to contain all the +correct information about the new file. If an error is detected, the return +value is negative. The value zero is returned after a successful +reorganization. + +@node Sync +@chapter Database Synchronization +@cindex database synchronization +@cindex synchronization, database + +@kwindex GDBM_SYNC +Unless your database was opened with the @samp{GDBM_SYNC} flag, +@code{gdbm} does not wait for writes to be flushed to the disk before +continuing. This allows for faster writing of databases at the risk +of having a corrupted database if the application terminates in an +abnormal fashion. The following function allows the programmer to +make sure the disk version of the database has been completely updated +with all changes to the current time. + +@deftypefn {gdbm interface} void gdbm_sync (GDBM_FILE @var{dbf}) +Synchronizes the changes in @var{dbf} with its disk file. The +parameter is a pointer returned by @code{gdbm_open}. + +This function would usually be called after a complete set of changes +have been made to the database and before some long waiting time. +The @code{gdbm_close} function automatically calls the equivalent of +@code{gdbm_sync} so no call is needed if the database is to be closed +immediately after the set of changes have been made. +@end deftypefn + +@node Flat files +@chapter Export and Import +@cindex Flat file format +@cindex export +@cindex import +@code{Gdbm} databases can be converted into so-called @dfn{flat +format} files. Such files cannot be used for searching, their sole +purpose is to keep the data from the database for restoring it when +the need arrives. There are two flat file formats, which differ in +the way they represent the data and in the amount of meta-information +stored. Both formats can be used, for example, to migrate between +the different versions of @code{gdbm} databases. Generally speaking, +flat files are safe to send over the network, and can be used to +recreate the database on another machine. The recreated database is +guaranteed to be a byte-to-byte equivalent of the database from which +the flat file was created. This does not necessarily mean, however, +that this file can be used in the same way as the original one. For +example, if the original database contained non-@acronym{ASCII} data +(e.g.@: @acronym{C} structures, integers etc.), the recreated database +can be of any use only if the target machine has the same integer +size and byte ordering as the source one and if its @acronym{C} +compiler uses the same packing conventions as the one which generated +@acronym{C} which populated the original database. In general, such +binary databases are not portable between machines, unless you follow +some stringent rules on what data is written to them and how it is +interpreted. + +The GDBM version @value{VERSION} supports two flat file formats. The +@dfn{binary} flat file format was first implemented in GDBM version +1.9.1. This format stores only key/data pairs, it does not keep +information about the database file itself. As its name implies, +files in this format are binary files. + +The @dfn{ascii} flat file format encodes all data in base64 and stores +not only key/data pairs, but also the original database file metadata, +such as file name, mode and ownership. Files in this format can be +sent without additional encapsulation over transmission channels that +normally allow only ASCII data, such as, e.g.@: SMTP. Due to additional +metadata they allow for restoring an exact copy of the database, +including file ownership and privileges, which is especially important +if the database in question contained some security-related data. + +We call a process of creating a flat file from a database +@dfn{exporting} or @dfn{dumping} this database. The reverse process, +creating the database from a flat file is called @dfn{importing} or +@dfn{loading} the database. + +@deftypefn {gdbm interface} int gdbm_dump (GDBM_FILE @var{dbf}, @ + const char *@var{filename}, int @var{format}, @ + int @var{open_flags}, int @var{mode}) +Dumps the database file to the named file in requested format. +Arguments are: + +@table @var +@item dbf +A pointer to the source database, returned by a prior call to +@code{gdbm_open}. + +@item filename +Name of the dump file. + +@item format +Output file format. Allowed values are: @samp{GDBM_DUMP_FMT_BINARY} to +create a binary dump and @samp{GDBM_DUMP_FMT_ASCII} to create an ASCII +dump file. + +@item open_flags +How to create the output file. If @var{flag} is @samp{GDBM_WRCREAT} +the file will be created if it does not exist. If it does exist, +the @code{gdbm_dump} will fail. + +If @var{flag} is @samp{GDBM_NEWDB}, the function will create a new +output file, replacing it if it already exists. + +@item mode +The permissions to use when creating the output file. +See @ifhtml +@uref{http://www.manpagez.com/man/2/open}, +@end ifhtml +@ifnothtml +@ref{open,,open a file,open(2), open(2) man page}, +@end ifnothtml +for a detailed discussion. +@end table +@end deftypefn + +@anchor{gdbm_load function} +@deftypefn {gdbm interface} int gdbm_load (GDBM_FILE *@var{pdbf}, @ + const char *@var{filename}, int @var{flag}, @ + int @var{meta_mask}, @ + unsigned long *@var{errline}) +Loads data from the dump file @var{filename} into the database pointed +to by @var{pdbf}. The latter can point to @samp{NULL}, in which case +the function will try to create a new database. If it succeeds, the +function will return, in the memory location pointed to by @var{pdbf}, +a pointer to the newly created database. If the dump file carries no +information about the original database file name, the function will +set @code{gdbm_errno} to @samp{GDBM_NO_DBNAME} and return +@samp{-1}, indicating failure. + +The @var{flag} has the same meaning as the @var{flag} argument +to the @code{gdbm_store} function (@pxref{Store}). + +The @var{meta_mask} argument can be used to disable restoring certain +bits of file's meta-data from the information in the input dump file. +It is a binary OR of zero or more of the following: + +@table @asis +@item GDBM_META_MASK_MODE +Do not restore file mode. + +@item GDBM_META_MASK_OWNER +Do not restore file owner. +@end table + +The function returns 0 upon successful completion or -1 on fatal +errors and 1 on mild (non-fatal) errors. + +If a fatal error occurs, @code{gdbm_errno} will be set to one of the +following values: + +@table @asis +@item GDBM_FILE_OPEN_ERROR +Input file (@var{filename}) cannot be opened. The @code{errno} +variable can be used to get more detail about the failure. + +@item GDBM_MALLOC_ERROR +Not enough memory to load data. + +@item GDBM_FILE_READ_ERROR +Reading from @var{filename} failed. The @code{errno} variable can be +used to get more detail about the failure. + +@item GDBM_ILLEGAL_DATA +Input contained some illegal data. + +@item GDBM_ITEM_NOT_FOUND +This error can occur only when the input file is in ASCII format. It +indicates that the data part of the record about to be read lacked +length specification. Application developers are advised to treat +this error equally as @samp{GDBM_ILLEGAL_DATA}. +@end table + +Mild errors mean that the function was able to successfully load and +restore the data, but was unable to change database file metadata +afterward. The table below lists possible values for @code{gdbm_errno} +in this case. To get more detail, inspect the system @code{errno} variable. + +@table @asis +@kwindex GDBM_ERR_FILE_OWNER +@item GDBM_ERR_FILE_OWNER +The function was unable to restore database file owner. + +@kwindex GDBM_ERR_FILE_MODE +@item GDBM_ERR_FILE_MODE +The function was unable to restore database file mode (permission bits). +@end table + +If an error occurs while loading data from an input file in ASCII +format, the number of line in which the error occurred will be stored +in the location pointed to by the @var{errline} parameter, unless it +is @samp{NULL}. + +If the line information is not available or applicable, @var{errline} +will be set to @samp{0}. +@end deftypefn + +@deftypefn {gdbm interface} int gdbm_dump_to_file (GDBM_FILE @var{dbf}, @ + FILE *@var{fp}, int @var{format}) +This is an alternative entry point to @code{gdbm_dump} (which see). +Arguments are: + +@table @var +@item dbf +A pointer to the source database, returned by a call to +@code{gdbm_open}. + +@item fp +File to write the data to. + +@item format +Format of the dump file. See the @var{format} argument to the +@code{gdbm_dump} function. +@end table +@end deftypefn + +@deftypefn {gdbm interface} int gdbm_load_from_file (GDBM_FILE *@var{pdbf}, @ + FILE *@var{fp}, int @var{replace}, int @var{meta_mask}, @ + unsigned long *@var{line}) +This is an alternative entry point to @code{gdbm_dump}. It writes the +output to @var{fp} which must be a file open for writing. The rest of +arguments is the same as for @code{gdbm_load} (excepting of course +@var{flag}, which is not needed in this case). +@end deftypefn + +@deftypefn {gdbm interface} int gdbm_export (GDBM_FILE @var{dbf}, @ + const char *@var{exportfile}, int @var{flag}, int @var{mode}) +This function is retained for compatibility with GDBM 1.10 and +earlier. It dumps the database to a file in binary dump format and +is entirely equivalent to + +@example +gdbm_dump(@var{dbf}, @var{exportfile}, GDBM_DUMP_FMT_BINARY, + @var{flag}, @var{mode}) +@end example + +@end deftypefn + +@deftypefn {gdbm interface} int gdbm_export_to_file (GDBM_FILE @var{dbf}, FILE *@var{fp}) +This is an alternative entry point to @code{gdbm_export}. This +function writes to file @var{fp} a binary dump of the database @var{dbf}. +@end deftypefn + +@deftypefn {gdbm interface} int gdbm_import (GDBM_FILE @var{dbf}, @ + const char *@var{importfile}, int @var{flag}) +This function is retained for compatibility with GDBM 1.10 and +earlier. It loads the file @var{importfile}, which must be a binary +flat file, into the database @var{dbf} and is equivalent to the +following construct: + +@example +@var{dbf} = gdbm_open (@var{importfile}, 0, + @var{flag} == GDBM_REPLACE ? + GDBM_WRCREAT : GDBM_NEWDB, + 0600, NULL); +gdbm_load (&@var{dbf}, @var{exportfile}, 0, @var{flag}, NULL) +@end example +@end deftypefn + +@deftypefn {gdbm interface} int gdbm_import_from_file (GDBM_FILE @var{dbf}, @ + FILE *@var{fp}, int @var{flag}) +An alternative entry point to @code{gdbm_import}. Reads the binary +dump from the file @var{fp} and stores the key/value pairs to +@var{dbf}. @xref{Store}, for a description of @var{flag}. + +This function is equivalent to: + +@example +@var{dbf} = gdbm_open (@var{importfile}, 0, + @var{flag} == GDBM_REPLACE ? + GDBM_WRCREAT : GDBM_NEWDB, + 0600, NULL); +gdbm_load_from_file (@var{dbf}, @var{fp}, @var{flag}, 0, NULL); +@end example +@end deftypefn + +@node Errors +@chapter Error strings. +@cindex error strings + +To convert a @code{gdbm} error code into English text, use this +routine: + +@deftypefn {gdbm interface} {const char *} gdbm_strerror (gdbm_error @var{errno}) +Converts @var{errno} (which is an integer value) into a human-readable +descriptive text. Returns a pointer to a static string. The caller +must not alter or free the returned pointer. + +The @var{errno} argument is usually the value of the global variable +@code{gdbm_errno}. @xref{Variables, gdbm_errno}. +@end deftypefn + +@node Options +@chapter Setting options +@cindex database options +@cindex options, database + +@code{Gdbm} supports the ability to set certain options on an already +open database. + +@deftypefn {gdbm interface} int gdbm_setopt (GDBM_FILE @var{dbf}, int @var{option}, @ + void *@var{value}, int @var{size}) +Sets an option on the database or returns the value of an option. + +The parameters are: + +@table @var +@item dbf +The pointer returned by @code{gdbm_open}. +@item option +The option to be set or retrieved. +@item value +A pointer to the value to which @var{option} will be set or where to +place the option value (depending on the option). +@item size +The length of the data pointed to by @var{value}. +@end table +@end deftypefn + +The valid options are: + +@table @asis +@kwindex GDBM_CACHESIZE +@kwindex GDBM_SETCACHESIZE +@item GDBM_SETCACHESIZE +@itemx GDBM_CACHESIZE +Set the size of the internal bucket cache. This option may only be +set once on each GDBM_FILE descriptor, and is set automatically to 100 +upon the first access to the database. The @var{value} should point +to a @code{size_t} holding the desired cache size. + +The @samp{GDBM_CACHESIZE} option is provided for compatibility with +earlier versions. + +@kwindex GDBM_GETCACHESIZE +@item GDBM_GETCACHESIZE +Return the size of the internal bucket cache. The @var{value} should +point to a @code{size_t} variable, where the size will be stored. + +@kwindex GDBM_GETFLAGS +@item GDBM_GETFLAGS +Return the flags describing the state of the database. The @var{value} should +point to a @code{int} variable where to store the flags. The return +is the same as the flags used when opening the database (@pxref{Open, +gdbm_open}), except that it reflects the current state (which may have +been altered by another calls to @code{gdbm_setopt}. + +@kwindex GDBM_FASTMODE +@item GDBM_FASTMODE +Enable or disable the @dfn{fast writes mode}, i.e.@: writes without +subsequent synchronization. The @var{value} should point +to an integer: @samp{TRUE} to enable fast mode, and @samp{FALSE} to +disable it. + +This option is retained for compatibility with previous versions of +@code{gdbm}. Its effect is the reverse of @code{GDBM_SETSYNCMODE} +(see below). + +@kwindex GDBM_SETSYNCMODE +@kwindex GDBM_SYNCMODE +@item GDBM_SETSYNCMODE +@itemx GDBM_SYNCMODE +Turn on or off file system synchronization operations. This +setting defaults to off. The @var{value} should point +to an integer: @samp{TRUE} to turn synchronization on, and @samp{FALSE} to +turn it off. + +Note, that this option is a reverse of @code{GDBM_FASTMODE}, +i.e.@: calling @code{GDBM_SETSYNCMODE} with @samp{TRUE} has the same effect +as calling @code{GDBM_FASTMODE} with @samp{FALSE}. + +The @samp{GDBM_SYNCMODE} option is provided for compatibility with +earlier versions. + +@kwindex GDBM_GETSYNCMODE +@item GDBM_GETSYNCMODE +Return the current synchronization status. The @var{value} should +point to an @code{int} where the status will be stored. + +@kwindex GDBM_SETCENTFREE +@kwindex GDBM_CENTFREE +@item GDBM_SETCENTFREE +@itemx GDBM_CENTFREE +@emph{NOTICE: This feature is still under study.} + +Set central free block pool to either on or off. The default is off, +which is how previous versions of @code{gdbm} handled free blocks. If +set, this option causes all subsequent free blocks to be placed in the +@emph{global} pool, allowing (in theory) more file space to be reused +more quickly. The @var{value} should point to an integer: @samp{TRUE} to +turn central block pool on, and @samp{FALSE} to turn it off. + +The @samp{GDBM_CENTFREE} option is provided for compatibility with +earlier versions. + +@kwindex GDBM_SETCOALESCEBLKS +@kwindex GDBM_COALESCEBLKS +@item GDBM_SETCOALESCEBLKS +@itemx GDBM_COALESCEBLKS +@emph{NOTICE: This feature is still under study.} + +Set free block merging to either on or off. The default is off, which +is how previous versions of @code{gdbm} handled free blocks. If set, +this option causes adjacent free blocks to be merged. This can become +a @acronym{CPU} expensive process with time, though, especially if +used in conjunction with GDBM_CENTFREE. The @var{value} should point +to an integer: @samp{TRUE} to turn free block merging on, and @samp{FALSE} to +turn it off. + +@kwindex GDBM_GETCOALESCEBLKS +@item GDBM_GETCOALESCEBLKS +Return the current status of free block merging. The @var{value} should +point to an @code{int} where the status will be stored. + +@kwindex GDBM_SETMAXMAPSIZE +@item GDBM_SETMAXMAPSIZE +Sets maximum size of a memory mapped region. The @var{value} should +point to a value of type @code{size_t}, @code{unsigned long} or +@code{unsigned}. The actual value is rounded to the nearest page +boundary (the page size is obtained from +@code{sysconf(_SC_PAGESIZE)}). + +@kwindex GDBM_GETMAXMAPSIZE +@item GDBM_GETMAXMAPSIZE +Return the maximum size of a memory mapped region. The @var{value} should +point to a value of type @code{size_t} where to return the data. + +@kwindex GDBM_SETMMAP +@item GDBM_SETMMAP +Enable or disable memory mapping mode. The @var{value} should point +to an integer: @samp{TRUE} to enable memory mapping or @samp{FALSE} to +disable it. + +@kwindex GDBM_GETMMAP +@item GDBM_GETMMAP +Check whether memory mapping is enabled. The @var{value} should point +to an integer where to return the status. + +@kwindex GDBM_GETDBNAME +@item GDBM_GETDBNAME +Return the name of the database disk file. The @var{value} should +point to a variable of type @code{char**}. A pointer to the newly +allocated copy of the file name will be placed there. The caller is +responsible for freeing this memory when no longer needed. For +example: + +@example +char *name; + +if (gdbm_setopt (dbf, GDBM_GETDBNAME, &name, sizeof (name))) + @{ + fprintf (stderr, "gdbm_setopt failed: %s\n", + gdbm_strerror (gdbm_errno)); + @} +else + @{ + printf ("database name: %s\n", name); + free (name); + @} +@end example + +@end table + +The return value will be @samp{-1} upon failure, or @samp{0} upon +success. The global variable @code{gdbm_errno} will be set upon failure. + +For instance, to set a database to use a cache of 10, after opening it +with @code{gdbm_open}, but prior to accessing it in any way, the following +code could be used: + +@example +@group +int value = 10; +ret = gdbm_setopt (dbf, GDBM_CACHESIZE, &value, sizeof (int)); +@end group +@end example + +@node Locking +@chapter File Locking. +@cindex locking + +@kwindex GDBM_NOLOCK +With locking disabled (if @code{gdbm_open} was called with @samp{GDBM_NOLOCK}), +the user may want to perform their own file locking on the database file +in order to prevent multiple writers operating on the same file +simultaneously. + +In order to support this, the @code{gdbm_fdesc} routine is provided. + +@deftypefn {gdbm interface} int gdbm_fdesc (GDBM_FILE @var{dbf}) +Returns the file descriptor of the database @var{dbf}. This value +can be used as an argument to @code{flock}, @code{lockf} or similar +calls. +@end deftypefn + +@node Variables +@chapter Useful global variables. + +The following global variables and constants are available: + +@deftypevar gdbm_error gdbm_errno +This variable contains error code from the last failed @code{gdbm} +call. @xref{Error codes}, for a list of available error codes and +their descriptions. + +Use @code{gdbm_strerror} (@pxref{Errors}) to convert it to a +descriptive text. +@end deftypevar + +@deftypevar {const char *} gdbm_errlist[] +This variable is an array of error descriptions, which is used by +@code{gdbm_strerror} to convert error codes to human-readable text +(@pxref{Errors}). You can access it directly, if you wish so. It +contains @code{_GDBM_MAX_ERRNO + 1} elements and can be directly +indexed by the error code to obtain a corresponding descriptive +text. +@end deftypevar + +@defvr {Constant} _GDBM_MIN_ERRNO +The minimum error code used by @code{gdbm}. +@end defvr + +@defvr {Constant} _GDBM_MAX_ERRNO +The maximum error code used by @code{gdbm}. +@end defvr + +@cindex version number +@deftypevar {const char *} gdbm_version +A string containing the version information. +@end deftypevar + +@deftypevar {int const} gdbm_version_number[3] +This variable contains the @code{gdbm} version numbers: + +@multitable @columnfractions 0.4 0.5 +@headitem Index @tab Meaning +@item 0 @tab Major number +@item 1 @tab Minor number +@item 2 @tab Patchlevel number +@end multitable + +Additionally, the following constants are defined in the @file{gdbm.h} +file: + +@table @asis +@kwindex GDBM_VERSION_MAJOR +@item GDBM_VERSION_MAJOR +Major number. + +@kwindex GDBM_VERSION_MINOR +@item GDBM_VERSION_MINOR +Minor number. + +@kwindex GDBM_VERSION_PATCH +@item GDBM_VERSION_PATCH +Patchlevel number. +@end table + +These can be used to verify whether the header file matches the library. +@end deftypevar + +To compare two split-out version numbers, use the following function: + +@deftypefn {gdbm interface} int gdbm_version_cmp (int const @var{a}[3], @ + int const @var{b}[3]) +Compare two version numbers. Return @samp{-1} if @var{a} is less than +@var{b}, @samp{1} if @var{a} is greater than @var{b} and @samp{0} if +they are equal. + +Comparison is done from left to right, so that: + +@example +a = @{ 1, 8, 3 @}; +b = @{ 1, 8, 3 @}; +gdbm_version_cmp (a, b) @result{} 0 + +a = @{ 1, 8, 3 @}; +b = @{ 1, 8, 2 @}; +gdbm_version_cmp (a, b) @result{} 1 + +a = @{ 1, 8, 3 @}; +b = @{ 1, 9. 0 @}; +gdbm_version_cmp (a, b) @result{} -1 +@end example +@end deftypefn + +@node Error codes +@chapter Error codes +@cindex error codes + +This chapter summarizes error codes which can be set by the +functions in @code{gdbm} library. + +@table @asis +@kwindex GDBM_NO_ERROR +@item GDBM_NO_ERROR +No error occurred. + +@kwindex GDBM_MALLOC_ERROR +@item GDBM_MALLOC_ERROR +Memory allocation failed. Not enough memory. + +@kwindex GDBM_BLOCK_SIZE_ERROR +@item GDBM_BLOCK_SIZE_ERROR +This error is set by the @code{gdbm_open} function (@pxref{Open}), if +the value of its @var{block_size} argument is incorrect. + +@kwindex GDBM_FILE_OPEN_ERROR +@item GDBM_FILE_OPEN_ERROR +The library was not able to open a disk file. This can be set by +@code{gdbm_open} (@pxref{Open}), @code{gdbm_export} and +@code{gdbm_import} functions (@pxref{Flat files}). + +Inspect the value of the system @code{errno} variable to get more +detailed diagnostics. + +@kwindex GDBM_FILE_WRITE_ERROR +@item GDBM_FILE_WRITE_ERROR +Writing to a disk file failed. This can be set by +@code{gdbm_open} (@pxref{Open}), @code{gdbm_export} and +@code{gdbm_import} functions. + +Inspect the value of the system @code{errno} variable to get more +detailed diagnostics. + +@kwindex GDBM_FILE_SEEK_ERROR +@item GDBM_FILE_SEEK_ERROR +Positioning in a disk file failed. This can be set by +@code{gdbm_open} (@pxref{Open}) function. + +Inspect the value of the system @code{errno} variable to get a more +detailed diagnostics. + +@kwindex GDBM_FILE_READ_ERROR +@item GDBM_FILE_READ_ERROR +Reading from a disk file failed. This can be set by +@code{gdbm_open} (@pxref{Open}), @code{gdbm_export} and +@code{gdbm_import} functions. + +Inspect the value of the system @code{errno} variable to get a more +detailed diagnostics. + +@kwindex GDBM_BAD_MAGIC_NUMBER +@item GDBM_BAD_MAGIC_NUMBER +The file given as argument to @code{gdbm_open} function is not a valid +@code{gdbm} file: it has a wrong magic number. + +@kwindex GDBM_EMPTY_DATABASE +@item GDBM_EMPTY_DATABASE +The file given as argument to @code{gdbm_open} function is not a valid +@code{gdbm} file: it has zero length. + +@kwindex GDBM_CANT_BE_READER +@item GDBM_CANT_BE_READER +This error code is set by the @code{gdbm_open} function if it is not +able to lock file when called in @samp{GDBM_READER} mode (@pxref{Open, +GDBM_READER}). + +@kwindex GDBM_CANT_BE_WRITER +@item GDBM_CANT_BE_WRITER +This error code is set by the @code{gdbm_open} function if it is not +able to lock file when called in writer mode (@pxref{Open}). + +@kwindex GDBM_READER_CANT_DELETE +@item GDBM_READER_CANT_DELETE +Set by the @code{gdbm_delete} (@pxref{Delete}) if it attempted to +operate on a database that is open in read-only mode (@pxref{Open, +GDBM_READER}). + +@kwindex GDBM_READER_CANT_STORE +@item GDBM_READER_CANT_STORE +Set by the @code{gdbm_store} (@pxref{Store}) if it attempted to +operate on a database that is open in read-only mode (@pxref{Open, +GDBM_READER}). + +@kwindex GDBM_READER_CANT_REORGANIZE +@item GDBM_READER_CANT_REORGANIZE +Set by the @code{gdbm_reorganize} (@pxref{Reorganization}) if it attempted to +operate on a database that is open in read-only mode (@pxref{Open, +GDBM_READER}). + +@kwindex GDBM_UNKNOWN_UPDATE +@item GDBM_UNKNOWN_UPDATE +Currently unused. Reserved for future uses. + +@kwindex GDBM_ITEM_NOT_FOUND +@item GDBM_ITEM_NOT_FOUND +Requested item was not found. This error is set by @code{gdbm_delete} +(@pxref{Delete}) and @code{gdbm_fetch} (@pxref{Fetch}) when the requested +@var{key} value is not found in the database. + +@kwindex GDBM_REORGANIZE_FAILED +@item GDBM_REORGANIZE_FAILED +The @code{gdbm_reorganize} function is not +able to create a temporary database. @xref{Reorganization}. + +@kwindex GDBM_CANNOT_REPLACE +@item GDBM_CANNOT_REPLACE +Cannot replace existing item. This error is set by the +@code{gdbm_store} if the requested @var{key} value is found in the +database and the @var{flag} parameter is not @samp{GDBM_REPLACE}. +@xref{Store}, for a detailed discussion. + +@kwindex GDBM_ILLEGAL_DATA +@item GDBM_ILLEGAL_DATA +Either @var{key} or @var{content} parameter was wrong in a call to +to @code{gdbm_store} (@pxref{Store}). + +@kwindex GDBM_OPT_ALREADY_SET +@item GDBM_OPT_ALREADY_SET +Requested option can be set only once and was already set. This error +is returned by the @code{gdbm_setopt} function. @xref{Options, +GDBM_CACHESIZE}. + +@kwindex GDBM_OPT_ILLEGAL +@item GDBM_OPT_ILLEGAL +The @var{option} argument is not valid or the @var{value} argument +points to an invalid value in a call to @code{gdbm_setopt} function. +@xref{Options}. + +@kwindex GDBM_BYTE_SWAPPED +@item GDBM_BYTE_SWAPPED +The @code{gdbm_open} function (@pxref{Open}) attempts to open a +database which is created on a machine with different byte ordering. + +@kwindex GDBM_BAD_FILE_OFFSET +@item GDBM_BAD_FILE_OFFSET +The @code{gdbm_open} function (@pxref{Open}) sets this error code if +the file it tries to open has a wrong magic number. + +@kwindex GDBM_BAD_OPEN_FLAGS +@item GDBM_BAD_OPEN_FLAGS +Set by the @code{gdbm_export} function if supplied an invalid +@var{flags} argument. @xref{Flat files}. + +@kwindex GDBM_FILE_STAT_ERROR +@item GDBM_FILE_STAT_ERROR +Getting information about a disk file failed. The system @code{errno} +will give more details about the error. + +This error can be set by the following functions: @code{gdbm_open}, +@code{gdbm_reorganize}. + +@kwindex GDBM_FILE_EOF +@item GDBM_FILE_EOF +End of file was encountered where more data was expected to be +present. This error can occur when fetching data from the database +and usually means that the database is truncated or otherwise corrupted. + +This error can be set by any GDBM function that does I/O. Some of +these functions are: @code{gdbm_delete}, @code{gdbm_exists}, +@code{gdbm_fetch}, @code{gdbm_export}, @code{gdbm_import}, +@code{gdbm_reorganize}, @code{gdbm_firstkey}, @code{gdbm_nextkey}, +@code{gdbm_store}. + +@kwindex GDBM_NO_DBNAME +@item GDBM_NO_DBNAME +Output database name is not specified. This error code is set by +@code{gdbm_load} (@pxref{gdbm_load function,,gdbm_load}) if the first +argument points to @samp{NULL} and the input file does not specify the +database name. + +@kwindex GDBM_ERR_FILE_OWNER +@item GDBM_ERR_FILE_OWNER +This error code is set by @code{gdbm_load} if it is unable to restore +database file owner. It is a mild error condition, meaning that the +data have been restored successfully, only changing the target file +owner failed. Inspect the system @code{errno} variable to get a more +detailed diagnostics. + +@kwindex GDBM_ERR_FILE_MODE +@item GDBM_ERR_FILE_MODE +This error code is set by @code{gdbm_load} if it is unable to restore +database file mode. It is a mild error condition, meaning that the data +have been restored successfully, only changing the target file owner +failed. Inspect the system @code{errno} variable to get a more +detailed diagnostics. + +@end table + +@node Compatibility +@chapter Compatibility with standard @code{dbm} and @code{ndbm}. + +@cindex compatibility layer +@code{Gdbm} includes a compatibility layer, which provides traditional +@samp{ndbm} and older @samp{dbm} functions. The layer is compiled and +installed if the @option{--enable-libgdbm-compat} option is used when +configuring the package. + +@findex ndbm.h +@findex dbm.h +@findex libgdbm_compat +The compatibility layer consists of two header files: @file{ndbm.h} +and @file{dbm.h} and the @file{libgdbm_compat} library. + +Older programs using @code{ndbm} or @code{dbm} interfaces can +use @file{libgdbm_compat} without any changes. To link a program with +the compatibility library, add the following two options to the +@command{cc} invocation: @option{-lgdbm -lgdbm_compat}. The @option{-L} +option may also be required, depending on where @code{gdbm} is +installed, e.g.: + +@example +cc ... -L/usr/local/lib -lgdbm -lgdbm_compat +@end example + +@cindex @samp{dir} file +@cindex @samp{pag} file +Databases created and manipulated by the compatibility interfaces +consist of two different files: @file{@var{file}.dir} and +@file{@var{file}.pag}. This is required by the @acronym{POSIX} +specification and corresponds to the traditional usage. Note, +however, that despite the similarity of the naming convention, +actual data stored in these files has not the same format as +in the databases created by other @code{dbm} or @code{ndbm} +libraries. In other words, you cannot access a standard UNIX +@code{dbm} file with GNU @code{dbm}! + +GNU @code{dbm} files are not @code{sparse}. You can copy them with +the usual @code{cp} command and they will not expand in the copying +process. + +@menu +* ndbm:: NDBM interface functions. +* dbm:: DBM interface functions. +@end menu + +@node ndbm +@section NDBM interface functions. +@cindex NDBM functions + +The functions below implement the @acronym{POSIX} @samp{ndbm} interface: + +@deftypefn {ndbm} {DBM *} dbm_open (char *@var{file}, int @var{flags}, int @var{mode}) +Opens a database. The @var{file} argument is the full name of the +database file to be opened. The function opens two files: +@file{@var{file}.pag} and @file{@var{file}.dir}. The @var{flags} and +@var{mode} arguments have the same meaning as the second and third +arguments of +@ifhtml +@uref{http://www.manpagez.com/man/2/open,,open(2)}, +@end ifhtml +@ifnothtml +@code{open} (@pxref{open,,open a file,open(2), open(2) man page}), +@end ifnothtml +except that a database opened for write-only access opens the files +for read and write access and the behavior of the @code{O_APPEND} flag is +unspecified. + +The function returns a pointer to the @code{DBM} structure describing +the database. This pointer is used to refer to this database in all +operations described below. + +Any error detected will cause a return value of @samp{NULL} and an +appropriate value will be stored in @code{gdbm_errno} +(@pxref{Variables}). +@end deftypefn + +@deftypefn {ndbm} void dbm_close (DBM *@var{dbf}) +Closes the database. The @var{dbf} argument must be a pointer +returned by an earlier call to @code{dbm_open}. +@end deftypefn + +@deftypefn {ndbm} datum dbm_fetch (DBM *@var{dbf}, datum @var{key}) +Reads a record from the database with the matching key. The @var{key} +argument supplies the key that is being looked for. + +If no matching record is found, the @code{dptr} member of the returned +datum is @samp{NULL}. Otherwise, the @code{dptr} member of the +returned datum points to the memory managed by the compatibility +library. The application should never free it. +@end deftypefn + +@deftypefn {ndbm} int dbm_store (DBM *@var{dbf}, datum @var{key}, @ + datum @var{content}, int @var{mode}) +Writes a key/value pair to the database. The argument @var{dbf} is a +pointer to the @code{DBM} structure returned from a call to +@code{dbm_open}. The @var{key} and @var{content} provide the values +for the record key and content. The @var{mode} argument controls +the behavior of @code{dbm_store} in case a matching record already +exists in the database. It can have one of the following two values: + +@table @code +@kwindex DBM_REPLACE +@item DBM_REPLACE +Replace existing record with the new one. + +@kwindex DBM_INSERT +@item DBM_INSERT +The existing record is left unchanged, and the function returns +@samp{1}. +@end table + +If no matching record exists in the database, new record will be +inserted no matter what the value of the @var{mode} is. +@end deftypefn + +@deftypefn {ndbm} int dbm_delete (DBM *@var{dbf}, datum @var{key}) +Deletes the record with the matching key from the database. If the +function succeeds, @samp{0} is returned. Otherwise, if no matching +record is found or if an error occurs, @samp{-1} is returned. +@end deftypefn + +@deftypefn {ndbm} datum dbm_firstkey (DBM *@var{dbf}) +Initializes iteration over the keys from the database and returns +the first key. Note, that the word @samp{first} does not imply any +specific ordering of the keys. + +If there are no records in the database, the @code{dptr} member of the +returned datum is @samp{NULL}. Otherwise, the @code{dptr} member of +the returned datum points to the memory managed by the compatibility +library. The application should never free it. +@end deftypefn + +@deftypefn {ndbm} datum dbm_nextkey (DBM *@var{dbf}) +Continues the iteration started by @code{dbm_firstkey}. Returns the +next key in the database. If the iteration covered all keys in the +database, the @code{dptr} member of the returned datum is @samp{NULL}. +Otherwise, the @code{dptr} member of the returned datum points to the +memory managed by the compatibility library. The application should +never free it. + +@cindex sequential access, using @samp{NDBM} +@cindex iteration loop, using @samp{NDBM} +The usual way of iterating over all the records in the database is: + +@example +for (key = dbm_firstkey (dbf); + key.ptr; + key = dbm_nextkey (dbf)) + @{ + /* do something with the key */ + @} +@end example + +The loop above should not try to delete any records from the database, +otherwise the iteration is not guaranteed to cover all the keys. +@xref{Sequential}, for a detailed discussion of this. +@end deftypefn + +@deftypefn {ndbm} int dbm_error (DBM *@var{dbf}) +Returns the error condition of the database: @samp{0} if no errors +occurred so far while manipulating the database, and a non-zero value +otherwise. +@end deftypefn + +@deftypefn {ndbm} void dbm_clearerr (DBM *@var{dbf}) +Clears the error condition of the database. +@end deftypefn + +@deftypefn {ndbm} int dbm_dirfno (DBM *@var{dbf}) +Returns the file descriptor of the @samp{dir} file of the database. +It is guaranteed to be different from the descriptor returned by +the @code{dbm_pagfno} function (see below). + +The application can lock this descriptor to serialize accesses to the +database. +@end deftypefn + +@deftypefn {ndbm} int dbm_pagfno (DBM *@var{dbf}) +Returns the file descriptor of the @samp{pag} file of the database. +See also @code{dbm_dirfno}. +@end deftypefn + +@deftypefn {ndbm} int dbm_rdonly (DBM *@var{dbf}) +Returns @samp{1} if the database @var{dbf} is open in a read-only mode +and @samp{0} otherwise. +@end deftypefn + +@node dbm +@section DBM interface functions. +@cindex DBM functions + +The functions below are provided for compatibility with the old +UNIX @samp{DBM} interface. Only one database at a time can be +manipulated using them. + +@deftypefn {dbm} int dbminit (char *@var{file}) +Opens a database. The @var{file} argument is the full name of the +database file to be opened. The function opens two files: +@file{@var{file}.pag} and @file{@var{file}.dir}. If any of +them does not exist, the function fails. It never attempts to create +the files. + +The database is opened in the read-write mode, if its disk permissions +permit. + +The application must ensure that the functions described below in +this section are called only after a successful call to @code{dbminit}. +@end deftypefn + +@deftypefn {dbm} int dbmclose (void) +Closes the database opened by an earlier call to @code{dbminit}. +@end deftypefn + +@deftypefn {dbm} datum fetch (datum @var{key}) +Reads a record from the database with the matching key. The @var{key} +argument supplies the key that is being looked for. + +If no matching record is found, the @code{dptr} member of the returned +datum is @samp{NULL}. Otherwise, the @code{dptr} member of the +returned datum points to the memory managed by the compatibility +library. The application should never free it. +@end deftypefn + +@deftypefn {dbm} int store (datum @var{key}, datum @var{content}) +Stores the key/value pair in the database. If a record with the +matching key already exists, its content will be replaced with the new +one. + +Returns @samp{0} on success and @samp{-1} on error. +@end deftypefn + +@deftypefn {dbm} int delete (datum @var{key}) +Deletes a record with the matching key. + +If the function succeeds, @samp{0} is returned. Otherwise, if no +matching record is found or if an error occurs, @samp{-1} is +returned. +@end deftypefn + +@deftypefn {dbm} datum firstkey (void) +Initializes iteration over the keys from the database and returns +the first key. Note, that the word @samp{first} does not imply any +specific ordering of the keys. + +If there are no records in the database, the @code{dptr} member of the +returned datum is @samp{NULL}. Otherwise, the @code{dptr} member of +the returned datum points to the memory managed by the compatibility +library. The application should never free it. +@end deftypefn + +@deftypefn {dbm} datum nextkey (datum @var{key}) +Continues the iteration started by a call to @code{firstkey}. Returns +the next key in the database. If the iteration covered all keys in the +database, the @code{dptr} member of the returned datum is @samp{NULL}. +Otherwise, the @code{dptr} member of the returned datum points to the +memory managed by the compatibility library. The application should +never free it. +@end deftypefn + +@node gdbmtool +@chapter Examine and modify a GDBM database. +@prindex gdbmtool + +The @command{gdbmtool} utility allows you to view and modify an +existing @acronym{GDBM} database or to create a new one. + +@cindex default database, @command{gdbmtool} +@flindex junk.gdbm +When invoked without arguments, it tries to open a database file called +@file{junk.gdbm}, located in the current working directory. You can +change this default by supplying the name of the database to use as +an argument to the program, e.g.: + +@example +$ gdbmtool file.db +@end example + +@cindex read-only mode, @command{gdbmtool} +@cindex @option{-r}, @command{gdbmtool} option +@cindex @option{--read-only}, @command{gdbmtool} option +The database will be opened in read-write mode, unless the +@option{-r} (@option{--read-only}) option is specified, in which case +it will be opened only for reading. + +@cindex creating a database, @command{gdbmtool} +@cindex @option{-n}, @command{gdbmtool} option +@cindex @option{--newdb}, @command{gdbmtool} option +If the database does not exist, @command{gdbmtool} will create it. +There is a special option @option{-n} (@option{--newdb}, which +instructs the utility to create a new database. If it is used and if +the database already exists, it will be deleted, so use it sparingly. + +@menu +* invocation:: +* shell:: +@end menu + +@node invocation +@section gdbmtool invocation +@cindex command line options, @command{gdbmtool} + +The following table summarizes all @command{gdbmtool} command line +options: + +@table @option +@item -b @var{size} +@itemx --block-size=@var{size} +Set block size. +@item -c @var{size} +@itemx --cache-size=@var{size} +Set cache size. +@item -f @var{file} +@item --file @var{file} +Read commands from @var{file}, instead of the standard input. +@item -h +@itemx --help +Print a concise help summary. +@item -N +@itemx --norc +Don't read startup files (@pxref{startup files}). +@item -n +@itemx --newdb +Create the database. +@item -l +@itemx --no-lock +Disable file locking. +@item -m +@itemx --no-mmap +Disable mmap. +@anchor{-q option} +@item -q +@itemx --quiet +Don't print the usual welcome banner at startup. This is the same as +setting the variable @samp{quiet} in the startup file. @xref{quiet}. +@item -r +@itemx --read-only +Open the database in read-only mode. +@item -s +@itemx --synchronize +Synchronize to the disk after each write. +@item -V +@itemx --version +Print program version and licensing information and exit. +@item --usage +Print a terse invocation syntax summary along with a list of available +command line options. +@end table + +@node shell +@section gdbmtool interactive mode +@cindex interactive mode, @command{gdbmtool} + +After successful startup, @command{gdbmtool} starts a loop, in which +it reads commands from the standard input, executes them and prints +the results on the standard output. If the standard input is attached +to a console, @command{gdbmtool} runs in interactive mode, which is +indicated by its @dfn{prompt}: + +@example +gdbmtool> _ +@end example + +The utility finishes when it reads the @samp{quit} command (see below) or +detects end-of-file on its standard input, whichever occurs first. + +A @command{gdbmtool} command consists of a @dfn{command verb}, +optionally followed by @dfn{arguments}, separated by any +amount of white space. A command verb can be entered either in full +or in an abbreviated form, as long as that abbreviation does not match +any other verb. For example, @samp{co} can be used instead of +@samp{count} and @samp{ca} instead of @samp{cache}. + +Any sequence of non-whitespace characters appearing after the command +verb forms an argument. If the argument contains whitespace or +unprintable characters it must be enclosed in double quotes. Within +double quotes the usual @dfn{escape sequences} are understood, as +shown in the table below: + +@float Table, backslash-interpretation +@caption{Backslash escapes} +@multitable @columnfractions 0.30 .5 +@item Sequence @tab Replaced with +@item \a @tab Audible bell character (@acronym{ASCII} 7) +@item \b @tab Backspace character (@acronym{ASCII} 8) +@item \f @tab Form-feed character (@acronym{ASCII} 12) +@item \n @tab Newline character (@acronym{ASCII} 10) +@item \r @tab Carriage return character (@acronym{ASCII} 13) +@item \t @tab Horizontal tabulation character (@acronym{ASCII} 9) +@item \v @tab Vertical tabulation character (@acronym{ASCII} 11) +@item \\ @tab Single slash +@item \" @tab Double quote +@end multitable +@end float + +In addition, a backslash immediately followed by the end-of-line +character effectively removes that character, allowing to split long +arguments over several input lines. + +Command parameters may be optional or mandatory. If the number of +actual arguments is less than the number of mandatory parameters, +@command{gdbmtool} will prompt you to supply missing arguments. For +example, the @samp{store} command takes two mandatory parameters, so +if you invoked it with no arguments, you would be prompted twice to +supply the necessary data, as shown in example below: + +@example +gdbmtool> @kbd{store} +key? @kbd{three} +data? @kbd{3} +@end example + +However, such prompting is possible only in interactive mode. In +non-interactive mode (e.g.@: when running a script), all arguments must +be supplied with each command, otherwise @command{gdbmtool} will report an +error and exit immediately. + +@menu +* variables:: shell variables. +* commands:: shell commands. +* definitions:: how to define structured data. +* startup files:: +@end menu + +@node variables +@subsection Shell Variables +@cindex variables, gdbmtool +A number of @command{gdbmtool} parameters is kept in its internal +variables. + +@deftypevr {gdbmtool variable} bool confirm +Whether to ask for confirmation before certain destructive operations, +such as truncating the existing database. + +Default is @samp{true}. +@end deftypevr + +@deftypevr {gdbmtool variable} string ps1 +Primary prompt string. Its value can contain @dfn{conversion +specifiers}, consisting of the @samp{%} character followed by another +character. These specifiers are expanded in the resulting prompt as +follows: + +@multitable @columnfractions 0.4 0.5 +@headitem Sequence @tab Expansion +@item %f @tab name of the current database file +@item %p @tab program invocation name +@item %P @tab package name (@samp{GDBM}) +@item %v @tab program version +@item %_ @tab single space character +@item %% @tab % +@end multitable + +The default value is @samp{%p>%_}, i.e. the program name, followed by +a ``greater than'' sign, followed by a single space. +@end deftypevr + +@deftypevr {gdbmtool variable} string ps2 +Secondary prompt. See @samp{ps1} for a description of its value. +This prompt is displayed before reading the second and subsequent +lines of a multi-line command. + +The default value is @samp{%_>%_}. +@end deftypevr + +@deftypevr {gdbmtool variable} string delim1 +A string used to delimit fields of a structured datum on output +(@pxref{definitions}). + +Default is @samp{,} (a comma). This variable cannot be unset. +@end deftypevr + +@deftypevr {gdbmtool variable} string delim2 +A string used to delimit array items when printing a structured datum +(@pxref{definitions}). + +Default is @samp{,} (a comma). This variable cannot be unset. +@end deftypevr + +@deftypevr {gdbmtool variable} string pager +The name and command line of the pager program to pipe output to. +This program is used in interactive mode when the estimated number of +output lines is greater then the number of lines on your screen. + +The default value is inherited from the environment variable +@env{PAGER}. Unsetting this variable disables paging. +@end deftypevr + +@anchor{quiet} +@deftypevr {gdbmtool variable} bool quiet +Whether to display a welcome banner at startup. This variable should +be set in a startup script file (@pxref{startup files}). +@xref{-q option}. +@end deftypevr + +@anchor{open parameters} +The following variables control how the database is opened: + +@deftypevr {gdbmtool variable} numeric blocksize +Sets the block size. @xref{Open, block_size}. Unset by default. +@end deftypevr + +@deftypevr {gdbmtool variable} numeric cachesize +Sets the cache size. @xref{Options, GDBM_SETCACHESIZE}. +By default this variable is not set. +@end deftypevr + +@anchor{openvar} +@deftypevr {gdbmtool variable} string open +Open mode. The following values are allowed: + +@table @asis +@item newdb +Truncate the database if it exists or create a new one. Open it in +read-write mode. + +Technically, this sets the @samp{GDBM_NEWDB} flag in call to @samp{gdbm_open}. +@xref{Open, GDBM_NEWDB}. +@item wrcreat +@itemx rw +Open the database in read-write mode. Create it if it does not +exist. This is the default. + +Technically speaking, it sets the @samp{GDBM_WRCREAT} flag in call to +@code{gdbm_open}. @xref{Open, GDBM_WRCREAT}. +@item reader +@itemx readonly +Open the database in read-only mode. Signal an error if it does not +exist. + +This sets the @samp{GDBM_READER} flag (@pxref{Open, GDBM_READER}). +@end table + +Attempting to set any other value or to unset this variable produces +an error. +@end deftypevr + +@anchor{filemode} +@deftypevr {gdbmtool variable} number filemode +File mode (in octal) for creating new database files and database +dumps. +@end deftypevr + +@deftypevr {gdbmtool variable} bool lock +Lock the database. This is the default. + +Setting this variable to false or unsetting it results in passing +@samp{GDBM_NOLOCK} flag to @code{gdbm_open} (@pxref{Open, GDBM_NOLOCK}). +@end deftypevr + +@deftypevr {gdbmtool variable} bool mmap +Use memory mapping. This is the default. + +Setting this variable to false or unsetting it results in passing +@samp{GDBM_NOMMAP} flag to @code{gdbm_open} (@pxref{Open, GDBM_NOMMAP}). +@end deftypevr + +@deftypevr {gdbmtool variable} bool sync +Flush all database writes on disk immediately. Default is false. +@xref{Open, GDBM_SYNC}. +@end deftypevr + +The following commands are used to list or modify the variables: + +@deffn {command verb} set [@var{assignments}] +When used without arguments, lists all variables and their values. +Unset variables are shown after a comment sign (@samp{#}). For string +and numeric variables, values are shown after an equals sign. For +boolean variables, only the variable name is displayed if the variable +is @samp{true}. If it is @samp{false}, its name is prefixed with +@samp{no}. + +For example: + +@example +@group +ps1="%p>%_" +ps2="%_>%_" +delim1="," +delim2="," +confirm +# cachesize is unset +# blocksize is unset +open="wrcreat" +lock +mmap +nosync +pager="less" +# quiet is unset +@end group +@end example + +If used with arguments, the @code{set} command alters the specified +variables. In this case, arguments are variable assignments in the +form @samp{@var{name}=@var{value}}. For boolean variables, the +@var{value} is interpreted as follows: if it is numeric, @samp{0} +stands for @samp{false}, any non-zero value stands for @samp{true}. +Otherwise, the values @samp{on}, @samp{true}, and @samp{yes} denote +@samp{true}, and @samp{off}, @samp{false}, @samp{no} stand for +@samp{false}. Alternatively, only the name of a boolean variable can be +supplied to set it to @samp{true}, and its name prefixed with +@samp{no} can be used to set it to false. For example, the following +command sets the @samp{delim2} variable to @samp{;} and the +@samp{confirm} variable to @samp{false}: + +@example +set delim2=";" noconfirm +@end example +@end deffn + +@deffn {command verb} unset @var{variables} +Unsets the listed variables. The effect of unsetting depends on the +variable. Unless explicitly described in the discussion of the +variables above, unsetting a boolean variable is equivalent to setting it to +@samp{false}. Unsetting a string variable is equivalent to assigning it +an empty string. +@end deffn + +@node commands +@subsection Gdbmtool Commands + +@deffn {command verb} avail +Print the @dfn{avail list}. +@end deffn + +@deffn {command verb} bucket @var{num} +Print the bucket number @var{num} and set it as the current one. +@end deffn + +@deffn {command verb} cache +Print the bucket cache. +@end deffn + +@deffn {command verb} close +Close the currently open database. +@end deffn + +@deffn {command verb} count +Print the number of entries in the database. +@end deffn + +@deffn {command verb} current +Print the current bucket. +@end deffn + +@deffn {command verb} delete @var{key} +Delete record with the given @var{key} +@end deffn + +@deffn {command verb} dir +Print hash directory. +@end deffn + +@anchor{gdbmtool export} +@deffn {command verb} export @var{file-name} [truncate] [binary|ascii] +Export the database to the flat file @var{file-name}. @xref{Flat files}, +for a description of the flat file format and its purposes. This +command will not overwrite an existing file, unless the +@samp{truncate} parameter is also given. Another optional argument +determines the type of the dump (@pxref{Flat files}). By default, ASCII +dump is created. + +The global variable @code{filemode} specifies the permissions to use +for the created output file. + +See also @ref{gdbmexport}. +@end deffn + +@deffn {command verb} fetch @var{key} +Fetch and display the record with the given @var{key}. +@end deffn + +@deffn {command verb} first +Fetch and display the first record in the database. Subsequent +records can be fetched using the @code{next} command (see below). +@xref{Sequential}, for more information on sequential access. +@end deffn + +@deffn {command verb} hash @var{key} +Compute and display the hash value for the given @var{key}. +@end deffn + +@deffn {command verb} header +Print file header. +@end deffn + +@deffn {command verb} help +@deffnx {command verb} ? +Print a concise command summary, showing each command verb +with its parameters and a short description of what it does. Optional +arguments are enclosed in square brackets. +@end deffn + +@anchor{gdbmtool import} +@deffn {command verb} import @var{file-name} [replace] [nometa] +Import data from a flat dump file @var{file-name} +(@pxref{Flat files}). If the word @samp{replace} is given +as an argument, any records with the same keys as the already +existing ones will replace them. The word @samp{nometa} turns off +restoring meta-information from the dump file. +@end deffn + +@deffn {command verb} list +List the contents of the database. +@end deffn + +@deffn {command verb} next [@var{key}] +Sequential access: fetch and display the next record. If the @var{key} is +given, the record following the one with this key will be fetched. + +See also @code{first}, above. + +@xref{Sequential}, for more information on sequential access. +@end deffn + +@deffn {command verb} open @var{filename} +Open the database file @var{filename}. If successful, any previously +open database is closed. Otherwise, if the operation fails, the +currently opened database remains unchanged. + +This command takes additional information from the following +variables: + +@table @samp +@item open +The database access mode. @xref{openvar,, The @var{open} variable}, +for a list of its values. +@item lock +Whether or not to lock the database. Default is @samp{on}. +@item mmap +Use the memory mapping. Default is @samp{on}. +@item sync +Synchronize after each write. Default is @samp{off}. +@item filemode +Specifies the permissions to use in case a new file is created. +@end table + +@xref{open parameters}, for a detailed description of these variables. +@end deffn + +@deffn {command verb} quit +Close the database and quit the utility. +@end deffn + +@deffn {command verb} reorganize +Reorganize the database (@pxref{Reorganization}). +@end deffn + +@deffn {command verb} source @var{filename} +Read @command{gdbmtool} commands from the file @var{filename}. +@end deffn + +@deffn {command verb} status +Print current program status. The following example shows the +information displayed: + +@example +Database file: junk.gdbm +Database is open +define key string +define content string +@end example + +The two @samp{define} strings show the defined formats for key and +content data. @xref{definitions}, for a detailed discussion of their +meaning. +@end deffn + +@deffn {command verb} store @var{key} @var{data} +Store the @var{data} with @var{key} in the database. If @var{key} +already exists, its data will be replaced. +@end deffn + +@deffn {command verb} version +Print the version of @command{gdbm}. +@end deffn + +@node definitions +@subsection Data Definitions +GDBM databases are able to keep data of any type, both in the key and +in the content part of a record. Quite often these data are +structured, i.e. they consist of several fields of various types. +@command{Gdbmtool} provides a mechanism for handling such kind of +records. + +The @code{define} command defines a record structure. The general +syntax is: + +@example +define @var{what} @var{definition} +@end example + +@noindent +where @var{what} is @samp{key} to defining the structure of key data and +@samp{content} to define the structure of the content records. + +The @var{definition} can be of two distinct formats. In the simplest +case it is a single data type. For example, + +@example +define content int +@end example + +@noindent +defines content records consisting of a single integer field. +Supported data types are: + +@table @asis +@item char +Single byte (signed). +@item short +Signed short integer. +@item ushort +Unsigned short integer. +@item int +Signed integer. +@item unsigned +@itemx uint +Unsigned integer. +@item long +Signed long integer. +@item ulong +Unsigned long integer. +@item llong +Signed long long integer. +@item ullong +Unsigned long long integer. +@item float +A floating point number. +@item double +Double-precision floating point number. +@item string +Array of bytes. +@item stringz +Null-terminated string, trailing null being part of the string. +@end table + +All numeric data types (integer as well as floating point) have the +same respective widths as in C language on the host where the database +file resides. + +The @samp{string} and @samp{stringz} are special. Both define a +string of bytes, similar to @samp{char x[]} in C. The former +defines an array of bytes, the latter - a null-terminated string. +This makes a difference, in particular, when the string is the only +part of datum. Consider the following two definitions: + +@enumerate 1 +@item @code{define key string} +@item @code{define key stringz} +@end enumerate + +@noindent +Now, suppose we want to store the string "ab" in the key. Using the +definition (1), the @code{dptr} member of GDBM @code{datum} will +contain two bytes: @samp{a}, and @samp{b}. Consequently, the +@code{dsize} member will have the value 2. Using the definition (2), +the @code{dptr} member will contain three bytes: @samp{a}, @samp{b}, +and ASCII 0. The @code{dsize} member will have the value 3. + +The definition (1) is the default for both key and content. + +The second form of the @code{define} statement is similar to the C +@code{struct} statement and allows for defining structural data. In +this form, the @var{definition} part is a comma-separated list of data +types and variables enclosed in curly braces. In contrast to the +rest of @command{gdbm} commands, this command is inherently +multiline and is terminated with the closing curly brace. For +example: + +@example +define content @{ + int status, + pad 8, + char id[3], + string name +@} +@end example + +@noindent +This defines a structure consisting of three members: an integer +@code{status}, an array of 8 bytes @code{id}, and a null-terminated +string @code{name}. Notice the @code{pad} statement: it allows to +introduce padding between structure members. Another useful statement +is @code{offset}: it specifies that the member following it begins at +the given offset in the structure. Assuming the size of @code{int} is +8 bytes, the above definition can also be written as + +@example +define content @{ + int status, + offset 16, + char id[3], + string name +@} +@end example + +@emph{NOTE}: The @samp{string} type can reasonably be used only if it +is the last or the only member of the data structure. That's because it +provides no information about the number of elements in the array, so +it is interpreted to contain all bytes up to the end of the datum. + +When displaying the structured data, @command{gdbmtool} precedes each +value with the corresponding field name and delimits parts of the +structure with the string defined in the @samp{delim1} variable +(@pxref{variables}). Array elements are delimited using the string from +@samp{delim2}. For example: + +@example +gdbmtool> fetch foo +status=2,id=@{ a, u, x @},name="quux" +@end example + +To supply a structured datum as an argument to a @command{gdbmtool} +command, use the same notation, but without field names, e.g.: + +@example +gdbmtool> hash @{ 2, @{a,u,x@}, "quux" @} +hash value = 13089969. +@end example + +@node startup files +@subsection Startup Files +@cindex startup file, gdbmtool +@cindex init file, gdbmtool +@flindex .gdbmtoolrc +Upon startup @command{gdbmtool} looks for a file named +@samp{.gdbmtoolrc} first in the current working directory and, if not +found, in the home directory of the user who started the command. + +If found, this file is read and interpreted as a list of +@command{gdbmtool} commands. This allows you to customize the +program behavior. + +Following is an example startup file which disables the welcome +banner, sets command line prompt to contain the name of the database +file in parentheses and defines the structure of the database content +records: + +@example +@group +set quiet +set ps1="(%f) " +define key stringz +define content @{ + int time, + pad 4, + int status +@} +@end group +@end example + +@node gdbm_dump +@chapter The @command{gdbm_dump} utility +@prindex gdbm_dump + +The @command{gdbm_dump} utility creates a flat file dump of a GDBM +database (@pxref{Flat files}). It takes one mandatory argument: the +name of the source database file. The second argument, if given, +specifies the name of the output file. If not given, +@command{gdbm_dump} will produce the dump on the standard output. + +For example, the following invocation creates a dump of the database +@file{file.db} in the file @file{file.dump}: + +@example +$ gdbm_dump file.db file.dump +@end example + +By default the utility creates dumps in ASCII format (@pxref{Flat +files,ASCII}). Another format can be requested using the +@option{--format} (@option{-H}) option. + +The @command{gdbm_dump} utility understands the following command line +options: + +@table @option +@item -H @var{fmt} +@itemx --format=@var{fmt} +Select output format. Valid values for @var{fmt} are: @samp{binary} +or @samp{0} to select binary dump format, and @samp{ascii} or @samp{1} +to select ASCII format. + +@item -h +@itemx --help +Print a concise help summary. + +@item -V +@itemx --version +Print program version and licensing information and exit. + +@item --usage +Print a terse invocation syntax summary along with a list of available +command line options. +@end table + +@node gdbm_load +@chapter The @command{gdbm_load} utility +@prindex gdbm_load + +The @command{gdbm_load} utility restores a GDBM database from a flat +file. The utility requires at least one argument: the name of the +input flat file. If it is @samp{-}, the standard input will be read. +The format of the input file is detected automatically. + +By default the utility attempts to restore the database under its +original name, as stored in the input file. It will fail to do so if +the input is in binary format. In that case, the name of the database +must be given as the second argument. + +In general, if two arguments are given the second one is treated as +the name of the database to create, overriding the file name specified +in the flat file. + +The utility understands the following command line arguments: + +@table @option + +@item -b @var{num} +@itemx --block-size=@var{num} +Sets block size. @xref{Open, block_size}. + +@item -c @var{num} +@itemx --cache-size=@var{num} +Sets cache size. @xref{Options, GDBM_SETCACHESIZE}. + +@item -M +@itemx --mmap +Use memory mapping. + +@item -m @var{mode} +@item --mode=@var{mode} +Sets the file mode. The argument is the desired file mode in octal. + +@item -n +@itemx --no-meta +Do not restore file meta-data (ownership and mode) from the flat file. + +@item -r +@itemx --replace +Replace existing keys. + +@item -u @var{user}[:@var{group}] +@itemx --user=@var{user}[:@var{group}] +Set file owner. The @var{user} can be either a valid user name or +UID. Similarly, the @var{group} is either a valid group name or GID. +If @var{group} is not given, the main group of @var{user} is used. + +User and group parts can be separated by a dot, instead of the colon. + +@item -h +@itemx --help +Print a concise help summary. + +@item -V +@itemx --version +Print program version and licensing information and exit. + +@item --usage +Print a terse invocation syntax summary along with a list of available +command line options. +@end table + +@node gdbmexport +@chapter Export a database into a portable format. +@prindex gdbmexport + +The @command{gdbmexport} utility converts the database of an older +GDBM version into a binary flat format. + +The utility takes two mandatory arguments: the name of the database +file to convert and the output file name, e.g.: + +@example +$ gdbmexport junk.gdbm junk.flat +@end example + +In addition the following two options are understood: + +@table @option +@item -h +Display short usage summary and exit. + +@item -v +Display program version and licensing information, and exit. +@end table + +@node Exit codes +@chapter Exit codes +@cindex exit code + +All GDBM utilities return uniform exit codes. These are summarized in +the table below: + +@multitable @columnfractions 0.3 0.7 +@headitem Code @tab Meaning +@item 0 @tab Successful termination. +@item 1 @tab A fatal error occurred. +@item 2 @tab Program was unable to restore file ownership or mode. +@item 3 @tab Command line usage error. +@end multitable + +@node Bugs +@chapter Problems and bugs. + +If you have problems with GNU @code{dbm} or think you've found a bug, +please report it. Before reporting a bug, make sure you've actually +found a real bug. Carefully reread the documentation and see if it +really says you can do what you're trying to do. If it's not clear +whether you should be able to do something or not, report that too; it's +a bug in the documentation! + +Before reporting a bug or trying to fix it yourself, try to isolate it +to the smallest possible input file that reproduces the problem. Then +send us the input file and the exact results @code{gdbm} gave you. Also +say what you expected to occur; this will help us decide whether the +problem was really in the documentation. + +Once you've got a precise problem, send e-mail to +@email{bug-gdbm@@gnu.org}. + +Please include the version number of GNU @code{dbm} you are using. You can get +this information by printing the variable @code{gdbm_version} +(@pxref{Variables}). + +Non-bug suggestions are always welcome as well. If you have questions +about things that are unclear in the documentation or are just obscure +features, please report them too. + +You may contact the authors and maintainers by e-mail: +@example +@email{phil@@cs.wwu.edu}, @email{downsj@@downsj.com}, @email{gray@@gnu.org.ua} +@end example + +@node Resources +@chapter Additional resources + +For the latest updates and pointers to additional resources, visit +@uref{http://www.gnu.org/@/software/@/gdbm}. + +In particular, a copy of @code{gdbm} documentation in various formats +is available online at @uref{http://www.gnu.org/@/software/@/gdbm/@/manual.html}. + +Latest versions of @code{gdbm} can be downloaded from anonymous FTP: +@uref{ftp://ftp.gnu.org/@/gnu/@/gdbm}, or via HTTP from +@uref{http://ftp.gnu.org/@/gnu/@/gdbm}, or from any +@ifhtml +@uref{http://www.gnu.org/order/ftp.html,,GNU mirror} worldwide. +@end ifhtml +@ifnothtml +GNU mirror worldwide. See @uref{http://www.gnu.org/@/order/@/ftp.html}, +for a list of mirrors. +@end ifnothtml + +To track @code{gdbm} development, visit +@uref{http://puszcza.gnu.org.ua/@/projects/@/gdbm}. + +@node GNU Free Documentation License +@appendix GNU Free Documentation License + +@include fdl.texi + +@node Index +@unnumbered Index + +@printindex cp + +@bye diff --git a/doc/gdbm_dump.1 b/doc/gdbm_dump.1 new file mode 100644 index 0000000..bf68683 --- /dev/null +++ b/doc/gdbm_dump.1 @@ -0,0 +1,88 @@ +.\" This file is part of GDBM. +.\" Copyright (C) 2013 Free Software Foundation, Inc. +.\" +.\" GDBM 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 3, or (at your option) +.\" any later version. +.\" +.\" GDBM 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 GDBM. If not, see <http://www.gnu.org/licenses/>. */ +.TH GDBM_DUMP 1 "May 8, 2013" "GDBM" "GDBM User Reference" +.SH NAME +gdbm_dump \- dump a GDBM database to a file +.SH SYNOPSIS +\fBgdbm_dump\fR [\fB\-H \fIFMT\fR] [\fB\-\-format\fR=\fIFMT\fR] \fIDB_FILE\fR [\fIFILE\fR] +.sp +\fBgdbm_dump\fR [\fB\-Vh\fR] [\fB\-\-help\fR] [\fB\-\-usage\fR] [\fB\-\-version\fR] +.SH DESCRIPTION +The +.B gdbm_dump +utility creates a dump of the specified +.BR gdbm (3) +database file. The name for the output dump file is supplied by the +second argument (\fIFILE\fR). If not specified, the output goes to +the standard error. +.PP +The created dump can be given as argument to the +.BR gdbm_load (1) +utility in order to re-create an exact copy of the \fIDB_FILE\fR. +.SH OPTIONS +.TP +\fB\-H\fR, \fB\-\-format\fR=\fIFMT\fR +Select dump format. The value \fBbinary\fR (or \fB0\fR) instructs +.B gdbm_dump +to produce a binary dump, compatible with earlier +.B gdbm +versions (up to version 1.9). The value \fBascii\fR (or \fB1\fR) +instructs it to create an ASCII dump (this is the default). The +latter is preferred because, apart from the actual data, it also +contains meta-information which will allow +.BR gdbm_load (1) +to recreate an exact copy of the file. +.TP +\fB\-h\fR, \fB\-\-help\fR +Print a short usage summary. +.TP +\fB\-\-usage\fR +Print a list of available options. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print program version +.SH "SEE ALSO" +.BR gdbm_load (1), +.BR gdbmtool (1), +.BR gdbm (3). +.PP +For a detailed description of +.B gdbm_dump +and other +.B gdbm +utilities, refer to the \fBGDBM Manual\fR available in +Texinfo format. To access it, run: + + \fBinfo gdbm\fR + +.SH "REPORTING BUGS" +Report bugs to <bug\-gdbm@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2013 Free Software Foundation, Inc +.br +.na +License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> +.br +.ad +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +.\" Local variables: +.\" eval: (add-hook 'write-file-hooks 'time-stamp) +.\" time-stamp-start: ".TH GDBM[A-Z_-]* 1 \"" +.\" time-stamp-format: "%:B %:d, %:y" +.\" time-stamp-end: "\"" +.\" time-stamp-line-limit: 20 +.\" end: diff --git a/doc/gdbm_load.1 b/doc/gdbm_load.1 new file mode 100644 index 0000000..8b0e77c --- /dev/null +++ b/doc/gdbm_load.1 @@ -0,0 +1,108 @@ +.\" This file is part of GDBM. -*- nroff -*- +.\" Copyright (C) 2011, 2013 Free Software Foundation, Inc. +.\" +.\" GDBM 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 3, or (at your option) +.\" any later version. +.\" +.\" GDBM 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 GDBM. If not, see <http://www.gnu.org/licenses/>. */ +.TH GDBM_LOAD 1 "December 25, 2013" "GDBM" "GDBM User Reference" +.SH NAME +gdbm_load \- re-create a GDBM database from a dump file. +.SH SYNOPSIS +\fBgdbm_load\fR [\fB\-Mnr\fR] [\fB\-b\fR \fINUM\fR] [\fB\-c\fR \fINUM]\ + [\fB\-m\fR \fIMODE\fR]\ + [\fB\-u\fR \fINAME\fR|\fIUID\fR[:\fINAME\fR|\fIGID\fR]] + [\fB\-\-block\-size\fR=\fINUM\fR] [\fB\-\-cache\-size\fR=\fINUM\fR]\ + [\fB\-\-mmap\fR=\fINUM\fR] + [\fB\-\-mode\fR=\fIMODE\fR]\ + [\fB\-\-no\-meta\fR] [\fB\-\-replace\fR] + [\fB\-\-user\fR=\fINAME\fR|\fIUID\fR[:\fINAME\fR|\fIGID\fR]]\ + \fIFILE\fR [\fIDB_FILE\fR] + +.sp +\fBgdbm_load\fR [\fB\-Vh\fR] [\fB\-\-help\fR] [\fB\-\-usage\fR] [\fB\-\-version\fR] +.SH DESCRIPTION +Create a +.B gdbm +database file +.I DB_FILE +from the dump file +.IR FILE . +If the +.I FILE +argument is not supplied, output the created database to the standard error. +.PP +If the input file is in ASCII dump format, the mode and ownership of +the created database are restored from the information in the dump. +This can be overridden using the command line options (see below). +.SH OPTIONS +.TP +\fB\-b\fR, \fB\-\-block\-size\fR=\fINUM\fR +Sets block size. +.TP +\fB\-c\fR, \fB\-\-cache\-size\fR=\fINUM\fR +Sets cache size. +.TP +\fB\-M\fR, \fB\-\-mmap\fR +Use memory mapping. +.TP +\fB\-m\fR, \fB\-\-mode\fR=\fIMODE\fR +Set database file mode (octal number). +.TP +\fB\-n\fR, \fB\-\-no\-meta\fR +Do not attempt to restore database meta-data (mode and ownership). +.TP +\fB\-r\fR, \fB\-\-replace\fR +If the database exists, replace records in it. +.TP +\fB\-u\fR, \fB\-\-user\fR=\fINAME\fR|\fIUID\fR[:\fINAME\fR|\fIGID\fR] +Set file ownership. +.TP +\fB\-h\fR, \fB\-\-help\fR +Print a short usage summary. +.TP +\fB\-\-usage\fR +Print a list of available options. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print program version +.SH "SEE ALSO" +.BR gdbm_dump (1), +.BR gdbmtool (1), +.BR gdbm (3). +.PP +For a detailed description of +.B gdbm_load +and other +.B gdbm +utilities, refer to the \fBGDBM Manual\fR available in +Texinfo format. To access it, run: + + \fBinfo gdbm\fR + +.SH "REPORTING BUGS" +Report bugs to <bug\-gdbm@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2013 Free Software Foundation, Inc +.br +.na +License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> +.br +.ad +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +.\" Local variables: +.\" eval: (add-hook 'write-file-hooks 'time-stamp) +.\" time-stamp-start: ".TH GDBM[A-Z_-]* 1 \"" +.\" time-stamp-format: "%:B %:d, %:y" +.\" time-stamp-end: "\"" +.\" time-stamp-line-limit: 20 +.\" end: diff --git a/doc/gdbmtool.1 b/doc/gdbmtool.1 new file mode 100644 index 0000000..a04fbef --- /dev/null +++ b/doc/gdbmtool.1 @@ -0,0 +1,443 @@ +.\" This file is part of GDBM. -*- nroff -*- +.\" Copyright (C) 2013 Free Software Foundation, Inc. +.\" +.\" GDBM 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 3, or (at your option) +.\" any later version. +.\" +.\" GDBM 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 GDBM. If not, see <http://www.gnu.org/licenses/>. */ +.TH GDBM_DUMP 1 "May 17, 2013" "GDBM" "GDBM User Reference" +.SH NAME +gdbmtool \- examine and modify a GDBM database +.SH SYNOPSIS +\fBgdbmtool\fR [\fB\-lmNnqrs\fR] [\fB\-b\fR \fISIZE\fR] [\fB\-c\fR \fISIZE\fR]\ + [\fB\-f\fR \fIFILE\fR] [\fB\-\-block\-size\fR=\fISIZE\fR] + [\fB\-\-cache\-size\fR=\fISIZE\fR] [\fB\-\-file\fR \fIFILE\fR]\ + [\fB\-\-newdb\fR] [\fB\-\-no\-lock\fR] + [\fB\-\-no\-mmap\fR] [\fB\-\-norc\fR] + [\fB\-\-quiet\fR] [\fB\-\-read\-only\fR] [\fB\-\-synchronize\fR]\ + [\fIDBFILE\fR] +.sp +\fBgdbmtool\fR [\fB\-Vh\fR] ][\fB\-\-help\fR] [\fB\-\-usage\fR] [\fB\-\-version\fR] +.SH DESCRIPTION +The +.B gdbmtool +utility allows you to view and modify an existing GDBM database or to +create a new one. +.PP +The \fIDBFILE\fR argument supplies the name of the database to open. +If not supplied, the default name +.B junk.gdbm +is used instead. +If the named database does not exist, it will be created. An existing +database can be cleared (i.e. all records removed from it) using the +\fB\-\-newdb\fR option (see below). +.PP +Unless the \fB\-N\fR (\fB\-\-norc\fR) option is given, after startup +.B gdbmtool +looks for file named +.B .gdbmtoolrc +first in the current working directory, and, if not found there, in +the home directory of the user who started the program. If found, +this file is read and interpreted as a list of +.B gdbmtool +commands. +.PP +Then +.B gdbmtool +starts a loop, in which it reads +commands from the standard input, executes them and prints the results on the +standard output. If the standard input is attached to a console, +the program runs in interactive mode. +.PP +The program terminates when the +.B quit +command is given, or end-of-file is detected on its standard input. +.PP +A +.B gdbmtool +command consists of a command verb, optionally +followed by one or more arguments, separated by any amount of white +space. A command verb can be entered either in full or in an +abbreviated form, as long as that abbreviation does not match any other +verb. +.PP +Any sequence of non-whitespace characters appearing after the command +verb forms an argument. If the argument contains whitespace or +unprintable characters it must be enclosed in double quotes. Within +double quotes the usual escape sequences are understood, as +shown in the table below: +.sp +.nf +.ta 8n 20n +.ul + Escape Expansion + \\a Audible bell character (ASCII 7) + \\b Backspace character (ASCII 8) + \\f Form-feed character (ASCII 12) + \\n Newline character (ASCII 10) + \\r Carriage return character (ASCII 13) + \\t Horizontal tabulation character (ASCII 9) + \\v Vertical tabulation character (ASCII 11) + \\\\ Single slash + \" Double quote +.fi +.PP +In addition, a backslash immediately followed by the end-of-line +character effectively removes that character, allowing to split long +arguments over several input lines. +.SH OPTIONS +.TP +\fB\-b\fR, \fB\-\-block\-size\fR=\fISIZE\fR +Set block size. +.TP +\fB\-c\fR, \fB\-\-cache\-size\fR=\fISIZE\fR +Set cache size. +.TP +\fB\-f\fR, \fB\-\-file\fR=\fIFILE\fR +Read commands from \fIFILE\fR, instead of from the standard input. +.TP +\fB\-l\fR, \fB\-\-no\-lock\fR +Disable file locking. +.TP +\fB\-m\fR, \fB\-\-no\-mmap\fR +Do not use +.BR mmap (2). +.TP +\fB\-n\fR, \fB\-\-newdb\fR +Create the database, truncating it if it already exists. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Don't print initial banner. +.TP +\fB\-r\fR, \fB\-\-read\-only\fR +Open database in read-only mode. +.TP +\fB\-s\fR, \fB\-\-synchronize\fR +Synchronize to disk after each write. +.TP +\fB\-h\fR, \fB\-\-help\fR +Print a short usage summary. +.TP +\fB\-\-usage\fR +Print a list of available options. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print program version +.SH SHELL COMMANDS +.TP +.BR avail +Print the +.BR "avail list" . +.TP +\fBbucket\fR \fINUM\fR +Print the bucket number \fINUM\fR and set is as the current one. +.TP +.BR cache +Print the bucket cache. +.TP +.B close +Close the currently open database. +.TP +.BR count +Print the number of entries in the database. +.TP +.BR current +Print the current bucket. +.TP +\fBdelete\fR \fIKEY\fR +Delete record with the given \fIKEY\fR. +.TP +.BR dir +Print hash directory. +.TP +\fBexport\fR, \fBe\fR \fIFILE\-NAME\fR [\fBtruncate\fR] [\fBbinary\fR|\fBascii\fR] +Export the database to the flat file \fIFILE\-NAME\fR. This is equivalent to +.BR gdbm_dump (1). + +This command will not overwrite an existing file, unless the +.B truncate +parameter is also given. Another optional parameter determines the type of +the dump (*note Flat files::). By default, ASCII dump will be created. +.TP +\fBfetch\fR \fIKEY\fR +Fetch and display the record with the given \fIKEY\fR. +.TP +.BR first +Fetch and display the first record in the database. Subsequent +records can be fetched using the +.B next +command (see below). +.TP +\fBhash\fR \fIKEY\fR +Compute and display the hash value for the given \fIKEY\fR. +.TP +.BR header +Print file header. +.TP +.BR help " or " ? +Print a concise command summary, showing each command letter and +verb with its parameters and a short description of what it does. +Optional arguments are enclosed in square brackets. +.TP +\fBimport\fR \fIFILE\-NAME\fR [\fBreplace\fR] [\fBnometa\fR] +Import data from a flat dump file \fIFILE\-NAME\fR. +If the +.B replace +argument is given, any records with the same keys as the already +existing ones will replace them. The +.B nometa +argument turns off restoring meta-information from the dump file. +.TP +\fBlist\fR +List the contents of the database. +.TP +\fBnext\fR [\fIKEY\fR] +Sequential access: fetch and display the next record. If the \fIKEY\fR is +given, the record following the one with this key will be fetched. +.TP +\fBopen\fR \fIFILE\fR +Open the database file \fIFILE\fR. If successful, any previously +open database is closed. Otherwise, if the operation fails, the +currently opened database remains unchanged. + +This command takes additional information from the variables +.BR open , +.BR lock , +.BR mmap ", and" +.BR sync . +See the section +.BR VARIABLES , +for a detailed description of these. +.TP +.B quit +Close the database and quit the utility. +.TP +.BR reorganize +Reorganize the database. +\fBset\fR [\fIVAR\fR=\fIVALUE\fR...] +Without arguments, lists variables and their values. If arguments are +specified, sets variables. Boolean variables can be set by specifying +variable name, optionally prefixed with \fBno\fR, to set it to \fBfalse\fR. +.TP +\fBsource\fR \fIFILE\fR +Read commands from the given \fIFILE\fR. +.TP +.BR status +Print current program status. +.TP +\fBstore\fR \fIKEY\fR \fIDATA\fR +Store the \fIDATA\fR with the given \fIKEY\fR in the database. If the +\fIKEY\fR already exists, its data will be replaced. +.TP +\fBunset\fR \fIVARIABLE\fR... +Unsets listed variables. +.TP +.BR version +Print the version of +.BR gdbm . +.SH "DATA DEFINITIONS" +The \fBdefine\fR statement provides a mechanism for defining key or +content structures. It is similar to the \fBC\fR \fBstruct\fR +declaration: +.sp +.nf +.in +4 +\fBdefine\fR \fBkey\fR|\fBcontent\fR \fB{\fR \fIdefnlist\fR \fB}\fR +.in +.fi +.PP +The \fIdefnlist\fR is a comma-separated list of member declarations. +Within \fIdefnlist\fR the newline character looses its special meaning +as the command terminator, so each declaration can appear on a +separate line and arbitrary number of comments can be inserted to +document the definition. +.PP +Each declaration has one of the following formats +.sp +.nf +.in +4 +\fItype\fR \fIname\fR +\fItype\fR \fIname\fR \fB[\fIN\fB]\fR +.in +.fi +.sp +where \fItype\fR is a data type and \fIname\fR is the member name. +The second format defines the member \fIname\fR as an array of \fIN\fR +elements of \fItype\fR. +.PP +The supported types are: +.sp +.nf +.ta 8n 20n +.ul + type meaning + char single byte (signed) + short signed short integer + ushort unsigned short integer + int signed integer + unsigned unsigned integer + uint ditto + long signed long integer + ulong unsigned long integer + llong signed long long integer + ullong unsigned long long integer + float a floating point number + double double-precision floating point number + string array of characters (see the \fBNOTE\fR below) + stringz null-terminated string of characters +.fi +.PP +The following alignment declarations can be used within \fIdefnlist\fR: +.TP +\fBoffset\fR \fIN\fR +The next member begins at offset \fIN\fR. +.TP +\fBpad\fR \fIN\fR +Add \fIN\fR bytes of padding to the previous member. +.PP +For example: +.sp +.nf +.in +4 +\fBdefine content { + int status, + pad 8, + char id[3], + stringz name +}\fR +.fi +.PP +To define data consisting of a single data member, the following +simplified construct can be used: +.sp +.nf +.in +4 +\fBdefine\fR \fBkey\fR|\fBcontent\fR \fItype\fR +.fi +.PP +where \fItype\fR is one of the types discussed above. +.PP +\fBNOTE\fR: The \fBstring\fR type can reasonably be used only if it is +the last or the only member of the data structure. That's because it +provides no information about the number of elements in the array, so +it is interpreted to contain all bytes up to the end of the datum. +.SH VARIABLES +.TP +.BR confirm ", boolean" +Whether to ask for confirmation before certain destructive operations, +such as truncating the existing database. Default is +.BR true . +.TP +.BR ps1 ", string" +Primary prompt string. Its value can contain \fIconversion +specifiers\fR, consisting of the \fB%\fR character followed by another +character. These specifiers are expanded in the resulting prompt as +follows: +.sp +.nf +.ta 8n 20n +.ul + Sequence Expansion + \fB%f\fR name of the db file + \fB%p\fR program name + \fB%P\fR package name (\fBgdbm\fR) + \fB%_\fR horizontal space (\fBASCII\fR 32) + \fB%v\fR program version + \fB%%\fR \fB%\fR +.fi +.sp +The default prompt is \fB%p>%_\fR. +.TP +.BR ps2 ", string" +Secondary prompt. See +.B ps1 +for a description of its value. +This prompt is displayed before reading the second and subsequent +lines of a multi-line command. + +The default value is \fB%_>%_\fR. +.TP +.BR delim1 ", string" +A string used to delimit fields of a structured datum on output +(see the section \fBDATA DEFINITIONS\fR). + +Default is \fB,\fR (a comma). This variable cannot be unset. +.TP +.BR delim2 ", string" +A string used to delimit array items when printing a structured datum. + +Default is \fB,\fR (a comma). This variable cannot be unset. +.TP +.BR pager ", string" +The name and command line of the pager program to pipe output to. +This program is used in interactive mode when the estimated number of +output lines is greater then the number of lines on your screen. + +The default value is inherited from the environment variable +\fBPAGER\fR. Unsetting this variable disables paging. +.TP +.BR quiet ", boolean" +Whether to display welcome banner at startup. This variable should +be set in a startup script file. +.PP +The following variables control how the database is opened: +.TP +.BR cachesize ", numeric" +Sets the cache size. By default this variable is not set. +.TP +.BR blocksize ", numeric" +Sets the block size. Unset by default. +.TP +.BR open ", string" +Open mode. The following values are allowed: +.RS 7 +.TP +.BR newdb +Truncate the database if it exists or create a new one. Open it in +read-write mode. +.TP +.BR wrcreat " or " rw +Open the database in read-write mode. Create it if it does not +exist. This is the default. +.TP +.BR reader " or " readonly +Open the database in read-only mode. Signal an error if it does not +exist. +.RE +.TP +.BR lock ", boolean" +Lock the database. This is the default. +.TP +.BR mmap ", boolean" +Use memory mapping. This is the default. + +.SH "SEE ALSO" +.BR gdbm_dump (1), +.BR gdbm_load (1), +.BR gdbm (3). +.SH "REPORTING BUGS" +Report bugs to <bug\-gdbm@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2013 Free Software Foundation, Inc +.br +.na +License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> +.br +.ad +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +.\" Local variables: +.\" eval: (add-hook 'write-file-hooks 'time-stamp) +.\" time-stamp-start: ".TH GDBM[A-Z_-]* 1 \"" +.\" time-stamp-format: "%:B %:d, %:y" +.\" time-stamp-end: "\"" +.\" time-stamp-line-limit: 20 +.\" end: diff --git a/doc/stamp-vti b/doc/stamp-vti new file mode 100644 index 0000000..39c7db9 --- /dev/null +++ b/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 25 December 2013 +@set UPDATED-MONTH December 2013 +@set EDITION 1.11 +@set VERSION 1.11 diff --git a/doc/version.texi b/doc/version.texi new file mode 100644 index 0000000..39c7db9 --- /dev/null +++ b/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 25 December 2013 +@set UPDATED-MONTH December 2013 +@set EDITION 1.11 +@set VERSION 1.11 |