Initial revision of NDB Cluster files

BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
This commit is contained in:
unknown 2004-04-14 10:53:21 +02:00
parent 0ba6cb48d8
commit 6386c55cee
1835 changed files with 500032 additions and 0 deletions

View file

@ -76,6 +76,7 @@ konstantin@mysql.com
kostja@oak.local
lenz@kallisto.mysql.com
lenz@mysql.com
magnus@neptunus.(none)
marko@hundin.mysql.fi
miguel@hegel.(none)
miguel@hegel.br

121
ndb/BinDist.sh Normal file
View file

@ -0,0 +1,121 @@
#
# Invoked from scripts/make_binary_distribution as "sh BinDist.sh".
# Prints list of dirs and files to include under mysql/ndb.
#
# release notes
grep -v '^#' <<__END__
#ReleaseNotes.html
mysqlclusterenv.sh
__END__
# subset of bins, libs, includes
grep -v '^#' <<__END__
bin/
bin/ndb
bin/mgmtsrvr
bin/mgmtclient
bin/mysqlcluster
bin/mysqlcluster_install_db
bin/mysqlclusterd
bin/restore
bin/ndb_rep
bin/desc
bin/flexBench
bin/select_all
bin/select_count
bin/delete_all
bin/ndbsql
bin/drop_tab
bin/drop_index
bin/list_tables
bin/waiter
lib/
lib/libNEWTON_API.a
lib/libNEWTON_API.so
lib/libNDB_API.a
lib/libNDB_API.so
lib/libMGM_API.a
lib/libMGM_API.so
lib/libNDB_ODBC.so
lib/libMGM_API_pic.a
lib/libNDB_API_pic.a
include/
include/ndb_types.h
include/ndb_version.h
include/mgmapi/
include/mgmapi/mgmapi.h
include/mgmapi/mgmapi_debug.h
include/ndbapi/
include/ndbapi/ndbapi_limits.h
include/ndbapi/AttrType.hpp
include/ndbapi/Ndb.hpp
include/ndbapi/NdbApi.hpp
include/ndbapi/NdbConnection.hpp
include/ndbapi/NdbCursorOperation.hpp
include/ndbapi/NdbDictionary.hpp
include/ndbapi/NdbError.hpp
include/ndbapi/NdbEventOperation.hpp
include/ndbapi/NdbIndexOperation.hpp
include/ndbapi/NdbOperation.hpp
include/ndbapi/NdbPool.hpp
include/ndbapi/NdbRecAttr.hpp
include/ndbapi/NdbReceiver.hpp
include/ndbapi/NdbResultSet.hpp
include/ndbapi/NdbScanFilter.hpp
include/ndbapi/NdbScanOperation.hpp
include/ndbapi/NdbSchemaCon.hpp
include/ndbapi/NdbSchemaOp.hpp
include/newtonapi/dba.h
include/newtonapi/defs/pcn_types.h
__END__
#if [ -f /usr/local/lib/libstdc++.a ]; then
# cp /usr/local/lib/libstdc++.a lib/.
# echo lib/libstdc++.a
#fi
#if [ -f /usr/local/lib/libstdc++.so.5 ]; then
# cp /usr/local/lib/libstdc++.so.5 lib/.
# echo lib/libstdc++.so.5
#fi
#if [ -f /usr/local/lib/libgcc_s.so.1 ]; then
# cp /usr/local/lib/libgcc_s.so.1 lib/.
# echo lib/libgcc_s.so.1
#fi
# docs
#find docs/*.html docs/*.pdf -print | sort -t/
# demos
find demos -print | grep -v /SCCS | sort -t/
# examples
grep -v '^#' <<__END__
examples/
examples/Makefile
examples/ndbapi_example1/
examples/ndbapi_example1/Makefile
examples/ndbapi_example1/ndbapi_example1.cpp
examples/ndbapi_example2/
examples/ndbapi_example2/Makefile
examples/ndbapi_example2/ndbapi_example2.cpp
examples/ndbapi_example3/
examples/ndbapi_example3/Makefile
examples/ndbapi_example3/ndbapi_example3.cpp
examples/ndbapi_example4/
examples/ndbapi_example4/Makefile
examples/ndbapi_example4/ndbapi_example4.cpp
examples/ndbapi_example5/
examples/ndbapi_example5/Makefile
examples/ndbapi_example5/ndbapi_example5.cpp
examples/select_all/
examples/select_all/Makefile
examples/select_all/select_all.cpp
__END__
exit 0

84
ndb/Defs.mk Normal file
View file

@ -0,0 +1,84 @@
include $(NDB_TOP)/config/config.mk
include $(NDB_TOP)/config/Defs.$(NDB_VERSION).mk
include $(NDB_TOP)/config/Defs.$(NDB_OS).$(NDB_ARCH).$(NDB_COMPILER).mk
ifeq ($(NDB_OS), WIN32)
# Windows specific definitions
OBJEXT := obj
LIBEXT := lib
LIBPREFIX :=
fixpath = `cygpath -w $1`
ar_rcs = lib -out:`cygpath -w $1` $2
link_so = link -DLL -OUT:`cygpath -w $1` $(WIN_LIBS) $2
#check-odbc = Y
USE_EDITLINE := N
#STRCASECMP is defined in include/portlib/PortDefs.h to _strcmpi
else
#Common definitions for almost all non-Windows environments
OBJEXT := o
LIBEXT := a
LIBPREFIX := lib
fixpath = $1
ar_rcs = $(AR_RCS) $1 $2
#check-odbc = $(findstring sqlext.h, $(wildcard /usr/include/sqlext.h) $(wildcard /usr/local/include/sqlext.h))
CCFLAGS_TOP += -DHAVE_STRCASECMP
endif
ifeq ($(NDB_OS), WIN32)
CCFLAGS_TOP += -DHAVE_STRDUP
NDB_STRLCPY := Y
NDB_STRLCAT := Y
SHLIBEXT := dll
endif
ifeq ($(NDB_OS), LINUX)
CCFLAGS_TOP += -DHAVE_STRDUP
NDB_STRLCAT := Y
NDB_STRLCPY := Y
SHLIBEXT := so
endif
ifeq ($(NDB_OS), SOLARIS)
CCFLAGS_TOP += -DHAVE_STRDUP
NDB_STRLCAT := Y
NDB_STRLCPY := Y
SHLIBEXT := so
endif
ifeq ($(NDB_OS), HPUX)
CCFLAGS_TOP += -DHAVE_STRDUP
NDB_STRLCAT := Y
NDB_STRLCPY := Y
SHLIBEXT := sl
endif
ifeq ($(NDB_OS), MACOSX)
CCFLAGS_TOP += -DHAVE_STRLCAT
CCFLAGS_TOP += -DHAVE_STRLCAT
CCFLAGS_TOP += -DHAVE_STRLCPY
CCFLAGS_TOP += -DNDBOUT_UINTPTR
SHLIBEXT := dylib
endif
ifeq ($(NDB_OS), OSE)
NDB_STRDUP := Y
NDB_STRLCAT := Y
NDB_STRLCPY := Y
SHLIBEXT := so
endif
ifeq ($(NDB_OS), SOFTOSE)
NDB_STRDUP := Y
NDB_STRLCAT := Y
NDB_STRLCPY := Y
SHLIBEXT := so
endif
ifeq ($(NDB_SCI), Y)
CCFLAGS_TOP += -DHAVE_SCI
endif
ifneq ($(findstring OSE, $(NDB_OS)),)
USE_EDITLINE := N
endif

853
ndb/Epilogue.mk Normal file
View file

@ -0,0 +1,853 @@
# .KEEP_STATE:
# bk test !!!
###
# For building some intermediary targets in /tmp (only useful on solaris)
ifneq ($(NDB_BUILDROOT),)
NDB_TOPABS := $(shell cd $(NDB_TOP) && /bin/pwd)
NDB_BUILDDIR := $(subst $(NDB_TOPABS),$(NDB_BUILDROOT),$(CURDIR))/
ifeq ($(wildcard $(NDB_BUILDDIR)),)
dummy := $(shell mkdir -p $(NDB_BUILDDIR))
endif
endif
###
CCFLAGS_TOP += -DNDB_$(NDB_OS) -DNDB_$(NDB_ARCH) -DNDB_$(NDB_COMPILER)
ifdef BIN_TARGET
BIN_EXE = Y
endif
###
#
# OS specifics
#
# Disable shared libraries on HP-UX for the time being.
ifeq ($(NDB_OS), HPUX)
SO_LIB := N
PIC_LIB := N
PIC_ARCHIVE := N
NONPIC_ARCHIVE := Y
endif
ifeq ($(NDB_OS), OSE)
SO_LIB := N
PIC_LIB := N
PIC_ARCHIVE := N
NONPIC_ARCHIVE := Y
ifdef BIN_TARGET
BIN_LIB_TARGET := lib$(BIN_TARGET).a
BIN_TARGET := lib$(BIN_TARGET).a
endif
endif
ifeq ($(NDB_OS), SOFTOSE)
SO_LIB := N
PIC_LIB := N
PIC_ARCHIVE := N
ifdef BIN_TARGET
BIN_EXE_TARGET := $(BIN_TARGET)
BIN_LIB_TARGET := lib$(BIN_TARGET).a
EXTRA_MAIN := osemain.o
endif
endif
ifeq ($(filter OSE, $(NDB_OS)),)
BIN_EXE_TARGET := $(BIN_TARGET)
endif
ifeq ($(NDB_OS), MACOSX)
.LIBPATTERNS= lib%.dylib lib%.a
endif
###
#
#
###
# External dependencies definition : the place we store libraries
# we get from outside the NDB development group.
EXTERNAL_DEPENDS_TOP=$(NDB_TOP)/src/external/$(NDB_OS).$(NDB_ARCH)
###
#
# TYPE Handling
#
# TYPE := kernel
#
ifneq ($(filter kernel, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/src/kernel/vm) \
-I$(call fixpath,$(NDB_TOP)/src/kernel/error) \
-I$(call fixpath,$(NDB_TOP)/src/kernel) \
-I$(call fixpath,$(NDB_TOP)/include/kernel) \
-I$(call fixpath,$(NDB_TOP)/include/transporter) \
-I$(call fixpath,$(NDB_TOP)/include/debugger) \
-I$(call fixpath,$(NDB_TOP)/include/mgmcommon) \
-I$(call fixpath,$(NDB_TOP)/include/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/include/util) \
-I$(call fixpath,$(NDB_TOP)/include/portlib) \
-I$(call fixpath,$(NDB_TOP)/include/logger)
endif
#
# TYPE := ndbapi
#
ifneq ($(filter ndbapi, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/include/kernel) \
-I$(call fixpath,$(NDB_TOP)/include/transporter) \
-I$(call fixpath,$(NDB_TOP)/include/debugger) \
-I$(call fixpath,$(NDB_TOP)/include/mgmcommon) \
-I$(call fixpath,$(NDB_TOP)/include/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/include/util) \
-I$(call fixpath,$(NDB_TOP)/include/portlib) \
-I$(call fixpath,$(NDB_TOP)/include/logger)
endif
#
# TYPE := ndbapiclient
#
ifneq ($(filter ndbapiclient, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/include/ndbapi)
BIN_TARGET_LIBS += NDB_API
endif
#
# TYPE := mgmapiclient
#
ifneq ($(filter mgmapiclient, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/include/mgmapi)
BIN_TARGET_LIBS += MGM_API
endif
#
# TYPE := ndbapitest
#
ifneq ($(filter ndbapitest, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/include/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/include/util) \
-I$(call fixpath,$(NDB_TOP)/include/portlib) \
-I$(call fixpath,$(NDB_TOP)/test/include) \
-I$(call fixpath,$(NDB_TOP)/include/mgmapi)
BIN_TARGET_LIBS += NDBT
LDFLAGS_LOC += -lNDB_API -lMGM_API -lm
endif
#
# TYPE := signalsender
#
ifneq ($(filter signalsender, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/include/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/src/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/src/ndbapi/signal-sender) \
-I$(call fixpath,$(NDB_TOP)/include/util) \
-I$(call fixpath,$(NDB_TOP)/include/portlib) \
-I$(call fixpath,$(NDB_TOP)/include/transporter) \
-I$(call fixpath,$(NDB_TOP)/include/mgmcommon) \
-I$(call fixpath,$(NDB_TOP)/include/kernel)
BIN_TARGET_LIBS += NDB_API
BIN_TARGET_ARCHIVES += editline signal-sender
endif
#
# TYPE := repserver
#
ifneq ($(filter repserver, $(TYPE)),)
CCFLAGS_LOC += \
-I$(call fixpath,$(NDB_TOP)/include/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/src) \
-I$(call fixpath,$(NDB_TOP)/src/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/src/ndbapi/signal-sender) \
-I$(call fixpath,$(NDB_TOP)/include/util) \
-I$(call fixpath,$(NDB_TOP)/include/portlib) \
-I$(call fixpath,$(NDB_TOP)/include/transporter) \
-I$(call fixpath,$(NDB_TOP)/include/mgmcommon) \
-I$(call fixpath,$(NDB_TOP)/include/kernel)
endif
#
# TYPE := odbcclient
#
ifneq ($(filter odbcclient, $(TYPE)),)
TYPE += util
LDFLAGS_LOC += -lm
#ifneq ($(call check-odbc),)
ifneq ($(NDB_ODBC),N)
ifeq ($(NDB_OS), SOLARIS)
CCFLAGS_LOC += -I/usr/local/include
BIN_TARGET_LIBS_DIRS += /usr/local/lib
BIN_TARGET_LIBS += odbc odbcinst NDBT
endif
ifeq ($(NDB_OS), LINUX)
BIN_TARGET_LIBS += odbc odbcinst NDBT
endif
ifeq ($(NDB_OS), MACOSX)
BIN_TARGET_LIBS += odbc odbcinst NDBT
endif
ifeq ($(NDB_OS), IBMAIX)
BIN_TARGET_LIBS += odbc odbcinst NDBT
endif
ifeq ($(NDB_OS), TRU64X)
BIN_TARGET_LIBS += odbc odbcinst NDBT
endif
else
BIN_EXE = N
endif
endif
#
# TYPE := *
#
#
# TYPE := util
#
ifneq ($(filter util, $(TYPE)),)
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include/util) \
-I$(call fixpath,$(NDB_TOP)/include/portlib) \
-I$(call fixpath,$(NDB_TOP)/include/logger)
BIN_TARGET_LIBS += logger general portlib
endif
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include)
ifeq ($(NDB_SCI), Y)
BIN_TARGET_LIBS += sisci
BIN_TARGET_LIBS_DIRS += $(EXTERNAL_DEPENDS_TOP)/sci/lib
CCFLAGS_LOC += -I$(call fixpath,$(EXTERNAL_DEPENDS_TOP)/sci/include)
endif
#
# TYPE Handling
###
###
#
# First rule
#
first:
$(MAKE) libs
$(MAKE) bins
ifeq ($(findstring all,$(replace-targets)),)
all: first
endif
###
#
# Nice to have rules
api: libs
$(MAKE) -C $(NDB_TOP)/src/ndbapi bins
mgm: libs
$(MAKE) -C $(NDB_TOP)/src/mgmsrv bins
ndb: libs
$(MAKE) -C $(NDB_TOP)/src/kernel/ndb-main bins
apitest: first
$(MAKE) -C $(NDB_TOP)/test/ndbapi all
#-lNDBT:
# $(MAKE) -C $(NDB_TOP)/test/src all
#
#-lNDB_API: libs
# $(MAKE) -C $(NDB_TOP)/src/ndbapi bins
#
# Libs/Bins
#
ifdef PREREQ_LOC
_libs:: $(PREREQ_LOC)
_bins:: $(PREREQ_LOC)
endif
L_DIRS := $(LIB_DIRS) $(DIRS)
B_DIRS := $(BIN_DIRS) $(DIRS)
A_DIRS := $(LIB_DIRS) $(BIN_DIRS) $(DIRS)
_libs::
_bins::
libs: _libs $(patsubst %, _libs_%, $(L_DIRS))
$(patsubst %, _libs_%, $(L_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _libs_%,%,$@) libs
bins: _bins $(patsubst %, _bins_%, $(B_DIRS))
$(patsubst %, _bins_%, $(B_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _bins_%,%,$@) bins
###
#
# Links
_links:
-$(NDB_TOP)/tools/make-links.sh $(NDB_TOP)/include `pwd`
links: _links $(patsubst %, _links_%, $(A_DIRS))
$(patsubst %, _links_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _links_%,%,$@) links
####
#
# OSE build_spec (
ifdef SOURCES
BS := Y
endif
ifdef SOURCES_c
BS := Y
endif
_build_spec: Makefile
ifdef BS
@echo "TYPE = SWU" > build.spec
@echo "include $(NDB_TOP)/Ndb.mk" >> build.spec
# @for i in $(CCFLAGS_LOC); do echo "INC += $$i" >> build.spec ; done
@for i in $(patsubst -I%, %, $(CCFLAGS_LOC)); do echo "INC += $$i" >> build.spec ; done
@echo "INC += /vobs/cello/cls/rtosi_if/include" >> build.spec
@echo "INC += /vobs/cello/cls/rtosi_if/include.@@@" >> build.spec
@echo "INC += /vobs/cello/cls/rtosi_if/include.<<<" >> build.spec
endif
build_spec: _build_spec $(patsubst %, _build_spec_%, $(A_DIRS))
$(patsubst %, _build_spec_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _build_spec_%,%,$@) build_spec
###
#
# Phony targets
.PHONY: $(A_DIRS)
###
#
# Dummy rule
DUMMY:
###
#
# Definitions of...
PIC_DIR := $(NDB_BUILDDIR).pic
A_TMP_DIR := $(NDB_BUILDDIR).a_tmp
SO_TMP_DIR := $(NDB_BUILDDIR).so_tmp
PIC_TMP_DIR := $(NDB_BUILDDIR).pic_tmp
$(PIC_DIR):
mkdir -p $(PIC_DIR)
SRC_C := $(filter %.C, $(SOURCES))
SRC_CPP := $(filter %.cpp, $(SOURCES))
SRC_CC := $(filter %.cc, $(SOURCES))
SRC_c := $(filter %.c, $(SOURCES)) $(filter %.c, $(SOURCES.c))
SRC_YPP := $(filter %.ypp, $(SOURCES))
SRC_LPP := $(filter %.lpp, $(SOURCES))
OBJECTS := $(SRC_C:%.C=%.$(OBJEXT)) \
$(SRC_CPP:%.cpp=%.$(OBJEXT)) \
$(SRC_CC:%.cc=%.$(OBJEXT)) \
$(SRC_c:%.c=%.$(OBJEXT)) \
$(SRC_YPP:%.ypp=%.tab.$(OBJEXT)) \
$(SRC_LPP:%.lpp=%.yy.$(OBJEXT)) \
$(OBJECTS_LOC)
PIC_OBJS := $(OBJECTS:%=$(PIC_DIR)/%)
LIB_DIR := $(NDB_TOP)/lib
BIN_DIR := $(NDB_TOP)/bin
###
#
# ARCHIVE_TARGET
#
ifdef ARCHIVE_TARGET
ifndef NONPIC_ARCHIVE
NONPIC_ARCHIVE := Y
endif
ifeq ($(NONPIC_ARCHIVE), Y)
_libs:: $(LIB_DIR)/$(LIBPREFIX)$(ARCHIVE_TARGET).$(LIBEXT)
$(LIB_DIR)/$(LIBPREFIX)$(ARCHIVE_TARGET).$(LIBEXT) : $(OBJECTS)
$(call ar_rcs,$@,$(OBJECTS))
endif # NONPIC_ARCHIVE := Y
ifeq ($(PIC_ARCHIVE), Y)
_libs:: $(PIC_DIR) $(LIB_DIR)/$(LIBPREFIX)$(ARCHIVE_TARGET)_pic.$(LIBEXT)
$(LIB_DIR)/$(LIBPREFIX)$(ARCHIVE_TARGET)_pic.$(LIBEXT) : $(PIC_OBJS)
cd $(PIC_DIR) && $(call ar_rcs,../$@,$(OBJECTS))
PIC_DEP := Y
endif # PIC_ARCHIVE := Y
endif # ARCHIVE_TARGET
###
#
# LIB_TARGET
#
ifdef LIB_TARGET
ifeq ($(A_LIB), Y)
A_LIB_ARCHIVES := $(LIB_TARGET_ARCHIVES:%=$(LIB_DIR)/$(LIBPREFIX)%.$(LIBEXT))
_bins:: $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(LIBEXT)
$(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(LIBEXT) : $(A_LIB_ARCHIVES)
@rm -rf $(A_TMP_DIR) && mkdir $(A_TMP_DIR)
cd $(A_TMP_DIR) && for i in $^; do ar -x ../$$i; done && $(call ar_rcs,../$@,*.$(OBJEXT))
$(NDB_TOP)/home/bin/ndb_deploy $@
endif # A_LIB := Y
ifeq ($(SO_LIB), Y)
ifneq ($(NDB_OS), WIN32)
SO_LIB_ARCHIVES := $(LIB_TARGET_ARCHIVES:%=$(LIB_DIR)/$(LIBPREFIX)%_pic.$(LIBEXT))
_bins:: $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(SHLIBEXT)
$(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(SHLIBEXT) : $(SO_LIB_ARCHIVES)
@rm -rf $(SO_TMP_DIR) && mkdir $(SO_TMP_DIR)
cd $(SO_TMP_DIR) && for i in $^; do ar -x ../$$i; done
ifneq ($(NDB_OS), MACOSX)
$(SO) $@.new $(SO_TMP_DIR)/*.$(OBJEXT) -L$(LIB_DIR) $(LIB_TARGET_LIBS) $(LDFLAGS_LAST)
rm -f $@; mv $@.new $@
else
$(SO) $@ $(SO_TMP_DIR)/*.$(OBJEXT) -L$(LIB_DIR) $(LIB_TARGET_LIBS) $(LDFLAGS_LAST)
endif
ifeq ($(NDB_VERSION), RELEASE)
ifneq ($(NDB_OS), MACOSX)
strip $@
endif
endif
$(NDB_TOP)/home/bin/ndb_deploy $@
else # WIN32
SO_LIB_ARCHIVES := $(LIB_TARGET_ARCHIVES:%=$(LIB_DIR)/$(LIBPREFIX)%_pic.$(LIBEXT))
_bins:: $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(SHLIBEXT)
$(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(SHLIBEXT) : $(SO_LIB_ARCHIVES)
@rm -rf $(SO_TMP_DIR) && mkdir $(SO_TMP_DIR)
cd $(SO_TMP_DIR) && for i in $^; do ar -x ../$$i; done
$(call link_so,$@.new,$(SO_TMP_DIR)/*.$(OBJEXT))
rm -f $@; mv $@.new $@
#ifeq ($(NDB_VERSION), RELEASE)
# strip $@
#endif
endif
endif # SO_LIB := Y
ifeq ($(PIC_LIB), Y)
PIC_LIB_ARCHIVES := $(LIB_TARGET_ARCHIVES:%=$(LIB_DIR)/$(LIBPREFIX)%_pic.$(LIBEXT))
_bins:: $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET)_pic.$(LIBEXT)
$(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET)_pic.$(LIBEXT) : $(PIC_LIB_ARCHIVES)
@rm -rf $(PIC_TMP_DIR) && mkdir $(PIC_TMP_DIR)
cd $(PIC_TMP_DIR) && for i in $^; do ar -x ../$$i; done && $(call ar_rcs,../$@,*.$(OBJEXT))
endif # PIC_LIB := Y
endif # LIB_TARGET
###
#
# BIN_TARGET
#
ifeq ($(BIN_EXE), Y)
ifneq ($(NDB_OS), WIN32)
BIN_LIBS := $(BIN_TARGET_ARCHIVES:%=$(LIB_DIR)/$(LIBPREFIX)%.$(LIBEXT))
BIN_LIBS += $(BIN_TARGET_LIBS:%=-l%)
BIN_DEPS := $(OBJECTS) $(EXTRA_MAIN) $(BIN_LIBS)
BIN_LIB_DIRS := $(BIN_TARGET_LIBS_DIRS:%=-L%)
BIN_FLAGS := $(BIN_LIB_DIRS) $(BIN_DEPS)
VPATH := $(LIB_DIR) $(BIN_TARGET_LIBS_DIRS)
_bins:: $(BIN_DIR)/$(BIN_TARGET)
$(BIN_DIR)/$(BIN_TARGET) : $(BIN_DEPS)
$(LINK.cc) $(LDFLAGS) $(LDLIBS) -L$(LIB_DIR) $(BIN_FLAGS) -o $@.new $(LDFLAGS_LAST)
rm -f $@; mv $@.new $@
ifeq ($(NDB_VERSION), RELEASE)
ifneq ($(NDB_OS), MACOSX)
strip $@
endif
endif
$(NDB_TOP)/home/bin/ndb_deploy $@
else # WIN32
BIN_LIBS := $(foreach lib,$(BIN_TARGET_ARCHIVES),$(call fixpath,$(LIB_DIR)/$(LIBPREFIX)$(lib).$(LIBEXT)))
BIN_LIBS += $(BIN_TARGET_LIBS:%=$(LIBPREFIX)%.$(LIBEXT))
BIN_DEPS := $(OBJECTS) $(BIN_TARGET_ARCHIVES:%=$(LIB_DIR)/$(LIBPREFIX)%.$(LIBEXT))
BIN_LIB_DIRS := -libpath:$(call fixpath,$(LIB_DIR)) $(BIN_TARGET_LIBS_DIRS:%=-libpath:%)
BIN_FLAGS := $(BIN_LIB_DIRS)
VPATH := $(LIB_DIR) $(BIN_TARGET_LIBS_DIRS)
_bins:: $(BIN_DIR)/$(BIN_TARGET).exe
$(BIN_DIR)/$(BIN_TARGET).exe : $(BIN_DEPS)
$(LINK.cc) -out:$(call fixpath,$@.new) $(OBJECTS) $(BIN_FLAGS) $(BIN_LIBS)
rm -f $@; mv $@.new $@
ifeq ($(NDB_VERSION), RELEASE)
strip $@
endif
endif
endif
###
#
# SOURCES.sh
#
ifdef SOURCES.sh
BIN_SRC := $(SOURCES.sh:%=$(BIN_DIR)/%)
_bins:: $(BIN_SRC)
$(BIN_SRC) : $(SOURCES.sh)
rm -f $(^:%=$(BIN_DIR)/%)
cp $^ $(BIN_DIR)
endif
#
# Compile rules PIC objects
#
ifeq ($(NDB_OS), WIN32)
OUT := -Fo
else
OUT := -o
endif
$(PIC_DIR)/%.$(OBJEXT): %.C
$(C++) $(OUT)$@ -c $(CCFLAGS) $(CFLAGS_$<) $(PIC) $<
$(PIC_DIR)/%.$(OBJEXT): %.cpp
$(C++) $(OUT)$@ -c $(CCFLAGS) $(CFLAGS_$<) $(PIC) $<
$(PIC_DIR)/%.$(OBJEXT): %.cc
$(C++) $(OUT)$@ -c $(CCFLAGS) $(CFLAGS_$<) $(PIC) $<
$(PIC_DIR)/%.$(OBJEXT): %.c
$(CC) $(OUT)$@ -c $(CFLAGS) $(CFLAGS_$<) $(PIC) $<
#
# Compile rules
#
%.$(OBJEXT) : %.cpp
$(C++) $(OUT)$@ -c $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.$(OBJEXT) : %.C
$(C++) $(OUT)$@ -c $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.$(OBJEXT) : %.cc
$(C++) $(OUT)$@ -c $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.$(OBJEXT) : %.c
$(CC) $(OUT)$@ -c $(CFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.s : %.C
$(C++) -S $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.s : %.cpp
$(C++) -S $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.s : %.cc
$(C++) -S $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
%.s : %.c
$(CC) -S $(CCFLAGS) $(CFLAGS_$<) $(NON_PIC) $<
BISON = bison
BISONHACK = :
%.tab.cpp %.tab.hpp : %.ypp
$(BISON) $<
$(BISONHACK) $*.tab.cpp $*.tab.hpp
FLEX = flex
FLEXHACK = :
%.yy.cpp : %.lpp
$(FLEX) -o$@ $<
$(FLEXHACK) $@
###
#
# Defines regarding dependencies
DEPMK := $(NDB_BUILDDIR).depend.mk
DEPDIR := $(NDB_BUILDDIR).depend
DEPENDENCIES := $(SRC_C:%.C=$(DEPDIR)/%.d) \
$(SRC_CC:%.cc=$(DEPDIR)/%.d) \
$(SRC_CPP:%.cpp=$(DEPDIR)/%.d) \
$(SRC_c:%.c=$(DEPDIR)/%.d) \
$(SRC_YPP:%.ypp=$(DEPDIR)/%.tab.d) \
$(SRC_LPP:%.lpp=$(DEPDIR)/%.yy.d)
###
#
# Dependency rule
_depend: $(DEPMK)
depend: _depend $(patsubst %, _depend_%, $(A_DIRS))
$(patsubst %, _depend_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _depend_%,%,$@) depend
###
#
# Clean dependencies
_clean_dep:
-rm -rf $(DEPMK) $(DEPDIR)/*
clean_dep: _clean_dep $(patsubst %, _clean_dep_%, $(A_DIRS))
$(patsubst %, _clean_dep_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _clean_dep_%,%,$@) clean_dep
###
#
# Generate dependencies
$(DEPDIR):
-@mkdir -p $(DEPDIR)
$(DEPDIR)/%.d: %.C
@echo Generating depend for $<
@$(MAKEDEPEND) $(CCFLAGS) $(CFLAGS_$<) $< >$@
$(DEPDIR)/%.d: %.c
@echo Generating depend for $<
@$(MAKEDEPEND) $(CCFLAGS) $(CFLAGS_$<) $< >$@
$(DEPDIR)/%.d: %.cpp
@echo Generating depend for $<
@$(MAKEDEPEND) $(CCFLAGS) $(CFLAGS_$<) $< >$@
$(DEPDIR)/%.d: %.cc
@echo Generating depend for $<
@$(MAKEDEPEND) $(CCFLAGS) $(CFLAGS_$<) $< >$@
ifeq ($(NDB_OS), WIN32)
ifndef PIC_DEP
DEP_PTN := -e 's/\(.*\)\.o[ :]*/\1.$(OBJEXT) $(DEPDIR)\/\1.d : /g'
else
DEP_PTN := -e 's/\(.*\)\.o[ :]*/\1.$(OBJEXT) $(PIC_DIR)\/\1.$(OBJEXT) $(DEPDIR)\/\1.d : /g'
endif
else
ifndef PIC_DEP
DEP_PTN := -e 's!\(.*\)\.$(OBJEXT)[ :]*!\1.$(OBJEXT) $(DEPDIR)\/\1.d : !g'
else
DEP_PTN := -e 's!\(.*\)\.$(OBJEXT)[ :]*!\1.$(OBJEXT) $(PIC_DIR)\/\1.$(OBJEXT) $(DEPDIR)\/\1.d : !g'
endif
endif
#DEP_PTN += -e 's!/usr/include/[-+a-zA-Z0-9_/.]*!!g'
#DEP_PTN += -e 's!/usr/local/lib/gcc-lib/[-+a-zA-Z0-9_/.]*!!g'
$(DEPMK): $(DEPDIR) $(SRC_YPP:%.ypp=%.tab.hpp) $(SRC_LPP:%.lpp=%.yy.cpp) $(DEPENDENCIES) $(wildcard $(NDB_TOP)/.update.d)
@echo "updating .depend.mk"
@sed $(DEP_PTN) /dev/null $(DEPENDENCIES) >$(DEPMK)
###
#
# clean
#
_clean:
-rm -rf SunWS_cache $(PIC_DIR)/SunWS_cache
ifeq ($(NONPIC_ARCHIVE), Y)
-rm -f $(OBJECTS) $(LIB_DIR)/$(LIBPREFIX)$(ARCHIVE_TARGET).$(LIBEXT)
endif
ifeq ($(PIC_ARCHIVE), Y)
-rm -f $(PIC_OBJS) $(LIB_DIR)/$(LIBPREFIX)$(ARCHIVE_TARGET)_pic.$(LIBEXT)
endif
ifdef BIN_TARGET
-rm -f $(OBJECTS)
endif
ifdef LIB_TARGET
ifeq ($(A_LIB), Y)
-rm -f $(A_TMP_DIR)/*
endif
ifeq ($(SO_LIB), Y)
-rm -f $(SO_TMP_DIR)/*
endif
ifeq ($(PIC_LIB), Y)
-rm -f $(PIC_TMP_DIR)/*
endif
endif
ifneq ($(SRC_YPP),)
-rm -f $(SRC_YPP:%.ypp=%.tab.[hc]pp) $(SRC_YPP:%.ypp=%.output)
endif
ifneq ($(SRC_LPP),)
-rm -f $(SRC_LPP:%.lpp=%.yy.*)
endif
ifdef CLEAN_LOC
-rm -f $(CLEAN_LOC)
endif
###
#
# clean all
#
clobber: cleanall
_cleanall: _clean clean_links
-rm -f osemain.con osemain.c
ifdef LIB_TARGET
ifeq ($(A_LIB), Y)
-rm -f $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(LIBEXT)
endif
ifeq ($(SO_LIB), Y)
-rm -f $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET).$(SHLIBEXT)
endif
ifeq ($(PIC_LIB), Y)
-rm -f $(LIB_DIR)/$(LIBPREFIX)$(LIB_TARGET)_pic.$(LIBEXT)
endif
endif
ifdef BIN_TARGET
-rm -f $(BIN_DIR)/$(BIN_TARGET)
endif
clean_links:
###
#
# Dist clean
#
_distclean: _tidy
rm -rf $(DEPDIR) $(PIC_DIR) $(PIC_TMP_DIR) $(SO_TMP_DIR) $(A_TMP_DIR) Sources build.spec
###
#
# tidy
#
_tidy: _cleanall _clean_dep
-rm -f *~ *.$(OBJEXT) *.$(LIBEXT) *.${SHLIBEXT}
#
# clean cleanall tidy - recursion
#
ifeq ($(findstring clean,$(replace-targets)),)
clean: _clean $(patsubst %, _clean_%, $(A_DIRS))
endif
$(patsubst %, _clean_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _clean_%,%,$@) clean
cleanall: _cleanall $(patsubst %, _cleanall_%, $(A_DIRS))
$(patsubst %, _cleanall_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _cleanall_%,%,$@) cleanall
tidy: _tidy $(patsubst %, _tidy_%, $(A_DIRS))
$(patsubst %, _tidy_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _tidy_%,%,$@) tidy
distclean: _distclean $(patsubst %, _distclean_%, $(A_DIRS))
$(patsubst %, _distclean_%, $(A_DIRS)) : DUMMY
$(MAKE) -C $(patsubst _distclean_%,%,$@) distclean
###
#
# Guess configuration
$(NDB_TOP)/config/config.mk: $(NDB_TOP)/config/GuessConfig.sh
$(NDB_TOP)/config/GuessConfig.sh -D
$(NDB_TOP)/config/Defs....mk: $(NDB_TOP)/config/config.mk
$(NDB_TOP)/config/Defs..mk: $(NDB_TOP)/config/config.mk
###
# Soft ose envirment stuff
#
osemain.con: $(NDB_TOP)/src/env/softose/osemain_con.org
cp $< $@
echo "PRI_PROC(init_$(BIN_TARGET), init_$(BIN_TARGET), 65535, 3, ndb, 0, NULL)" >> $@
osemain.c: $(OSE_LOC)/sfk-solaris2/krn-solaris2/src/osemain.c
ln -s $< $@
osemain.o : osemain.con
$(DEPDIR)/osemain.d : osemain.con
###
#
# These target dont want dependencies
NO_DEP=clean clobber cleanall tidy clean_dep $(DEPDIR) build_spec \
$(NDB_TOP)/config/config.mk distclean osemain.con osemain.c
ifeq ($(filter $(NO_DEP), $(MAKECMDGOALS)),)
ifneq ($(strip $(DEPENDENCIES)),)
include $(DEPMK)
endif
endif
###
#
# Auxiliary targets
sources: Sources
Sources: Makefile
@rm -f $@
@for f in Makefile $(A_DIRS) $(SOURCES) $(SOURCES.c); do echo $$f; done >$@
###
#
# TAG generation for emacs and vi folks
#
# In emacs "Esc- ." or "M- ." to find a symbol location
# In vi use the :\tag command
# by convention:
# TAGS is used with emacs
# tags is used with vi
#
# Hopefully the make is being done from $(NDB_TOP)/src
# and your TAGS/tags file then is in the same directory.
TAGS: DUMMY
rm -f TAGS
find $(NDB_TOP) -name "*.[ch]" | xargs $(ETAGS) --append
find $(NDB_TOP) -name "*.[ch]pp" | xargs $(ETAGS) --append
tags: DUMMY
rm -f tags
find $(NDB_TOP) -name "*.[ch]" | xargs $(CTAGS) --append
find $(NDB_TOP) -name "*.[ch]pp" | xargs $(CTAGS) --append
install:
ebrowse: DUMMY
cd $(NDB_TOP); rm -f EBROWSE
cd $(NDB_TOP); find . -name "*.hpp" -or -name "*.cpp" -or -name "*.h" -or -name "*.c" > tmpfile~
cd $(NDB_TOP); ebrowse --file tmpfile~
cd $(NDB_TOP); rm -f tmpfile~

62
ndb/Makefile Normal file
View file

@ -0,0 +1,62 @@
include .defs.mk
DIRS := src test tools examples
# hack before full autoconf
replace-targets := all clean
NDB_RELEASE := $(shell ../scripts/mysql_config --version)
include $(NDB_TOP)/Epilogue.mk
_libs_test : _bins_src
_libs_tools : _libs_test
_libs_examples : _bins_src
_bins_src : _libs_src
_bins_tools : _bins_src
# always release compile except for ndbapi static lib
all:
$(MAKE) -C src/ndbapi libs
$(MAKE) libs NDB_VERSION=RELEASE
$(MAKE) bins NDB_VERSION=RELEASE
ifeq ($(NDB_OS),LINUX)
NDB_RELEASE=$(NDB_RELEASE) $(MAKE) -j1 -C docs all </dev/null || :
endif
# old distclean matches clean better
clean: distclean
$(MAKE) -C docs clean
nuke-deps:
find . -name '.depend*' | xargs rm -rf
vim-tags:
bk sfiles -g | ctags --c-types=+p --extra=+fq -L -
cvs-update:
ifeq ($(NDB_VERSION),main)
-cvs update -d
else
ifeq ($(NDB_TAG),HEAD)
-cvs -q update
-cd include && cvs -q update -d
-cd src && cvs -q update -d
-cd test && cvs -q update -d
-cd tools && cvs -q update -d
else
-cvs -q update -r $(NDB_TAG)
-cd include && cvs -q update -d -r $(NDB_TAG)
-cd src && cvs -q update -d -r $(NDB_TAG)
-cd test && cvs -q update -d -r $(NDB_TAG)
-cd tools && cvs -q update -d -r $(NDB_TAG)
endif
endif
make nuke-deps
make vim-tags
make TAGS
bk-update:
bk pull
make nuke-deps
make vim-tags
make TAGS

7
ndb/README Normal file
View file

@ -0,0 +1,7 @@
INSTALLATION
To compile a pentium version of MySQL Cluster from this BK clone do:
shell> cd /home/bk/mysql-4.1-ndb
shell> BUILD/compile-pentium-debug -c --prefix=/usr/local/mysql-4.1-ndb
shell> make

0
ndb/bin/.empty Normal file
View file

180
ndb/bin/check-regression.sh Executable file
View file

@ -0,0 +1,180 @@
#!/bin/sh
# NAME
# check-regression.sh
#
# SYNOPSIS
# check-regression.sh
#
# DESCRIPTION
#
# This scrip must be run before any major cvs checkins are done.
# It will perform a number of regression tests to check that
# nothing is broken.
#
# OPTIONS
#
# EXAMPLES
#
#
# ENVIRONMENT
# NDB_PROJ_HOME Home dir for ndb
# verbose verbose printouts
#
# FILES
# $NDB_PROJ_HOME/lib/funcs.sh general shell script functions
#
#
# SEE ALSO
#
# DIAGNOSTICTS
#
#
# VERSION
# 1.0
#
# AUTHOR
#
#
. $NDB_PROJ_HOME/lib/funcs.sh # Load some good stuff
synopsis="check-regression.sh"
progname=`basename $0`
numOfTestsOK=0
numOfTestsFailed=0
LOG=check-regression.`date '+%Y-%m-%d'`
executeTest()
{
eval "$@" | tee -a $LOG
if [ $? -eq 0 ]
then
echo "SUCCESS: $@"
numOfTestsOK=`expr $numOfTestsOK + 1`
else
echo "FAILED: $@"
numOfTestsFailed=`expr $numOfTestsFailed + 1`
fi
}
#
# INFO
#
trace "Starting: `date`"
trace "NDB_PROJ_HOME = $NDB_PROJ_HOME"
trace "NDB_TOP = $NDB_TOP"
#
# THE TESTS TO EXECUTE
#
# Testsuite: testDataBuffers
# Number of tests: 1
executeTest 'drop_tab ' TB00 TB01 TB02 TB03 TB04 TB05 TB06 TB07 TB08 TB09 TB10 TB11 TB12 TB13 TB14 TB15
executeTest 'testDataBuffers'
executeTest 'drop_tab ' TB00 TB01 TB02 TB03 TB04 TB05 TB06 TB07 TB08 TB09 TB10 TB11 TB12 TB13 TB14 TB15
TABLES="T9 T13"
# Testsuite: testBasic
# Number of tests: 16
executeTest 'testBasic -n PkInsert' $TABLES
executeTest 'testBasic -n PkRead' $TABLES
executeTest 'testBasic -n PkUpdate' $TABLES
executeTest 'testBasic -n PkDelete' $TABLES
#executeTest 'testBasic -n UpdateAndRead'
#executeTest 'testBasic -n PkReadAndLocker'
#executeTest 'testBasic -n PkReadAndLocker2'
#executeTest 'testBasic -n PkReadUpdateAndLocker'
#executeTest 'testBasic -n ReadWithLocksAndInserts'
#executeTest 'testBasic -n ReadConsistency'
#executeTest 'testBasic -n PkInsertTwice'
#executeTest 'testBasic -n Fill'
#executeTest 'testBasic -n FillTwice'
#executeTest 'testBasic -n NoCommitSleep'
#executeTest 'testBasic -n NoCommit626'
#executeTest 'testBasic -n NoCommitAndClose'
# Testsuite: testBasicAsynch
# Number of tests: 4
executeTest 'testBasicAsynch -n PkInsertAsynch' $TABLES
executeTest 'testBasicAsynch -n PkReadAsynch' $TABLES
executeTest 'testBasicAsynch -n PkUpdateAsynch' $TABLES
executeTest 'testBasicAsynch -n PkDeleteAsynch' $TABLES
# Testsuite: testDict
# Number of tests: 6
#executeTest 'testDict -n CreateAndDrop'
#executeTest 'testDict -n CreateAndDropWithData'
#executeTest 'testDict -n CreateAndDropDuring'
#executeTest 'testDict -n CreateInvalidTables'
#executeTest 'testDict -n CreateTableWhenDbIsFull'
#executeTest 'testDict -n CreateMaxTables'
# Testsuite: testScan
# Number of tests: 34
#executeTest 'testScan -n ScanRead'
#executeTest 'testScan -n ScanRead16'
executeTest 'testScan -n ScanRead240' $TABLES
executeTest 'testScan -n ScanUpdate' $TABLES
executeTest 'testScan -n ScanUpdate2' $TABLES
executeTest 'testScan -n ScanDelete' $TABLES
executeTest 'testScan -n ScanDelete2' $TABLES
#executeTest 'testScan -n ScanUpdateAndScanRead'
#executeTest 'testScan -n ScanReadAndLocker'
#executeTest 'testScan -n ScanReadAndPkRead'
#executeTest 'testScan -n ScanRead488'
#executeTest 'testScan -n ScanWithLocksAndInserts'
#executeTest 'testScan -n ScanReadAbort'
#executeTest 'testScan -n ScanReadAbort15'
#executeTest 'testScan -n ScanReadAbort16'
#executeTest 'testScan -n ScanUpdateAbort16'
#executeTest 'testScan -n ScanReadAbort240'
#executeTest 'testScan -n ScanReadRestart'
#executeTest 'testScan -n ScanReadRestart16'
#executeTest 'testScan -n ScanReadRestart32'
#executeTest 'testScan -n ScanUpdateRestart'
#executeTest 'testScan -n ScanUpdateRestart16'
#executeTest 'testScan -n CheckGetValue'
#executeTest 'testScan -n CloseWithoutStop'
#executeTest 'testScan -n NextScanWhenNoMore'
#executeTest 'testScan -n ExecuteScanWithoutOpenScan'
#executeTest 'testScan -n OnlyOpenScanOnce'
#executeTest 'testScan -n OnlyOneOpInScanTrans'
#executeTest 'testScan -n OnlyOneOpBeforeOpenScan'
#executeTest 'testScan -n OnlyOneScanPerTrans'
#executeTest 'testScan -n NoCloseTransaction'
#executeTest 'testScan -n CheckInactivityTimeOut'
#executeTest 'testScan -n CheckInactivityBeforeClose'
#executeTest 'testScan -n CheckAfterTerror'
# Testsuite: testScanInterpreter
# Number of tests: 1
#executeTest 'testScanInterpreter -n ScanLessThan'
TABLES="T6 T13"
# Testsuite: testSystemRestart
# Number of tests: 4
executeTest 'testSystemRestart -l 1 -n SR1' $TABLES
executeTest 'testSystemRestart -l 1 -n SR2' $TABLES
#executeTest 'testSystemRestart -n SR_UNDO'
#executeTest 'testSystemRestart -n SR_FULLDB'
# TESTS FINISHED
trace "Finished: `date`"
#
# TEST SUMMARY
#
if [ $numOfTestsFailed -eq 0 ]
then
echo "-- REGRESSION TEST SUCCESSFUL --"
else
echo "-- REGRESSION TEST FAILED!! --"
fi
echo "Number of successful tests: $numOfTestsOK"
echo "Number of failed tests : $numOfTestsFailed"

View file

@ -0,0 +1,22 @@
#!/bin/sh
rm $1
touch $1
echo "<table border="1" width=640>" >> $1
echo "<tr>" >> $1
echo "<td><b>Name</b></td><td>&nbsp;</td><td width="70%"><b>Description</b></td>" >> $1
echo "</tr>" >> $1
testBasic --print_html >> $1
testBackup --print_html >> $1
testBasicAsynch --print_html >> $1
testDict --print_html >> $1
testBank --print_html >> $1
testIndex --print_html >> $1
testNdbApi --print_html >> $1
testNodeRestart --print_html >> $1
testOperations --print_html >> $1
testRestartGci --print_html >> $1
testScan --print_html >> $1
testScanInterpreter --print_html >> $1
testSystemRestart --print_html >> $1
echo "</table>" >> $1

11
ndb/bin/mysqlcluster Executable file
View file

@ -0,0 +1,11 @@
#!/bin/sh
if [ -z "$MYSQLCLUSTER_TOP" -o ! -d "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set or directory does not exist"
exit 1
fi
if [ -z "$MYSQLCLUSTER_TOP" -o ! -d "$MYSQLCLUSTER_TOP/ndb" ]; then
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
mysql --socket=$MYSQLCLUSTER_TOP/data/mysqlcluster.sock $*

119
ndb/bin/mysqlcluster_install_db Executable file
View file

@ -0,0 +1,119 @@
#!/bin/sh
NDB_HOME=
export NDB_CONNECTSTRING
if [ -z "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set"
exit 1
fi
if [ -d "$MYSQLCLUSTER_TOP" ]; then :; else
echo "$MYSQLCLUSTER_TOP directory does not exist"
exit 1
fi
if [ -d "$MYSQLCLUSTER_TOP/ndb" ]; then :; else
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
start_default_ndbcluster() {
# configurable parameters, make sure to change in mysqlcluterd as well
MYSQLCLUSTER_FILESYSTEM=$MYSQLCLUSTER_TOP/data/mysqlclusterfs
MYSQLCLUSTER_PORT_BASE="22" # using ports MYSQLCLUSTER_PORT_BASE{"00","01", etc}
# end configurable parameters
# do some checks
NDB_CONNECTSTRING=
[ -d "$MYSQLCLUSTER_FILESYSTEM" ] || mkdir "$MYSQLCLUSTER_FILESYSTEM"
if [ -d "$MYSQLCLUSTER_FILESYSTEM" ]; then :; else
echo "$MYSQLCLUSTER_FILESYSTEM filesystem directory does not exist"
exit 1
fi
# set som help variables
NDB_HOST="localhost"
NDB_PORT=$MYSQLCLUSTER_PORT_BASE"00"
NDB_CONNECTSTRING_BASE="host=$NDB_HOST:$NDB_PORT;nodeid="
# Edit file system path and ports in config file
cd $MYSQLCLUSTER_FILESYSTEM
sed \
-e s,"WRITE_PATH_TO_FILESYSTEM_2_HERE",$MYSQLCLUSTER_FILESYSTEM,g \
-e s,"CHOOSE_PORT_BASE",$MYSQLCLUSTER_PORT_BASE,g \
< $MYSQLCLUSTER_TOP/ndb/demos/config-templates/config_template-install.ini \
> config.ini
# Start management server as deamon
NDB_ID="1"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
#xterm -e mgmtsrvr -c $MYSQLCLUSTER_FILESYSTEM/config.ini &
if mgmtsrvr -d -c $MYSQLCLUSTER_FILESYSTEM/config.ini ; then :; else
echo "Unable to start mgmtsrvr"
exit 1
fi
# Start database node
cd $MYSQLCLUSTER_FILESYSTEM # the output from the database node gets where it starts
NDB_ID="2"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
#xterm -T "NDB Cluster DB Node" -geometry 80x10 -xrm *.hold:true -e ndb -i &
ndb -d -i &
# Start xterm for application programs
NDB_ID="3"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
#xterm -T "NDB Cluster API Node" -geometry 80x10 &
echo set before running ndbApi programs > export NDB_CONNECTSTRING=$NDB_CONNECTSTRING
# Start management client
#xterm -T "NDB Management Client" -geometry 80x10 -xrm *.hold:true -e mgmtclient $NDB_HOST $NDB_PORT &
echo "NDB Management Client starts with: mgmtclient $NDB_HOST $NDB_PORT"
# test if Ndb Cluster starts properly
NDB_ID="11"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
if list_tables | grep "NDBT_ProgramExit: 0 - OK"; then :; else
echo "Ndbcluster startup failed"
exit 1
fi
}
start_mysql_install_db() {
# run install of regular MySQL Server
cd $MYSQLCLUSTER_TOP
scripts/mysql_install_db --basedir=$MYSQLCLUSTER_TOP --datadir=$MYSQLCLUSTER_TOP/data --socket=$MYSQLCLUSTER_TOP/data/mysqlcluster.sock $*
}
if test "$1" = "ndb_started"
then
shift
mgmt_host=$1
shift
mgmt_port=$1
shift
if [ -z "$mgmt_host" -o -z "$mgmt_port" ]; then
echo "syntax: ndb_started hostname port"
exit 1
fi
NDB_CONNECTSTRING="host=$mgmt_host:$mgmt_port;nodeid=11"
echo using NDB_CONNECTSTRING=$NDB_CONNECTSTRING
start_mysql_install_db $*
else
start_default_ndbcluster
start_mysql_install_db
fi

34
ndb/bin/mysqlclusterd Executable file
View file

@ -0,0 +1,34 @@
#!/bin/sh
# configurable parameters
MYSQLCLUSTER_PORT_BASE="22"
# end configurable parameters
if [ -z "$MYSQLCLUSTER_TOP" -o ! -d "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set or directory does not exist"
exit 1
fi
if [ -z "$MYSQLCLUSTER_TOP" -o ! -d "$MYSQLCLUSTER_TOP/ndb" ]; then
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
if test "$1" = "ndb_started"
then
shift
mgmt_host=$1
shift
mgmt_port=$1
shift
if [ -z "$mgmt_host" -o -z "$mgmt_port" ]; then
echo "syntax: ndb_started hostname port"
exit 1
fi
NDB_CONNECTSTRING="host=$mgmt_host:$mgmt_port;nodeid=11"
echo using NDB_CONNECTSTRING=$NDB_CONNECTSTRING
else
NDB_CONNECTSTRING="host=localhost:"$MYSQLCLUSTER_PORT_BASE"00;nodeid=11"
fi
export NDB_CONNECTSTRING
mysqld --default-table-type=ndbcluster --basedir=$MYSQLCLUSTER_TOP --datadir=$MYSQLCLUSTER_TOP/data --socket=$MYSQLCLUSTER_TOP/data/mysqlcluster.sock $*

644
ndb/bin/regression.sh Normal file
View file

@ -0,0 +1,644 @@
#!/bin/sh
# NAME
# regression.sh
#
# SYNOPSIS
# regression.sh
#
# DESCRIPTION
#
# This script runs a number of regression tests to verify that nothing
# is broken. Currently it executes the same tests as in the autotest
# regression suite.
#
# OPTIONS
#
# EXAMPLES
#
#
# ENVIRONMENT
# verbose verbose printouts
#
# FILES
#
#
# SEE ALSO
#
# DIAGNOSTICTS
#
#
# VERSION
# 1.0
#
# AUTHOR
#
#
# die prints the supplied message to stderr,
# prefixed with the program name, and exits
# with the exit code given by "-e num" or
# 1, if no -e option is present.
#
die ()
{
die_code__=1
[ "X$1" = X-e ] && { die_code__=$2; shift 2; }
[ "X$1" = X-- ] && shift
errmsg "$@"
exit $die_code__
}
# msg prints the supplied message to stderr,
# prefixed with the program name.
#
errmsg ()
{
echo "${progname:-<no program name set>}:" "$@" >&2
}
# rawdie prints the supplied message to stderr.
# It then exits with the exit code given with "-e num"
# or 1, if no -e option is present.
#
rawdie ()
{
rawdie_code__=1
[ "X$1" = X-e ] && { rawdie_code__=$2; shift 2; }
[ "X$1" = X-- ] && shift
rawerrmsg "$@"
exit $rawdie_code__
}
# Syndie prints the supplied message (if present) to stderr,
# prefixed with the program name, on the first line.
# On the second line, it prints $synopsis.
# It then exits with the exit code given with "-e num"
# or 1, if no -e option is present.
#
syndie ()
{
syndie_code__=1
[ "X$1" = X-e ] && { syndie_code__=$2; shift 2; }
[ "X$1" = X-- ] && shift
[ -n "$*" ] && msg "$*"
rawdie -e $syndie_code__ "Synopsis: $synopsis"
}
# msg prints the supplied message to stdout,
# prefixed with the program name.
#
msg ()
{
echo "${progname:-<no program name set>}:" "$@"
}
rawmsg () { echo "$*"; } # print the supplied message to stdout
rawerrmsg () { echo "$*" >&2; } # print the supplied message to stderr
# trace prints the supplied message to stdout if verbose is non-null
#
trace ()
{
[ -n "$verbose" ] && msg "$@"
}
# errtrace prints the supplied message to stderr if verbose is non-null
#
errtrace ()
{
[ -n "$verbose" ] && msg "$@" >&2
}
synopsis="regression.sh"
progname=`basename $0`
numOfTestsOK=0
numOfTestsFailed=0
LOG=regression-$1.`date '+%Y-%m-%d'`
executeTest()
{
eval "$@" | tee -a $LOG
if [ $? -eq 0 ]
then
echo "SUCCESS: $@"
numOfTestsOK=`expr $numOfTestsOK + 1`
else
echo "FAILED: $@"
numOfTestsFailed=`expr $numOfTestsFailed + 1`
fi
}
#
# INFO
#
trace "Starting: `date`"
trace "NDB_TOP = $NDB_TOP"
#
# THE TESTS TO EXECUTE
#
# BASIC FUNCTIONALITY
if [ $1 = "basic" ]
then
executeTest 'testBasic -n PkRead'
executeTest 'drop_all_tabs'
executeTest 'testBasic -n PkUpdate'
executeTest 'drop_all_tabs'
executeTest 'testBasic -n PkDelete'
executeTest 'drop_all_tabs'
executeTest 'testBasic -n PkInsert'
executeTest 'drop_all_tabs'
executeTest 'testBasic -n UpdateAndRead'
executeTest 'drop_all_tabs'
executeTest 'testBasic -n PkReadAndLocker' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n PkReadAndLocker2' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n PkReadUpdateAndLocker' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n ReadWithLocksAndInserts' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n PkInsertTwice' T1 T6 T10
executeTest 'drop_tab' T1 T6 T10
executeTest 'testBasic -n PkDirtyRead'
executeTest 'drop_all_tabs'
executeTest 'testBasic -n Fill' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n Fill' T1
executeTest 'drop_tab' T1
executeTest 'testBasic -n NoCommitSleep' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n NoCommit626' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n NoCommitAndClose' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n Commit626' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n CommitTry626' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n CommitAsMuch626' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n NoCommit626' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n NoCommitRollback626' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n Commit630' T1 T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n CommitTry630' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n CommitAsMuch630' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n NoCommit630' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n NoCommitRollback630' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n NoCommitAndClose' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n RollbackUpdate' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n RollbackDeleteMultiple' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n ImplicitRollbackDelete' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n CommitDelete' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n RollbackNothing' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testBasic -n ReadConsistency' T6
executeTest 'drop_tab' T6
executeTest 'testBasic -n PkRead' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'testBasic -n PkUpdate' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'testBasic -n PkDelete' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'testBasic -n PkInsert' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_409
executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'testBasic -n UpdateAndRead' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
#executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
executeTest 'testBasicAsynch -n PkInsertAsynch'
executeTest 'drop_all_tabs'
executeTest 'testBasicAsynch -n PkReadAsynch'
executeTest 'drop_all_tabs'
executeTest 'testBasicAsynch -n PkUpdateAsynch'
executeTest 'drop_all_tabs'
executeTest 'testBasicAsynch -n PkDeleteAsynch'
executeTest 'drop_all_tabs'
fi
# SCAN TESTS
if [ $1 = "scan" ]
then
executeTest 'testScan -n ScanRead16'
executeTest 'drop_all_tabs'
executeTest 'testScan -n ScanRead240'
executeTest 'drop_all_tabs'
executeTest 'testScan -n ScanUpdate'
executeTest 'drop_all_tabs'
executeTest 'testScan -n ScanUpdate2' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanDelete'
executeTest 'drop_all_tab'
executeTest 'testScan -n ScanDelete2' T10
executeTest 'drop_tab' T10
executeTest 'testScan -n ScanUpdateAndScanRead' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanReadAndLocker' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanReadAndPkRead' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanRead488' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanWithLocksAndInserts' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanReadAbort' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanReadAbort15' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanReadAbort240' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanUpdateAbort16' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanReadRestart' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ScanUpdateRestart' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n CheckGetValue' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n CloseWithoutStop' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n NextScanWhenNoMore' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n ExecuteScanWithoutOpenScan' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n OnlyOpenScanOnce' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n OnlyOneOpInScanTrans' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n OnlyOneOpBeforeOpenScan' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n OnlyOneScanPerTrans' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n NoCloseTransaction' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n CheckInactivityTimeOut' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n CheckInactivityBeforeClose' T6
executeTest 'drop_tab' T6
executeTest 'testScan -n CheckAfterTerror' T6
executeTest 'drop_tab' T6
fi
# DICT TESTS
if [ $1 = "dict" ]
then
executeTest 'testDict -n CreateAndDrop'
executeTest 'drop_all_tabs'
executeTest 'testDict -n CreateAndDropWithData'
executeTest 'drop_all_tabs'
executeTest 'testDict -n CreateAndDropDuring' T6
executeTest 'drop_tab' T6
executeTest 'testDict -n CreateInvalidTables'
executeTest 'drop_all_tabs'
executeTest 'testDict -n CreateTableWhenDbIsFull' T6
executeTest 'drop_tab' T6
executeTest 'testDict -n CreateMaxTables' T6
executeTest 'drop_tab' T6
executeTest 'testDict -n FragmentTypeAll' T1 T6 T7 T8
executeTest 'drop_tab' T1 T6 T7 T8
executeTest 'testDict -n FragmentTypeAllLarge' T1 T6 T7 T8
executeTest 'drop_tab' T1 T6 T7 T8
executeTest 'testDict -n TemporaryTables' T1 T6 T7 T8
executeTest 'drop_tab' T1 T6 T7 T8
fi
# TEST NDBAPI
if [ $1 = "api" ]
then
executeTest 'testNdbApi -n MaxNdb' T6
executeTest 'drop_tab' T6
executeTest 'testNdbApi -n MaxTransactions' T1 T6 T7 T8 T13
executeTest 'drop_tab' T1 T6 T7 T8 T13
executeTest 'testNdbApi -n MaxOperations' T1 T6 T7 T8 T1
executeTest 'drop_tab' T1 T6 T7 T8 T13
executeTest 'testNdbApi -n MaxGetValue' T1 T6 T7 T8 T13
executeTest 'drop_tab' T1 T6 T7 T8 T13
executeTest 'testNdbApi -n MaxEqual'
executeTest 'drop_all_tabs'
executeTest 'testNdbApi -n DeleteNdb' T1 T6
executeTest 'drop_tab' T1 T6
executeTest 'testNdbApi -n WaitUntilReady' T1 T6 T7 T8 T13
executeTest 'drop_tab' T1 T6 T7 T8 T13
executeTest 'testNdbApi -n GetOperationNoTab' T6
executeTest 'drop_tab' T6
executeTest 'testNdbApi -n NdbErrorOperation' T6
executeTest 'drop_tab' T6
executeTest 'testNdbApi -n MissingOperation' T6
executeTest 'drop_tab' T6
executeTest 'testNdbApi -n GetValueInUpdate' T6
executeTest 'drop_tab' T6
executeTest 'testNdbApi -n UpdateWithoutKeys' T6
executeTest 'drop_tab' T6
executeTest 'testNdbApi -n UpdateWithoutValues' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadRead' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadReadEx' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadInsert' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadUpdate' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadDelete' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadExRead' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadExReadEx' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadExInsert' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadExUpdate' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n ReadExDelete' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n InsertRead' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n InsertReadEx' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n InsertInsert' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n InsertUpdate' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n InsertDelete' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n UpdateRead' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n UpdateReadEx' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n UpdateInsert' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n UpdateUpdate' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n UpdateDelete' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n DeleteRead' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n DeleteReadEx' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n DeleteInsert' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n DeleteUpdate' T6
executeTest 'drop_tab' T6
executeTest 'testOperations -n DeleteDelete' T6
executeTest 'drop_tab' T6
executeTest 'testRestartGci' T6
executeTest 'drop_tab' T6
executeTest 'testIndex -n CreateAll'
executeTest 'drop_all_tabs'
executeTest 'testIndex -n InsertDeleteGentle' T1 T6 T8 T10
executeTest 'drop_tab' T1 T6 T8 T10
executeTest 'testIndex -n InsertDelete' T1 T6 T8 T10
executeTest 'drop_tab' T1 T6 T8 T10
executeTest 'testIndex -n CreateLoadDropGentle' T1 T6 T8 T10
executeTest 'drop_tab' T1 T6 T8 T10
executeTest 'testIndex -n CreateLoadDrop' T1 T6 T8 T10
executeTest 'drop_tab' T1 T6 T8 T10
executeTest 'testBackup' -n BackupOne
executeTest 'testBackup' -n BackupBank T6
executeTest 'drop_tab' T6
fi
# TEST SYSTEM RESTARTS
if [ $1 = "sr" ]
then
executeTest 'testSystemRestart -n SR1' T1
executeTest 'testSystemRestart -n SR1' T6
executeTest 'testSystemRestart -n SR1' T7
executeTest 'testSystemRestart -n SR1' T8
executeTest 'testSystemRestart -n SR1' T10
executeTest 'testSystemRestart -n SR2' T1
executeTest 'testSystemRestart -n SR2' T6
executeTest 'testSystemRestart -n SR2' T7
executeTest 'testSystemRestart -n SR2' T10
executeTest 'testSystemRestart -n SR2' T13
executeTest 'testSystemRestart -n SR3' T6
executeTest 'testSystemRestart -n SR3' T10
executeTest 'testSystemRestart -n SR4' T6
executeTest 'testSystemRestart -n SR_UNDO' T1
executeTest 'testSystemRestart -n SR_UNDO' T6
executeTest 'testSystemRestart -n SR_UNDO' T7
executeTest 'testSystemRestart -n SR_UNDO' T8
executeTest 'testSystemRestart -n SR_UNDO' T10
executeTest 'drop_tab' T1 T6 T7 T8 T10
fi
# TEST NODE RESTARTS
if [ $1 = "nr" ]
then
executeTest 'testNodeRestart -n NoLoad' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n PkRead' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n PkReadPkUpdate' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n ReadUpdateScan' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n Terror' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n FullDb' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartRandomNode' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartRandomNodeError' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartRandomNodeInitial' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartNFDuringNR' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartNodeDuringLCP' T6 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartMasterNodeError' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n TwoNodeFailure' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n TwoMasterNodeFailure' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n FiftyPercentFail' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartAllNodes' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartAllNodesAbort' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n RestartAllNodesError9999' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
executeTest 'testNodeRestart -n FiftyPercentStopAndWait' T6 T8 T13
executeTest 'drop_tab' T6 T8 T13
fi
# TESTS FINISHED
trace "Finished: `date`"
#
# TEST SUMMARY
#
if [ $numOfTestsFailed -eq 0 ]
then
echo "-- REGRESSION TEST SUCCESSFUL --"
else
echo "-- REGRESSION TEST FAILED!! --"
fi
echo "Number of successful tests: $numOfTestsOK"
echo "Number of failed tests : $numOfTestsFailed"

4
ndb/config/Defs.DEBUG.mk Normal file
View file

@ -0,0 +1,4 @@
VERSION_FLAGS := -DNDB_DEBUG -DUSE_EMULATED_JAM -DVM_TRACE -DERROR_INSERT -DARRAY_GUARD
#-DDEBUG_TRANSPORTER

View file

@ -0,0 +1,50 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := ar rcs
SO := ld -b -o
SHLIBEXT := sl
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -MA -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -W -Wall -pedantic
# -Wno-sign-compare Use this flag if you are annoyed with all the warnings
CCFLAGS_TOP = -DHPUX -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DNO_COMMAND_HANDLER
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lnsl -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,49 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := $(PURE) ar rcs
SO := g++ -shared -o
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -Wall #-pedantic
# Add these for more warnings -Weffc++ -W
CCFLAGS_TOP = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
CCFLAGS_TOP += -fno-rtti
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,56 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++$(GCC_VERSION)
CC := gcc$(GCC_VERSION)
AR_RCS := $(PURE) ar rcs
SO := gcc$(GCC_VERSION) -shared -lpthread -o
MAKEDEPEND := g++$(GCC_VERSION) -M
PIC := -fPIC
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
# gcc3.3 __THROW problem if -pedantic and -O2
ifeq ($(NDB_VERSION),DEBUG)
CCFLAGS_WARNINGS = -Wno-long-long -Wall -pedantic
else
CCFLAGS_WARNINGS = -Wno-long-long -Wall
endif
# Add these for more warnings -Weffc++ -W
CCFLAGS_TOP = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
CCFLAGS_TOP += -fno-rtti -fno-exceptions
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O2
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O2 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP =
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(CC) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)
LDFLAGS_LAST = -lpthread -lrt -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic

View file

@ -0,0 +1,54 @@
###
#
# Defines
SHELL := /bin/sh
C++ := icc
CC := icc
AR_RCS := $(PURE) ar rcs
SO := g++$(GCC_VERSION) -shared -lpthread -o
MAKEDEPEND := g++$(GCC_VERSION) -M
PIC := -fPIC
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
# gcc3.3 __THROW problem if -pedantic and -O2
ifeq ($(NDB_VERSION),DEBUG)
CCFLAGS_WARNINGS =
else
CCFLAGS_WARNINGS =
endif
# Add these for more warnings -Weffc++ -W
CCFLAGS_TOP = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
CCFLAGS_TOP +=
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O2
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O2 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,54 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := $(PURE) ar rcs
SO := g++ -shared -lpthread -o
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
# gcc3.3 __THROW problem if -pedantic and -O2
ifeq ($(NDB_VERSION),DEBUG)
CCFLAGS_WARNINGS = -Wno-long-long -Wall -pedantic
else
CCFLAGS_WARNINGS = -Wno-long-long -Wall
endif
# Add these for more warnings -Weffc++ -W
CCFLAGS_TOP = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
CCFLAGS_TOP += -fno-rtti -fno-exceptions -m64
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O2
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O2 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,58 @@
###
#
# Defines
SHELL := /bin/sh
C++ := gcc
CC := gcc
CXX := gcc
AR_RCS := $(PURE) ar rcs
#SO := g++ -dynamiclib -Wl,-segprot,__TEXT,rwx,rwx -o
SO := gcc -dynamiclib -o
SHLIBEXT := dylib
MAKEDEPEND := gcc -M
PIC := -fPIC
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -Wall -Winline #-Werror#-pedantic
# Add these for more warnings -Weffc++ -W
CCFLAGS_TOP = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D_BIG_ENDIAN
CXX_FLAGS_TOP = -fno-rtti -felide-constructors -fno-exceptions -fno-omit-fram-pointer
C_FLAGS_TOP += -fno-omit-frame-pointer
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(CXXFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(C_FLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP =
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)
#LDFLAGS_LAST = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
LDFLAGS_LAST = -lstdc++

View file

@ -0,0 +1,47 @@
###
#
# Defines
SHELL := /bin/sh
C++ := dplus
CC := dcc
AR_RCS := $(PURE) ar rcs
SO := dar -r
MAKEDEPEND := g++ -M -nostdinc
PIC :=
RPCGENFLAGS := -MA -C -N
###
#
# Flags
#
CCFLAGS_INCLUDE = -I/vobs/cello/cls/rtosi_if/include -I/vobs/cello/cls/rtosi_if/include.mp750 -I/vobs/cello/cls/rtosi_if/include.ppc
CCFLAGS_TOP = -tPPC750EH -DBIG_ENDIAN -D_BIG_ENDIAN -DPPC -DPPC750 -DOSE_DELTA -DMP -Xlint -Xforce-prototypes -DINLINE=__inline__ -Xansi -Xsmall-data=0 -Xsmall-const=0 -Xstrings-in-text
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -XO
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -XO -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_INCLUDE)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_INCLUDE)
LDFLAGS_TOP =
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,3 @@
VERSION_FLAGS := -DNDB_RELEASE -DUSE_EMULATED_JAM -DNDEBUG

View file

@ -0,0 +1,3 @@
VERSION_FLAGS := -DNDB_RELEASE -DUSE_EMULATED_JAM -DNDEBUG -DVM_TRACE -DERROR_INSERT -DARRAY_GUARD

View file

@ -0,0 +1,53 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := $(PURE) ar rcs
SO := g++ -shared -o
MAKEDEPEND := g++ -M
PIC := -fPIC
###
#
# Flags
#
NDB_STRDUP := Y
CCFLAGS_WARNINGS = -Wall -pedantic -Wno-sign-compare
CC_FLAGS_OSE = -DSPARC -DSIM -DOSE_DELTA -DMP
CCFLAGS_TOP = $(CC_FLAGS_OSE) $(CC_FLAGS_WARNINGS) -DNDB_STRDUP
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS_LOC_OSE= -I/vobs/cello/cls/rtosi_if/include.sparc
CCFLAGS = $(CCFLAGS_LOC_OSE) $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC_OSE) $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDLIBS_LOC = -L$(NDB_TOP)/lib -L$(OSE_LOC)/sfk-solaris2/lib -L$(OSE_LOC)/sfk-solaris2/krn-solaris2/lib
LDLIBS_TOP =
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(LDFLAGS)

View file

@ -0,0 +1,57 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := $(PURE) ar rcs
SO := g++ -shared -o
MAKEDEPEND := g++ -M
PIC := -fPIC
###
#
# Flags
#
NDB_STRDUP := Y
CCFLAGS_WARNINGS = -Wno-long-long -Wall -pedantic -Wno-sign-compare -ansi
CC_FLAGS_OSE = -DUSE_OSEDEF_H -DOSE_DELTA -DOS_DEBUG -DBIG_ENDIAN
CCFLAGS_TOP = $(CC_FLAGS_OSE) $(CC_FLAGS_WARNINGS) -DNDB_STRDUP
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3 -g
else
VERSION_FLAGS += -g -DOS_DEBUG
endif
endif
OSE_LOC = /opt/as/OSE/OSE4.3.1
CCFLAGS_LOC_OSESTD = -I$(OSE_LOC)/sfk-solaris2/std-include
CCFLAGS_LOC_OSE = -I$(OSE_LOC)/sfk-solaris2/include -I$(OSE_LOC)/sfk-solaris2/krn-solaris2/include -I$(NDB_TOP)/src/env/softose
CCFLAGS = $(CCFLAGS_LOC_OSE) $(CCFLAGS_LOC_OSESTD) $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC_OSE) $(CCFLAGS_LOC_OSESTD) $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDLIBS_LOC = -L$(NDB_TOP)/lib -L$(OSE_LOC)/sfk-solaris2/lib -L$(OSE_LOC)/sfk-solaris2/krn-solaris2/lib
LDLIBS_TOP =
LDLIBS_LAST = -lsoftose_env -lsoftose_krn -llnh -lefs -lshell -lfss -ltosv -lrtc -lheap -linetutil -linetapi -lsoftose -lsoftose_env -lsoftose_krn -losepthread -lrtc -lnsl -lsocket -lpthread -lcrt -lm
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(LDFLAGS)

View file

@ -0,0 +1,54 @@
###
#
# Defines
SHELL := /bin/sh
C++ := CC
CC := /opt/as/forte6/SUNWspro/bin/cc
AR_RCS := $(PURE) CC -xar -o
SO := CC -G -z text -o
MAKEDEPEND := CC -xM1
PIC := -KPIC
ETAGS := etags
CTAGS := ctags
RPCGENFLAGS := -MA -C -N
###
#
# Flags
CCFLAGS_TOP = -mt -DSOLARIS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
ifneq ($(PURE),)
CCFLAGS_TOP += -xs
CCFLAGS_TOP += -DNDB_PURIFY
endif
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -xO3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -xO3 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS)
LDFLAGS_TOP = -L/opt/as/forte6/SUNWspro/WS6/lib -lpthread -lsocket -lnsl -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) -xildoff $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,54 @@
###
#
# Defines
SHELL := /bin/sh
CXX := gcc
C++ := g++
CC := gcc
AR_RCS := ar rcs
SO := gcc -G -o
#GXX_VERSION := $(shell gcc --version | sed -e 's,.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*,\1,1' -e q)
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -MA -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -W -Wall -pedantic
# -Wno-sign-compare Use this flag if you are annoyed with all the warnings
CCFLAGS_TOP = -DSOLARIS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DNO_COMMAND_HANDLER
CCFLAGS_TOP += -fno-rtti
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O2
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O2 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP =
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(CXX) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)
LDFLAGS_LAST = -lpthread -lsocket -lnsl -lrt -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic

View file

@ -0,0 +1,53 @@
###
#
# Note: LD_LIBRARY_PATH must be set for /usr/local/lib/sparcv9 to dynamically link
# to 64-bit libraries
#
# Defines
SHELL := /bin/sh
C++ := g++ -m64
CC := gcc -m64
AR_RCS := ar rcs
SO := g++ -m64 -shared -o
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -MA -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -W -Wall -pedantic
# -Wno-sign-compare Use this flag if you are annoyed with all the warnings
CCFLAGS_TOP = -DSOLARIS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DNO_COMMAND_HANDLER
CCFLAGS_TOP += -fno-rtti
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O2
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O2 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lsocket -lnsl -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,53 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := $(PURE) ar rcs
SO := g++ -shared -o
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -MA -C -N
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -Wall -pedantic
# -Wno-sign-compare Use this flag if you are annoyed with all the warnings
CCFLAGS_TOP = -DSOLARIS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DNO_COMMAND_HANDLER
# SOLARIS 6 should use the same settings as SOLARIS7
# if something in the SOLARIS 7 port does not work for SOLARIS 6
# it can be ifdefed using
# if ! defined NDB_SOLRIS6
CCFLAGS_TOP = -DNDB_SOLARIS
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lsocket -lnsl -lposix4
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,49 @@
###
#
# Defines
SHELL := /bin/sh
C++ := g++
CC := gcc
AR_RCS := $(PURE) ar rcs
SO := g++ -shared -o
MAKEDEPEND := g++ -M
PIC := -fPIC
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS = -Wno-long-long -Wall #-pedantic
# Add these for more warnings -Weffc++ -W
CCFLAGS_TOP = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
CCFLAGS_TOP += -fno-rtti
ifeq (RELEASE, $(NDB_VERSION))
VERSION_FLAGS += -O3
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
VERSION_FLAGS += -O3 -g
else
VERSION_FLAGS += -g
endif
endif
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP = -lpthread -lrt
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
LINK.cc = $(PURE) $(C++) $(CCFLAGS) $(LDFLAGS)
LINK.c = $(PURE) $(CC) $(CFLAGS) $(LDFLAGS)

View file

@ -0,0 +1,61 @@
###
#
# Defines
SHELL := /bin/sh
DEFINES = -D_WIN32 -D_M_IX86=600 -D_MSC_EXTENSIONS=0 -U_cdecl -D_MT
#
MAKEDEPEND = g++ -M --nostdinc --nostdinc++ -I"`cygpath -u "$(MSVCDIR)\include"`" -I"`cygpath -u "$(MSVCDIR)\PlatformSDK\include"`" $(DEFINES)
PIC = -D_LIB
NON_PIC = -D_LIB
RPCGENFLAGS := -M -C -N
ETAGS := etags
CTAGS := ctags
###
#
# Flags
#
CCFLAGS_WARNINGS =
CCFLAGS_TOP =
CCFLAGS_LOC =
CCFLAGS_WIN = -DWIN32 -D_WIN32_WINNT=0x0500 -DWINVER=0x0500 -D_MBCS -DNO_COMMAND_HANDLER
CCFLAGS_WIN += -W3 -EHsc
#CCFLAGS_WIN += -clr
ifeq (RELEASE, $(NDB_VERSION))
CCFLAGS_WIN += -MT -O2 -Ob1 -DNO_DEBUG_MESSAGES
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
CCFLAGS_WIN += -MT -O2 -Ob1 -DNO_DEBUG_MESSAGES
else
CCFLAGS_WIN += -MTd -Zi -Od -GS -D_DEBUG
endif
endif
C++ = cl -nologo $(CCFLAGS_WIN)
CC = cl -nologo $(CCFLAGS_WIN)
CCFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
CFLAGS = $(CCFLAGS_LOC) $(CCFLAGS_TOP) $(USER_FLAGS) $(VERSION_FLAGS) $(CCFLAGS_WARNINGS)
LDFLAGS_TOP =
LDFLAGS = $(LDFLAGS_LOC) $(LDFLAGS_TOP)
LDLIBS = $(LDLIBS_LOC) $(LDLIBS_TOP)
WIN_LIBS := Ws2_32.lib Advapi32.lib
ifeq (RELEASE, $(NDB_VERSION))
LINK.cc = link -INCREMENTAL:NO -NOLOGO -LARGEADDRESSAWARE $(WIN_LIBS)
else
ifeq (RELEASE_TRACE, $(NDB_VERSION))
LINK.cc = link -INCREMENTAL:NO -NOLOGO -LARGEADDRESSAWARE $(WIN_LIBS)
else
LINK.cc = link -INCREMENTAL -NOLOGO -DEBUG -LARGEADDRESSAWARE $(WIN_LIBS)
endif
endif

113
ndb/config/GuessConfig.sh Executable file
View file

@ -0,0 +1,113 @@
#! /bin/sh
if [ -z "$NDB_TOP" ]
then
echo "You have not set NDB_TOP. Exiting" 1>&2
exit 1
fi
if [ -z "$NDB_SCI" ]
then
NDB_SCI=N
fi
os=`uname -s`
case $os in
Linux)
NDB_OS=LINUX
NDB_ARCH=x86
NDB_COMPILER=GCC
;;
Darwin)
NDB_OS=MACOSX
NDB_ARCH=POWERPC
NDB_COMPILER=GCC
;;
HP-UX)
NDB_OS=HPUX
NDB_ARCH=HPPA
NDB_COMPILER=GCC
;;
CYGWIN_NT-5.0)
NDB_OS=WIN32
NDB_ARCH=x86
NDB_COMPILER=VC7
;;
*)
if [ "$os" = "SunOS" ] && [ `uname -r` = "5.6" ]
then
NDB_OS=OSE
NDB_ARCH=PPC750
NDB_COMPILER=DIAB
else
NDB_OS=SOLARIS
NDB_ARCH=SPARC
NDB_COMPILER=GCC
fi;;
esac
if [ -z "$NDB_ODBC" ]
then
val=N
if [ -f /usr/include/sqlext.h -o -f /usr/local/include/sqlext.h ]
then
val=Y
fi
case $NDB_OS in
LINUX)
NDB_ODBC=$val
;;
MACOSX)
NDB_ODBC=$val
;;
*)
NDB_ODBC=N
;;
esac
fi
mch=`uname -m`
case $mch in
x86_64)
NDB_ARCH=x86_64
;;
*)
;;
esac
if [ -f $NDB_TOP/config/Makefile ]
then
TERMCAP_LIB=`grep TERMCAP_LIB $NDB_TOP/config/Makefile | sed -e s,"TERMCAP_LIB.*=.*-l","",g`
fi
if [ "$TERMCAP_LIB" = "" ]
then
TERMCAP_LIB=termcap
fi
# Allow for selecting GCC, but must be 2nd parameter
if [ $# -gt 1 -a "$2" = "-GCC" ]
then
NDB_COMPILER=GCC
fi
(
echo "# This file was automatically generated `date`"
echo "NDB_OS := $NDB_OS"
echo "NDB_ARCH := $NDB_ARCH"
echo "NDB_COMPILER := $NDB_COMPILER"
if [ $# -gt 0 -a "$1" = "-R" ]
then
echo "NDB_VERSION := RELEASE"
else
echo "NDB_VERSION := DEBUG"
fi
echo "NDB_SCI := $NDB_SCI"
echo "NDB_ODBC := $NDB_ODBC"
echo "TERMCAP_LIB := $TERMCAP_LIB"
) > $NDB_TOP/config/config.mk
exit 0

31
ndb/config/Makefile.am Normal file
View file

@ -0,0 +1,31 @@
# Copyright (C) 2003 MySQL AB
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Process this file with automake to create Makefile.in
AUTOMAKE_OPTIONS = foreign
# These are built from source in the Docs directory
EXTRA_DIST =
SUBDIRS =
# Relink after clean
linked_sources =
CLEANFILES = $(linked_sources)
# This is just so that the linking is done early.
config.h:

1513
ndb/config/acinclude.m4 Normal file

File diff suppressed because it is too large Load diff

2085
ndb/config/configure.in Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
OwnProcessId 3
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 2
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 1
127.0.0.1 10000

View file

@ -0,0 +1,70 @@
###############################################################################
#
# Initial system configuration file for MySQL Cluster v3.1.0 (Demo 1)
#
###############################################################################
[DB DEFAULT]
NoOfReplicas: 1
#LockPagesInMainMemory: Y
StopOnError: Y
#MaxNoOfConcurrentOperations: 1024
#MaxNoOfConcurrentTransactions: 1024
NoOfIndexPages: 1500
NoOfDataPages: 5000
#TimeBetweenLocalCheckpoints: 20
#TimeBetweenGlobalCheckpoints: 1500
#NoOfFragmentLogFiles: 8
BackupMemory: 4M
BackupDataBufferSize: 2M
BackupLogBufferSize: 2M
BackupWriteSize: 32k
[COMPUTER]
Id: 1
ByteOrder: Little
HostName: localhost
[MGM]
Id: 1
ExecuteOnComputer: 1
PortNumber: 10000
PortNumberStats: 10001
[DB]
Id: 2
ExecuteOnComputer: 1
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_2_HERE
[API]
Id: 3
ExecuteOnComputer: 1
# Designated MySQL Server API node id
[API]
Id: 11
ExecuteOnComputer: 1
[TCP DEFAULT]
SendSignalId: N
Compression: N
Checksum: N
SendBufferSize: 2000
MaxReceiveSize: 2000
[TCP]
NodeId1: 1
NodeId2: 2
PortNumber: 10002
[TCP]
NodeId1: 2
NodeId2: 3
PortNumber: 10003
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 11
PortNumber: 10011

View file

@ -0,0 +1,2 @@
OwnProcessId 4
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 5
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 6
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 7
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 2
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 3
127.0.0.1 10000

View file

@ -0,0 +1,2 @@
OwnProcessId 1
127.0.0.1 10000

View file

@ -0,0 +1,157 @@
###############################################################################
#
# Initial system configuration file for MySQL Cluster v3.1.0 (Demo 2)
#
###############################################################################
[COMPUTER]
Id: 1
ByteOrder: Little
HostName: localhost
[COMPUTER]
Id: 2
ByteOrder: Little
HostName: localhost
[MGM]
Id: 1
ExecuteOnComputer: 1
PortNumber: 10000
PortNumberStats: 10001
ArbitrationRank: 1
[DB DEFAULT]
NoOfReplicas: 2
#LockPagesInMainMemory: N
StopOnError: N
#MaxNoOfConcurrentOperations: 1024
#MaxNoOfConcurrentTransactions: 1024
NoOfIndexPages: 200
NoOfDataPages: 600
#TimeBetweenLocalCheckpoints: 20
#TimeBetweenGlobalCheckpoints: 1500
#NoOfFragmentLogFiles: 8
BackupMemory: 4M
BackupDataBufferSize: 2M
BackupLogBufferSize: 2M
BackupWriteSize: 32k
[DB]
Id: 2
ExecuteOnComputer: 1
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_2_HERE
[DB]
Id: 3
ExecuteOnComputer: 2
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_3_HERE
[API DEFAULT]
ArbitrationRank: 1
[API]
Id: 4
ExecuteOnComputer: 1
[API]
Id: 5
ExecuteOnComputer: 1
[API]
Id: 6
ExecuteOnComputer: 2
[API]
Id: 7
ExecuteOnComputer: 2
# Designated MySQL Server API node id
[API]
Id: 11
ExecuteOnComputer: 1
# Designated MySQL Server API node id
[API]
Id: 12
ExecuteOnComputer: 2
[TCP]
NodeId1: 1
NodeId2: 2
PortNumber: 10002
[TCP]
NodeId1: 1
NodeId2: 3
PortNumber: 10003
[TCP]
NodeId1: 2
NodeId2: 3
PortNumber: 10004
[TCP]
NodeId1: 2
NodeId2: 4
PortNumber: 10005
[TCP]
NodeId1: 2
NodeId2: 5
PortNumber: 10006
[TCP]
NodeId1: 2
NodeId2: 6
PortNumber: 10007
[TCP]
NodeId1: 2
NodeId2: 7
PortNumber: 10008
[TCP]
NodeId1: 3
NodeId2: 4
PortNumber: 10009
[TCP]
NodeId1: 3
NodeId2: 5
PortNumber: 10010
[TCP]
NodeId1: 3
NodeId2: 6
PortNumber: 10011
[TCP]
NodeId1: 3
NodeId2: 7
PortNumber: 10012
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 11
PortNumber: 10013
# Designated MySQL Server API node connection
[TCP]
NodeId1: 3
NodeId2: 11
PortNumber: 10014
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 12
PortNumber: 10015
# Designated MySQL Server API node connection
[TCP]
NodeId1: 3
NodeId2: 12
PortNumber: 10016

View file

@ -0,0 +1,87 @@
###############################################################################
#
# Initial system configuration file for MySQL Cluster v3.1.0 (Demo 1)
#
###############################################################################
[DB DEFAULT]
NoOfReplicas: 1
StopOnError: Y
NoOfIndexPages: 1500
NoOfDataPages: 5000
BackupMemory: 4M
BackupDataBufferSize: 2M
BackupLogBufferSize: 2M
BackupWriteSize: 32k
[COMPUTER]
Id: 1
ByteOrder: Little
HostName: CHOOSE_HOSTNAME
[EXTERNAL SYSTEM]
Name: External
[MGM]
Id: 1
ExecuteOnComputer: 1
PortNumber: CHOOSE_PORT_BASE00
PortNumberStats: CHOOSE_PORT_BASE01
[DB]
Id: 2
ExecuteOnComputer: 1
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_2_HERE
[API]
Id: 3
ExecuteOnComputer: 1
[REP]
Id: CHOOSE_REP_ID
ExecuteOnComputer: 1
[EXTERNAL REP]
Id: CHOOSE_EXTREP_ID
System: External
# Designated MySQL Server API node id
[API]
Id: 11
ExecuteOnComputer: 1
[TCP DEFAULT]
SendSignalId: N
Compression: N
Checksum: N
SendBufferSize: 2000
MaxReceiveSize: 2000
[TCP]
NodeId1: 1
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE02
[TCP]
NodeId1: 2
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE03
[TCP]
NodeId1: 2
NodeId2: CHOOSE_REP_ID
PortNumber: CHOOSE_PORT_BASE04
[TCP]
Hostname1: CHOOSE_HOSTNAME
Hostname2: CHOOSE_EXTHOSTNAME
NodeId1: CHOOSE_REP_ID
NodeId2: External.CHOOSE_EXTREP_ID
PortNumber: 10099
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 11
PortNumber: CHOOSE_PORT_BASE11

View file

@ -0,0 +1,336 @@
###############################################################################
#
# 4-node system configuration file for MySQL Cluster
#
###############################################################################
[DB DEFAULT]
NoOfReplicas: 1
StopOnError: N
NoOfIndexPages: 1500
NoOfDataPages: 5000
BackupMemory: 4M
BackupDataBufferSize: 2M
BackupLogBufferSize: 2M
BackupWriteSize: 32k
[COMPUTER]
Id: 1
ByteOrder: Little
HostName: CHOOSE_HOSTNAME_1
[COMPUTER]
Id: 2
ByteOrder: Little
HostName: CHOOSE_HOSTNAME_2
[COMPUTER]
Id: 3
ByteOrder: Little
HostName: CHOOSE_HOSTNAME_3
[COMPUTER]
Id: 4
ByteOrder: Little
HostName: CHOOSE_HOSTNAME_4
[MGM]
Id: 1
ExecuteOnComputer: 1
PortNumber: CHOOSE_PORT_BASE00
PortNumberStats: CHOOSE_PORT_BASE01
[DB]
Id: 2
ExecuteOnComputer: 1
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_1_HERE
[DB]
Id: 3
ExecuteOnComputer: 2
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_2_HERE
[DB]
Id: 4
ExecuteOnComputer: 3
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_3_HERE
[DB]
Id: 5
ExecuteOnComputer: 4
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_4_HERE
[API]
Id: 6
ExecuteOnComputer: 1
[API]
Id: 7
ExecuteOnComputer: 2
[API]
Id: 8
ExecuteOnComputer: 3
[API]
Id: 9
ExecuteOnComputer: 4
# Designated MySQL Server API node id
[API]
Id: 11
ExecuteOnComputer: 1
# Designated MySQL Server API node id
[API]
Id: 12
ExecuteOnComputer: 2
# Designated MySQL Server API node id
[API]
Id: 13
ExecuteOnComputer: 3
# Designated MySQL Server API node id
[API]
Id: 14
ExecuteOnComputer: 4
[TCP DEFAULT]
SendSignalId: N
Compression: N
Checksum: N
SendBufferSize: 2000
MaxReceiveSize: 2000
# Management server
[TCP]
NodeId1: 1
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE02
[TCP]
NodeId1: 1
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE03
[TCP]
NodeId1: 1
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE04
[TCP]
NodeId1: 1
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE05
# Database cluster
[TCP]
NodeId1: 2
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE06
[TCP]
NodeId1: 2
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE07
[TCP]
NodeId1: 2
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE08
[TCP]
NodeId1: 3
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE09
[TCP]
NodeId1: 3
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE10
[TCP]
NodeId1: 4
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE11
# API node 6
[TCP]
NodeId1: 6
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE12
[TCP]
NodeId1: 6
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE13
[TCP]
NodeId1: 6
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE14
[TCP]
NodeId1: 6
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE15
# API node 7
[TCP]
NodeId1: 7
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE16
[TCP]
NodeId1: 7
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE17
[TCP]
NodeId1: 7
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE18
[TCP]
NodeId1: 7
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE19
# API node 8
[TCP]
NodeId1: 8
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE20
[TCP]
NodeId1: 8
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE21
[TCP]
NodeId1: 8
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE22
[TCP]
NodeId1: 8
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE23
# API node 9
[TCP]
NodeId1: 9
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE24
[TCP]
NodeId1: 9
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE25
[TCP]
NodeId1: 9
NodeId2: 4
PortNumber: CHOOSE_PORT_BASE26
[TCP]
NodeId1: 9
NodeId2: 5
PortNumber: CHOOSE_PORT_BASE27
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 11
PortNumber: CHOOSE_PORT_BASE28
# Designated MySQL Server API node connection
[TCP]
NodeId1: 3
NodeId2: 11
PortNumber: CHOOSE_PORT_BASE29
# Designated MySQL Server API node connection
[TCP]
NodeId1: 4
NodeId2: 11
PortNumber: CHOOSE_PORT_BASE30
# Designated MySQL Server API node connection
[TCP]
NodeId1: 5
NodeId2: 11
PortNumber: CHOOSE_PORT_BASE31
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 12
PortNumber: CHOOSE_PORT_BASE32
# Designated MySQL Server API node connection
[TCP]
NodeId1: 3
NodeId2: 12
PortNumber: CHOOSE_PORT_BASE33
# Designated MySQL Server API node connection
[TCP]
NodeId1: 4
NodeId2: 12
PortNumber: CHOOSE_PORT_BASE34
# Designated MySQL Server API node connection
[TCP]
NodeId1: 5
NodeId2: 12
PortNumber: CHOOSE_PORT_BASE35
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 13
PortNumber: CHOOSE_PORT_BASE36
# Designated MySQL Server API node connection
[TCP]
NodeId1: 3
NodeId2: 13
PortNumber: CHOOSE_PORT_BASE37
# Designated MySQL Server API node connection
[TCP]
NodeId1: 4
NodeId2: 13
PortNumber: CHOOSE_PORT_BASE38
# Designated MySQL Server API node connection
[TCP]
NodeId1: 5
NodeId2: 13
PortNumber: CHOOSE_PORT_BASE39
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 14
PortNumber: CHOOSE_PORT_BASE40
# Designated MySQL Server API node connection
[TCP]
NodeId1: 3
NodeId2: 14
PortNumber: CHOOSE_PORT_BASE41
# Designated MySQL Server API node connection
[TCP]
NodeId1: 4
NodeId2: 14
PortNumber: CHOOSE_PORT_BASE42
# Designated MySQL Server API node connection
[TCP]
NodeId1: 5
NodeId2: 14
PortNumber: CHOOSE_PORT_BASE43

View file

@ -0,0 +1,64 @@
###############################################################################
#
# Initial system configuration file for MySQL Cluster v3.1.0 (Demo 1)
#
###############################################################################
[DB DEFAULT]
NoOfReplicas: 1
StopOnError: N
NoOfIndexPages: 1500
NoOfDataPages: 5000
BackupMemory: 4M
BackupDataBufferSize: 2M
BackupLogBufferSize: 2M
BackupWriteSize: 32k
[COMPUTER]
Id: 1
ByteOrder: Little
HostName: localhost
[MGM]
Id: 1
ExecuteOnComputer: 1
PortNumber: CHOOSE_PORT_BASE00
PortNumberStats: CHOOSE_PORT_BASE01
[DB]
Id: 2
ExecuteOnComputer: 1
FileSystemPath: WRITE_PATH_TO_FILESYSTEM_2_HERE
[API]
Id: 3
ExecuteOnComputer: 1
# Designated MySQL Server API node id
[API]
Id: 11
ExecuteOnComputer: 1
[TCP DEFAULT]
SendSignalId: N
Compression: N
Checksum: N
SendBufferSize: 2000
MaxReceiveSize: 2000
[TCP]
NodeId1: 1
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE02
[TCP]
NodeId1: 2
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE03
# Designated MySQL Server API node connection
[TCP]
NodeId1: 2
NodeId2: 11
PortNumber: CHOOSE_PORT_BASE11

View file

@ -0,0 +1,50 @@
echo $NDB_HOST $NDB_EXTHOST
NDB_PORT=$NDB_PORT_BASE"00"
NDB_CONNECTSTRING_BASE="host=$NDB_HOST:$NDB_PORT;nodeid="
# Edit file system path
cd $NDB_DEMO
sed -e s,"WRITE_PATH_TO_FILESYSTEM_2_HERE",$NDB_DEMO/filesystem,g \
-e s,"CHOOSE_HOSTNAME",$NDB_HOST,g\
-e s,"CHOOSE_EXTHOSTNAME",$NDB_EXTHOST,g\
-e s,"CHOOSE_PORT_BASE",$NDB_PORT_BASE,g\
-e s,"CHOOSE_REP_ID",$NDB_REP_ID,g\
-e s,"CHOOSE_EXTREP_ID",$NDB_EXTREP_ID,g\
< ../config-templates/config_template-1-REP.ini > config.ini
# Start management server as deamon
NDB_ID="1"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
export NDB_CONNECTSTRING
if mgmtsrvr -d -c config.ini ; then :; else
echo "Unable to start mgmtsrvr"
exit 1
fi
# Start database node
NDB_ID="2"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
export NDB_CONNECTSTRING
xterm -T "$NDB_DEMO_NAME DB Node $NDB_ID" -geometry 80x10 -xrm *.hold:true -e ndb -i &
# Start xterm for application programs
NDB_ID="3"
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
export NDB_CONNECTSTRING
xterm -T "$NDB_DEMO_NAME API Node $NDB_ID" -geometry 80x10 &
# Start xterm for rep node
NDB_ID=$NDB_REP_ID
NDB_CONNECTSTRING=$NDB_CONNECTSTRING_BASE$NDB_ID
export NDB_CONNECTSTRING
xterm -T "$NDB_DEMO_NAME REP Node $NDB_ID" -geometry 80x10 -xrm *.hold:true -e ndb_rep &
# Start management client
xterm -T "$NDB_DEMO_NAME Mgmt Client" -geometry 80x10 -xrm *.hold:true -e mgmtclient $NDB_HOST $NDB_PORT &

30
ndb/demos/run_demo1-PS.sh Executable file
View file

@ -0,0 +1,30 @@
#!/bin/sh
if [ -z "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set"
exit 1
fi
if [ -d "$MYSQLCLUSTER_TOP/ndb" ]; then :; else
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
NDB_CONNECTSTRING=
NDB_HOME=
NDB_DEMO=$MYSQLCLUSTER_TOP/ndb/demos/1-node-PS
NDB_PORT_BASE="102"
NDB_REP_ID="5"
NDB_EXTREP_ID="4"
NDB_DEMO_NAME="Demo 1-PS MySQL Cluster"
NDB_HOST1=$1
NDB_HOST2=$2
if [ -z "$NDB_HOST1" ]; then
NDB_HOST1=localhost
fi
if [ -z "$NDB_HOST2" ]; then
NDB_HOST2=localhost
fi
NDB_HOST=$NDB_HOST1
NDB_EXTHOST=$NDB_HOST2
source $MYSQLCLUSTER_TOP/ndb/demos/run_demo1-PS-SS_common.sh

30
ndb/demos/run_demo1-SS.sh Executable file
View file

@ -0,0 +1,30 @@
#!/bin/sh
if [ -z "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set"
exit 1
fi
if [ -d "$MYSQLCLUSTER_TOP/ndb" ]; then :; else
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
NDB_CONNECTSTRING=
NDB_HOME=
NDB_DEMO=$MYSQLCLUSTER_TOP/ndb/demos/1-node-SS
NDB_PORT_BASE="101"
NDB_REP_ID="4"
NDB_EXTREP_ID="5"
NDB_DEMO_NAME="Demo 1-SS MySQL Cluster"
NDB_HOST1=$1
NDB_HOST2=$2
if [ -z "$NDB_HOST1" ]; then
NDB_HOST1=localhost
fi
if [ -z "$NDB_HOST2" ]; then
NDB_HOST2=localhost
fi
NDB_HOST=$NDB_HOST2
NDB_EXTHOST=$NDB_HOST1
source $MYSQLCLUSTER_TOP/ndb/demos/run_demo1-PS-SS_common.sh

41
ndb/demos/run_demo1.sh Executable file
View file

@ -0,0 +1,41 @@
#!/bin/sh
if [ -z "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set"
exit 1
fi
if [ -d "$MYSQLCLUSTER_TOP/ndb" ]; then :; else
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
NDB_CONNECTSTRING=
NDB_HOME=
ndb_demo=$MYSQLCLUSTER_TOP/ndb/demos
# Edit file system path
cd $ndb_demo/1-node/1-mgm-1
sed -e s,"WRITE_PATH_TO_FILESYSTEM_2_HERE",$ndb_demo/1-node/1-db-2/filesystem,g \
< template_config.ini > config.ini
# Start management server as deamon
cd $ndb_demo/1-node/1-mgm-1
if mgmtsrvr -d -c config.ini ; then :; else
echo "Unable to start mgmtsrvr"
exit 1
fi
# Start database node
cd $ndb_demo/1-node/1-db-2
xterm -T "Demo 1 NDB Cluster DB Node 2" -geometry 80x10 -xrm *.hold:true -e ndb -i &
# Start xterm for application programs
cd $ndb_demo/1-node/1-api-3
xterm -T "Demo 1 NDB Cluster API Node 3" -geometry 80x10 &
# Start management client
cd $ndb_demo
xterm -T "Demo 1 NDB Management Client" -geometry 80x10 -xrm *.hold:true -e mgmtclient localhost 10000 &

54
ndb/demos/run_demo2.sh Executable file
View file

@ -0,0 +1,54 @@
#!/bin/sh
if [ -z "$MYSQLCLUSTER_TOP" ]; then
echo "MYSQLCLUSTER_TOP not set"
exit 1
fi
if [ -d "$MYSQLCLUSTER_TOP/ndb" ]; then :; else
echo "$MYSQLCLUSTER_TOP/ndb directory does not exist"
exit 1
fi
NDB_CONNECTSTRING=
NDB_HOME=
ndb_demo=$MYSQLCLUSTER_TOP/ndb/demos
# Edit file system path
cd $ndb_demo/2-node/2-mgm-1
sed -e s,"WRITE_PATH_TO_FILESYSTEM_2_HERE",$ndb_demo/2-node/2-db-2/filesystem,g \
-e s,"WRITE_PATH_TO_FILESYSTEM_3_HERE",$ndb_demo/2-node/2-db-3/filesystem,g \
< template_config.ini > config.ini
# Start management server as deamon
cd $ndb_demo/2-node/2-mgm-1
if mgmtsrvr -d -c config.ini ; then :; else
echo "Unable to start mgmtsrvr"
exit 1
fi
#xterm -T "Demo 2 NDB Management Server" -geometry 80x10 -xrm *.hold:true -e mgmtsrvr -c config.ini &
# Start database node
cd $ndb_demo/2-node/2-db-2
xterm -T "Demo 2 NDB Cluster DB Node 2" -geometry 80x10 -xrm *.hold:true -e ndb -i &
# Start database node
cd $ndb_demo/2-node/2-db-3
xterm -T "Demo 2 NDB Cluster DB Node 3" -geometry 80x10 -xrm *.hold:true -e ndb -i &
# Start xterm for application programs
cd $ndb_demo/2-node/2-api-4
xterm -T "Demo 2 NDB Cluster API Node 4" -geometry 80x10 &
# Start xterm for application programs
cd $ndb_demo/2-node/2-api-5
xterm -T "Demo 2 NDB Cluster API Node 5" -geometry 80x10 &
# Start management client
cd $ndb_demo
xterm -T "Demo 2 NDB Management Client" -geometry 80x10 -xrm *.hold:true -e mgmtclient localhost 10000 &

97
ndb/docs/Makefile Normal file
View file

@ -0,0 +1,97 @@
include .defs.mk
#
# hack before full autoconf
replace-targets := all clean
first-docs: all
include $(NDB_TOP)/Epilogue.mk
all: ndbapidoc mgmapidoc
DOXYGEN = doxygen
DOXYTOP = $(shell cd $(NDB_TOP); pwd)/docs
DOXYDIR = $(DOXYTOP)/doxygen
DOXYTMP = $(DOXYTOP)/.doxytmp
DOXYOUT = $(DOXYTOP)/.doxyout
clean:
rm -rf ndbapi.pdf ndbapi.html mgmapi.pdf mgmapi.html
rm -rf $(DOXYTMP) $(DOXYOUT)
###
#
# NDB API Programmer's Guide
#
ndbapidoc: ndbapi.pdf
ndbapi.pdf: $(NDB_TOP)/include/ndb_version.h
@set -x; \
rm -rf ndbapi.pdf ndbapi.html; \
rm -rf $(DOXYTMP) $(DOXYOUT); \
mkdir -p $(DOXYTMP) $(DOXYOUT); \
(cd $(NDB_TOP)/include/ndbapi && \
find . -type f -print | \
grep -v /SCCS | \
cpio -pdm $(DOXYTMP)); \
(cd $(NDB_TOP)/examples && \
cp -p */*.[ch]pp $(DOXYTMP)); \
$(DOXYDIR)/predoxy.pl; \
mv footer.html $(DOXYTMP); \
(cd $(DOXYTMP) && \
$(DOXYGEN) $(DOXYDIR)/Doxyfile.ndbapi); \
$(DOXYDIR)/postdoxy.pl $(DOXYOUT)/ndbapi.latex "NDB API Programmer Guide"; \
(cd $(DOXYOUT) && \
find ndbapi.html -print | cpio -pdm $(DOXYTOP)); \
(cd $(DOXYOUT)/ndbapi.latex && \
pdflatex refman.tex && makeindex refman && pdflatex refman.tex && \
cp -p refman.pdf $(DOXYTOP)/ndbapi.pdf);
###
#
# MGM API Guide
#
mgmapidoc: mgmapi.pdf
mgmapi.pdf: $(NDB_TOP)/include/ndb_version.h
@set -x; \
rm -rf mgmapi.pdf mgmapi.html; \
rm -rf $(DOXYTMP) $(DOXYOUT); \
mkdir -p $(DOXYTMP) $(DOXYOUT); \
(cd $(NDB_TOP)/include/mgmapi && \
find . -type f -print | \
grep -v /SCCS | \
cpio -pdm $(DOXYTMP)); \
$(DOXYDIR)/predoxy.pl; \
mv footer.html $(DOXYTMP); \
(cd $(DOXYTMP) && \
$(DOXYGEN) $(DOXYDIR)/Doxyfile.mgmapi); \
$(DOXYDIR)/postdoxy.pl $(OUTDIR)/mgmapi.latex "NDB Cluster MGM API Guide"; \
(cd $(DOXYOUT) && \
find mgmapi.html -print | cpio -pdm $(DOXYTOP)); \
(cd $(DOXYOUT)/mgmapi.latex && \
pdflatex refman.tex && makeindex refman && pdflatex refman.tex && \
cp -p refman.pdf $(DOXYTOP)/mgmapi.pdf);
###
#
# Complete Source Browser except for
# ndbapi odbc test tools win32 lib examples docs CVS config bin
# include/ndbapi
# include/newtonapi src/newtonapi
# include/mgmapi src/mgmapi
# src/client
ndbdoc: DUMMY
mkdir -p $(OUTDIR)
cd $(NDB_TOP) ; $(DOXYGEN) $(DOXYDIR)/Doxyfile.ndb
###
#
# odbcdoc - Complete Source Browser for NDB ODBC (src/client/odbc)
odbcdoc: DUMMY
mkdir -p $(OUTDIR)
cd $(NDB_TOP) ; $(DOXYGEN) $(DOXYDIR)/Doxyfile.odbc
testdoc: DUMMY
mkdir -p $(OUTDIR)
cd $(NDB_TOP) ; $(DOXYGEN) $(DOXYDIR)/Doxyfile.test

30
ndb/docs/README Normal file
View file

@ -0,0 +1,30 @@
Create MySQL Cluster user documentation from source code
--------------------------------------------------------
(All these require Doxygen.)
* make clean
Remove all generated documentation and tmp files
* make ndbapidoc
Makes the NDB API Programmer's Guide (in HTML)
* make ndbapipdf
Makes the NDB API Programmer Guide (in PDF)
* make mgmapidoc
Makes the MGM API Reference Manual (in HTML)
* make mgmapipdf
Makes the MGM API Reference Manual (in PDF)
* make ndbdoc
Makes source code browser for NDB Cluster (in HTML)
(Requires Graphviz.)
Doxygen and Graphviz can be found at:
http://www.doxygen.org
or at (for Red Hat 9.0 RPMs):
http://dentrassi.de/download/doxygen/
--
lars@mysql.com

View file

@ -0,0 +1,877 @@
# Doxyfile 1.2.12
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#---------------------------------------------------------------------------
# General configuration options
#---------------------------------------------------------------------------
DETAILS_AT_TOP = yes
HIDE_FRIEND_COMPOUNDS = yes
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME =
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY =
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
# German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
OUTPUT_LANGUAGE = English
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = NO
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = NO
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = NO
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members of documented classes, files or namespaces.
# If set to NO (the default) these members will be included in the
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
# If set to NO (the default) these class will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
# include brief member descriptions after the members that are listed in
# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
# the brief description of a member or function before the detailed description.
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = NO
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. It is allowed to use relative paths in the argument list.
STRIP_FROM_PATH =
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = NO
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
# file names in lower case letters. If set to YES upper case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# users are adviced to set this option to NO.
CASE_SENSE_NAMES = YES
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
# will put list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explict @brief command for a brief description.
JAVADOC_AUTOBRIEF = NO
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it
# reimplements.
INHERIT_DOCS = YES
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
# will sort the (detailed) documentation of file and class members
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
# The GENERATE_TODOLIST tag can be used to enable (YES) or
# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or
# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or
# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
# This tag can be used to specify a number of aliases that acts
# as commands in the documentation. An alias has the form "name=value".
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
# put the command \sideeffect (or @sideeffect) in the documentation, which
# will result in a user defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
ALIASES =
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
# the initial value of a variable or define consist of for it to appear in
# the documentation. If the initializer consists of more lines than specified
# here it will be hidden. Use a value of 0 to hide initializers completely.
# The appearance of the initializer of individual variables and defines in the
# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C.
# For instance some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = YES
# The WARN_FORMAT tag determines the format of the warning messages that
# doxygen can produce. The string should contain the $file, $line, and $text
# tags, which will be replaced by the file and line number from which the
# warning originated and the warning text.
WARN_FORMAT =
# The WARN_LOGFILE tag can be used to specify a file to which warning
# and error messages should be written. If left blank the output is written
# to stderr.
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = .
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank file matching one of the following patterns are included:
# *.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
# *.h++ *.idl
FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = NO
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE =
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
EXCLUDE_PATTERNS =
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH = .
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude
# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or
# directories that contain image that are included in the documentation (see
# the \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command <filter> <input-file>, where <filter>
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse.
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
SOURCE_BROWSER = NO
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = NO
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = YES
# If the REFERENCES_RELATION tag is set to YES (the default)
# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = NO
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = ../.doxyout/mgmapi.html
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER = footer.html
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the Html help documentation and to the tree view.
TOC_EXPAND = NO
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
# generated containing a tree-like index structure (just like the one that
# is generated for HTML Help). For this to work a browser that supports
# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
# or Internet explorer 4.0+). Note that for large projects the tree generation
# can take a very long time. In such cases it is better to disable this feature.
# Windows users are probably better off using the HTML help feature.
GENERATE_TREEVIEW = NO
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
GENERATE_LATEX = YES
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = ../.doxyout/mgmapi.latex
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE =
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER = ../doxygen/header.mgmapi.tex
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = YES
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
# The RTF output is optimised for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = ../mgmapi.rtf
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
# will contain hyperlink fields. The RTF file will
# contain links (just like the HTML output) instead of page references.
# This makes the output suitable for online browsing using WORD or other
# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's
# config file, i.e. a series of assigments. You only have to provide
# replacements, missing definitions are set to their default value.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT =
# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION =
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
# then it will generate one additional man file for each entity
# documented in the real man page(s). These additional files
# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES Doxygen will
# generate an XML file that captures the structure of
# the code including all documentation. Note that this
# feature is still experimental and incomplete at the
# moment.
GENERATE_XML = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = YES
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
EXPAND_ONLY_PREDEF = YES
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by
# the preprocessor.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED = DOXYGEN_SHOULD_SKIP_DEPRECATED \
DOXYGEN_SHOULD_SKIP_INTERNAL \
protected=private
# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
# doxygen's preprocessor will remove all function-like macros that are alone
# on a line and do not end with a semicolon. Such function macros are typically
# used for boiler-plate code, and will confuse the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to external references
#---------------------------------------------------------------------------
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH =
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
# super classes. Setting the tag to NO turns the diagrams off. Note that this
# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
# recommended to install and use dot, since it yield more powerful graphs.
CLASS_DIAGRAMS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = NO
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = YES
# If set to YES, the inheritance and collaboration graphs will hide
# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
# tags are set to YES then doxygen will generate a graph for each documented
# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found on the path.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS =
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_WIDTH = 1024
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_HEIGHT = 1024
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
# remove the intermedate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to the search engine
#---------------------------------------------------------------------------
# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = NO
# The CGI_NAME tag should be the name of the CGI script that
# starts the search engine (doxysearch) with the correct parameters.
# A script with this name will be generated by doxygen.
CGI_NAME =
# The CGI_URL tag should be the absolute URL to the directory where the
# cgi binaries are located. See the documentation of your http daemon for
# details.
CGI_URL =
# The DOC_URL tag should be the absolute URL to the directory where the
# documentation is located. If left blank the absolute path to the
# documentation, with file:// prepended to it, will be used.
DOC_URL =
# The DOC_ABSPATH tag should be the absolute path to the directory where the
# documentation is located. If left blank the directory on the local machine
# will be used.
DOC_ABSPATH =
# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
# is installed.
BIN_ABSPATH =
# The EXT_DOC_PATHS tag can be used to specify one or more paths to
# documentation generated for other projects. This allows doxysearch to search
# the documentation for these projects as well.
EXT_DOC_PATHS =

View file

@ -0,0 +1,937 @@
# Doxyfile 1.2.14
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#---------------------------------------------------------------------------
# General configuration options
#---------------------------------------------------------------------------
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = "NDB Cluster"
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY =
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
OUTPUT_LANGUAGE = English
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = YES
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = YES
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
EXTRACT_LOCAL_CLASSES = YES
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members of documented classes, files or namespaces.
# If set to NO (the default) these members will be included in the
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
# If set to NO (the default) these class will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
# include brief member descriptions after the members that are listed in
# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
# the brief description of a member or function before the detailed description.
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
# members of a class in the documentation of that class as if those members were
# ordinary class members. Constructors, destructors and assignment operators of
# the base classes will not be shown.
INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = YES
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. It is allowed to use relative paths in the argument list.
STRIP_FROM_PATH = .
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = YES
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
# file names in lower case letters. If set to YES upper case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# users are adviced to set this option to NO.
CASE_SENSE_NAMES = YES
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
# will put list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explict @brief command for a brief description.
JAVADOC_AUTOBRIEF = NO
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it
# reimplements.
INHERIT_DOCS = YES
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
# will sort the (detailed) documentation of file and class members
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
# The GENERATE_TODOLIST tag can be used to enable (YES) or
# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or
# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or
# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
# This tag can be used to specify a number of aliases that acts
# as commands in the documentation. An alias has the form "name=value".
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
# put the command \sideeffect (or @sideeffect) in the documentation, which
# will result in a user defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
ALIASES =
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
# the initial value of a variable or define consist of for it to appear in
# the documentation. If the initializer consists of more lines than specified
# here it will be hidden. Use a value of 0 to hide initializers completely.
# The appearance of the initializer of individual variables and defines in the
# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C.
# For instance some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = YES
# The WARN_FORMAT tag determines the format of the warning messages that
# doxygen can produce. The string should contain the $file, $line, and $text
# tags, which will be replaced by the file and line number from which the
# warning originated and the warning text.
WARN_FORMAT = "$file:$line: $text"
# The WARN_LOGFILE tag can be used to specify a file to which warning
# and error messages should be written. If left blank the output is written
# to stderr.
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT =
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank the following patterns are tested:
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
# *.h++ *.idl *.odl
FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = YES
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE = test \
tools \
win32 \
lib \
examples \
docs \
CVS \
SCCS \
config \
bin \
include/ndbapi \
include/newtonapi \
src/newtonapi \
include/mgmapi \
src/mgmapi \
src/client
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
# that are symbolic links (a Unix filesystem feature) are excluded from the input.
EXCLUDE_SYMLINKS = NO
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
EXCLUDE_PATTERNS = *CVS* \
*SCCS*
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH =
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude
# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or
# directories that contain image that are included in the documentation (see
# the \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command <filter> <input-file>, where <filter>
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse.
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = YES
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = YES
# If the REFERENCES_RELATION tag is set to YES (the default)
# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = YES
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = ndb.html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
# doxygen will generate files with .html extension.
HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the Html help documentation and to the tree view.
TOC_EXPAND = NO
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
# generated containing a tree-like index structure (just like the one that
# is generated for HTML Help). For this to work a browser that supports
# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
# or Internet explorer 4.0+). Note that for large projects the tree generation
# can take a very long time. In such cases it is better to disable this feature.
# Windows users are probably better off using the HTML help feature.
GENERATE_TREEVIEW = NO
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = ndb.latex
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE = a4wide
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = NO
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = NO
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
# The RTF output is optimised for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
# will contain hyperlink fields. The RTF file will
# contain links (just like the HTML output) instead of page references.
# This makes the output suitable for online browsing using WORD or other
# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's
# config file, i.e. a series of assigments. You only have to provide
# replacements, missing definitions are set to their default value.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT = man
# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION = .3
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
# then it will generate one additional man file for each entity
# documented in the real man page(s). These additional files
# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES Doxygen will
# generate an XML file that captures the structure of
# the code including all documentation. Note that this
# feature is still experimental and incomplete at the
# moment.
GENERATE_XML = NO
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
# generate an AutoGen Definitions (see autogen.sf.net) file
# that captures the structure of the code including all
# documentation. Note that this feature is still experimental
# and incomplete at the moment.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = NO
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by
# the preprocessor.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
# doxygen's preprocessor will remove all function-like macros that are alone
# on a line and do not end with a semicolon. Such function macros are typically
# used for boiler-plate code, and will confuse the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to external references
#---------------------------------------------------------------------------
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
# in the modules index. If set to NO, only the current project's groups will
# be listed.
EXTERNAL_GROUPS = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
# super classes. Setting the tag to NO turns the diagrams off. Note that this
# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
# recommended to install and use dot, since it yield more powerful graphs.
CLASS_DIAGRAMS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = YES
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = YES
# If set to YES, the inheritance and collaboration graphs will hide
# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = NO
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
# tags are set to YES then doxygen will generate a graph for each documented
# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. Possible values are gif, jpg, and png
# If left blank gif will be used.
DOT_IMAGE_FORMAT = gif
# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found on the path.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS =
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_WIDTH = 1024
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_HEIGHT = 1024
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
# remove the intermedate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to the search engine
#---------------------------------------------------------------------------
# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = NO
# The CGI_NAME tag should be the name of the CGI script that
# starts the search engine (doxysearch) with the correct parameters.
# A script with this name will be generated by doxygen.
CGI_NAME = search.cgi
# The CGI_URL tag should be the absolute URL to the directory where the
# cgi binaries are located. See the documentation of your http daemon for
# details.
CGI_URL =
# The DOC_URL tag should be the absolute URL to the directory where the
# documentation is located. If left blank the absolute path to the
# documentation, with file:// prepended to it, will be used.
DOC_URL =
# The DOC_ABSPATH tag should be the absolute path to the directory where the
# documentation is located. If left blank the directory on the local machine
# will be used.
DOC_ABSPATH =
# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
# is installed.
BIN_ABSPATH = /usr/local/bin
# The EXT_DOC_PATHS tag can be used to specify one or more paths to
# documentation generated for other projects. This allows doxysearch to search
# the documentation for these projects as well.
EXT_DOC_PATHS =

View file

@ -0,0 +1,877 @@
# Doxyfile 1.2.12
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#---------------------------------------------------------------------------
# General configuration options
#---------------------------------------------------------------------------
DETAILS_AT_TOP = yes
HIDE_FRIEND_COMPOUNDS = yes
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME =
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY =
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
# German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
OUTPUT_LANGUAGE = English
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = NO
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = NO
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = NO
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members of documented classes, files or namespaces.
# If set to NO (the default) these members will be included in the
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
# If set to NO (the default) these class will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
# include brief member descriptions after the members that are listed in
# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
# the brief description of a member or function before the detailed description.
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = NO
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. It is allowed to use relative paths in the argument list.
STRIP_FROM_PATH =
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = NO
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
# file names in lower case letters. If set to YES upper case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# users are adviced to set this option to NO.
CASE_SENSE_NAMES = YES
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
# will put list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explict @brief command for a brief description.
JAVADOC_AUTOBRIEF = NO
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it
# reimplements.
INHERIT_DOCS = YES
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
# will sort the (detailed) documentation of file and class members
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
# The GENERATE_TODOLIST tag can be used to enable (YES) or
# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or
# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or
# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
# This tag can be used to specify a number of aliases that acts
# as commands in the documentation. An alias has the form "name=value".
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
# put the command \sideeffect (or @sideeffect) in the documentation, which
# will result in a user defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
ALIASES =
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
# the initial value of a variable or define consist of for it to appear in
# the documentation. If the initializer consists of more lines than specified
# here it will be hidden. Use a value of 0 to hide initializers completely.
# The appearance of the initializer of individual variables and defines in the
# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C.
# For instance some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = YES
# The WARN_FORMAT tag determines the format of the warning messages that
# doxygen can produce. The string should contain the $file, $line, and $text
# tags, which will be replaced by the file and line number from which the
# warning originated and the warning text.
WARN_FORMAT =
# The WARN_LOGFILE tag can be used to specify a file to which warning
# and error messages should be written. If left blank the output is written
# to stderr.
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = .
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank file matching one of the following patterns are included:
# *.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
# *.h++ *.idl
FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = NO
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE =
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
EXCLUDE_PATTERNS =
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH = .
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude
# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or
# directories that contain image that are included in the documentation (see
# the \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command <filter> <input-file>, where <filter>
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse.
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
SOURCE_BROWSER = NO
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = NO
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = YES
# If the REFERENCES_RELATION tag is set to YES (the default)
# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = NO
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = ../.doxyout/ndbapi.html
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER = footer.html
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the Html help documentation and to the tree view.
TOC_EXPAND = NO
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
# generated containing a tree-like index structure (just like the one that
# is generated for HTML Help). For this to work a browser that supports
# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
# or Internet explorer 4.0+). Note that for large projects the tree generation
# can take a very long time. In such cases it is better to disable this feature.
# Windows users are probably better off using the HTML help feature.
GENERATE_TREEVIEW = NO
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
GENERATE_LATEX = YES
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = ../.doxyout/ndbapi.latex
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE =
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER = ../doxygen/header.ndbapi.tex
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = YES
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
# The RTF output is optimised for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = ../ndbapi.rtf
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
# will contain hyperlink fields. The RTF file will
# contain links (just like the HTML output) instead of page references.
# This makes the output suitable for online browsing using WORD or other
# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's
# config file, i.e. a series of assigments. You only have to provide
# replacements, missing definitions are set to their default value.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT =
# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION =
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
# then it will generate one additional man file for each entity
# documented in the real man page(s). These additional files
# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES Doxygen will
# generate an XML file that captures the structure of
# the code including all documentation. Note that this
# feature is still experimental and incomplete at the
# moment.
GENERATE_XML = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = YES
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
EXPAND_ONLY_PREDEF = YES
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by
# the preprocessor.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED = DOXYGEN_SHOULD_SKIP_DEPRECATED \
DOXYGEN_SHOULD_SKIP_INTERNAL \
protected=private
# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
# doxygen's preprocessor will remove all function-like macros that are alone
# on a line and do not end with a semicolon. Such function macros are typically
# used for boiler-plate code, and will confuse the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to external references
#---------------------------------------------------------------------------
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH =
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
# super classes. Setting the tag to NO turns the diagrams off. Note that this
# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
# recommended to install and use dot, since it yield more powerful graphs.
CLASS_DIAGRAMS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = NO
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = YES
# If set to YES, the inheritance and collaboration graphs will hide
# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
# tags are set to YES then doxygen will generate a graph for each documented
# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found on the path.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS =
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_WIDTH = 1024
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_HEIGHT = 1024
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
# remove the intermedate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to the search engine
#---------------------------------------------------------------------------
# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = NO
# The CGI_NAME tag should be the name of the CGI script that
# starts the search engine (doxysearch) with the correct parameters.
# A script with this name will be generated by doxygen.
CGI_NAME =
# The CGI_URL tag should be the absolute URL to the directory where the
# cgi binaries are located. See the documentation of your http daemon for
# details.
CGI_URL =
# The DOC_URL tag should be the absolute URL to the directory where the
# documentation is located. If left blank the absolute path to the
# documentation, with file:// prepended to it, will be used.
DOC_URL =
# The DOC_ABSPATH tag should be the absolute path to the directory where the
# documentation is located. If left blank the directory on the local machine
# will be used.
DOC_ABSPATH =
# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
# is installed.
BIN_ABSPATH =
# The EXT_DOC_PATHS tag can be used to specify one or more paths to
# documentation generated for other projects. This allows doxysearch to search
# the documentation for these projects as well.
EXT_DOC_PATHS =

View file

@ -0,0 +1,921 @@
# Doxyfile 1.2.14
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#---------------------------------------------------------------------------
# General configuration options
#---------------------------------------------------------------------------
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = "NDB ODBC"
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY =
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
OUTPUT_LANGUAGE = English
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = YES
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = YES
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
EXTRACT_LOCAL_CLASSES = YES
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members of documented classes, files or namespaces.
# If set to NO (the default) these members will be included in the
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
# If set to NO (the default) these class will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
# include brief member descriptions after the members that are listed in
# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
# the brief description of a member or function before the detailed description.
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
# members of a class in the documentation of that class as if those members were
# ordinary class members. Constructors, destructors and assignment operators of
# the base classes will not be shown.
INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = YES
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. It is allowed to use relative paths in the argument list.
STRIP_FROM_PATH = .
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = YES
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
# file names in lower case letters. If set to YES upper case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# users are adviced to set this option to NO.
CASE_SENSE_NAMES = YES
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
# will put list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explict @brief command for a brief description.
JAVADOC_AUTOBRIEF = NO
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it
# reimplements.
INHERIT_DOCS = YES
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
# will sort the (detailed) documentation of file and class members
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
# The GENERATE_TODOLIST tag can be used to enable (YES) or
# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or
# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or
# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
# This tag can be used to specify a number of aliases that acts
# as commands in the documentation. An alias has the form "name=value".
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
# put the command \sideeffect (or @sideeffect) in the documentation, which
# will result in a user defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
ALIASES =
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
# the initial value of a variable or define consist of for it to appear in
# the documentation. If the initializer consists of more lines than specified
# here it will be hidden. Use a value of 0 to hide initializers completely.
# The appearance of the initializer of individual variables and defines in the
# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C.
# For instance some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = YES
# The WARN_FORMAT tag determines the format of the warning messages that
# doxygen can produce. The string should contain the $file, $line, and $text
# tags, which will be replaced by the file and line number from which the
# warning originated and the warning text.
WARN_FORMAT = "$file:$line: $text"
# The WARN_LOGFILE tag can be used to specify a file to which warning
# and error messages should be written. If left blank the output is written
# to stderr.
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = src/client/odbc
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank the following patterns are tested:
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
# *.h++ *.idl *.odl
FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = YES
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
# that are symbolic links (a Unix filesystem feature) are excluded from the input.
EXCLUDE_SYMLINKS = NO
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
EXCLUDE_PATTERNS =
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH =
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude
# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or
# directories that contain image that are included in the documentation (see
# the \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command <filter> <input-file>, where <filter>
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse.
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = YES
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = YES
# If the REFERENCES_RELATION tag is set to YES (the default)
# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = YES
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = ../.doxyout/odbc.html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
# doxygen will generate files with .html extension.
HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the Html help documentation and to the tree view.
TOC_EXPAND = NO
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
# generated containing a tree-like index structure (just like the one that
# is generated for HTML Help). For this to work a browser that supports
# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
# or Internet explorer 4.0+). Note that for large projects the tree generation
# can take a very long time. In such cases it is better to disable this feature.
# Windows users are probably better off using the HTML help feature.
GENERATE_TREEVIEW = NO
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = ../.doxyout/odbc.latex
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE = a4wide
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = NO
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = NO
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
# The RTF output is optimised for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
# will contain hyperlink fields. The RTF file will
# contain links (just like the HTML output) instead of page references.
# This makes the output suitable for online browsing using WORD or other
# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's
# config file, i.e. a series of assigments. You only have to provide
# replacements, missing definitions are set to their default value.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT = man
# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION = .3
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
# then it will generate one additional man file for each entity
# documented in the real man page(s). These additional files
# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES Doxygen will
# generate an XML file that captures the structure of
# the code including all documentation. Note that this
# feature is still experimental and incomplete at the
# moment.
GENERATE_XML = NO
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
# generate an AutoGen Definitions (see autogen.sf.net) file
# that captures the structure of the code including all
# documentation. Note that this feature is still experimental
# and incomplete at the moment.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = NO
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by
# the preprocessor.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
# doxygen's preprocessor will remove all function-like macros that are alone
# on a line and do not end with a semicolon. Such function macros are typically
# used for boiler-plate code, and will confuse the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to external references
#---------------------------------------------------------------------------
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
# in the modules index. If set to NO, only the current project's groups will
# be listed.
EXTERNAL_GROUPS = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
# super classes. Setting the tag to NO turns the diagrams off. Note that this
# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
# recommended to install and use dot, since it yield more powerful graphs.
CLASS_DIAGRAMS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = YES
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = YES
# If set to YES, the inheritance and collaboration graphs will hide
# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = NO
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
# tags are set to YES then doxygen will generate a graph for each documented
# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. Possible values are gif, jpg, and png
# If left blank gif will be used.
DOT_IMAGE_FORMAT = gif
# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found on the path.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS =
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_WIDTH = 1024
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_HEIGHT = 1024
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
# remove the intermedate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to the search engine
#---------------------------------------------------------------------------
# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = YES
# The CGI_NAME tag should be the name of the CGI script that
# starts the search engine (doxysearch) with the correct parameters.
# A script with this name will be generated by doxygen.
CGI_NAME = search.cgi
# The CGI_URL tag should be the absolute URL to the directory where the
# cgi binaries are located. See the documentation of your http daemon for
# details.
CGI_URL =
# The DOC_URL tag should be the absolute URL to the directory where the
# documentation is located. If left blank the absolute path to the
# documentation, with file:// prepended to it, will be used.
DOC_URL =
# The DOC_ABSPATH tag should be the absolute path to the directory where the
# documentation is located. If left blank the directory on the local machine
# will be used.
DOC_ABSPATH =
# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
# is installed.
BIN_ABSPATH = /usr/local/bin/
# The EXT_DOC_PATHS tag can be used to specify one or more paths to
# documentation generated for other projects. This allows doxysearch to search
# the documentation for these projects as well.
EXT_DOC_PATHS =

View file

@ -0,0 +1,921 @@
# Doxyfile 1.2.14
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#---------------------------------------------------------------------------
# General configuration options
#---------------------------------------------------------------------------
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = "NDB Cluster Test Programs"
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY =
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
OUTPUT_LANGUAGE = English
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = YES
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = YES
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
EXTRACT_LOCAL_CLASSES = YES
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members of documented classes, files or namespaces.
# If set to NO (the default) these members will be included in the
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
# If set to NO (the default) these class will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
# include brief member descriptions after the members that are listed in
# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
# the brief description of a member or function before the detailed description.
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
# members of a class in the documentation of that class as if those members were
# ordinary class members. Constructors, destructors and assignment operators of
# the base classes will not be shown.
INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = YES
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. It is allowed to use relative paths in the argument list.
STRIP_FROM_PATH = .
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = YES
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
# file names in lower case letters. If set to YES upper case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# users are adviced to set this option to NO.
CASE_SENSE_NAMES = YES
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
# will put list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explict @brief command for a brief description.
JAVADOC_AUTOBRIEF = NO
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it
# reimplements.
INHERIT_DOCS = YES
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
# will sort the (detailed) documentation of file and class members
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
# The GENERATE_TODOLIST tag can be used to enable (YES) or
# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or
# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or
# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
# This tag can be used to specify a number of aliases that acts
# as commands in the documentation. An alias has the form "name=value".
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
# put the command \sideeffect (or @sideeffect) in the documentation, which
# will result in a user defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
ALIASES =
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
# the initial value of a variable or define consist of for it to appear in
# the documentation. If the initializer consists of more lines than specified
# here it will be hidden. Use a value of 0 to hide initializers completely.
# The appearance of the initializer of individual variables and defines in the
# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C.
# For instance some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = YES
# The WARN_FORMAT tag determines the format of the warning messages that
# doxygen can produce. The string should contain the $file, $line, and $text
# tags, which will be replaced by the file and line number from which the
# warning originated and the warning text.
WARN_FORMAT = "$file:$line: $text"
# The WARN_LOGFILE tag can be used to specify a file to which warning
# and error messages should be written. If left blank the output is written
# to stderr.
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = test
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank the following patterns are tested:
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
# *.h++ *.idl *.odl
FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = YES
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
# that are symbolic links (a Unix filesystem feature) are excluded from the input.
EXCLUDE_SYMLINKS = NO
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
EXCLUDE_PATTERNS =
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH =
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude
# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or
# directories that contain image that are included in the documentation (see
# the \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command <filter> <input-file>, where <filter>
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse.
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = YES
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = YES
# If the REFERENCES_RELATION tag is set to YES (the default)
# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = YES
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
# doxygen will generate files with .html extension.
HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the Html help documentation and to the tree view.
TOC_EXPAND = NO
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
# generated containing a tree-like index structure (just like the one that
# is generated for HTML Help). For this to work a browser that supports
# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
# or Internet explorer 4.0+). Note that for large projects the tree generation
# can take a very long time. In such cases it is better to disable this feature.
# Windows users are probably better off using the HTML help feature.
GENERATE_TREEVIEW = NO
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = latex
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE = a4wide
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = NO
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = NO
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
# The RTF output is optimised for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
# will contain hyperlink fields. The RTF file will
# contain links (just like the HTML output) instead of page references.
# This makes the output suitable for online browsing using WORD or other
# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's
# config file, i.e. a series of assigments. You only have to provide
# replacements, missing definitions are set to their default value.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT = man
# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION = .3
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
# then it will generate one additional man file for each entity
# documented in the real man page(s). These additional files
# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES Doxygen will
# generate an XML file that captures the structure of
# the code including all documentation. Note that this
# feature is still experimental and incomplete at the
# moment.
GENERATE_XML = NO
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
# generate an AutoGen Definitions (see autogen.sf.net) file
# that captures the structure of the code including all
# documentation. Note that this feature is still experimental
# and incomplete at the moment.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = NO
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by
# the preprocessor.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
# doxygen's preprocessor will remove all function-like macros that are alone
# on a line and do not end with a semicolon. Such function macros are typically
# used for boiler-plate code, and will confuse the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to external references
#---------------------------------------------------------------------------
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
# in the modules index. If set to NO, only the current project's groups will
# be listed.
EXTERNAL_GROUPS = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
# super classes. Setting the tag to NO turns the diagrams off. Note that this
# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
# recommended to install and use dot, since it yield more powerful graphs.
CLASS_DIAGRAMS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = YES
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = YES
# If set to YES, the inheritance and collaboration graphs will hide
# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = NO
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
# tags are set to YES then doxygen will generate a graph for each documented
# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. Possible values are gif, jpg, and png
# If left blank gif will be used.
DOT_IMAGE_FORMAT = gif
# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found on the path.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS =
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_WIDTH = 1024
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_HEIGHT = 1024
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
# remove the intermedate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to the search engine
#---------------------------------------------------------------------------
# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = NO
# The CGI_NAME tag should be the name of the CGI script that
# starts the search engine (doxysearch) with the correct parameters.
# A script with this name will be generated by doxygen.
CGI_NAME = search.cgi
# The CGI_URL tag should be the absolute URL to the directory where the
# cgi binaries are located. See the documentation of your http daemon for
# details.
CGI_URL =
# The DOC_URL tag should be the absolute URL to the directory where the
# documentation is located. If left blank the absolute path to the
# documentation, with file:// prepended to it, will be used.
DOC_URL =
# The DOC_ABSPATH tag should be the absolute path to the directory where the
# documentation is located. If left blank the directory on the local machine
# will be used.
DOC_ABSPATH =
# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
# is installed.
BIN_ABSPATH = /usr/local/bin
# The EXT_DOC_PATHS tag can be used to specify one or more paths to
# documentation generated for other projects. This allows doxysearch to search
# the documentation for these projects as well.
EXT_DOC_PATHS =

View file

@ -0,0 +1,44 @@
\documentclass[a4paper]{book}
\usepackage{a4wide}
\usepackage{makeidx}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{float}
\usepackage{textcomp}
\usepackage{alltt}
\usepackage{times}
\ifx\pdfoutput\undefined
\usepackage[ps2pdf,
pagebackref=true,
colorlinks=true,
linkcolor=blue
]{hyperref}
\usepackage{pspicture}
\else
\usepackage[pdftex,
pagebackref=true,
colorlinks=true,
linkcolor=blue
]{hyperref}
\fi
\usepackage{doxygen}
\makeindex
\setcounter{tocdepth}{1}
\renewcommand{\footrulewidth}{0.4pt}
\begin{document}
\begin{titlepage}
\vspace*{7cm}
\begin{center}
{\Huge NDB Cluster MGM API Guide \mbox{}\vspace{-3cm}\mbox{}\hrule\bigskip\bigskip\bigskip\bigskip\mbox{}\Huge{}}\\\vspace*{1cm}
\begin{center}\LARGE{MySQL AB}\end{center}\hfill\bigskip\bigskip\bigskip\hrule\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip NDB Cluster Release RELEASE
\bigskip\bigskip\bigskip\bigskip\bigskip\hfill\vspace*{0.5cm}
{\small DATE}\\
\end{center}
\end{titlepage}
\clearemptydoublepage
\pagenumbering{roman}
\tableofcontents
\clearemptydoublepage
\pagenumbering{arabic}

View file

@ -0,0 +1,44 @@
\documentclass[a4paper]{book}
\usepackage{a4wide}
\usepackage{makeidx}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{float}
\usepackage{textcomp}
\usepackage{alltt}
\usepackage{times}
\ifx\pdfoutput\undefined
\usepackage[ps2pdf,
pagebackref=true,
colorlinks=true,
linkcolor=blue
]{hyperref}
\usepackage{pspicture}
\else
\usepackage[pdftex,
pagebackref=true,
colorlinks=true,
linkcolor=blue
]{hyperref}
\fi
\usepackage{doxygen}
\makeindex
\setcounter{tocdepth}{1}
\renewcommand{\footrulewidth}{0.4pt}
\begin{document}
\begin{titlepage}
\vspace*{7cm}
\begin{center}
{\Huge NDB API Programmer's Guide \mbox{}\vspace{-3cm}\mbox{}\hrule\bigskip\bigskip\bigskip\bigskip\mbox{}\Huge{}}\\\vspace*{1cm}
\begin{center}\LARGE{MySQL AB}\end{center}\hfill\bigskip\bigskip\bigskip\hrule\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip\bigskip NDB Cluster Release RELEASE
\bigskip\bigskip\bigskip\bigskip\bigskip\hfill\vspace*{0.5cm}
{\small DATE}\\
\end{center}
\end{titlepage}
\clearemptydoublepage
\pagenumbering{roman}
\tableofcontents
\clearemptydoublepage
\pagenumbering{arabic}

97
ndb/docs/doxygen/postdoxy.pl Executable file
View file

@ -0,0 +1,97 @@
#!/usr/local/bin/perl
#
# Written by Lars Thalmann, lars@mysql.com, 2003.
#
use strict;
umask 000;
# -----------------------------------------------------------------------------
# Settings
# -----------------------------------------------------------------------------
$ENV{LD_LIBRARY_PATH} = "/usr/local/lib:/opt/as/local/lib";
$ENV{LD_LIBRARY_PATH} = $ENV{LD_LIBRARY_PATH} . ":/opt/as/forte6/SUNWspro/lib";
$ENV{PATH} = $ENV{PATH} . ":/usr/local/bin:/opt/as/local/bin";
$ENV{PATH} = $ENV{PATH} . ":/opt/as/local/teTeX/bin/sparc-sun-solaris2.8";
my $destdir = @ARGV[0];
my $title = ""; # $ARGV[1];
my $release;
if (defined $ENV{'NDB_RELEASE'}) {
$release = $ENV{'NDB_RELEASE'};
print "----------------------------------------------------------------\n";
print "Relase = " . $release . "\n";
print "----------------------------------------------------------------\n";
} else {
print "----------------------------------------------------------------\n";
print "NDB Documentation is being modified to statndard format\n";
print "(If you want this automatic, use env variable NDB_RELEASE.)\n";
print "Enter release (Examples: \"1.43.0 (alpha)\" or \"2.1.0 (gamma)\"): ";
$release = <stdin>;
print "----------------------------------------------------------------\n";
}
# -----------------------------------------------------------------------------
# Change a little in refman.tex
# -----------------------------------------------------------------------------
open (INFILE, "< ${destdir}/refman.tex")
or die "Error opening ${destdir}/refman.tex.\n";
open (OUTFILE, "> ${destdir}/refman.tex.new")
or die "Error opening ${destdir}/refman.tex.new.\n";
while (<INFILE>)
{
if (/(.*)(RELEASE)(.*)$/) {
print OUTFILE $1 . $release . $3;
} elsif (/(.*)(DATE)(.*)$/) {
print OUTFILE $1 . localtime() . $3;
} elsif (/\\chapter\{File Index\}/) {
# Erase
} elsif (/\\input\{files\}/) {
# Erase
} elsif (/\\chapter\{Hierarchical Index\}/) {
# Erase
} elsif (/\\input\{hierarchy\}/) {
# Erase
} elsif (/\\chapter\{Page Index\}/) {
# Erase
} elsif (/\\input\{pages\}/) {
# Erase
} else {
print OUTFILE;
}
}
close INFILE;
close OUTFILE;
system("mv ${destdir}/refman.tex.new ${destdir}/refman.tex");
# -----------------------------------------------------------------------------
# Change a little in doxygen.sty
# -----------------------------------------------------------------------------
open (INFILE, "< ${destdir}/doxygen.sty")
or die "Error opening INFILE.\n";
open (OUTFILE, "> ${destdir}/doxygen.sty.new")
or die "Error opening OUTFILE.\n";
while (<INFILE>)
{
if (/\\rfoot/) {
print OUTFILE "\\rfoot[\\fancyplain{}{\\bfseries\\small \\copyright~Copyright 2003-2004 MySQL AB\\hfill support-cluster\@mysql.com}]{}\n";
} elsif (/\\lfoot/) {
print OUTFILE "\\lfoot[]{\\fancyplain{}{\\bfseries\\small support-cluster\@mysql.com\\hfill \\copyright~Copyright 2003-2004 MySQL AB}}\n";
} else {
print OUTFILE;
}
}
close INFILE;
close OUTFILE;
system("mv ${destdir}/doxygen.sty.new ${destdir}/doxygen.sty");

34
ndb/docs/doxygen/predoxy.pl Executable file
View file

@ -0,0 +1,34 @@
#!/usr/local/bin/perl
#
# Written by Lars Thalmann, lars@mysql.com, 2003.
#
use strict;
umask 000;
# -----------------------------------------------------------------------------
# Fix HTML Footer
# -----------------------------------------------------------------------------
open (OUTFILE, "> footer.html");
print OUTFILE<<EOT;
<hr>
<address>
<small>
<center>
EOT
print OUTFILE "Documentation generated " . localtime() .
" from NDB Cluster source files.";
print OUTFILE<<EOT;
<br>
&copy; 2003-2004
<a href="http://www.mysql.com">MySQL AB</a>
<br>
</center>
</small></address>
</body>
</html>
EOT
print "Preformat finished\n\n";

8
ndb/env.sh Normal file
View file

@ -0,0 +1,8 @@
#
NDB_TOP=`pwd`
export NDB_TOP
NDB_PROJ_HOME=$NDB_TOP/home
export NDB_PROJ_HOME

26
ndb/examples/Makefile Normal file
View file

@ -0,0 +1,26 @@
-include .defs.mk
#ifneq ($(C++),)
#OPTS = CC=$(CC) CXX=$(C++)
#endif
# XXX ndbapi_example4 commented out until fixed
BIN_DIRS := ndbapi_example1 ndbapi_example2 ndbapi_example3 $(ndbapi_example4) \
ndbapi_example5 select_all
bins: $(patsubst %, _bins_%, $(BIN_DIRS))
$(patsubst %, _bins_%, $(BIN_DIRS)) :
$(MAKE) -C $(patsubst _bins_%, %, $@) $(OPTS)
libs:
clean:
for f in ${BIN_DIRS}; do \
$(MAKE) -C $$f $@;\
done
cleanall: clean
tidy: clean
distclean: clean

Binary file not shown.

View file

@ -0,0 +1,34 @@
-include ../../Defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#NDB_OS = LINUX
#You need to set the NDB_OS variable here (LINUX, SOLARIS, MACOSX)
TARGET = ndbapi_async
SRCS = ndbapi_async.cpp
OBJS = ndbapi_async.o
CC = g++
CFLAGS = -c -Wall -fno-rtti -D$(NDB_OS)
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB = -lpthread -lsocket -lnsl -lrt
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB = -lpthread
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CC) $(LFLAGS) -L$(LIB_DIR) -lNDB_API $(OBJS) $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,505 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
* ndbapi_async.cpp:
* Illustrates how to use callbacks and error handling using the asynchronous
* part of the NDBAPI.
*
* Classes and methods in NDBAPI used in this example:
*
* Ndb
* init()
* waitUntilRead()
* getDictionary()
* startTransaction()
* closeTransaction()
* sendPollNdb()
* getNdbError()
*
* NdbConnection
* getNdbOperation()
* executeAsynchPrepare()
* getNdbError()
*
* NdbDictionary::Dictionary
* getTable()
* dropTable()
* createTable()
* getNdbError()
*
* NdbDictionary::Column
* setName()
* setPrimaryKey()
* setType()
* setLength()
* setNullable()
*
* NdbDictionary::Table
* setName()
* addColumn()
*
* NdbOperation
* insertTuple()
* equal()
* setValue()
*
*/
#include <NdbApi.hpp>
#include <NdbScanFilter.hpp>
#include <iostream> // Used for cout
#ifdef SOLARIS
#include <sys/types.h>
#include <unistd.h>
#endif
#if defined LINUX || defined MACOSX
#include <time.h>
#include <unistd.h>
#endif
/**
* Helper sleep function
*/
int
milliSleep(int milliseconds){
int result = 0;
struct timespec sleeptime;
sleeptime.tv_sec = milliseconds / 1000;
sleeptime.tv_nsec = (milliseconds - (sleeptime.tv_sec * 1000)) * 1000000;
result = nanosleep(&sleeptime, NULL);
return result;
}
/**
* error printout macro
*/
#define APIERROR(error) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << std::endl; \
exit(-1); }
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
/**
* callback struct.
* transaction : index of the transaction in transaction[] array below
* data : the data that the transaction was modifying.
* retries : counter for how many times the trans. has been retried
*/
typedef struct {
Ndb * ndb;
int transaction;
int data;
int retries;
} async_callback_t;
/**
* Structure used in "free list" to a NdbConnection
*/
typedef struct {
NdbConnection* conn;
int used;
} transaction_t;
/**
* Free list holding transactions
*/
transaction_t transaction[1024]; //1024 - max number of outstanding
//transaction in one Ndb object
#endif
/**
* prototypes
*/
/**
* Prepare and send transaction
*/
int populate(Ndb * myNdb, int data, async_callback_t * cbData);
/**
* Error handler.
*/
bool asynchErrorHandler(NdbConnection * trans, Ndb* ndb);
/**
* Exit function
*/
void asynchExitHandler(Ndb * m_ndb) ;
/**
* Helper function used in callback(...)
*/
void closeTransaction(Ndb * ndb , async_callback_t * cb);
/**
* Function to create table
*/
int create_table(Ndb * myNdb);
/**
* stat. variables
*/
int tempErrors = 0;
int permErrors = 0;
/**
* Helper function for callback(...)
*/
void
closeTransaction(Ndb * ndb , async_callback_t * cb)
{
ndb->closeTransaction(transaction[cb->transaction].conn);
transaction[cb->transaction].conn = 0;
transaction[cb->transaction].used = 0;
cb->retries++;
}
/**
* Callback executed when transaction has return from NDB
*/
static void
callback(int result, NdbConnection* trans, void* aObject)
{
async_callback_t * cbData = (async_callback_t *)aObject;
if (result<0)
{
/**
* Error: Temporary or permanent?
*/
if (asynchErrorHandler(trans, (Ndb*)cbData->ndb))
{
closeTransaction((Ndb*)cbData->ndb, cbData);
while(populate((Ndb*)cbData->ndb, cbData->data, cbData) < 0)
milliSleep(10);
}
else
{
std::cout << "Restore: Failed to restore data "
<< "due to a unrecoverable error. Exiting..." << std::endl;
delete cbData;
asynchExitHandler((Ndb*)cbData->ndb);
}
}
else
{
/**
* OK! close transaction
*/
closeTransaction((Ndb*)cbData->ndb, cbData);
delete cbData;
}
}
/**
* Create table "GARAGE"
*/
int create_table(Ndb * myNdb)
{
NdbDictionary::Table myTable;
NdbDictionary::Column myColumn;
NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
/*********************************************************
* Create a table named GARAGE if it does not exist *
*********************************************************/
if (myDict->getTable("GARAGE") != NULL)
{
std::cout << "NDB already has example table: GARAGE. "
<< "Dropping it..." << std::endl;
if(myDict->dropTable("GARAGE") == -1)
{
std::cout << "Failed to drop: GARAGE." << std::endl;
exit(1);
}
}
myTable.setName("GARAGE");
/**
* Column REG_NO
*/
myColumn.setName("REG_NO");
myColumn.setPrimaryKey(true);
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
/**
* Column BRAND
*/
myColumn.setName("BRAND");
myColumn.setPrimaryKey(false);
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(20);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
/**
* Column COLOR
*/
myColumn.setName("COLOR");
myColumn.setPrimaryKey(false);
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(20);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
if (myDict->createTable(myTable) == -1) {
APIERROR(myDict->getNdbError());
}
return 1;
}
void asynchExitHandler(Ndb * m_ndb)
{
if (m_ndb != NULL)
delete m_ndb;
exit(-1);
}
/* returns true if is recoverable (temporary),
* false if it is an error that is permanent.
*/
bool asynchErrorHandler(NdbConnection * trans, Ndb* ndb)
{
NdbError error = trans->getNdbError();
switch(error.status)
{
case NdbError::Success:
return false;
break;
case NdbError::TemporaryError:
/**
* The error code indicates a temporary error.
* The application should typically retry.
* (Includes classifications: NdbError::InsufficientSpace,
* NdbError::TemporaryResourceError, NdbError::NodeRecoveryError,
* NdbError::OverloadError, NdbError::NodeShutdown
* and NdbError::TimeoutExpired.)
*
* We should sleep for a while and retry, except for insufficient space
*/
if(error.classification == NdbError::InsufficientSpace)
return false;
milliSleep(10);
tempErrors++;
return true;
break;
case NdbError::UnknownResult:
std::cout << error.message << std::endl;
return false;
break;
default:
case NdbError::PermanentError:
switch (error.code)
{
case 499:
case 250:
milliSleep(10);
return true; // SCAN errors that can be retried. Requires restart of scan.
default:
break;
}
//ERROR
std::cout << error.message << std::endl;
return false;
break;
}
return false;
}
static int nPreparedTransactions = 0;
static int MAX_RETRIES = 10;
static int parallelism = 100;
/************************************************************************
* populate()
* 1. Prepare 'parallelism' number of insert transactions.
* 2. Send transactions to NDB and wait for callbacks to execute
*/
int populate(Ndb * myNdb, int data, async_callback_t * cbData)
{
NdbOperation* myNdbOperation; // For operations
async_callback_t * cb;
int retries;
int current = 0;
for(int i=0; i<1024; i++)
{
if(transaction[i].used == 0)
{
current = i;
if (cbData == 0)
{
/**
* We already have a callback
* This is an absolutely new transaction
*/
cb = new async_callback_t;
cb->retries = 0;
}
else
{
/**
* We already have a callback
*/
cb =cbData;
retries = cbData->retries;
}
/**
* Set data used by the callback
*/
cb->ndb = myNdb; //handle to Ndb object so that we can close transaction
// in the callback (alt. make myNdb global).
cb->data = data; //this is the data we want to insert
cb->transaction = current; //This is the number (id) of this transaction
transaction[current].used = 1 ; //Mark the transaction as used
break;
}
}
if(!current)
return -1;
while(retries < MAX_RETRIES)
{
transaction[current].conn = myNdb->startTransaction();
if (transaction[current].conn == NULL) {
if (asynchErrorHandler(transaction[current].conn, myNdb))
{
/**
* no transaction to close since conn == null
*/
milliSleep(10);
retries++;
continue;
}
asynchExitHandler(myNdb);
}
// Error check. If error, then maybe table GARAGE is not in database
myNdbOperation = transaction[current].conn->getNdbOperation("GARAGE");
if (myNdbOperation == NULL)
{
if (asynchErrorHandler(transaction[current].conn, myNdb))
{
myNdb->closeTransaction(transaction[current].conn);
transaction[current].conn = 0;
milliSleep(10);
retries++;
continue;
}
asynchExitHandler(myNdb);
} // if
if(myNdbOperation->insertTuple() < 0 ||
myNdbOperation->equal("REG_NO", data) < 0 ||
myNdbOperation->setValue("BRAND", "Mercedes") <0 ||
myNdbOperation->setValue("COLOR", "Blue") < 0)
{
if (asynchErrorHandler(transaction[current].conn, myNdb))
{
myNdb->closeTransaction(transaction[current].conn);
transaction[current].conn = 0;
retries++;
milliSleep(10);
continue;
}
asynchExitHandler(myNdb);
}
/*Prepare transaction (the transaction is NOT yet sent to NDB)*/
transaction[current].conn->executeAsynchPrepare(Commit,
&callback,
cb);
/**
* When we have prepared parallelism number of transactions ->
* send the transaction to ndb.
* Next time we will deal with the transactions are in the
* callback. There we will see which ones that were successful
* and which ones to retry.
*/
if (nPreparedTransactions == parallelism-1)
{
// send-poll all transactions
// close transaction is done in callback
myNdb->sendPollNdb(3000, parallelism );
nPreparedTransactions=0;
}
else
nPreparedTransactions++;
return 1;
}
std::cout << "Unable to recover from errors. Exiting..." << std::endl;
asynchExitHandler(myNdb);
return -1;
}
int main()
{
Ndb* myNdb = new Ndb( "TEST_DB" ); // Object representing the database
/*******************************************
* Initialize NDB and wait until its ready *
*******************************************/
if (myNdb->init(1024) == -1) { // Set max 1024 parallel transactions
APIERROR(myNdb->getNdbError());
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
create_table(myNdb);
/**
* Initialise transaction array
*/
for(int i = 0 ; i < 1024 ; i++)
{
transaction[i].used = 0;
transaction[i].conn = 0;
}
int i=0;
/**
* Do 20000 insert transactions.
*/
while(i < 20000)
{
while(populate(myNdb,i,0)<0) // <0, no space on free list. Sleep and try again.
milliSleep(10);
i++;
}
std::cout << "Number of temporary errors: " << tempErrors << std::endl;
delete myNdb;
}

View file

@ -0,0 +1,3 @@
1. Set NDB_OS in Makefile
2. Add path to libNDB_API.so in LD_LIBRARY_PATH
3. Set NDB_CONNECTSTRING

View file

@ -0,0 +1,33 @@
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here
TARGET = ndbapi_example1
SRCS = ndbapi_example1.cpp
OBJS = ndbapi_example1.o
CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB =
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB =
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CXX) $(LFLAGS) -L$(LIB_DIR) $(OBJS) -lNDB_API $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,193 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
//
// ndbapi_example1.cpp: Using synchronous transactions in NDB API
//
// Correct output from this program is:
//
// ATTR1 ATTR2
// 0 10
// 1 1
// 2 12
// Detected that deleted tuple doesn't exist!
// 4 14
// 5 5
// 6 16
// 7 7
// 8 18
// 9 9
#include <NdbApi.hpp>
// Used for cout
#include <stdio.h>
#include <iostream>
#define APIERROR(error) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << std::endl; \
exit(-1); }
int main()
{
Ndb* myNdb = new Ndb( "TEST_DB_1" ); // Object representing the database
NdbDictionary::Table myTable;
NdbDictionary::Column myColumn;
NdbConnection *myConnection; // For other transactions
NdbOperation *myOperation; // For other operations
NdbRecAttr *myRecAttr; // Result of reading attribute value
/********************************************
* Initialize NDB and wait until it's ready *
********************************************/
if (myNdb->init() == -1) {
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
/*********************************************************
* Create a table named MYTABLENAME if it does not exist *
*********************************************************/
if (myDict->getTable("MYTABLENAME") != NULL) {
std::cout << "NDB already has example table: MYTABLENAME." << std::endl;
exit(-1);
}
myTable.setName("MYTABLENAME");
myColumn.setName("ATTR1");
myColumn.setPrimaryKey(true);
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
myColumn.setName("ATTR2");
myColumn.setPrimaryKey(false);
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
if (myDict->createTable(myTable) == -1)
APIERROR(myDict->getNdbError());
/**************************************************************************
* Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) *
**************************************************************************/
for (int i = 0; i < 5; i++) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->insertTuple();
myOperation->equal("ATTR1", i);
myOperation->setValue("ATTR2", i);
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->insertTuple();
myOperation->equal("ATTR1", i+5);
myOperation->setValue("ATTR2", i+5);
if (myConnection->execute( Commit ) == -1)
APIERROR(myConnection->getNdbError());
myNdb->closeTransaction(myConnection);
}
/*****************************************************************
* Update the second attribute in half of the tuples (adding 10) *
*****************************************************************/
for (int i = 0; i < 10; i+=2) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->updateTuple();
myOperation->equal( "ATTR1", i );
myOperation->setValue( "ATTR2", i+10);
if( myConnection->execute( Commit ) == -1 )
APIERROR(myConnection->getNdbError());
myNdb->closeTransaction(myConnection);
}
/*************************************************
* Delete one tuple (the one with primary key 3) *
*************************************************/
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL)
APIERROR(myConnection->getNdbError());
myOperation->deleteTuple();
myOperation->equal( "ATTR1", 3 );
if (myConnection->execute(Commit) == -1)
APIERROR(myConnection->getNdbError());
myNdb->closeTransaction(myConnection);
/*****************************
* Read and print all tuples *
*****************************/
std::cout << "ATTR1 ATTR2" << std::endl;
for (int i = 0; i < 10; i++) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->readTuple();
myOperation->equal("ATTR1", i);
myRecAttr = myOperation->getValue("ATTR2", NULL);
if (myRecAttr == NULL) APIERROR(myConnection->getNdbError());
if(myConnection->execute( Commit ) == -1)
if (i == 3) {
std::cout << "Detected that deleted tuple doesn't exist!" << std::endl;
} else {
APIERROR(myConnection->getNdbError());
}
if (i != 3) {
printf(" %2d %2d\n", i, myRecAttr->u_32_value());
}
myNdb->closeTransaction(myConnection);
}
delete myNdb;
}

View file

@ -0,0 +1,33 @@
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here
TARGET = ndbapi_example2
SRCS = ndbapi_example2.cpp
OBJS = ndbapi_example2.o
CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB =
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB =
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CXX) $(LFLAGS) -L$(LIB_DIR) $(OBJS) -lNDB_API $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,110 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
//
// ndbapi_example2.cpp: Using asynchronous transactions in NDB API
//
// Execute ndbapi_example1 to create the table "MYTABLENAME"
// before executing this program.
//
// Correct output from this program is:
//
// Successful insert.
// Successful insert.
#include <NdbApi.hpp>
// Used for cout
#include <iostream>
#define APIERROR(error) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << std::endl; \
exit(-1); }
static void callback(int result, NdbConnection* NdbObject, void* aObject);
int main()
{
Ndb* myNdb = new Ndb( "TEST_DB_2" ); // Object representing the database
NdbConnection* myNdbConnection[2]; // For transactions
NdbOperation* myNdbOperation; // For operations
/*******************************************
* Initialize NDB and wait until its ready *
*******************************************/
if (myNdb->init(2) == -1) { // Want two parallel insert transactions
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
/******************************************************
* Insert (we do two insert transactions in parallel) *
******************************************************/
for (int i = 0; i < 2; i++) {
myNdbConnection[i] = myNdb->startTransaction();
if (myNdbConnection[i] == NULL) APIERROR(myNdb->getNdbError());
myNdbOperation = myNdbConnection[i]->getNdbOperation("MYTABLENAME");
// Error check. If error, then maybe table MYTABLENAME is not in database
if (myNdbOperation == NULL) APIERROR(myNdbConnection[i]->getNdbError());
myNdbOperation->insertTuple();
myNdbOperation->equal("ATTR1", 20 + i);
myNdbOperation->setValue("ATTR2", 20 + i);
// Prepare transaction (the transaction is NOT yet sent to NDB)
myNdbConnection[i]->executeAsynchPrepare(Commit, &callback, NULL);
}
// Send all transactions to NDB
myNdb->sendPreparedTransactions(0);
// Poll all transactions
myNdb->pollNdb(3000, 2);
// Close all transactions
for (int i = 0; i < 2; i++)
myNdb->closeTransaction(myNdbConnection[i]);
delete myNdb;
}
/*
* callback : This is called when the transaction is polled
*
* (This function must have three arguments:
* - The result of the transaction,
* - The NdbConnection object, and
* - A pointer to an arbitrary object.)
*/
static void
callback(int result, NdbConnection* myTrans, void* aObject)
{
if (result == -1) {
std::cout << "Poll error: " << std::endl;
APIERROR(myTrans->getNdbError());
} else {
std::cout << "Successful insert." << std::endl;
}
}

View file

@ -0,0 +1,33 @@
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here
TARGET = ndbapi_example3
SRCS = ndbapi_example3.cpp
OBJS = ndbapi_example3.o
CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB =
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB =
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CXX) $(LFLAGS) -L$(LIB_DIR) $(OBJS) -lNDB_API $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,202 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
//
// ndbapi_example3.cpp: Error handling and transaction retries
//
// Execute ndbapi_example1 to create the table "MYTABLENAME"
// before executing this program.
//
// There are many ways to program using the NDB API. In this example
// we execute two inserts in the same transaction using
// NdbConnection::Ndbexecute(NoCommit).
//
// Transaction failing is handled by re-executing the transaction
// in case of non-permanent transaction errors.
// Application errors (i.e. errors at points marked with APIERROR)
// should be handled by the application programmer.
#include <NdbApi.hpp>
// Used for cout
#include <iostream>
// Used for sleep (use your own version of sleep)
#include <unistd.h>
#define TIME_TO_SLEEP_BETWEEN_TRANSACTION_RETRIES 1
//
// APIERROR prints an NdbError object
//
#define APIERROR(error) \
{ std::cout << "API ERROR: " << error.code << " " << error.message \
<< std::endl \
<< " " << "Status: " << error.status \
<< ", Classification: " << error.classification << std::endl\
<< " " << "File: " << __FILE__ \
<< " (Line: " << __LINE__ << ")" << std::endl \
; \
}
//
// CONERROR prints all error info regarding an NdbConnection
//
#define CONERROR(ndbConnection) \
{ NdbError error = ndbConnection->getNdbError(); \
std::cout << "CON ERROR: " << error.code << " " << error.message \
<< std::endl \
<< " " << "Status: " << error.status \
<< ", Classification: " << error.classification << std::endl \
<< " " << "File: " << __FILE__ \
<< " (Line: " << __LINE__ << ")" << std::endl \
; \
printTransactionError(ndbConnection); \
}
void printTransactionError(NdbConnection *ndbConnection) {
const NdbOperation *ndbOp = NULL;
int i=0;
/****************************************************************
* Print NdbError object of every operations in the transaction *
****************************************************************/
while ((ndbOp = ndbConnection->getNextCompletedOperation(ndbOp)) != NULL) {
NdbError error = ndbOp->getNdbError();
std::cout << " OPERATION " << i+1 << ": "
<< error.code << " " << error.message << std::endl
<< " Status: " << error.status
<< ", Classification: " << error.classification << std::endl;
i++;
}
}
//
// Example insert
// @param myNdb Ndb object representing NDB Cluster
// @param myConnection NdbConnection used for transaction
// @param error NdbError object returned in case of errors
// @return -1 in case of failures, 0 otherwise
//
int insert(int transactionId, NdbConnection* myConnection) {
NdbOperation *myOperation; // For other operations
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) return -1;
if (myOperation->insertTuple() ||
myOperation->equal("ATTR1", transactionId) ||
myOperation->setValue("ATTR2", transactionId)) {
APIERROR(myOperation->getNdbError());
exit(-1);
}
return myConnection->execute(NoCommit);
}
//
// Execute function which re-executes (tries 10 times) the transaction
// if there are temporary errors (e.g. the NDB Cluster is overloaded).
// @return -1 failure, 1 success
//
int executeInsertTransaction(int transactionId, Ndb* myNdb) {
int result = 0; // No result yet
int noOfRetriesLeft = 10;
NdbConnection *myConnection; // For other transactions
NdbError ndberror;
while (noOfRetriesLeft > 0 && !result) {
/*********************************
* Start and execute transaction *
*********************************/
myConnection = myNdb->startTransaction();
if (myConnection == NULL) {
APIERROR(myNdb->getNdbError());
ndberror = myNdb->getNdbError();
result = -1; // Failure
} else if (insert(transactionId, myConnection) ||
insert(10000+transactionId, myConnection) ||
myConnection->execute(Commit)) {
CONERROR(myConnection);
ndberror = myConnection->getNdbError();
result = -1; // Failure
} else {
result = 1; // Success
}
/**********************************
* If failure, then analyze error *
**********************************/
if (result == -1) {
switch (ndberror.status) {
case NdbError::Success:
break;
case NdbError::TemporaryError:
std::cout << "Retrying transaction..." << std::endl;
sleep(TIME_TO_SLEEP_BETWEEN_TRANSACTION_RETRIES);
--noOfRetriesLeft;
result = 0; // No completed transaction yet
break;
case NdbError::UnknownResult:
case NdbError::PermanentError:
std::cout << "No retry of transaction..." << std::endl;
result = -1; // Permanent failure
break;
}
}
/*********************
* Close transaction *
*********************/
if (myConnection != NULL) {
myNdb->closeTransaction(myConnection);
}
}
if (result != 1) exit(-1);
return result;
}
int main()
{
Ndb* myNdb = new Ndb( "TEST_DB_1" ); // Object representing the database
/*******************************************
* Initialize NDB and wait until its ready *
*******************************************/
if (myNdb->init() == -1) {
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
/************************************
* Execute some insert transactions *
************************************/
for (int i = 10000; i < 20000; i++) {
executeInsertTransaction(i, myNdb);
}
delete myNdb;
}

View file

@ -0,0 +1,33 @@
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here
TARGET = ndbapi_example4
SRCS = ndbapi_example4.cpp
OBJS = ndbapi_example4.o
CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB =
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB =
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CXX) $(LFLAGS) -L$(LIB_DIR) $(OBJS) -lNDB_API $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,252 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
//
// ndbapi_example4.cpp: Using secondary indexes in NDB API
//
// Correct output from this program is:
//
// ATTR1 ATTR2
// 0 10
// 1 1
// 2 12
// Detected that deleted tuple doesn't exist!
// 4 14
// 5 5
// 6 16
// 7 7
// 8 18
// 9 9
#include <NdbApi.hpp>
// Used for cout
#include <stdio.h>
#include <iostream>
#define APIERROR(error) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << std::endl; \
exit(-1); }
int main()
{
Ndb* myNdb = new Ndb( "TEST_DB_1" ); // Object representing the database
NdbDictionary::Table myTable;
NdbDictionary::Column myColumn;
NdbDictionary::Index myIndex;
NdbConnection *myConnection; // For transactions
NdbOperation *myOperation; // For primary key operations
NdbIndexOperation *myIndexOperation; // For index operations
NdbRecAttr *myRecAttr; // Result of reading attribute value
/********************************************
* Initialize NDB and wait until it's ready *
********************************************/
if (myNdb->init() == -1) {
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
/*********************************************************
* Create a table named MYTABLENAME if it does not exist *
*********************************************************/
NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
if (myDict->getTable("MYTABLENAME") != NULL) {
std::cout << "NDB already has example table: MYTABLENAME." << std::endl;
exit(-1);
}
myTable.setName("MYTABLENAME");
myColumn.setName("ATTR1");
myColumn.setPrimaryKey(true);
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
myColumn.setName("ATTR2");
myColumn.setPrimaryKey(false);
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
if (myDict->createTable(myTable) == -1)
APIERROR(myDict->getNdbError());
/**********************************************************
* Create an index named MYINDEXNAME if it does not exist *
**********************************************************/
if (myDict->getIndex("MYINDEXNAME", "MYTABLENAME") != NULL) {
std::cout << "NDB already has example index: MYINDEXNAME." << std::endl;
exit(-1);
}
myIndex.setName("MYINDEXNAME");
myIndex.setTable("MYTABLENAME");
myIndex.setType(NdbDictionary::Index::UniqueHashIndex);
const char* attr_arr[] = {"ATTR2"};
myIndex.addIndexColumns(1, attr_arr);
if (myDict->createIndex(myIndex) == -1)
APIERROR(myDict->getNdbError());
/**************************************************************************
* Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) *
**************************************************************************/
for (int i = 0; i < 5; i++) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->insertTuple();
myOperation->equal("ATTR1", i);
myOperation->setValue("ATTR2", i);
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->insertTuple();
myOperation->equal("ATTR1", i+5);
myOperation->setValue("ATTR2", i+5);
if (myConnection->execute( Commit ) == -1)
APIERROR(myConnection->getNdbError());
myNdb->closeTransaction(myConnection);
}
/*****************************************
* Read and print all tuples using index *
*****************************************/
std::cout << "ATTR1 ATTR2" << std::endl;
for (int i = 0; i < 10; i++) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myIndexOperation = myConnection->getNdbIndexOperation("MYINDEXNAME",
"MYTABLENAME");
if (myIndexOperation == NULL) APIERROR(myConnection->getNdbError());
myIndexOperation->readTuple();
myIndexOperation->equal("ATTR2", i);
myRecAttr = myIndexOperation->getValue("ATTR1", NULL);
if (myRecAttr == NULL) APIERROR(myConnection->getNdbError());
if(myConnection->execute( Commit ) != -1)
printf(" %2d %2d\n", myRecAttr->u_32_value(), i);
}
myNdb->closeTransaction(myConnection);
/*****************************************************************
* Update the second attribute in half of the tuples (adding 10) *
*****************************************************************/
for (int i = 0; i < 10; i+=2) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myIndexOperation = myConnection->getNdbIndexOperation("MYINDEXNAME",
"MYTABLENAME");
if (myIndexOperation == NULL) APIERROR(myConnection->getNdbError());
myIndexOperation->updateTuple();
myIndexOperation->equal( "ATTR2", i );
myIndexOperation->setValue( "ATTR2", i+10);
if( myConnection->execute( Commit ) == -1 )
APIERROR(myConnection->getNdbError());
myNdb->closeTransaction(myConnection);
}
/*************************************************
* Delete one tuple (the one with primary key 3) *
*************************************************/
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myIndexOperation = myConnection->getNdbIndexOperation("MYINDEXNAME",
"MYTABLENAME");
if (myIndexOperation == NULL)
APIERROR(myConnection->getNdbError());
myIndexOperation->deleteTuple();
myIndexOperation->equal( "ATTR2", 3 );
if (myConnection->execute(Commit) == -1)
APIERROR(myConnection->getNdbError());
myNdb->closeTransaction(myConnection);
/*****************************
* Read and print all tuples *
*****************************/
std::cout << "ATTR1 ATTR2" << std::endl;
for (int i = 0; i < 10; i++) {
myConnection = myNdb->startTransaction();
if (myConnection == NULL) APIERROR(myNdb->getNdbError());
myOperation = myConnection->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myConnection->getNdbError());
myOperation->readTuple();
myOperation->equal("ATTR1", i);
myRecAttr = myOperation->getValue("ATTR2", NULL);
if (myRecAttr == NULL) APIERROR(myConnection->getNdbError());
if(myConnection->execute( Commit ) == -1)
if (i == 3) {
std::cout << "Detected that deleted tuple doesn't exist!" << std::endl;
} else {
APIERROR(myConnection->getNdbError());
}
if (i != 3) {
printf(" %2d %2d\n", i, myRecAttr->u_32_value());
}
myNdb->closeTransaction(myConnection);
}
/**************
* Drop index *
**************/
if (myDict->dropIndex("MYINDEXNAME", "MYTABLENAME") == -1)
APIERROR(myDict->getNdbError());
/**************
* Drop table *
**************/
if (myDict->dropTable("MYTABLENAME") == -1)
APIERROR(myDict->getNdbError());
delete myNdb;
}

View file

@ -0,0 +1,33 @@
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here
TARGET = ndbapi_example5
SRCS = ndbapi_example5.cpp
OBJS = ndbapi_example5.o
CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB =
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB =
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CXX) $(LFLAGS) -L$(LIB_DIR) $(OBJS) -lNDB_API $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,230 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
* ndbapi_example5.cpp: Using API level events in NDB API
*/
#include <NdbApi.hpp>
#include <NdbEventOperation.hpp>
// Used for cout
#include <stdio.h>
#include <iostream>
#include <unistd.h>
/**
*
* Assume that there is a table TAB0 which is being updated by
* another process (e.g. flexBench -l 0 -stdtables).
* We want to monitor what happens with columns COL0, COL2, COL11
*
* or together with the mysqlcluster client;
*
* shell> mysqlcluster -u root
* mysql> create database TEST_DB;
* mysql> use TEST_DB;
* mysql> create table TAB0 (COL0 int primary key, COL1 int, COL11 int);
*
* In another window start ndbapi_example5, wait until properly started
*
* mysql> insert into TAB0 values (1,2,3);
* mysql> insert into TAB0 values (2,2,3);
* mysql> insert into TAB0 values (3,2,9);
* mysql>
*
* you should see the data popping up in the example window
*
*/
#define APIERROR(error) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << std::endl; \
exit(-1); }
Ndb* myCreateNdb();
int myCreateEvent(Ndb* myNdb,
const char *eventName,
const char *eventTableName,
const char **eventComlumnName,
const int noEventComlumnName);
int main()
{
Ndb* myNdb = myCreateNdb();
NdbDictionary::Dictionary *myDict;
const char *eventName = "CHNG_IN_TAB0";
const char *eventTableName = "TAB0";
const int noEventColumnName = 3;
const char *eventColumnName[noEventColumnName] =
{"COL0",
"COL1",
"COL11"};
myDict = myNdb->getDictionary();
// Create events
myCreateEvent(myNdb,
eventName,
eventTableName,
eventColumnName,
noEventColumnName);
int j = 0;
while (j < 5) {
// Start "transaction" for handling events
NdbEventOperation* op;
printf("create EventOperation\n");
if ((op = myNdb->createEventOperation(eventName,100)) == NULL) {
printf("Event operation creation failed\n");
exit(-1);
}
printf("get values\n");
NdbRecAttr* recAttr[noEventColumnName];
NdbRecAttr* recAttrPre[noEventColumnName];
// primary keys should always be a part of the result
for (int i = 0; i < noEventColumnName; i++) {
recAttr[i] = op->getValue(eventColumnName[i]);
recAttrPre[i] = op->getPreValue(eventColumnName[i]);
}
// set up the callbacks
printf("execute\n");
if (op->execute()) { // This starts changes to "start flowing"
printf("operationd execution failed\n");
exit(-1);
}
int i = 0;
while(i < 40) {
//printf("now waiting for event...\n");
int r = myNdb->pollEvents(1000); // wait for event or 1000 ms
if (r>0) {
//printf("got data! %d\n", r);
int overrun;
while (op->next(&overrun) > 0) {
i++;
if (!op->isConsistent())
printf("A node failiure has occured and events might be missing\n");
switch (op->getEventType()) {
case NdbDictionary::Event::TE_INSERT:
printf("%u INSERT: ", i);
break;
case NdbDictionary::Event::TE_DELETE:
printf("%u DELETE: ", i);
break;
case NdbDictionary::Event::TE_UPDATE:
printf("%u UPDATE: ", i);
break;
}
printf("overrun %u pk %u: ", overrun, recAttr[0]->u_32_value());
for (int i = 1; i < noEventColumnName; i++) {
if (recAttr[i]->isNULL() >= 0) { // we have a value
printf(" post[%u]=", i);
if (recAttr[i]->isNULL() == 0) // we have a non-null value
printf("%u", recAttr[i]->u_32_value());
else // we have a null value
printf("NULL");
}
if (recAttrPre[i]->isNULL() >= 0) { // we have a value
printf(" post[%u]=", i);
if (recAttrPre[i]->isNULL() == 0) // we have a non-null value
printf("%u", recAttrPre[i]->u_32_value());
else // we have a null value
printf("NULL");
}
}
printf("\n");
}
} else
;//printf("timed out\n");
}
// don't want to listen to eventsanymore
myNdb->dropEventOperation(op);
j++;
}
myDict->dropEvent(eventName); // remove event from database
delete myNdb;
}
Ndb* myCreateNdb()
{
Ndb* myNdb = new Ndb("TEST_DB");
/********************************************
* Initialize NDB and wait until it's ready *
********************************************/
if (myNdb->init() == -1) {
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
return myNdb;
}
int myCreateEvent(Ndb* myNdb,
const char *eventName,
const char *eventTableName,
const char **eventColumnName,
const int noEventColumnName)
{
NdbDictionary::Dictionary *myDict = myNdb->getDictionary();
if (!myDict) {
printf("Event Creation failedDictionary not found");
exit(-1);
}
NdbDictionary::Event myEvent(eventName);
myEvent.setTable(eventTableName);
myEvent.addTableEvent(NdbDictionary::Event::TE_ALL);
// myEvent.addTableEvent(NdbDictionary::Event::TE_INSERT);
// myEvent.addTableEvent(NdbDictionary::Event::TE_UPDATE);
// myEvent.addTableEvent(NdbDictionary::Event::TE_DELETE);
for (int i = 0; i < noEventColumnName; i++)
myEvent.addEventColumn(eventColumnName[i]);
int res = myDict->createEvent(myEvent); // Add event to database
if (res == 0)
myEvent.print();
else {
printf("Event creation failed\n");
printf("trying drop Event, maybe event exists\n");
res = myDict->dropEvent(eventName);
if (res)
exit(-1);
// try again
res = myDict->createEvent(myEvent); // Add event to database
if (res)
exit(-1);
}
return res;
}

View file

@ -0,0 +1,35 @@
-include ../../Defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here (LINUX, SOLARIS, MACOSX)
#NDB_OS = LINUX
TARGET = ndbapi_scan
SRCS = ndbapi_scan.cpp
OBJS = ndbapi_scan.o
CC = g++
CFLAGS = -c -Wall -fno-rtti
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB = -lpthread -lsocket -lnsl -lrt
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB = -lpthread
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CC) $(LFLAGS) -L$(LIB_DIR) -lNDB_API $(OBJS) $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,824 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
* ndbapi_scan.cpp:
* Illustrates how to use the scan api in the NDBAPI.
* The example shows how to do scan, scan for update and scan for delete
* using NdbScanFilter and NdbScanOperation
*
* Classes and methods used in this example:
*
* Ndb
* init()
* waitUntilRead()
* getDictionary()
* startTransaction()
* closeTransaction()
* sendPreparedTransactions()
* pollNdb()
*
* NdbConnection
* getNdbOperation()
* executeAsynchPrepare()
* getNdbError()
* executeScan()
* nextScanResult()
*
* NdbDictionary::Dictionary
* getTable()
* dropTable()
* createTable()
*
* NdbDictionary::Column
* setName()
* setPrimaryKey()
* setType()
* setLength()
* setNullable()
*
* NdbDictionary::Table
* setName()
* addColumn()
*
* NdbOperation
* insertTuple()
* equal()
* setValue()
* openScanRead()
* openScanExclusive()
*
* NdbRecAttr
* aRef()
* u_32_value()
*
* NdbResultSet
* nextResult()
* deleteTuple()
* updateTuple()
*
* NdbScanOperation
* getValue()
* readTuplesExclusive()
*
* NdbScanFilter
* begin()
* eq()
* end()
*
*
*/
#include <NdbApi.hpp>
#include <NdbScanFilter.hpp>
// Used for cout
#include <iostream>
#ifdef SOLARIS
#include <sys/types.h>
#include <unistd.h>
#endif
#if defined LINUX || defined MACOSX
#include <time.h>
#include <unistd.h>
#endif
/**
* Helper sleep function
*/
int
milliSleep(int milliseconds){
int result = 0;
struct timespec sleeptime;
sleeptime.tv_sec = milliseconds / 1000;
sleeptime.tv_nsec = (milliseconds - (sleeptime.tv_sec * 1000)) * 1000000;
result = nanosleep(&sleeptime, NULL);
return result;
}
/**
* Helper sleep function
*/
#define APIERROR(error) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << std::endl; \
exit(-1); }
/*
* callback : This is called when the transaction is polled
*
* (This function must have three arguments:
* - The result of the transaction,
* - The NdbConnection object, and
* - A pointer to an arbitrary object.)
*/
static void
callback(int result, NdbConnection* myTrans, void* aObject)
{
if (result == -1) {
std::cout << "In callback: " << std::endl;
/**
* Put error checking code here (see ndb_async_example)
*/
APIERROR(myTrans->getNdbError());
} else {
/**
* Ok!
*/
return;
}
}
/**
* Function to create table
*/
int create_table(Ndb * myNdb)
{
NdbDictionary::Table myTable;
NdbDictionary::Column myColumn;
NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
/*********************************************************
* Create a table named GARAGE if it does not exist *
*********************************************************/
if (myDict->getTable("GARAGE") != NULL) {
std::cout << "NDB already has example table: GARAGE. "
<< "Dropping it..." << std::endl;
if(myDict->dropTable("GARAGE") == -1)
{
std::cout << "Failed to drop: GARAGE." << std::endl;
exit(1);
}
}
myTable.setName("GARAGE");
myColumn.setName("REG_NO");
myColumn.setPrimaryKey(true);
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
myColumn.setName("BRAND");
myColumn.setPrimaryKey(false);
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(20);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
myColumn.setName("COLOR");
myColumn.setPrimaryKey(false);
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(20);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
if (myDict->createTable(myTable) == -1) {
APIERROR(myDict->getNdbError());
return -1;
}
return 1;
}
int populate(Ndb * myNdb)
{
NdbConnection* myNdbConnection[15]; // For transactions
NdbOperation* myNdbOperation; // For operations
/******************************************************
* Insert (we do 15 insert transactions in parallel) *
******************************************************/
/**
* Five blue mercedes
*/
for (int i = 0; i < 5; i++)
{
myNdbConnection[i] = myNdb->startTransaction();
if (myNdbConnection[i] == NULL)
APIERROR(myNdb->getNdbError());
myNdbOperation = myNdbConnection[i]->getNdbOperation("GARAGE");
// Error check. If error, then maybe table GARAGE is not in database
if (myNdbOperation == NULL)
APIERROR(myNdbConnection[i]->getNdbError());
myNdbOperation->insertTuple();
myNdbOperation->equal("REG_NO", i);
myNdbOperation->setValue("BRAND", "Mercedes");
myNdbOperation->setValue("COLOR", "Blue");
// Prepare transaction (the transaction is NOT yet sent to NDB)
myNdbConnection[i]->executeAsynchPrepare(Commit, &callback, NULL);
}
/**
* Five black bmw
*/
for (int i = 5; i < 10; i++)
{
myNdbConnection[i] = myNdb->startTransaction();
if (myNdbConnection[i] == NULL)
APIERROR(myNdb->getNdbError());
myNdbOperation = myNdbConnection[i]->getNdbOperation("GARAGE");
// Error check. If error, then maybe table MYTABLENAME is not in database
if (myNdbOperation == NULL)
APIERROR(myNdbConnection[i]->getNdbError());
myNdbOperation->insertTuple();
myNdbOperation->equal("REG_NO", i);
myNdbOperation->setValue("BRAND", "BMW");
myNdbOperation->setValue("COLOR", "Black");
// Prepare transaction (the transaction is NOT yet sent to NDB)
myNdbConnection[i]->executeAsynchPrepare(Commit, &callback, NULL);
}
/**
* Five pink toyotas
*/
for (int i = 10; i < 15; i++) {
myNdbConnection[i] = myNdb->startTransaction();
if (myNdbConnection[i] == NULL) APIERROR(myNdb->getNdbError());
myNdbOperation = myNdbConnection[i]->getNdbOperation("GARAGE");
// Error check. If error, then maybe table MYTABLENAME is not in database
if (myNdbOperation == NULL) APIERROR(myNdbConnection[i]->getNdbError());
myNdbOperation->insertTuple();
myNdbOperation->equal("REG_NO", i);
myNdbOperation->setValue("BRAND", "Toyota");
myNdbOperation->setValue("COLOR", "Pink");
// Prepare transaction (the transaction is NOT yet sent to NDB)
myNdbConnection[i]->executeAsynchPrepare(Commit, &callback, NULL);
}
// Send all transactions to NDB
myNdb->sendPreparedTransactions(0);
// Poll all transactions
myNdb->pollNdb(3000, 0);
// it is also possible to use sendPollNdb instead of
// myNdb->sendPreparedTransactions(0); and myNdb->pollNdb(3000, 15); above.
// myNdb->sendPollNdb(3000,0);
// Note! Neither sendPollNdb or pollNdb returs until all 15 callbacks have
// executed.
// Close all transactions. It is also possible to close transactions
// in the callback.
for (int i = 0; i < 15; i++)
myNdb->closeTransaction(myNdbConnection[i]);
return 1;
}
int scan_delete(Ndb* myNdb,
int parallelism,
int column,
int column_len,
const char * color)
{
// Scan all records exclusive and delete
// them one by one
int retryAttempt = 0;
const int retryMax = 10;
int deletedRows = 0;
int check;
NdbError err;
NdbConnection *myTrans;
NdbScanOperation *myScanOp;
/**
* Loop as long as :
* retryMax not reached
* failed operations due to TEMPORARY erros
*
* Exit loop;
* retyrMax reached
* Permanent error (return -1)
*/
while (true)
{
if (retryAttempt >= retryMax)
{
std::cout << "ERROR: has retried this operation " << retryAttempt
<< " times, failing!" << std::endl;
return -1;
}
myTrans = myNdb->startTransaction();
if (myTrans == NULL)
{
const NdbError err = myNdb->getNdbError();
if (err.status == NdbError::TemporaryError)
{
milliSleep(50);
retryAttempt++;
continue;
}
std::cout << err.message << std::endl;
return -1;
}
/**
* Get a scan operation.
*/
myScanOp = myTrans->getNdbScanOperation("GARAGE");
if (myScanOp == NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define a result set for the scan.
*/
NdbResultSet * rs = myScanOp->readTuplesExclusive(parallelism);
if( rs == 0 ) {
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Use NdbScanFilter to define a search critera
*/
NdbScanFilter filter(myScanOp) ;
if(filter.begin(NdbScanFilter::AND) < 0 ||
filter.eq(column, color, column_len, false) <0||
filter.end() <0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Start scan (NoCommit since we are only reading at this stage);
*/
if(myTrans->execute(NoCommit) != 0){
err = myTrans->getNdbError();
if(err.status == NdbError::TemporaryError){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
std::cout << err.code << std::endl;
std::cout << myTrans->getNdbError().code << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* start of loop: nextResult(true) means that "parallelism" number of
* rows are fetched from NDB and cached in NDBAPI
*/
while((check = rs->nextResult(true)) == 0){
do {
if (rs->deleteTuple() != 0){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
deletedRows++;
/**
* nextResult(false) means that the records
* cached in the NDBAPI are modified before
* fetching more rows from NDB.
*/
} while((check = rs->nextResult(false)) == 0);
/**
* Commit when all cached tuple have been marked for deletion
*/
if(check != -1){
check = myTrans->execute(Commit);
myTrans->releaseCompletedOperations();
}
/**
* Check for errors
*/
err = myTrans->getNdbError();
if(check == -1){
if(err.status == NdbError::TemporaryError){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
}
/**
* End of loop
*/
}
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return 0;
}
if(myTrans!=0) {
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
}
return -1;
}
int scan_update(Ndb* myNdb,
int parallelism,
int column_len,
int update_column,
const char * column_name,
const char * before_color,
const char * after_color)
{
// Scan all records exclusive and update
// them one by one
int retryAttempt = 0;
const int retryMax = 10;
int updatedRows = 0;
int check;
NdbError err;
NdbConnection *myTrans;
NdbScanOperation *myScanOp;
/**
* Loop as long as :
* retryMax not reached
* failed operations due to TEMPORARY erros
*
* Exit loop;
* retyrMax reached
* Permanent error (return -1)
*/
while (true)
{
if (retryAttempt >= retryMax)
{
std::cout << "ERROR: has retried this operation " << retryAttempt
<< " times, failing!" << std::endl;
return -1;
}
myTrans = myNdb->startTransaction();
if (myTrans == NULL)
{
const NdbError err = myNdb->getNdbError();
if (err.status == NdbError::TemporaryError)
{
milliSleep(50);
retryAttempt++;
continue;
}
std::cout << err.message << std::endl;
return -1;
}
/**
* Get a scan operation.
*/
myScanOp = myTrans->getNdbScanOperation("GARAGE");
if (myScanOp == NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define a result set for the scan.
*/
NdbResultSet * rs = myScanOp->readTuplesExclusive(parallelism);
if( rs == 0 ) {
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Use NdbScanFilter to define a search critera
*/
NdbScanFilter filter(myScanOp) ;
if(filter.begin(NdbScanFilter::AND) < 0 ||
filter.eq(update_column, before_color, column_len, false) <0||
filter.end() <0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Start scan (NoCommit since we are only reading at this stage);
*/
if(myTrans->execute(NoCommit) != 0){
err = myTrans->getNdbError();
if(err.status == NdbError::TemporaryError){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
std::cout << myTrans->getNdbError().code << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define an update operation
*/
NdbOperation * myUpdateOp;
/**
* start of loop: nextResult(true) means that "parallelism" number of
* rows are fetched from NDB and cached in NDBAPI
*/
while((check = rs->nextResult(true)) == 0){
do {
/**
* Get update operation
*/
myUpdateOp = rs->updateTuple();
if (myUpdateOp == 0){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
updatedRows++;
/**
* do the update
*/
myUpdateOp->setValue(update_column,after_color);
/**
* nextResult(false) means that the records
* cached in the NDBAPI are modified before
* fetching more rows from NDB.
*/
} while((check = rs->nextResult(false)) == 0);
/**
* Commit when all cached tuple have been updated
*/
if(check != -1){
check = myTrans->execute(Commit);
myTrans->releaseCompletedOperations();
}
/**
* Check for errors
*/
err = myTrans->getNdbError();
if(check == -1){
if(err.status == NdbError::TemporaryError){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
}
/**
* End of loop
*/
}
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return 0;
}
if(myTrans!=0) {
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
}
return -1;
}
int scan_print(Ndb * myNdb, int parallelism,
int column_len_brand,
int column_len_color)
{
// Scan all records exclusive and update
// them one by one
int retryAttempt = 0;
const int retryMax = 10;
int fetchedRows = 0;
int check;
NdbError err;
NdbConnection *myTrans;
NdbScanOperation *myScanOp;
/* Result of reading attribute value, three columns:
REG_NO, BRAND, and COLOR
*/
NdbRecAttr * myRecAttr[3];
/**
* Loop as long as :
* retryMax not reached
* failed operations due to TEMPORARY erros
*
* Exit loop;
* retyrMax reached
* Permanent error (return -1)
*/
while (true)
{
if (retryAttempt >= retryMax)
{
std::cout << "ERROR: has retried this operation " << retryAttempt
<< " times, failing!" << std::endl;
return -1;
}
myTrans = myNdb->startTransaction();
if (myTrans == NULL)
{
const NdbError err = myNdb->getNdbError();
if (err.status == NdbError::TemporaryError)
{
milliSleep(50);
retryAttempt++;
continue;
}
std::cout << err.message << std::endl;
return -1;
}
/*
* Define a scan operation.
* NDBAPI.
*/
myScanOp = myTrans->getNdbScanOperation("GARAGE");
if (myScanOp == NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define a result set for the scan.
*/
NdbResultSet * rs = myScanOp->readTuplesExclusive(parallelism);
if( rs == 0 ) {
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define storage for fetched attributes.
* E.g., the resulting attributes of executing
* myOp->getValue("REG_NO") is placed in myRecAttr[0].
* No data exists in myRecAttr until transaction has commited!
*/
myRecAttr[0] = myScanOp->getValue("REG_NO");
myRecAttr[1] = myScanOp->getValue("BRAND");
myRecAttr[2] = myScanOp->getValue("COLOR");
if(myRecAttr[0] ==NULL || myRecAttr[1] == NULL || myRecAttr[2]==NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Start scan (NoCommit since we are only reading at this stage);
*/
if(myTrans->execute(NoCommit) != 0){
err = myTrans->getNdbError();
if(err.status == NdbError::TemporaryError){
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
std::cout << err.code << std::endl;
std::cout << myTrans->getNdbError().code << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* start of loop: nextResult(true) means that "parallelism" number of
* rows are fetched from NDB and cached in NDBAPI
*/
while((check = rs->nextResult(true)) == 0){
do {
fetchedRows++;
/**
* print REG_NO unsigned int
*/
std::cout << myRecAttr[0]->u_32_value() << "\t";
char * buf_brand = new char[column_len_brand+1];
char * buf_color = new char[column_len_color+1];
/**
* print BRAND character string
*/
memcpy(buf_brand, myRecAttr[1]->aRef(), column_len_brand);
buf_brand[column_len_brand] = 0;
std::cout << buf_brand << "\t";
delete [] buf_brand;
/**
* print COLOR character string
*/
memcpy(buf_color, myRecAttr[2]->aRef(), column_len_color);
buf_brand[column_len_color] = 0;
std::cout << buf_color << std::endl;
delete [] buf_color;
/**
* nextResult(false) means that the records
* cached in the NDBAPI are modified before
* fetching more rows from NDB.
*/
} while((check = rs->nextResult(false)) == 0);
}
myNdb->closeTransaction(myTrans);
return 1;
}
return -1;
}
int main()
{
Ndb* myNdb = new Ndb( "TEST_DB" ); // Object representing the database
/*******************************************
* Initialize NDB and wait until its ready *
*******************************************/
if (myNdb->init(1024) == -1) { // Set max 1024 parallel transactions
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
std::cout << "NDB was not ready within 30 secs." << std::endl;
exit(-1);
}
create_table(myNdb);
NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
int column_color = myDict->getTable("GARAGE")->getColumn("COLOR")->getColumnNo();
int column_len_color =
myDict->getTable("GARAGE")->getColumn("COLOR")->getLength();
int column_len_brand =
myDict->getTable("GARAGE")->getColumn("BRAND")->getLength();
int parallelism = 16;
if(populate(myNdb) > 0)
std::cout << "populate: Success!" << std::endl;
if(scan_print(myNdb, parallelism, column_len_brand, column_len_color) > 0)
std::cout << "scan_print: Success!" << std::endl << std::endl;
std::cout << "Going to delete all pink cars!" << std::endl;
if(scan_delete(myNdb, parallelism, column_color,
column_len_color, "Pink") > 0)
std::cout << "scan_delete: Success!" << std::endl << std::endl;
if(scan_print(myNdb, parallelism, column_len_brand, column_len_color) > 0)
std::cout << "scan_print: Success!" << std::endl << std::endl;
std::cout << "Going to update all blue cars to black cars!" << std::endl;
if(scan_update(myNdb, parallelism, column_len_color, column_color,
"COLOR", "Blue", "Black") > 0)
{
std::cout << "scan_update: Success!" << std::endl << std::endl;
}
if(scan_print(myNdb, parallelism, column_len_brand, column_len_color) > 0)
std::cout << "scan_print: Success!" << std::endl << std::endl;
delete myNdb;
}

View file

@ -0,0 +1,3 @@
1. Set NDB_OS in Makefile
2. Add path to libNDB_API.so in LD_LIBRARY_PATH
3. Set NDB_CONNECTSTRING

View file

@ -0,0 +1,33 @@
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#You need to set the NDB_OS variable here
TARGET = select_all
SRCS = select_all.cpp
OBJS = select_all.o
CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
DEBUG =
LFLAGS = -Wall
INCLUDE_DIR = ../../include
LIB_DIR = ../../lib
ifeq ($(NDB_OS), SOLARIS)
# Here is the definition of system libraries necessary for Solaris 7
SYS_LIB =
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB =
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB =
endif
$(TARGET): $(OBJS)
$(CXX) $(LFLAGS) -L$(LIB_DIR) $(OBJS) -lNDB_API $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
clean:
rm -f *.o $(TARGET)

View file

@ -0,0 +1,258 @@
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
//
// select_all.cpp: Prints all rows of a table
//
// Usage: select_all <table_name>+
#include <NdbApi.hpp>
// Used for cout
#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
#define APIERROR(error) \
{ cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \
<< error.code << ", msg: " << error.message << "." << endl; \
exit(-1); }
void usage(const char* prg) {
cout << "Usage: " << prg << " <table name>" << endl;
cout << "Prints all rows of table named <table name>" << endl;
exit(0);
}
/*****************************************************************************
*************************** Result Set Container ****************************
*****************************************************************************/
/*
* Container of NdbRecAttr objects.
* (NdbRecAttr objects are database rows read by a scan operation.)
*/
class ResultSetContainer {
public:
/**
* Initialize ResultSetContainer object for table named <tableName>
* - Allocates memory
* - Fetches attribute names from NDB Cluster
*/
void init(NdbDictionary::Dictionary* dict, const char* tableName);
/**
* Get no of attributes for stored NdbRecAttr objects
*/
int getNoOfAttributes() const;
/**
* Get NdbRecAttr object no i
*/
NdbRecAttr* & getAttrStore(int i);
/**
* Get attribute name of attribute no i
*/
const char* getAttrName(int i) const;
/**
* Print header of rows
*/
void header() const;
private:
int m_cols; // No of attributes for stored NdbRecAttr objects
char **m_names; // Names of attributes
NdbRecAttr **m_data; // The actual stored NdbRecAttr objects
};
void ResultSetContainer::init(NdbDictionary::Dictionary * dict,
const char* tableName)
{
// Get Table object from NDB (this contains metadata about all tables)
const NdbDictionary::Table * tab = dict->getTable(tableName);
// Get table id of the table we are interested in
if (tab == 0) APIERROR(dict->getNdbError()); // E.g. table didn't exist
// Get no of attributes and allocate memory
m_cols = tab->getNoOfColumns();
m_names = new char* [m_cols];
m_data = new NdbRecAttr* [m_cols];
// Store all attribute names for the table
for (int i = 0; i < m_cols; i++) {
m_names[i] = new char[255];
snprintf(m_names[i], 255, "%s", tab->getColumn(i)->getName());
}
}
int ResultSetContainer::getNoOfAttributes() const {return m_cols;}
NdbRecAttr*& ResultSetContainer::getAttrStore(int i) {return m_data[i];}
const char* ResultSetContainer::getAttrName(int i) const {return m_names[i];}
/*****************************************************************************
********************************** MAIN ***********************************
*****************************************************************************/
int main(int argc, const char** argv)
{
Ndb* myNdb = new Ndb("ndbapi_example4"); // Object representing the database
NdbConnection* myNdbConnection; // For transactions
NdbOperation* myNdbOperation; // For operations
int check;
if (argc != 2) {
usage(argv[0]);
exit(0);
}
const char* tableName = argv[1];
/*******************************************
* Initialize NDB and wait until its ready *
*******************************************/
if (myNdb->init() == -1) {
APIERROR(myNdb->getNdbError());
exit(-1);
}
if (myNdb->waitUntilReady(30) != 0) {
cout << "NDB was not ready within 30 secs." << endl;
exit(-1);
}
/***************************
* Define and execute scan *
***************************/
cout << "Select * from " << tableName << endl;
ResultSetContainer * container = new ResultSetContainer;
container->init(myNdb->getDictionary(), tableName);
myNdbConnection = myNdb->startTransaction();
if (myNdbConnection == NULL) APIERROR(myNdb->getNdbError());
myNdbOperation = myNdbConnection->getNdbOperation(tableName);
if (myNdbOperation == NULL) APIERROR(myNdbConnection->getNdbError());
// Define the operation to be an 'openScanRead' operation.
check = myNdbOperation->openScanRead(1);
if (check == -1) APIERROR(myNdbConnection->getNdbError());
// Set interpreted program to just be the single instruction
// 'interpret_exit_ok'. (This approves all rows of the table.)
if (myNdbOperation->interpret_exit_ok() == -1)
APIERROR(myNdbConnection->getNdbError());
// Get all attribute values of the row
for(int i = 0; i < container->getNoOfAttributes(); i++){
if((container->getAttrStore(i) =
myNdbOperation->getValue(container->getAttrName(i))) == 0)
APIERROR(myNdbConnection->getNdbError());
}
// Execute scan operation
check = myNdbConnection->executeScan();
if (check == -1) APIERROR(myNdbConnection->getNdbError());
/****************
* Print header *
****************/
for (int i = 0; i < container->getNoOfAttributes(); i++)
cout << container->getAttrName(i) << "\t";
cout << endl;
for (int i = 0; i < container->getNoOfAttributes(); i++) {
for (int j = strlen(container->getAttrName(i)); j > 0; j--)
cout << "-";
cout << "\t";
}
cout << "\n";
/**************
* Scan table *
**************/
int eof;
int rows = 0;
// Print all rows of table
while ((eof = myNdbConnection->nextScanResult()) == 0) {
rows++;
for (int i = 0; i < container->getNoOfAttributes(); i++) {
if (container->getAttrStore(i)->isNULL()) {
cout << "NULL";
} else {
// Element size of value (No of bits per element in attribute value)
const int size = container->getAttrStore(i)->attrSize();
// No of elements in an array attribute (Is 1 if non-array attribute)
const int aSize = container->getAttrStore(i)->arraySize();
switch(container->getAttrStore(i)->attrType()){
case UnSigned:
switch(size) {
case 8: cout << container->getAttrStore(i)->u_64_value(); break;
case 4: cout << container->getAttrStore(i)->u_32_value(); break;
case 2: cout << container->getAttrStore(i)->u_short_value(); break;
case 1: cout << (unsigned) container->getAttrStore(i)->u_char_value();
break;
default: cout << "Unknown size" << endl;
}
break;
case Signed:
switch(size) {
case 8: cout << container->getAttrStore(i)->int64_value(); break;
case 4: cout << container->getAttrStore(i)->int32_value(); break;
case 2: cout << container->getAttrStore(i)->short_value(); break;
case 1: cout << (int) container->getAttrStore(i)->char_value(); break;
default: cout << "Unknown size" << endl;
}
break;
case String:
{
char* buf = new char[aSize+1];
memcpy(buf, container->getAttrStore(i)->aRef(), aSize);
buf[aSize] = 0;
cout << buf;
delete [] buf;
}
break;
case Float:
cout << container->getAttrStore(i)->float_value();
break;
default:
cout << "Unknown";
break;
}
}
cout << "\t";
}
cout << endl;
}
if (eof == -1) APIERROR(myNdbConnection->getNdbError());
myNdb->closeTransaction(myNdbConnection);
cout << "Selected " << rows << " rows." << endl;
}

BIN
ndb/home/bin/Linuxmkisofs Executable file

Binary file not shown.

BIN
ndb/home/bin/Solarismkisofs Executable file

Binary file not shown.

1865
ndb/home/bin/cvs2cl.pl Executable file

File diff suppressed because it is too large Load diff

569
ndb/home/bin/cvschk Executable file
View file

@ -0,0 +1,569 @@
#!/usr/bin/perl -w
#
# cvschk -- fast offline check for new files and modifications of files
# cvschk : A perl program which checks the status of the CVS controlled
# files and gives an ASCII table sorted after the status of files.
#
# If you have used CVS, then you know that it is hard to
# get a good overview the CVS-status of the files in you
# directories. Any new files? Any files changes?
# cvschk will help the programmer get the overview in the
# situation, where we do not have access to the CVS repository.
#
# Note that the program does only local checks of the files
# If you have fast access to the CVS repositiory, then consider
# the cvsstat-program - which additionally can tell if other
# people have made newer versions of the files.
#
# The program requires Perl 5.004 (maybe previous versions also work).
#
# It is tuned to parse the output of cvs(1) version 1.9.
# Earlier and later versions may require modifications to the script.
#
# ** Note that the first line might be wrong depending **
# ** on the location of your perl program. **
#
# Sample output:
# The directory ./mytempdir is not under CVS control
#
# Changed files
# ---------------
# ./cvs2html
# ./cvschk
# ./cvsstat
#
# New files
# ---------------
# ./.#cvschk
# ./XX
# ./cvs2html.ok
#
# Deleted files
# ---------------
# (none)
# Changelog:
#
# Ver Date Author Changelog
# --- ---------- -------------------- -------------------------------------
# 1.12 2002-01-04 Michael Kohne Fixed a $foo=<> warning for
# 5.004_01 with defined($foo=<>)
# Added a --tabular|-t switch
#
# 1.11 2001-12-27 Michael Kohne Added cvsignore functionality
# Handling of 'dummy timestamp'
# Handling of 'Result of Merge'
#
# 1.10 2001-11-06 Michael Kohne Added -r and -l options
#
# 1.9 2001-08-03 Lars G. T. Jørgensen Hack to allow special entry-line
#
# 1.8 2001-06-07 Peter Toft Back to the same as 1.6
# CVS is my friend
#
# 1.7 2001-06-04 Peter Toft Peter was very tired and
# applied a wrong patch -
# version 1.7 is crap
#
# 1.6 2000-12-17 Peter Toft Better description added
#
# 1.5 2000-11-04 Peter Toft URL of cvsstat changed
#
# 1.4 2000-09-20 Peter Toft Must show deleted files also
# as the default
#
# 1.3 2000-08-08 Ole Tange and Initial version
# Peter Toft
# ---- ---------- -------------------- -------------------------------------
#
# -----------------------------------------------------------------------------
#
# This program is protected by the GPL, and all modifications of
# general interest should be emailed to the maintainer (pto@sslug.dk).
#
# This program also uses code parts from cvsstat
# (same homepage as cvschk)
#
# Copyright 2000,2001 by Peter Toft <pto@sslug.dk> and Ole Tange <ole@tange.dk>
# as well as
# Lars G. T. Jørgensen <larsj@diku.dk>
#
# The URL of the home page of cvschk is shown below.
use Time::Local;
use strict;
use Getopt::Long;
my $startdir = ".";
my $debug = 0;
my (%files,%filesok,%seen,%skip);
# Michael Kohne 12/16/01
#
# Simulation of .cvsignore as CVS does it...
#
# using .cvsignore handling makes cvschk take from 2 to 3 times
# longer to run over the same set of files.
# in my tests, disabling cvsignore altogether, cvschk takes .2
# seconds on my working directory. Adding cvsignore,takes
# .4 seconds.
# Note that I do not use individual .cvsignore files - if there
# are a lot of them in your directory tree, it will add run time
#
# variables used for .cvsignore handling
my $initcvsignoreregex;# regex holding all startup cvsignore pattersn (no ())
my $cvsignoreregex;# one regex holding all current cvsignore patterns
my $disable_cvsignore=0;# set to 1 to disable cvsignore emulation
# (available in case it's REALLY screwed up)
my $disable_ind_cvsignore=0;# set to 1 to disable finding .cvsignore files
# in each directory.
my $debug_cvsignore = 0; # For debugging .cvsignore problems
my %mon;
@mon{qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)}=
0..11; # Perl months are 0 .. 11
my ($version) = ('$Revision: 1.12 $ ' =~ /^\$\w+: (.*) \$ $/);
my $URL = "http://cvs.sslug.dk/cvs2html";
my $version_line = "cvschk version $version (see $URL)\n";
my $opt_all;
my $restrict;
my $local;
my $tabular;
my $opt_restrict;
sub show_version {print $version_line}
sub die_version {die $version_line}
sub die_usage {
my $bundled = ($] > 5.00399
? "can be bundled"
: "can't be bundled, because your Perl is too old");
die <<END_OF_USAGE; # Help in the style of GNU `ls --help' or `make --help'
Usage: $0 [OPTION]...
Show the CVS status of FILEs (the current directory by default),
traversing directories recursively and telling if new files exist
in the repository.
Options:
-a, --all Show all statistics, including the names of files that
are up to date, used tags, ignored patterns and more
-r, --restrict Don't show the names of the unknown files
(useful if you have many temporary files)
-t, --tabular Show one file per line, each preceeded with a status word,
Sorted by filename.
-l, --local Don't descend into sub-directories
-d, --debug Debug info
-h, --help Show this help end exit immediately
-V, --version Show the version line and exit immediately
The one-letter options $bundled.
END_OF_USAGE
}
sub die_help {show_version; die_usage}
# Let `-ar' mean `-a -r' and require `--all' (or -a) instead of `-all'.
if ($] > 5.00399) { # This requires 5.004, so silently skip it for older Perls.
eval {Getopt::Long::config("bundling")}; # avoid 5.003 compilation error
warn $@ if $@; # For Perl 5.004+ we do want to see any compilation error
}
GetOptions( "all|a" => \$opt_all,
"tabular|t" => \$tabular,
"restrict|r" => \$restrict,
"local|l" => \$local,
"help|h" => \&die_help,
"debug|d" => \$debug,
"version|V" => \&die_version,
) or die_usage;
sub cvs_changed_in_dir($); #define prototype (for recursion)
# functions for .cvsignore handling
# converts a given filename pattern
# (of the sort that sh(1) takes) to
# a perl regex of similar meaning.
#
# It works by doing the following:
#
# change:
# . to \.
# $ to \$
# * to .*
# ? to .
#
sub fpat_to_regex($)
{
my $fexp;
$fexp = shift;
$fexp =~ s/\./\\\./g;#change . to \.
$fexp =~ s/\$/\\\$/g;#change dollar sign to \dollar sign
$fexp =~ s/\*/.*/g;# change * to .*
$fexp =~ s/\?/./g; # change ? to .
return $fexp;
}
# copy the input list to one single regex,
# items seperated by | symbols.
# return the regex string
sub do_regex_convert
{
my $rx = "";
my $first = 1;#true for first element only
# convert each element of cvsignore into a regex
# this makes the patterns usable in perl
my $cp;
foreach $cp (@_) {
if (not $first) { $rx = $rx . "|"; }
if ($first) { $first = 0; }
$rx = $rx . fpat_to_regex($cp);
}
return $rx;
}
# first parameter is a reference to the array
# to be loaded
# the rest of the parameters are just items
# that need to be loaded into the array.
# Note that if a ! is found, the list is
# emptied, then further items are added.
# returns true if a ! was found
sub load_list_from_list
{
my $arref = shift;# get reference to array from front
my $item;
my $ret=0;#false means no ! found
chomp @_;#kill newlines
foreach $item (@_) {
$item =~ s/^\s*(.*?)\s*$/$1/;#kill leading/trailing whitespace
if ($item) { # empty string is false
push @$arref,$item;
}
if ($item eq "!") {
@$arref = ();# '!' causes list to clear
$ret = 1;# ! found
}
}
return $ret;
}
# loads the given list with lines from the
# specified file. Note that if a '!' is found
# all prior patterns are removed from the list
# before the following patterns are loaded
# first param is the filename,
# second param is a reference to an array
# that the data is to go into
# returns true if a ! was found
sub load_list_from_file
{
my @inlist;
my $fname = shift;#filename to read from
#if (not -e $fname) { return; }
my $arref = shift;#array to store into
open CVSIGNORE,"$fname" or return;#file might not exist, that's OK
@inlist = <CVSIGNORE>;
close CVSIGNORE;
return load_list_from_list($arref,@inlist);
}
# loads $cvsignoreregex from
# $initcvsignoreregex and the .cvsignore file
# in the local directory
sub load_cvsignore
{
if ($disable_ind_cvsignore) {return;}#don't look for local .cvsignore files
if ($disable_cvsignore) {return;}#don't do anything
my $dir = shift;
my @cvsignore;
# bang will be true if a ! was found. In such cases, I need
# to not use the pre-exisitng regex list.
my $bang = load_list_from_file("$dir/.cvsignore",\@cvsignore);
# if we get a local cvsignore list, then...
my $rx = do_regex_convert(@cvsignore);
if ($rx) {
$cvsignoreregex = "(";
if (not $bang) {$cvsignoreregex = $cvsignoreregex . $initcvsignoreregex . "|";}
$cvsignoreregex = $cvsignoreregex . $rx . ")";
} else {
if ($bang) {$cvsignoreregex = "";}
else {$cvsignoreregex = "(" . $initcvsignoreregex . ")";}
}
if ($debug_cvsignore) {print $dir,":",$cvsignoreregex, "\n";}
}
# loads all of the cvsignore patterns that
# can be loaded at script startup
sub load_initial_cvsignore()
{
#load the default patterns
# (taken from http://www.gnu.org/manual/cvs-1.9/html_node/cvs_141.html#IDX399)
#
# this gives you the patterns that cvs normally starts with
my @initcvsignore;
push @initcvsignore,("RCS");
push @initcvsignore,("SCCS");
push @initcvsignore,("CVS");
push @initcvsignore,("CVS.adm");
push @initcvsignore,("RCSLOG");
push @initcvsignore,("cvslog.*");
push @initcvsignore,("tags");
push @initcvsignore,("TAGS");
push @initcvsignore,(".make.state");
push @initcvsignore,(".nse_depinfo");
push @initcvsignore,("*~");
push @initcvsignore,("\#*");
push @initcvsignore,(".\#*");
push @initcvsignore,("\,*");
push @initcvsignore,("_\$\*");
push @initcvsignore,("*\$");
push @initcvsignore,("*.old");
push @initcvsignore,("*.bak");
push @initcvsignore,("*.BAK");
push @initcvsignore,("*.orig");
push @initcvsignore,("*.rej");
push @initcvsignore,(".del-*");
push @initcvsignore,("*.a");
push @initcvsignore,("*.olb");
push @initcvsignore,("*.o");
push @initcvsignore,("*.obj");
push @initcvsignore,("*.so");
push @initcvsignore,("*.exe");
push @initcvsignore,("*.Z");
push @initcvsignore,("*.elc");
push @initcvsignore,("*.ln");
push @initcvsignore,("core");
# now, load (in proper order!)
# each of the possible cvsignore files
# there are 4 possible .cvsignore files:
# $CVSROOT/CVSROOT/cvsignore
# ~/.cvsignore
# $CVSIGNORE environment variable
# .cvsignore in current directory
# The first (CVSROOT/cvsignore) would require calling cvs, so
# we won't do that one.
# The last (.cvsignore in current directory) is done
# for each directory. It's handled in the load_cvsignore routine.
# ~/.cvsignore
my @inlist;
my $item;
my $HOME=$ENV{"HOME"};
if (not $HOME) {$HOME = ".";}
load_list_from_file("$HOME/.cvsignore",\@initcvsignore);
# $CVSIGNORE environment variable
my $igstr = $ENV{"CVSIGNORE"}; # get env var
if ($igstr) {
my @iglist = split(/\s+/, $igstr); #if it exists, convert to list
load_list_from_list(\@initcvsignore,@iglist);
}
# now that @initcvsignore is setup,
# turn it into a regex string
$initcvsignoreregex = do_regex_convert(@initcvsignore);
# now preset the cvsignore regex string to match
# @initcvsignore. That way, if we aren't using local
# cvsignore files, we do nothing.
$cvsignoreregex = "(" . $initcvsignoreregex . ")";
}
# routine to see if the given name is in the cvsignore regex
# returns true if it is, false if it's not
sub ignore_file($)
{
#allow user to disable the cvsignore stuff
if ($disable_cvsignore) {return 0;}
if (not $cvsignoreregex) {return 0;}# if regex is empty, nothing matches the regex
my $filename = shift;
if ($debug_cvsignore) {print "ignore_file:",$filename,"\n";}
if ($filename =~ $cvsignoreregex) {
if ($debug_cvsignore) {print $filename," matches\n";}
return 1;
}
if ($debug_cvsignore) {print $filename," doesn't match\n";}
return 0;
}
sub cvs_changed_in_dir($) {
my $dir = shift;
my ($line,$filename,$version,$mtime,$date,
$dir_filename,$cvstime,@subdirs,
@new_in_dir,$i);
# Examine status of files in CVS/Entries
if(not open(ENTRIES,"$dir/CVS/Entries")) {
if ($tabular) {
push @{$files{Unknown}}, $dir;
}
else {
warn "The directory $dir is not under CVS control\n";
}
} else {
load_cvsignore($dir);#load up proper cvsignore for given directory
while(defined ($line=<ENTRIES>)) {
# Parse CVS/Entries-line
$line=~m!^/(.*)/(.*)/(.*)/.*/! or do {
$debug and warn("Skipping entry-line $line");
next;
};
($filename,$version,$date) = ($1,$2,$3);
$dir_filename=$dir."/".$filename;
# Mark this file as seen
$seen{$dir_filename}=1;
# if not exists: Deleted
if(not -e $dir_filename) {
push @{$files{Deleted}}, $dir_filename; next;
}
# if dir: save name for recursion
-d $dir_filename and do {
push @subdirs, $dir_filename; next;
};
# modification time of $dir_filename
$mtime= (stat $dir_filename)[9];
if($date eq "dummy timestamp") {
# dummy timestamp means it's new to the repository.
push @{$files{Changed}}, $dir_filename;
if ($debug) {
print "$dir_filename is changed\n";
}
}
elsif($date eq "Result of merge") {
# result of merge means it's changed, then updated.
push @{$files{Changed}}, $dir_filename;
if ($debug) {
print "$dir_filename is changed\n";
}
}
elsif(not
$date=~/... (...)\s+(\d+)\s+(\d+):(\d+):(\d+) (\d{4})/)
{
#bogus entry in Entires
warn "Warning: $dir_filename -> '$date' ".
"not in ctime(3) format\n";
} else {
$cvstime=timegm($5,$4,$3,$2,$mon{$1},$6);
if($cvstime != $mtime) {
push @{$files{Changed}}, $dir_filename;
if ($debug) {
print "$dir_filename is changed\n";
}
} else {
push @{$files{Unchanged}}, $dir_filename;
if ($debug) {
print "$dir_filename is Unchanged\n";
}
}
}
}
close ENTRIES;
# Locate any new files/dirs
if(not opendir(D,$dir)) {
warn("Cannot open $dir");
@new_in_dir= ();
} else {
@skip{qw(. .. CVS)}=1..3; # Filenames that that we want to ignore
#(note: these are exact filenames)
@new_in_dir=
(grep { not $seen{$_} } # files we have not already processed
map { $dir."/".$_ } # map from file to dir/file
grep { not ignore_file($_) } # ignore files in the cvsignore list
grep { not $skip{$_} } # skip files to be ignored
readdir(D));
closedir(D);
}
# Remember new files (actually non-directories)
push @{$files{New}}, grep { not -d $_ } @new_in_dir;
if ($debug) { print "@{$files{New}} are new in $dir\n"; }
# Remember new subdirs
push @subdirs, grep { -d $_ } @new_in_dir;
# Recurse all subdirs
if (not $local) {
for $i (@subdirs) { cvs_changed_in_dir($i); }
}
}
}
sub print_status()
{
my $k;
my %show_these_states = ("Changed" => 1);
if(not $restrict) {
$show_these_states{"New"} = 1;
$show_these_states{"Deleted"} = 1;
}
if($opt_all) { $show_these_states{"Unchanged"} = 1; }
if ($tabular) {
my %allfiles; # key: filesname, value: state
my ($file, $state, $statefiles);
$show_these_states{"Unknown"} = 1;
while (($state, $statefiles) = each %files) {
for my $f (@{$statefiles}) {
$allfiles{$f} = $state;
}
}
for $file (sort keys %allfiles) {
$state = $allfiles{$file};
printf("%-10s %s\n", $state, $file) if $show_these_states{$state};
}
}
else {
print "\n";
for $k (keys %show_these_states) {
if(not $files{$k} or not @{$files{$k}}) {
# no files
$files{$k}=["(none)"];
}
print("$k files\n",
"---------------\n",
map { "$_\n" } sort @{$files{$k}});
print "\n";
}
}
}
load_initial_cvsignore();
if ($debug_cvsignore) {print "initial regex:",$cvsignoreregex,"\n";}
cvs_changed_in_dir($startdir);
print_status();

17
ndb/home/bin/fix-cvs-root Executable file
View file

@ -0,0 +1,17 @@
#! /bin/sh
# change all CVS/Root to current CVSROOT
[ "$CVSROOT" ] || { echo "no CVSROOT in environment" >&2; exit 1; }
echo "changing all CVS/Root files under `pwd`"
sleep 1
find . -path '*/CVS/Root' -print |
while read file; do
echo "$file"
chmod +w $file || exit 1
echo $CVSROOT >$file || exit 1
done
echo "done"

158
ndb/home/bin/import-from-bk.sh Executable file
View file

@ -0,0 +1,158 @@
#! /bin/sh
# XXX does not delete files
# XXX does not handle nested new dirs
# this script screams for perl, no time now
# look for bk2cvs on the net
PATH=/usr/local/bin:$PATH; export PATH
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
batch=n
if [ "$1" = "-batch" ]; then
batch=y
shift
fi
say() {
echo "$*"
}
die() {
case $# in
0) set -- "command failed" ;;
esac
say "$* -- aborted" >&2
exit 1
}
usage() {
die "usage: $0 [-batch] top -- copy from mysql/ndb to another NDB_TOP"
}
doit() {
cmd="$*"
if [ $batch = n ]; then
echo -n "$cmd [y]"
read junk
sh -c "$cmd"
return 0
else
echo "$cmd"
sh -c "$cmd"
return $?
fi
}
say "======================"
say "`date`"
case $# in
1) [ -d $1/src/CVS ] || die "$1 is not an NDB_TOP"
top=$1 ;;
*) usage ;;
esac
if ! fgrep ndb_kernel_version.h $top/include/kernel/CVS/Entries >/dev/null 2>&1; then
die "$top is not an NDB_TOP"
fi
if find $top -path '*/CVS/Tag' -print | grep . >/dev/null; then
die "$top: contains CVS/Tag files, not accepted"
fi
if [ ! -f include/SCCS/s.ndb_version.h ]; then
die "current dir ($PWD) is not an NDB_TOP"
fi
doit "bk pull" || exit 1
doit "bk -r clean"
doit "bk -r get -q"
files=`bk -r. sfiles -g |
fgrep -v ' ' |
fgrep -v /.cvsignore`
n=0
files2=
for f in $files; do
if [ ! -f $f ]; then
die "$f: no such file"
fi
if [ -w $f ]; then
say "$f: is writable, accept anyway"
fi
files2="$files2 $f"
n=$((n+1))
done
files=$files2
say "$n files..."
adddirs= addfiles= updfiles=
for f in $files; do
d=`dirname $f`
b=`basename $f`
if [ ! -f $top/$d/CVS/Entries ]; then
found=n
for x in $adddirs; do
if [ $x = $d ]; then found=y; break; fi
done
if [ $found = n ]; then
say "$d: to create dir"
adddirs="$adddirs $d"
fi
addfiles="$addfiles $f"
say "$f: to create"
elif ! fgrep "/$b/" $top/$d/CVS/Entries >/dev/null; then
addfiles="$addfiles $f"
say "$f: to create"
else
cmp $f $top/$f >/dev/null
case $? in
0) continue ;;
1) ;;
*) die "$f: unknown error" ;;
esac
updfiles="$updfiles $f"
say "$f: to update"
fi
done
for d in $adddirs; do
doit "cd $top && mkdir -p $d" || die
done
for f in $addfiles $updfiles; do
doit "cp -fp $f $top/$f" || die
done
for d in $adddirs; do
# fix 1 level up
d2=`dirname $d`
if [ ! -d $top/$d2/CVS ]; then
doit "cd $top && cvs add $d2" || die
fi
doit "cd $top && cvs add $d" || die
done
for f in $addfiles; do
kb=
if echo $f | perl -nle "print(-B $_)" | grep 1 >/dev/null; then
kb="-kb"
fi
doit "cd $top && cvs add $kb $f" || die
done
tag=import_bk_`date +%Y_%m_%d`
doit "cd $top && cvs commit -m $tag" || die
doit "cd $top && cvs tag -F $tag" || die
env="NDB_TOP=$top; export NDB_TOP"
env="$env; USER_FLAGS='-DAPI_TRACE -fmessage-length=0'; export USER_FLAGS"
doit "$env; cd $top && ./configure"
doit "$env; cd $top && sh config/GuessConfig.sh"
doit "$env; cd $top && make clean nuke-deps vim-tags"
doit "$env; cd $top && make" || die
say "imported ok"

27
ndb/home/bin/ndb_deploy Executable file
View file

@ -0,0 +1,27 @@
#!/bin/sh
if [ $# -eq 0 ]
then
for i in $DEPLOY_DST
do
rsync -r -v --exclude '*.a' $NDB_TOP/bin $NDB_TOP/lib $i/
done
else
while [ $# -gt 0 ]
do
arg=$1
shift;
if [ `echo $arg | grep -c lib` -eq 0 ]
then
dst=bin/
else
dst=lib/
fi
for i in $DEPLOY_DST
do
rsync -v $arg $i/$dst
done
done
fi

184
ndb/home/bin/ndbdoxy.pl Executable file
View file

@ -0,0 +1,184 @@
#!/usr/local/bin/perl
#
# ndbdoxy.pl Executes doxygen on a checked out version of NDB Cluster
#
# Written by Lars Thalmann, 2003.
use strict;
umask 000;
# -----------------------------------------------------------------------------
# Settings
# -----------------------------------------------------------------------------
my $root = "/home/elathal/public_html/cvsdoxy";
$ENV{LD_LIBRARY_PATH} = "/usr/local/lib:/opt/as/local/lib";
$ENV{LD_LIBRARY_PATH} = $ENV{LD_LIBRARY_PATH} . ":/opt/as/forte6/SUNWspro/lib";
$ENV{PATH} = $ENV{PATH} . ":/usr/local/bin:/opt/as/local/bin";
$ENV{PATH} = $ENV{PATH} . ":/opt/as/local/teTeX/bin/sparc-sun-solaris2.8";
my $DOXYGEN = "doxygen";
my $PDFLATEX = "pdflatex";
my $MAKEINDEX = "makeindex";
# -----------------------------------------------------------------------------
# Argument handling
# -----------------------------------------------------------------------------
if (@ARGV != 3) {
print<<END;
Usage:
ndbdoxy.pl <module> <title> <version>
where
<module> is cvsdoxy module to doxgenify
<title> is title of report
<version> is version of NDB Cluster
END
exit;
}
my $module = $ARGV[0];
my $title = $ARGV[1];
my $version = $ARGV[2];
my $destdir = ".";
# -----------------------------------------------------------------------------
# Execute Doxygen -g
# -----------------------------------------------------------------------------
if (-r "${root}/doxyfiles/${module}.doxyfile") {
system("cd ${destdir}; \
cp ${root}/doxyfiles/${module}.doxyfile Doxyfile");
} elsif (-r "${root}/doxyfiles/default.doxyfile") {
system("cd ${destdir}; \
cp ${root}/doxyfiles/default.doxyfile Doxyfile");
} else {
system("cd ${destdir}; $DOXYGEN -g");
}
# -----------------------------------------------------------------------------
# HTML Footer
# -----------------------------------------------------------------------------
if (-r "${root}/doxyfiles/htmlfooter") {
system("cd ${destdir}; \
cp ${root}/doxyfiles/htmlfooter footer.html");
open (INFILE, "< ${destdir}/footer.html")
or die "Error opening ${destdir}/footer.html.\n";
open (OUTFILE, "> ${destdir}/footer.html.new")
or die "Error opening ${destdir}/footer.html.new.\n";
while (<INFILE>) {
if (/(.*)DATE(.*)$/) {
print OUTFILE $1 . localtime() . $2;
} else {
print OUTFILE;
}
}
close INFILE;
close OUTFILE;
system("mv ${destdir}/footer.html.new ${destdir}/footer.html");
} else {
print("Warning: No ${root}/doxyfiles/${module}.htmlfooter");
}
# -----------------------------------------------------------------------------
# Execute Doxygen
# -----------------------------------------------------------------------------
system("cd ${destdir}; $DOXYGEN");
# -----------------------------------------------------------------------------
# Change a little in refman.tex
# -----------------------------------------------------------------------------
open (INFILE, "< ${destdir}/latex/refman.tex")
or die "Error opening ${destdir}/latex/refman.tex.\n";
open (OUTFILE, "> ${destdir}/latex/refman.tex.new")
or die "Error opening ${destdir}/latex/refman.tex.new.\n";
while (<INFILE>)
{
if (/(.*)Reference Manual(.*)$/) {
print OUTFILE $1 .
"\\mbox{}\\vspace{-3cm}\\mbox{}" .
"\\hrule\\bigskip\\bigskip\\bigskip\\bigskip" .
"\\Huge{" . $title . "}" . $2;
} elsif (/(.*)Generated by Doxygen 1.2.1[0-9](.*)$/) {
print OUTFILE $1 .
"\\begin{center}" .
"\\LARGE{MySQL AB}" .
"\\end{center}".
"\\hfill\\bigskip\\bigskip\\bigskip\\hrule" .
"\\bigskip\\bigskip\\bigskip\\bigskip\\bigskip" .
"\\bigskip\\bigskip\\bigskip\\bigskip\\bigskip" .
"\\bigskip\\bigskip NDB Cluster Release " . $version .
"\\bigskip\\bigskip\\bigskip\\bigskip\\bigskip\\hfill" .
$2;
} elsif (/\\chapter\{File Index\}/) {
print OUTFILE "\%\\chapter{File Index}\n";
} elsif (/\\input{files}/) {
print OUTFILE "\%\\input{files}\n";
} elsif (/\\chapter\{Page Index\}/) {
print OUTFILE "\%\\chapter{Page Index}\n";
} elsif (/\\input{pages}/) {
print OUTFILE "\%\\input{pages}\n";
} else {
print OUTFILE;
}
}
close INFILE;
close OUTFILE;
system("mv ${destdir}/latex/refman.tex.new ${destdir}/latex/refman.tex");
# -----------------------------------------------------------------------------
# Change a little in doxygen.sty
# -----------------------------------------------------------------------------
open (INFILE, "< ${destdir}/latex/doxygen.sty")
or die "Error opening INFILE.\n";
open (OUTFILE, "> ${destdir}/latex/doxygen.sty.new")
or die "Error opening OUTFILE.\n";
while (<INFILE>)
{
if (/\\rfoot/) {
print OUTFILE "\\rfoot[\\fancyplain{}{\\bfseries\\small \\copyright~Copyright 2003 MySQL AB\\hfill support-cluster\@mysql.com}]{}\n";
} elsif (/\\lfoot/) {
print OUTFILE "\\lfoot[]{\\fancyplain{}{\\bfseries\\small support-cluster\@mysql.com\\hfill \\copyright~Copyright 2003 MySQL AB}}\n";
} else {
print OUTFILE;
}
}
close INFILE;
close OUTFILE;
system("mv ${destdir}/latex/doxygen.sty.new ${destdir}/latex/doxygen.sty");
# -----------------------------------------------------------------------------
# Other
# -----------------------------------------------------------------------------
#system("cd ${root}/tmp/${module}; \
# mkdir html.tar; \
# cd html.tar; \
# cp -r ../html ${module}; \
# tar cf ${module}.html.tar ${module}; \
# /usr/local/bin/gzip ${module}.html.tar; \
# /bin/rm -rf ${root}/tmp/${module}/html.tar/${module}");
#system("cd ${destdir}/latex/; \
# $PDFLATEX refman.tex \
# $MAKEINDEX refman.idx \
# $PDFLATEX refman.tex \
# mv -f refman.pdf ${module}.pdf");
print<<END;
Execute:
latex refman; makeindex refman; latex refman
END

78
ndb/home/bin/ngcalc Executable file
View file

@ -0,0 +1,78 @@
#! /usr/local/bin/perl
use strict;
use Getopt::Long;
sub usage {
print <<END;
ngcalc -- calculate node groups and table fragments
usage: ngcalc [ options ] f1 f2 ...
-g num number of node groups (default 2)
-r num number of replicas (default 2)
-n list comma-separated list of db nodes (default 1,2,...)
fX number of fragments per node group in table X (e.g. 1,2,8)
(all replicas count as same fragment)
END
exit(1);
};
use vars qw($cnoOfNodeGroups $cnoReplicas $nodeArray);
$cnoOfNodeGroups = 2;
$cnoReplicas = 2;
GetOptions(
"g=i" => \$cnoOfNodeGroups,
"r=i" => \$cnoReplicas,
"n=s" => \$nodeArray,
) or &usage;
my @tableList = @ARGV;
$cnoOfNodeGroups > 0 or &usage;
$cnoReplicas > 0 or &usage;
if (! defined($nodeArray)) {
$nodeArray = join(',', 1..($cnoOfNodeGroups*$cnoReplicas));
}
$nodeArray =~ /^\d+(,\d+)*$/ or &usage;
my @nodeArray = split(/,/, $nodeArray);
@nodeArray == $cnoOfNodeGroups*$cnoReplicas or &usage;
my @nodeGroupRecord;
for (my $i = 0; $i < $cnoOfNodeGroups; $i++) {
my $rec = {};
my $nodes = [];
for (my $j = 0; $j < $cnoReplicas; $j++) {
push(@$nodes, $nodeArray[$i * $cnoReplicas + $j]);
}
$rec->{nodesInGroup} = $nodes;
$rec->{nodeCount} = $cnoReplicas;
$rec->{nextReplicaNode} = 0;
$nodeGroupRecord[$i] = $rec;
print "NG $i: ", join(" ", @{$rec->{nodesInGroup}}), "\n";
}
# see Dbdih::execCREATE_FRAGMENTATION_REQ
my $c_nextNodeGroup = 0;
for (my $t = 0; $t < @tableList; $t++) {
use integer;
my $f = $tableList[$t];
my $ng = $c_nextNodeGroup++;
$c_nextNodeGroup = 0 if $c_nextNodeGroup == $cnoOfNodeGroups;
my $noOfFragments = $f * $cnoOfNodeGroups;
my @fragments;
for (my $fragNo = 0; $fragNo < $noOfFragments; $fragNo++) {
my $rec = $nodeGroupRecord[$ng];
my $max = $rec->{nodeCount};
my $ind = $rec->{nextReplicaNode};
$rec->{nextReplicaNode} = ($ind + 1 >= $max ? 0 : $ind + 1);
for (my $replicaNo = 0; $replicaNo < $cnoReplicas; $replicaNo++) {
my $nodeId = $rec->{nodesInGroup}[$ind++];
push(@fragments, $nodeId);
$ind = ($ind == $max ? 0 : $ind);
}
$ng++;
$ng = ($ng == $cnoOfNodeGroups ? 0 : $ng);
}
printf "%02d %s\n", $t, join(" ", @fragments);
}

View file

@ -0,0 +1,102 @@
BEGIN{
PRINT=0;
SIGNAL_ARRAY[0]="";
BLOCK_ID=0;
SIGNAL_ID=-22;
}
{
SIGNAL_ARRAY[SIGNAL_ID]=SIGNAL_ID;
}
/^---- Send ----- Signal ----------------/ {
DIRECTION="S";
SENDER="";
SENDPROCESS="";
RECEIVER="";
RECPROCESS="";
SIGNAL="";
RECSIGID="?";
SIGID="?";
DELAY="N/A";
}
/^---- Send delay Signal/ {
DIRECTION="SD";
SENDER="";
SENDPROCESS="";
RECEIVER="";
RECPROCESS="";
SIGNAL="";
RECSIGID="?";
SIGID="?";
DELAY=$5;
LEN=length(DELAY);
DELAY=substr(DELAY,2,LEN);
}
/^---- Received - Signal ----------------/ {
DIRECTION="R";
SENDER="";
SENDPROCESS="";
RECEIVER="";
RECPROCESS="";
SIGNAL="";
RECSIGID="?";
SIGID="?";
DELAY="N/A";
}
/r.bn:/{
RECEIVER=$3;
RECPROCESS=$5;
if(DIRECTION == "R"){
SIGNAL=$10;
RECSIGID=$7;
}
else
SIGNAL=$8;
}
/s.bn:/{
SENDER=$3;
SIGID=$7;
if(SIGID == SIGNAL_ARRAY[SIGID]){
PRINT=1;
if(DIRECTION == "R"){
SIGNAL_ARRAY[RECSIGID]=RECSIGID;
};
}
SENDPROCESS=$5;
LEN=length(RECEIVER);
RECEIVER=substr(RECEIVER,2,LEN-3);
if(BLOCK_ID == "ALL" || RECEIVER==BLOCK_ID){PRINT=1; }
LEN=length(SENDER);
SENDER=substr(SENDER,2,LEN-3);
if(BLOCK_ID == "ALL" || SENDER == BLOCK_ID){ PRINT=1;}
LEN=length(SIGNAL);
SIGNAL=substr(SIGNAL,2,LEN-2);
LEN=length(SENDPROCESS);
SENDPROCESS=substr(SENDPROCESS,1,LEN-1);
LEN=length(RECPROCESS);
RECPROCESS=substr(RECPROCESS,1,LEN-1);
if( PRINT == 1){
print DIRECTION" "SENDPROCESS" "SENDER" "RECPROCESS" "RECEIVER" "SIGNAL" "SIGID" "RECSIGID" "DELAY;
}
PRINT=0;
}

View file

@ -0,0 +1,29 @@
BEGIN{
NAMES[""]="";
ORDER[0]="";
NUM=0;
}
{
if(NAMES[$2$3]!=$2$3){
NAMES[$2$3]=$2$3;
ORDER[NUM]=$2$3;
NUM++;
}
if(NAMES[$4$5]!=$4$5){
NAMES[$4$5]=$4$5;
ORDER[NUM]=$4$5;
NUM++;
}
}
END{
for(i=0; i<NUM; i++){
LIST=ORDER[i]" "LIST;
}
print LIST;
}

349
ndb/home/bin/signallog2html.sh Executable file
View file

@ -0,0 +1,349 @@
#!/bin/sh
# NAME
# signallog2html.sh
#
# SYNOPSIS
# signallog2html.sh [ -b <block_name | ALL> ] [ -s <signal_id> ] -f signal_log_file
#
# DESCRIPTION
# Creates a signal sequence diagram in HTML format that can be
# viewed from a web browser. The HTML file is created from a signal
# log file and it contains a big table with jpeg files in every
# table cell. Every row in the table is a signal. The block_name
# could be one of the following: CMVMI MISSRA NDBFS NDBCNTR DBACC
# DBDICT DBLQH DBDIH DBTC DBTUP QMGR ALL. The signal_id is a
# number. If no block_name or signal_id is given the default
# block_name "ALL" is used.
#
#
#
# OPTIONS
#
# EXAMPLES
#
#
# ENVIRONMENT
# NDB_PROJ_HOME Home dir for ndb
#
# FILES
# $NDB_PROJ_HOME/lib/funcs.sh General shell script functions.
# uniq_blocks.awk Creates a list of unique blocks
# in the signal_log_file.
# signallog2list.awk Creates a list file from the signal_log_file.
# empty.JPG Jpeg file, must exist in the HTML file
# directory for viewing.
# left_line.JPG
# line.JPG
# right_line.JPG
# self_line.JPG
#
#
# SEE ALSO
#
# DIAGNOSTICTS
#
# VERSION
# 1.0
#
# DATE
# 011029
#
# AUTHOR
# Jan Markborg
#
progname=`basename $0`
synopsis="signallog2html.sh [ -b <block_name | ALL> ] [ -s <signal_id> ] -f signal_log_file"
block_name=""
signal_id=""
verbose=yes
signal_log_file=""
: ${NDB_PROJ_HOME:?} # If undefined, exit with error message
: ${NDB_LOCAL_BUILD_OPTIONS:=--} # If undef, set to --. Keeps getopts happy.
# You may have to experiment a bit
# to get quoting right (if you need it).
. $NDB_PROJ_HOME/lib/funcs.sh # Load some good stuff
# defaults for options related variables
#
report_date=`date '+%Y-%m-%d'`
# Option parsing for the the command line.
#
while getopts f:b:s: i
do
case $i in
f) signal_log_file=$OPTARG;;
b) block_name=$OPTARG;;
s) signal_id=$OPTARG;;
\?) syndie ;; # print synopsis and exit
esac
done
# -- Verify
trace "Verifying signal_log_file $signal_log_file"
if [ x$signal_log_file = "x" ]
then
syndie "Invalid signal_log_file name: $signal_log_file not found"
fi
if [ ! -r $signal_log_file ]
then
syndie "Invalid signal_log_file name: $signal_log_file not found"
fi
if [ blocknameSET = 1 ]
then
trace "Verifying block_name"
case $block_name in
CMVMI| MISSRA| NDBFS| NDBCNTR| DBACC| DBDICT| DBLQH| DBDIH| DBTC| DBTUP| QMGR);;
ALL) trace "Signals to/from every block will be traced!";;
*) syndie "Unknown block name: $block_name";;
esac
fi
if [ block_name="" -a signal_id="" ]
then
block_name=ALL
trace "block_name = $block_name"
fi
trace "Arguments OK"
###
#
# General html functions
header(){
cat <<EOF
<html><head><title>$*</title></head>
<body>
EOF
}
footer(){
cat <<EOF
</body></html>
EOF
}
heading(){
h=$1; shift
cat <<EOF
<h$h>$*</h$h>
EOF
}
table(){
echo "<table $*>"
}
table_header(){
echo "<th>$*</th>"
}
end_table(){
echo "</table>"
}
row(){
echo "<tr>"
}
end_row(){
echo "</tr>"
}
c_column(){
cat <<EOF
<td valign=center align=center>$*</td>
EOF
}
bold(){
cat <<EOF
<b>$*</b>
EOF
}
column(){
cat <<EOF
<td align=left>$*</td>
EOF
}
para(){
cat <<EOF
<p></p>
EOF
}
hr(){
cat <<EOF
<hr>
EOF
}
img_column(){
cat <<EOF
<td><center><$* height=100% width=100%></center></td>
EOF
}
# Check the direction of arrow.
# arrowDirection(){ $columnarray $sendnode$sendblock $recnode$recblock
arrowDirection(){
if [ $2 = $3 ]
then
arrow=SELF
return;
else
for x in $1
do
if [ $x = $2 ]
then
arrow=RIGHT
break
elif [ $x = $3 ]
then
arrow=LEFT
break
fi
done
fi
}
drawImages(){
for x in $columnarray
do
case $arrow in
SELF)
if [ $x = $sendnode$sendblock ]
then
img_column img SRC=\"self_line.JPG\"
else
img_column img SRC=\"empty.JPG\"
fi;;
RIGHT)
if [ $x = $recnode$recblock ]
then
img_column img SRC=\"right_line.JPG\"
weHavePassedRec=1
elif [ $x = $sendnode$sendblock ]
then
img_column img SRC=\"empty.JPG\"
weHavePassedSen=1
elif [ $weHavePassedRec = 1 -o $weHavePassedSen = 0 ]
then
img_column img SRC=\"empty.JPG\"
elif [ $weHavePassedRec = 0 -a $weHavePassedSen = 1 ]
then
img_column img SRC=\"line.JPG\"
fi;;
LEFT)
if [ $x = $recnode$recblock ]
then
img_column img SRC=\"empty.JPG\"
weHaveJustPassedRec=1
weHavePassedRec=1
continue
fi
if [ $x = $sendnode$sendblock -a $weHaveJustPassedRec = 1 ]
then
img_column img SRC=\"left_line.JPG\"
weHaveJustPassedRec=0
weHavePassedSen=1
continue
fi
if [ $x = $sendnode$sendblock ]
then
img_column img SRC=\"line.JPG\"
weHavePassedSen=1
continue
fi
if [ $weHaveJustPassedRec = 1 ]
then
img_column img SRC=\"left_line.JPG\"
weHaveJustPassedRec=0
continue
fi
if [ $weHavePassedSen = 1 -o $weHavePassedRec = 0 ]
then
img_column img SRC=\"empty.JPG\"
continue
fi
if [ $weHavePassedRec = 1 -a $weHavePassedSen = 0 ]
then
img_column img SRC=\"line.JPG\"
continue
fi
column ERROR;;
*)
echo ERROR;;
esac
done
column $signal
}
### Main
trace "Making HTML file"
(
header "Signal sequence diagram $report_date"
heading 1 "Signal sequence diagram $report_date"
trace "Making list file"
#make a signal list file from the signal log file.
`awk -f /home/ndb/bin/signallog2html.lib/signallog2list.awk SIGNAL_ID=$signal_id BLOCK_ID=$block_name $signal_log_file > $signal_log_file.list`
COLUMNS=`awk -f /home/ndb/bin/signallog2html.lib/uniq_blocks.awk $signal_log_file.list | wc -w`
table "border=0 cellspacing=0 cellpadding=0 cols=`expr $COLUMNS + 1`"
columnarray=`awk -f /home/ndb/bin/signallog2html.lib/uniq_blocks.awk $signal_log_file.list`
row
column #make an empty first column!
for col in $columnarray
do
table_header $col
done
grep "" $signal_log_file.list | \
while read direction sendnode sendblock recnode recblock signal sigid recsigid delay
do
if [ $direction = "R" ]
then
row
weHavePassedRec=0
weHavePassedSen=0
weHaveJustPassedRec=0
arrow=""
# calculate the direction of the arrow.
arrowDirection "$columnarray" "$sendnode$sendblock" "$recnode$recblock"
# Draw the arrow images.
drawImages
end_row
fi
done
end_table
footer
) > $signal_log_file.html
exit 0

90
ndb/home/bin/stripcr Executable file
View file

@ -0,0 +1,90 @@
#!/bin/sh
# NAME
# stripcr - a program for removing carriage return chars from dos-files.
#
# SYNOPSIS
# stripcr [file...]
#
# DESCRIPTION
# stripcr deletes all CR characters from the given files.
# The files are edited in place.
# If no files are given, stdin and stdout are used instead.
#
# OPTIONS
# -s extension Make a copy of the original of each file, and
# give it the given extension (.bak, .orig, -bak, ...).
#
# EXAMPLES
# stripcr file.txt innerloop.cc
# stripcr -i.bak *.cc
#
# ENVIRONMENT
# NDB_PROJ_HOME Home dir for ndb
#
# FILES
# $NDB_PROJ_HOME/lib/funcs.sh Some userful functions for safe execution
# of commands, printing, and tracing.
#
# VERSION
# 1.0
#
# AUTHOR
# Jonas Mölsä
#
progname=`basename $0`
synopsis="stripcr [-s extension] [file...]"
: ${NDB_PROJ_HOME:?} # If undefined, exit with error message
: ${STRIPCR_OPTIONS:=--} # If undefined, set to --, to keep getopts happy.
# You may have to experiment, to get quoting right.
. $NDB_PROJ_HOME/lib/funcs.sh
# defaults for options related variables
#
extension=
options="$STRIPCR_OPTIONS"
# used if error when parsing the options environment variable
#
env_opterr="options environment variable: <<$options>>"
# We want to be able to set options in an environment variable,
# as well as on the command line. In order not to have to repeat
# the same getopts information twice, we loop two times over the
# getopts while loop. The first time, we process options from
# the options environment variable, the second time we process
# options from the command line.
#
# The things to change are the actual options and what they do.
#
#
for optstring in "$options" "" # 1. options variable 2. cmd line
do
while getopts s: i $optstring # optstring empty => no arg => cmd line
do
case $i in
s) extension="$OPTARG";;
\?) syndie $env_opterr;; # print synopsis and exit
esac
done
[ -n "$optstring" ] && OPTIND=1 # Reset for round 2, cmd line options
env_opterr= # Round 2 should not use the value
done
shift `expr $OPTIND - 1`
safe perl -i$extension -lpe 'tr/\r//d' $*

Some files were not shown because too many files have changed in this diff Show more