Browse Source

* Initial implementation of data dictionary functionality

git-svn-id: trunk@9175 -
michael 18 years ago
parent
commit
422b5d916b

+ 16 - 0
.gitattributes

@@ -3958,6 +3958,22 @@ packages/fcl-db/src/README -text
 packages/fcl-db/src/bufdataset.pas svneol=native#text/plain
 packages/fcl-db/src/bufdataset_parser.pp svneol=native#text/plain
 packages/fcl-db/src/database.inc svneol=native#text/plain
+packages/fcl-db/src/datadict/Makefile svneol=native#text/plain
+packages/fcl-db/src/datadict/Makefile.fpc svneol=native#text/plain
+packages/fcl-db/src/datadict/buildd.lpi svneol=native#text/plain
+packages/fcl-db/src/datadict/buildd.lpr svneol=native#text/plain
+packages/fcl-db/src/datadict/fpdatadict.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpdddbf.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddfb.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddmysql40.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddmysql41.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddmysql50.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddodbc.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddoracle.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddpq.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddregstd.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddsqldb.pp svneol=native#text/plain
+packages/fcl-db/src/datadict/fpddsqlite3.pp svneol=native#text/plain
 packages/fcl-db/src/dataset.inc svneol=native#text/plain
 packages/fcl-db/src/datasource.inc svneol=native#text/plain
 packages/fcl-db/src/db.pas svneol=native#text/plain

+ 2150 - 0
packages/fcl-db/src/datadict/Makefile

@@ -0,0 +1,2150 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/11/05]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../../../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=fcl-db
+PACKAGEDIR_MAIN:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-db/Makefile.fpc,$(PACKAGESDIR))))))
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_RSTS+=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc fpddpq fpddoracle fpddsqlite3 fpddregstd
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif

+ 23 - 0
packages/fcl-db/src/datadict/Makefile.fpc

@@ -0,0 +1,23 @@
+#
+# Makefile.fpc for SQL FCL db units
+#
+
+[package]
+main=fcl-db
+
+[target]
+units=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc \
+      fpddpq fpddoracle fpddsqlite3 fpddregstd
+rsts=fpdatadict fpddfb fpddsqldb fpddmysql40 fpddmysql41 fpddmysql50 fpddodbc \
+      fpddpq fpddoracle fpddsqlite3 fpddregstd
+
+[compiler]
+options=-S2h
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../../../..
+
+[rules]

+ 104 - 0
packages/fcl-db/src/datadict/buildd.lpi

@@ -0,0 +1,104 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <PathDelim Value="/"/>
+    <Version Value="6"/>
+    <General>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <IconPath Value="./"/>
+      <TargetFileExt Value=""/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <Units Count="13">
+      <Unit0>
+        <Filename Value="buildd.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="buildd"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="fpddsqldb.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddsqldb"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="fpdatadict.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpdatadict"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="fpdddbf.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddDbf"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="fpddfb.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddfb"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="fpddmysql40.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddmysql40"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="fpddmysql41.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddmysql41"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="fpddmysql50.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddmysql50"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="fpddpq.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddpq"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="fpddodbc.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddodbc"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="fpddoracle.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddoracle"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="fpddsqlite3.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddsqlite3"/>
+      </Unit11>
+      <Unit12>
+        <Filename Value="fpddregstd.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpddregstd"/>
+      </Unit12>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="5"/>
+    <CodeGeneration>
+      <Generate Value="Faster"/>
+    </CodeGeneration>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+</CONFIG>

+ 12 - 0
packages/fcl-db/src/datadict/buildd.lpr

@@ -0,0 +1,12 @@
+program buildd;
+
+
+uses
+  Classes
+  { you can add units after this }, fpddsqldb, fpdatadict, fpdddbf, fpddfb,
+  fpddmysql40, fpddmysql41, fpddmysql50, fpddpq, fpddodbc, fpddoracle,
+fpddsqlite3, fpddregstd;
+
+begin
+end.
+

+ 1938 - 0
packages/fcl-db/src/datadict/fpdatadict.pp

@@ -0,0 +1,1938 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    Data Dictionary Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpdatadict;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils,inicol, inifiles, contnrs, db;
+
+Type
+  // Supported objects in this data dictionary
+  TObjectType = (otUnknown,otDictionary,otTables,otTable,otFields,otField,
+                 otConnection,otTableData,otIndexDefs,otIndexDef);
+  TDDProgressEvent = Procedure(Sender : TObject; Const Msg : String) of Object;
+
+  { TDDFieldDef }
+
+  TDDFieldDef = Class(TIniCollectionItem)
+  private
+    FAlignMent: TAlignMent;
+    FConstraint: string;
+    FConstraintErrorMessage: string;
+    FCustomConstraint: string;
+    FDefault: String;
+    FDefaultExpression: string;
+    FDisplayLabel: string;
+    FDisplayWidth: Longint;
+    FFieldName: string;
+    FFieldType: TFieldType;
+    FHint: String;
+    FPrecision: Integer;
+    FReadOnly: Boolean;
+    FRequired: Boolean;
+    FSize: Integer;
+    FVisible: Boolean;
+    Function IsSizeStored : Boolean;
+    Function IsPrecisionStored : Boolean;
+  protected
+    function GetSectionName: String; override;
+    procedure SetSectionName(const Value: String); override;
+  Public
+    Constructor Create(ACollection : TCollection); override;
+    Procedure ImportFromField(F: TField; Existing : Boolean = True);
+    Procedure ApplyToField(F : TField);
+    Procedure Assign(Source : TPersistent);  override;
+    Procedure SaveToIni(Ini: TCustomInifile; ASection : String); override;
+    Procedure LoadFromIni(Ini: TCustomInifile; ASection : String); override;
+  Published
+    property FieldType : TFieldType Read FFieldType Write FFieldType;
+    property AlignMent : TAlignMent Read FAlignMent write FAlignment default taLeftJustify;
+    property CustomConstraint: string read FCustomConstraint write FCustomConstraint;
+    property ConstraintErrorMessage: string read FConstraintErrorMessage write FConstraintErrorMessage;
+    Property DBDefault : String Read FDefault Write FDEfault;
+    property DefaultExpression: string read FDefaultExpression write FDefaultExpression;
+    property DisplayLabel : string read FDisplayLabel write FDisplayLabel;
+    property DisplayWidth: Longint read FDisplayWidth write FDisplayWidth;
+    property FieldName: string read FFieldName write FFieldName;
+    property Constraint: string read FConstraint write FConstraint;
+    property ReadOnly: Boolean read FReadOnly write FReadOnly;
+    property Required: Boolean read FRequired write FRequired;
+    property Visible: Boolean read FVisible write FVisible default True;
+    Property Size : Integer Read FSize Write FSize Stored IsSizeStored;
+    Property Precision : Integer Read FPrecision Write FPrecision Stored IsPrecisionStored;
+    Property Hint : String Read FHint Write FHint;
+  end;
+  
+  { TDDFieldDefs }
+
+  TDDFieldDefs = Class(TIniCollection)
+  private
+    FTableName: String;
+    function GetField(Index : Integer): TDDFieldDef;
+    procedure SetField(Index : Integer; const AValue: TDDFieldDef);
+    procedure SetTableName(const AValue: String);
+  Public
+    Constructor Create(ATableName : String);
+    Function AddField(AFieldName: String = '') : TDDFieldDef;
+    Function IndexOfField(AFieldName : String) : Integer;
+    Function FindField(AFieldName : String) : TDDFieldDef;
+    Function FieldByName(AFieldName : String) : TDDFieldDef;
+    Property Fields[Index : Integer] : TDDFieldDef Read GetField Write SetField; default;
+    Property TableName : String Read FTableName Write SetTableName;
+  end;
+  
+  { TDDIndexDef }
+  TDDIndexDef = Class(TIniCollectionItem)
+  private
+    FCaseinsFields: string;
+    FDescFields: string;
+    FExpression: string;
+    FFields: string;
+    FIndexName: String;
+    FOptions: TIndexOptions;
+    FSource: string;
+  protected
+    function GetSectionName: String; override;
+    procedure SetSectionName(const Value: String); override;
+    procedure Assign(ASource : TPersistent); override;
+  Published
+    Property IndexName : String Read FIndexName Write FIndexName;
+    property Expression: string read FExpression write FExpression;
+    property Fields: string read FFields write FFields;
+    property CaseInsFields: string read FCaseinsFields write FCaseInsFields;
+    property DescFields: string read FDescFields write FDescFields;
+    property Options: TIndexOptions read FOptions write FOptions;
+    property Source: string read FSource write FSource;
+  end;
+  
+  { TDDIndexDefs }
+
+  TDDIndexDefs = Class(TIniCollection)
+  private
+    FTableName : String;
+    function GetIndex(Index : Integer): TDDIndexDef;
+    procedure SetIndex(Index : Integer; const AValue: TDDIndexDef);
+    procedure SetTableName(const AValue: String);
+  Public
+    Constructor Create(ATableName : String);
+    Function AddDDIndexDef(AName : String) : TDDIndexDef;
+    Property TableName : String Read FTableName Write SetTableName;
+    Property Indexes[Index : Integer] : TDDIndexDef Read GetIndex Write SetIndex; default;
+  end;
+
+  { TDDTableDef }
+
+  TDDTableDef = Class(TIniCollectionItem)
+  private
+    FFieldDefs: TDDFieldDefs;
+    FIndexDefs: TDDIndexDefs;
+    FPrimaryKeyName: String;
+    FTableName: String;
+    function GetOnProgress: TDDProgressEvent;
+    function GetPrimaryKeyName: String;
+    procedure SetTableName(const AValue: String);
+  protected
+    function GetSectionName: String; override;
+    procedure SetSectionName(const Value: String); override;
+  Public
+    Constructor Create(ACollection : TCollection); override;
+    Destructor Destroy; override;
+    Function ImportFromDataset(Dataset : TDataSet; DoClear : Boolean = False; UpdateExisting : Boolean = True) : Integer;
+    Procedure ApplyToDataset(Dataset : TDataset);
+    Function AddField(AFieldName : String = '') : TDDFieldDef;
+    Procedure SaveToIni(Ini: TCustomInifile; ASection : String); override;
+    Procedure LoadFromIni(Ini: TCustomInifile; ASection : String); override;
+    Property Fields : TDDFieldDefs Read FFieldDefs;
+    Property Indexes : TDDIndexDefs Read FIndexDefs;
+    Property OnProgress : TDDProgressEvent Read GetOnProgress;
+  Published
+    Property TableName : String Read FTableName Write SetTableName;
+    Property PrimaryKeyConstraintName : String Read GetPrimaryKeyName Write FPrimaryKeyName;
+  end;
+  
+  { TDDTableDefs }
+
+  TDDTableDefs = Class(TIniCollection)
+  private
+    FOnProgress: TDDProgressEvent;
+    function GetTable(Index : Integer): TDDTableDef;
+    procedure SetTable(Index : Integer; const AValue: TDDTableDef);
+  Public
+    Function AddTable(ATableName : String = '') : TDDTableDef;
+    Function IndexOfTable(ATableName : String) : Integer;
+    Function FindTable(ATableName : String) : TDDTableDef;
+    Function TableByName(ATableName : String) : TDDTableDef;
+    Property Tables[Index : Integer] : TDDTableDef Read GetTable Write SetTable; default;
+    Property OnProgress : TDDProgressEvent Read FOnProgress Write FOnProgress;
+  end;
+
+
+  { TFPDataDictionary }
+  TOnApplyDataDictEvent = Procedure (Sender : TObject; Source : TDDFieldDef; Dest : TField; Var Allow : Boolean) of object;
+
+  TFPDataDictionary = Class(TPersistent)
+  private
+    FDDName: String;
+    FFileName: String;
+    FOnApplyDataDictEvent: TOnApplyDataDictEvent;
+    FOnProgress: TDDProgressEvent;
+    FTables: TDDTableDefs;
+    // Last table that returned a match for findfieldDef
+    FLastMatchTableDef : TDDTableDef;
+    procedure SetOnProgress(const AValue: TDDProgressEvent);
+  Public
+    Constructor Create;
+    Destructor Destroy; override;
+    Procedure SaveToFile(AFileName : String; KeepBackup: Boolean = True);
+    Procedure SaveToIni(Ini : TCustomIniFile; ASection : String); virtual;
+    Procedure LoadFromFile(AFileName : String);
+    Procedure LoadFromIni(Ini : TCustomIniFile; ASection : String); virtual;
+    Procedure ApplyToDataset(ADataset : TDataset);
+    Procedure ApplyToDataset(ADataset : TDataset; OnApply : TOnApplyDataDictEvent);
+    Function FindFieldDef(FieldName : String; out TableName : String) : TDDFieldDef;
+    Function FindFieldDef(FieldName : String) : TDDFieldDef;
+    function CanonicalizeFieldName(const InFN: String; Out TN, FN: String): Boolean;
+    function CanonicalizeFieldName(const InFN: String; Out TableDef : TDDTableDef; Out FN: String): Boolean;
+    Property Tables : TDDTableDefs Read FTables;
+    Property FileName : String Read FFileName;
+    Property Name : String Read FDDName Write FDDName;
+    Property OnProgress : TDDProgressEvent Read FOnProgress Write SetOnProgress;
+  Published
+    // Using name confuses the object inspector grid.
+    Property DataDictionaryName : String Read FDDName Write FDDName;
+    Property OnApplyDataDictEvent : TOnApplyDataDictEvent Read FOnApplyDataDictEvent Write FOnApplyDataDictEvent;
+  end;
+
+
+  { TFPDDFieldList }
+
+  TFPDDFieldList = Class(TObjectList)
+  private
+    function GetFieldDef(Index : Integer): TDDFieldDef;
+    procedure SetFieldDef(Index : Integer; const AValue: TDDFieldDef);
+  Public
+    Constructor CreateFromTableDef(TD : TDDTableDef);
+    Constructor CreateFromFieldDefs(FD : TDDFieldDefs);
+    Property FieldDefs[Index : Integer] : TDDFieldDef Read GetFieldDef Write SetFieldDef; default;
+  end;
+  
+  
+
+  
+  { TFPDDSQLEngine }
+  TSQLEngineOption = (eoLineFeedAfterField,eoUseOldInWhereParams,eoAndTermsInBrackets,eoQuoteFieldNames,eoLineFeedAfterAndTerm,eoAddTerminator);
+  TSQLEngineOptions = Set of TSQLEngineOption;
+  
+
+  TFPDDSQLEngine = Class(TPersistent)
+  private
+    FFieldQuoteChar: Char;
+    FIndent: Integer;
+    FMaxLineLength: Integer;
+    FLastLength: integer;
+    FOptions: TSQLEngineOptions;
+    FTableDef: TDDTableDef;
+    FNoIndent : Boolean;
+    FTerminatorChar : Char;
+  Protected
+    procedure CheckTableDef;
+    Procedure NoIndent;
+    Procedure ResetLine;
+    Procedure AddToStringLN(Var Res : String; S : String);
+    Procedure AddToString(Var Res : String; S : String);
+    Procedure FixUpStatement(var Res : String);
+    Procedure AddWhereClause(Var Res : String; FieldList: TFPDDFieldList; UseOldParam:Boolean);
+    Function CreateAndTerm(FD : TDDFieldDef; UseOldParam : Boolean): string;
+    // Primitives. Override for engine-specifics
+    Procedure AddFieldString(Var Res: String; S : String);
+    Function FieldNameString(FD : TDDFieldDef) : string; virtual;
+    Function TableNameString(TD : TDDTableDef) : string; virtual;
+    Function FieldParamString(FD : TDDFieldDef; UseOldParam : Boolean) : string; virtual;
+    Function FieldTypeString(FD : TDDFieldDef) : String; virtual;
+    Function FieldDefaultString(FD : TDDFieldDef) : String; virtual;
+    Function FieldCheckString(FD : TDDFieldDef) : String; virtual;
+    Function FieldDeclarationString(FD : TDDFieldDef) : String; virtual;
+    Property FieldQuoteChar : Char Read FFieldQuoteChar Write FFieldQuoteChar;
+    Property TerminatorChar : Char Read FTerminatorChar Write FTerminatorChar;
+  Public
+    Constructor Create; virtual;
+    function  CreateWhereSQL(Var Res : String; FieldList: TFPDDFieldList; UseOldParam:Boolean): String;
+    Procedure CreateSelectSQLStrings(FieldList,KeyFields : TFPDDFieldList; SQL : TStrings);
+    Procedure CreateInsertSQLStrings(FieldList : TFPDDFieldList; SQL : TStrings);
+    Procedure CreateUpdateSQLStrings(FieldList,KeyFields : TFPDDFieldList; SQL : TStrings);
+    Procedure CreateDeleteSQLStrings(KeyFields : TFPDDFieldList; SQL : TStrings);
+    Procedure CreateCreateSQLStrings(Fields,KeyFields : TFPDDFieldList; SQL : TStrings);
+    Procedure CreateCreateSQLStrings(KeyFields : TFPDDFieldList; SQL : TStrings);
+    Function  CreateSelectSQL(FieldList,KeyFields : TFPDDFieldList) : String; virtual;
+    Function  CreateInsertSQL(FieldList : TFPDDFieldList) : String; virtual;
+    Function  CreateUpdateSQL(FieldList,KeyFields : TFPDDFieldList) : String; virtual;
+    Function  CreateDeleteSQL(KeyFields : TFPDDFieldList) : String; virtual;
+    Function  CreateCreateSQL(Fields,KeyFields : TFPDDFieldList) : String; virtual;
+    Function  CreateCreateSQL(KeyFields : TFPDDFieldList) : String; virtual;
+    Property TableDef : TDDTableDef Read FTableDef Write FTableDef;
+  Published
+    Property MaxLineLength : Integer Read FMaxLineLength Write FMaxLineLength default 72;
+    Property Indent : Integer Read FIndent Write FIndent default 2;
+    Property Options : TSQLEngineOptions Read FOptions Write FOptions;
+  end;
+  
+  { TFPDDEngine }
+  TFPDDEngineCapability =(ecImport,ecCreateTable,ecViewTable, ecTableIndexes, ecRunQuery, ecRowsAffected);
+  TFPDDEngineCapabilities = set of TFPDDEngineCapability;
+  {
+    to avoid dependencies on GUI elements in the data dictionary engines,
+    connection string dialogs must be registered separately.
+
+    TGetConnectionEvent is the callback prototype for such a dialog
+  }
+  TGetConnectionEvent = Procedure(Sender: TObject; Var Connection : String) of object;
+
+  TFPDDEngine = Class(TComponent)
+  private
+    FOnProgress: TDDProgressEvent;
+  Protected
+    FConnected: Boolean;
+    FConnectString: String;
+    Procedure DoProgress(Const Msg : String);
+    // Utility routine which can be used by descendents.
+    procedure IndexDefsToDDIndexDefs(IDS : TIndexDefs; DDIDS : TDDindexDefs);
+  Public
+    Destructor Destroy; override;
+    Function GetConnectString : String; virtual;
+    Function ImportTables(Tables : TDDTableDefs; List : TStrings; UpdateExisting : Boolean) : Integer;
+    // Mandatory for all data dictionary engines.
+    Class function Description : string; virtual; abstract;
+    Class function DBType : String; virtual; abstract;
+    Class function EngineCapabilities : TFPDDEngineCapabilities; virtual;
+    Function Connect(const ConnectString : String) : Boolean; virtual; abstract;
+    Procedure Disconnect ; virtual; abstract;
+    Function GetTableList(List : TStrings) : Integer; virtual; abstract;
+    Function ImportFields(Table : TDDTableDef) : Integer; virtual; abstract;
+    // Override depending on capabilities
+    Procedure CreateTable(Table : TDDTableDef); virtual;
+    // Should not open the dataset.
+    Function ViewTable(Const TableName: String; DatasetOwner : TComponent) : TDataset; virtual;
+    // Run a non-select query. If possible, returns the number of modified records.
+    Function RunQuery(SQL : String) : Integer; Virtual;
+    // Create a select query TDataset. Do not open the resulting dataset.
+    Function CreateQuery(SQL : String; DatasetOwner : TComponent) : TDataset; Virtual;
+    // Assign a select query and open the resulting dataset.
+    Procedure SetQueryStatement(SQL : String; AQuery : TDataset); Virtual;
+    // Get table index defs. Return number of defs (if ecTableIndexes in capabilities)
+    Function GetTableIndexDefs(ATableName : String; Defs : TDDIndexDefs) : integer ;virtual;
+    // Override if a better implementation exists.
+    Function CreateSQLEngine : TFPDDSQLEngine; virtual;
+    Property OnProgress : TDDProgressEvent Read FOnProgress Write FOnProgress;
+    Property ConnectString : String Read FConnectString;
+    Property Connected : Boolean Read FConnected Write FConnected;
+  end;
+  TFPDDEngineClass = Class of TFPDDEngine;
+
+
+  EDataDict = Class(Exception);
+
+Procedure RegisterDictionaryEngine(AEngine :TFPDDEngineClass);
+Function IsDictionaryEngineRegistered(AEngine :TFPDDEngineClass) : boolean;
+Procedure RegisterConnectionStringCallback(Const AName: String; CallBack : TGetConnectionEvent);
+Procedure UnRegisterDictionaryEngine(AEngine :TFPDDEngineClass);
+Function  GetDictionaryEngineList(List : TStrings) : Integer;
+Function  GetDictionaryEngineInfo(Const AName : String; Var ADescription,ADBType: String; var ACapabilities : TFPDDEngineCapabilities) : boolean;
+Function  CreateDictionaryEngine(AName : String; AOWner : TComponent) : TFPDDEngine;
+Function IndexOptionsToString (Options : TIndexOptions) : String;
+
+Var
+  DefaultDDExt : String = '.fpd';
+  
+  // Default values for SQL Engine properties.
+  
+  DefaultSQLEngineOptions : TSQLEngineOptions
+                          = [eoLineFeedAfterField,eoUseOldInWhereParams,
+                             eoAndTermsInBrackets,eoLineFeedAfterAndTerm];
+                             
+  DefaultSQLEngineIndent     : Integer = 2;
+  DefaultSQLEngineLineLength : Integer = 72;
+  DefaultSQLTerminatorChar   : Char = ';';
+  DefaultSQLFieldQuoteChar   : Char = '"';
+  
+implementation
+
+uses typinfo;
+
+{ ---------------------------------------------------------------------
+  Constants, not to be localized
+  ---------------------------------------------------------------------}
+
+Const
+  // Datadict saving
+  SDataDict                 = 'FPDataDict';
+  KeyDataDictName           = 'DataDictName';
+
+  // Tables Saving
+  SDataDictTables           = SDataDict+'_Tables';
+  KeyTableName              = 'TableName';
+  KeyPrimaryKeyConstraint   = 'PrimaryKeyConstraint';
+  
+  // Fields Saving
+  SFieldSuffix              = '_Fields';
+  SIndexSuffix              = '_Indices';
+  KeyAlignMent              = 'AlignMent';
+  KeyCustomConstraint       = 'CustomConstraint';
+  KeyConstraintErrorMessage = 'ConstraintErrorMessage';
+  KeyDBDefault              = 'DBDefault';
+  KeyDefaultExpression      = 'DefaultExpression';
+  KeyDisplayLabel           = 'DisplayLabel';
+  KeyDisplayWidth           = 'DisplayWidth';
+  KeyFieldName              = 'FieldName';
+  KeyConstraint             = 'Constraint';
+  KeyReadOnly               = 'ReadOnly';
+  KeyRequired               = 'Required';
+  KeyVisible                = 'Visible';
+  KeySize                   = 'Size';
+  KeyFieldType              = 'FieldType';
+  KeyHint                   = 'Hint';
+
+  // SQL Keywords
+  SSelect      = 'SELECT';
+  SFrom        = 'FROM';
+  SWhere       = 'WHERE';
+  SInsertInto  = 'INSERT INTO';
+  SUpdate      = 'UPDATE';
+  SSet         = 'SET';
+  SDeleteFrom  = 'DELETE FROM';
+  SAnd         = 'AND';
+  SOLD         = 'OLD';
+  SValues      = 'VALUES';
+  SCreateTable = 'CREATE TABLE';
+  SNotNull     = 'NOT NULL';
+  SDefault     = 'DEFAULT';
+  SCheck       = 'CHECK';  // Check constraint
+  SPrimaryKey  = 'PRIMARY KEY';
+  SConstraint  = 'CONSTRAINT';
+
+  SQLFieldTypes : Array[TFieldType] of string = (
+    '', 'VARCHAR', 'SMALLINT', 'INT', 'SMALLINT',
+    'BOOL', 'FLOAT', 'DECIMAL','DECIMAL','DATE', 'TIME', 'TIMESTAMP',
+    '', '', 'INT', 'BLOB', 'BLOB', 'BLOB', 'BLOB',
+    '', '', '', '', 'CHAR',
+    'CHAR', 'DOUBLE PRECISION', '', '', '',
+    '', '', '', '', '',
+    '', '', 'TIMESTAMP', 'DECIMAL','CHAR','BLOB');
+    
+{ ---------------------------------------------------------------------
+  Constants which can be localized
+  ---------------------------------------------------------------------}
+
+Resourcestring
+  SErrFieldNotFound           = '"%s": Field "%s" not found.';
+  SErrTableNotFound           = 'Table "%s" not found.';
+  SErrDuplicateTableName      = 'Duplicate table name: "%s"';
+  SErrDuplicateFieldName      = '"%s": Duplicate field name: "%s"';
+  SNewTable                   = 'NewTable';
+  SNewField                   = 'NewField';
+  SErrNoFileName              = 'No filename given for save';
+  SErrNotRegistering          = 'Not registering data dictionary engine "%s": %s';
+  SErrNoEngineCapabilities    = 'It reports no capabilities.';
+  SErrNoEngineDBType          = 'It reports no database type';
+  SErrNoEngineDescription     = 'It reports no description';
+  SErrUnknownEngine           = 'Unknown datadictionary: "%s"';
+  SErrMissingTableDef         = 'Cannot perform this operation without tabledef.';
+  SErrFieldTypeNotSupported   = 'Field type "%s" is not supported in this SQL dialect';
+  SErrNoConnectionDialog      = 'No connection dialog registered for data dictionary engine "%s".';
+  SDDImportingTable           = 'Importing table definition for table "%s"';
+  SErrCreateTableNotSupported = 'Creating tables is not supported by the "%s" engine.';
+  SErrViewTableNotSupported   = 'Viewing tables is not supported by the "%s" engine.';
+  SErrRunQueryNotSupported    = 'Running queries is not supported by the "%s" engine.';
+  SErrOpenQueryNotSupported   = 'Running and opening SELECT queries is not supported by the "%s" engine.';
+  SErrSetQueryStatementNotSupported = 'Setting the SQL statement is not supported by the "%s" engine.';
+  SErrGetTableIndexDefsNotSupported = 'Getting index definitions of a table is not supported by the "%s" engine.';
+  SSavingFieldsFrom           = 'Saving fields from %s';
+  SLoadingFieldsFrom          = 'Loading fields from %s';
+  SIndexOptionPrimary         = 'Primary key';
+  SIndexOptionUnique          = 'Unique';
+  SIndexOptionDescending      = 'Descending';
+  SIndexOptionCaseInsensitive = 'Case insensitive';
+  SIndexOptionExpression      = 'Expression';
+  SIndexOptionNonMaintained   = 'Not maintained';
+  SWarnFieldNotFound          = 'Could not find field "%s".';
+  SLogFieldFoundIn            = 'Field "%s" found in table "%s".';
+  
+Const
+  IndexOptionNames : Array [TIndexOption] of String
+                   = (SIndexOptionPrimary, SIndexOptionUnique,
+                      SIndexOptionDescending, SIndexOptionCaseInsensitive,
+                      SIndexOptionExpression, SIndexOptionNonMaintained);
+                      
+{ ---------------------------------------------------------------------
+  Dictionary Engine registration
+  ---------------------------------------------------------------------}
+
+Var
+  DDEngines : TStringList;
+  
+Type
+
+  { TEngineRegistration }
+
+  TEngineRegistration = Class(TObject)
+  Private
+    FEngine : TFPDDEngineClass;
+    FCallBack : TGetConnectionEvent;
+  Public
+    Constructor Create(AEngine : TFPDDEngineClass);
+  end;
+
+{ TEngineRegistration }
+
+constructor TEngineRegistration.Create(AEngine: TFPDDEngineClass);
+begin
+  FEngine:=AEngine;
+end;
+
+procedure RegisterDictionaryEngine(AEngine: TFPDDEngineClass);
+begin
+  If (AEngine.EngineCapabilities=[]) then
+     Raise EDataDict.CreateFmt(SErrNotRegistering,[AEngine.ClassName,SErrNoEngineCapabilities]);
+  If (AEngine.DBType='') then
+     Raise EDataDict.CreateFmt(SErrNotRegistering,[AEngine.ClassName,SErrNoEngineDBType]);
+  If (AEngine.Description='') then
+     Raise EDataDict.CreateFmt(SErrNotRegistering,[AEngine.ClassName,SErrNoEngineDescription]);
+  If not assigned(DDEngines) then
+    begin
+    DDEngines:=TStringList.Create;
+    DDEngines.Sorted:=true;
+    DDEngines.Duplicates:=dupError;
+    end;
+  DDEngines.AddObject(Aengine.ClassName,TEngineRegistration.Create(AEngine));
+end;
+
+
+procedure UnRegisterDictionaryEngine(AEngine: TFPDDEngineClass);
+
+Var
+  I : Integer;
+  
+begin
+  If Assigned(DDEngines) then
+    begin
+    I:=DDEngines.IndexOf(Aengine.ClassName);
+    If (i<>-1) then
+      begin
+      DDEngines.Objects[i].Free;
+      DDEngines.Delete(i);
+      end;
+    if (DDEngines.Count=0) then
+      FreeAndNil(DDEngines);
+    end;
+end;
+
+function GetDictionaryEngineList(List: TStrings): Integer;
+begin
+  If Not Assigned(DDEngines) then
+    Result:=0
+  else
+    begin
+    If Assigned(List) then
+      List.Text:=DDEngines.Text;
+    Result:=DDEngines.Count;
+    end;
+end;
+
+Function IndexOfDDEngine(Const AName: String) : Integer;
+
+begin
+  If Assigned(DDEngines) then
+    Result:=DDEngines.IndexOf(AName)
+  else
+    Result:=-1;
+end;
+
+Function FindEngineRegistration(Const AName : String) : TEngineRegistration;
+
+Var
+   I : integer;
+
+begin
+  I:=IndexOfDDEngine(AName);
+  if (I<>-1) then
+    Result:=TEngineRegistration(DDEngines.Objects[i])
+  else
+    Result:=Nil;
+end;
+
+Function GetEngineRegistration(Const AName : String) : TEngineRegistration;
+
+begin
+  Result:=FindEngineRegistration(AName);
+  If (Result=Nil) then
+    Raise EDataDict.CreateFmt(SErrUnknownEngine,[AName]);
+end;
+
+Function FindDictionaryClass(Const AName : String) : TFPDDEngineClass;
+
+Var
+   R : TEngineRegistration;
+
+begin
+  R:=FindEngineRegistration(AName);
+  If (R=Nil) then
+    Result:=Nil
+  else
+    Result:=R.FEngine;
+end;
+
+Function GetDictionaryClass(Const AName : String) : TFPDDEngineClass;
+
+begin
+  Result:=GetEngineRegistration(AName).FEngine;
+end;
+
+function IsDictionaryEngineRegistered(AEngine: TFPDDEngineClass): boolean;
+
+Var
+  I : Integer;
+
+begin
+  Result:=Assigned(DDEngines);
+  If Result then
+    begin
+    Result:=False;
+    I:=0;
+    While (Not Result) and (I<DDEngines.Count) do
+      begin
+      Result:=(TEngineRegistration(DDEngines.Objects[i]).FEngine=AEngine);
+      inc(I);
+      end;
+    end;
+end;
+
+procedure RegisterConnectionStringCallback(Const AName : String;
+  CallBack: TGetConnectionEvent);
+begin
+  GetEngineRegistration(AName).FCallBack:=CallBack;
+end;
+
+function GetEngineConnectionStringCallBack(Const AName : String) : TGetConnectionEvent;
+
+begin
+  Result:=GetEngineRegistration(AName).FCallBack;
+end;
+
+Function  GetDictionaryEngineInfo(Const AName : String; Var ADescription,ADBType: String;var ACapabilities : TFPDDEngineCapabilities) : boolean;
+
+Var
+  DDEC : TFPDDEngineClass;
+  
+begin
+  DDEC:=FindDictionaryClass(AName);
+  Result:=DDEC<>Nil;
+  If Result then
+    begin
+    ADescription:=DDEC.Description;
+    ADBType:=DDEC.DBType;
+    ACapabilities:=DDEC.EngineCapabilities;
+    end;
+end;
+
+function CreateDictionaryEngine(AName: String; AOWner : TComponent): TFPDDEngine;
+
+begin
+  Result:=GetDictionaryClass(AName).Create(AOwner);
+end;
+
+function IndexOptionsToString(Options: TIndexOptions): String;
+
+Var
+  IO : TIndexOption;
+
+begin
+  Result:='';
+  For IO:=Low(TIndexOption) to High(TIndexOption) do
+    If IO in Options then
+      begin
+      If (Result<>'') then
+        Result:=Result+',';
+      Result:=Result+IndexOptionNames[IO];
+      end;
+end;
+
+{ ---------------------------------------------------------------------
+  TDDFieldDef
+  ---------------------------------------------------------------------}
+  
+function TDDFieldDef.IsSizeStored: Boolean;
+begin
+  Result:=FieldType in [ftUnknown, ftString, ftBCD,
+    ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
+    ftParadoxOle, ftDBaseOle, ftTypedBinary, ftFixedChar,
+    ftWideString,ftArray, ftOraBlob, ftOraClob, ftFMTBcd];
+end;
+
+function TDDFieldDef.IsPrecisionStored: Boolean;
+begin
+  Result:=FieldType in [ftFloat,ftBCD,ftFMTBCD];
+end;
+
+function TDDFieldDef.GetSectionName: String;
+begin
+  Result:=FFieldName;
+end;
+
+procedure TDDFieldDef.SetSectionName(const Value: String);
+begin
+  FFieldName:=Value;
+end;
+
+constructor TDDFieldDef.Create(ACollection: TCollection);
+begin
+  Inherited;
+  FVisible:=True;
+  FAlignMent:=taLeftJustify;
+end;
+
+procedure TDDFieldDef.ImportFromField(F: TField; Existing : Boolean = True);
+begin
+  FieldName:=F.FieldName;
+  FieldType:=F.DataType;
+  If IsSizeStored then
+    Size:=F.Size;
+  If IsPrecisionStored then
+    begin
+    If F is TBCDFIeld then
+      Precision:=TBCDField(F).Precision
+    else if F is TFloatField then
+      Precision:=TFloatField(F).Precision;
+    end;
+  if not Existing then
+  begin
+    AlignMent:=F.AlignMent;
+    DisplayWidth:=F.DisplayWidth;
+    CustomConstraint:=F.CustomConstraint;
+    ConstraintErrorMessage:=F.ConstraintErrorMessage;
+    DefaultExpression:=F.DefaultExpression;
+    DisplayLabel:=F.DisplayLabel;
+    ReadOnly:=F.ReadOnly;
+    Required:=F.Required;
+    Visible:=F.Visible;
+  end;
+end;
+
+procedure TDDFieldDef.ApplyToField(F: TField);
+begin
+{ // Normally, these should never be assigned...
+  F.FieldName              := FieldName;
+  F.DataType               := FieldType;
+  If IsSizeStored then
+    F.Size:=Size;
+}
+  F.AlignMent              := AlignMent;
+  F.DisplayWidth           := DisplayWidth;
+  F.CustomConstraint       := CustomConstraint;
+  F.ConstraintErrorMessage := ConstraintErrorMessage;
+  F.DefaultExpression      := DefaultExpression;
+  F.DisplayLabel           := DisplayLabel;
+  F.ReadOnly               := ReadOnly;
+  F.Required               := Required;
+  F.Visible                := Visible;
+
+end;
+
+procedure TDDFieldDef.Assign(Source: TPersistent);
+
+Var
+  DF : TDDFieldDef;
+  
+begin
+  if Source is TField then
+    ImportFromField(TField(Source))
+  else If Source is TDDFieldDef then
+    begin
+    DF:=TDDFieldDef(Source);
+    FieldType:=DF.FieldType;
+    If IsSizeStored then
+      Size:=DF.Size;
+    AlignMent:=DF.AlignMent;
+    DisplayWidth:=DF.DisplayWidth;
+    CustomConstraint:=DF.CustomConstraint;
+    ConstraintErrorMessage:=DF.ConstraintErrorMessage;
+    DefaultExpression:=DF.DefaultExpression;
+    DBDefault:=DF.DBDefault;
+    DisplayLabel:=DisplayLabel;
+    FieldName:=DF.FieldName;
+    Constraint:=DF.Constraint;
+    Hint:=DF.Hint;
+    ReadOnly:=DF.ReadOnly;
+    Required:=DF.Required;
+    Visible:=DF.Visible;
+    end
+  else
+    Inherited;
+end;
+
+procedure TDDFieldDef.SaveToIni(Ini: TCustomInifile; ASection: String);
+begin
+  With Ini do
+    begin
+    WriteInteger(ASection,KeyFieldType,Ord(Fieldtype));
+    If IsSizeStored then
+      WriteInteger(ASection,KeySize,Ord(Size));
+    WriteInteger(ASection,KeyAlignMent,Ord(AlignMent));
+    WriteInteger(ASection,KeyDisplayWidth,DisplayWidth);
+    WriteString(ASection,KeyCustomConstraint,CustomConstraint);
+    WriteString(ASection,KeyConstraintErrorMessage,ConstraintErrorMessage);
+    WriteString(ASection,KeyDefaultExpression,DefaultExpression);
+    WriteString(ASection,KeyDBDefault,DBDefault);
+    WriteString(ASection,KeyDisplayLabel,DisplayLabel);
+    WriteString(ASection,KeyFieldName,FieldName);
+    WriteString(ASection,KeyConstraint,Constraint);
+    WriteString(ASection,KeyHint,Hint);
+    WriteBool(ASection,KeyReadOnly,ReadOnly);
+    WriteBool(ASection,KeyRequired,Required);
+    WriteBool(ASection,KeyVisible,Visible);
+    end;
+end;
+
+procedure TDDFieldDef.LoadFromIni(Ini: TCustomInifile; ASection: String);
+
+begin
+  With Ini do
+    begin
+    FieldType:=TFieldType(ReadInteger(ASection,KeyFieldType,Ord(Fieldtype)));
+    If IsSizeStored then
+      Size:=ReadInteger(ASection,KeySize,0);
+    Alignment:=TAlignment(ReadInteger(ASection,KeyAlignMent,Ord(AlignMent)));
+    DisplayWidth:=ReadInteger(ASection,KeyDisplayWidth,DisplayWidth);
+    CustomConstraint:=ReadString(ASection,KeyCustomConstraint,CustomConstraint);
+    ConstraintErrorMessage:=ReadString(ASection,KeyConstraintErrorMessage,ConstraintErrorMessage);
+    DefaultExpression:=ReadString(ASection,KeyDefaultExpression,DefaultExpression);
+    DBDefault:=ReadString(ASection,KeyDBDefault,DBDefault);
+    DisplayLabel:=ReadString(ASection,KeyDisplayLabel,DisplayLabel);
+    FieldName:=ReadString(ASection,KeyFieldName,FieldName);
+    Constraint:=ReadString(ASection,KeyConstraint,Constraint);
+    Hint:=ReadString(ASection,KeyHint,Hint);
+    ReadOnly:=ReadBool(ASection,KeyReadOnly,ReadOnly);
+    Required:=ReadBool(ASection,KeyRequired,Required);
+    Visible:=ReadBool(ASection,KeyVisible,Visible);
+    end;
+end;
+
+{ ---------------------------------------------------------------------
+  TDDFieldDefs
+  ---------------------------------------------------------------------}
+
+procedure TDDFieldDefs.SetTableName(const AValue: String);
+begin
+  FTableName:=AValue;
+  FSectionPrefix:=AValue;
+  GlobalSection:=AValue+SFieldSuffix;
+end;
+
+function TDDFieldDefs.GetField(Index : Integer): TDDFieldDef;
+begin
+  Result:=TDDFieldDef(Items[Index]);
+end;
+
+procedure TDDFieldDefs.SetField(Index : Integer; const AValue: TDDFieldDef);
+begin
+  Items[Index]:=AValue;
+end;
+
+constructor TDDFieldDefs.Create(ATableName: String);
+begin
+  Inherited Create(TDDFieldDef);
+  FPrefix:='Field';
+  TableName:=ATableName;
+end;
+
+function TDDFieldDefs.AddField(AFieldName: String): TDDFieldDef;
+
+Var
+  I : Integer;
+
+begin
+  If (AFieldName<>'') and (IndexOfField(AFieldName)<>-1) then
+    Raise EDataDict.CreateFmt(SErrDuplicateFieldName,[TableName,AFieldName]);
+  If (AFieldName='') then
+    begin
+    I:=0;
+    Repeat
+      Inc(I);
+      AFieldName:=SNewField+IntToStr(i);
+    Until (IndexOfField(AFieldName)=-1);
+    end;
+  Result:=Add as TDDFieldDef;
+  Result.FieldName:=AFieldName;
+end;
+
+function TDDFieldDefs.IndexOfField(AFieldName: String): Integer;
+begin
+  Result:=Count-1;
+  While (Result>=0) and (CompareText(GetField(Result).FieldName,AFieldName)<>0) do
+    Dec(Result)
+end;
+
+function TDDFieldDefs.FindField(AFieldName: String): TDDFieldDef;
+
+Var
+  I : integer;
+  
+begin
+  I:=IndexOfField(AFieldName);
+  If (I=-1) then
+    Result:=Nil
+  else
+    Result:=GetField(I);
+end;
+
+function TDDFieldDefs.FieldByName(AFieldName: String): TDDFieldDef;
+begin
+  Result:=FindField(AFieldName);
+  If Result=Nil then
+    Raise EDatadict.CreateFmt(SErrFieldNotFound,[TableName,AFieldName]);
+end;
+
+{ ---------------------------------------------------------------------
+  TDDTableDef
+  ---------------------------------------------------------------------}
+  
+  
+procedure TDDTableDef.SetTableName(const AValue: String);
+begin
+  FTableName:=AValue;
+  FFieldDefs.TableName:=AValue;
+end;
+
+function TDDTableDef.GetPrimaryKeyName: String;
+begin
+  Result:=Tablename+'_PK';
+end;
+
+function TDDTableDef.GetOnProgress: TDDProgressEvent;
+begin
+  Result:=Nil;
+  If (Collection Is TDDTableDefs) then
+    Result:=(Collection As TDDTableDefs).OnProgress;
+end;
+
+function TDDTableDef.GetSectionName: String;
+begin
+  Result:=FTableName;
+end;
+
+procedure TDDTableDef.SetSectionName(const Value: String);
+begin
+  TableName:=Value;
+end;
+
+constructor TDDTableDef.Create(ACollection: TCollection);
+begin
+  inherited Create(ACollection);
+  FFieldDefs:=TDDFieldDefs.Create('NewTable');
+  FIndexDefs:=TDDIndexDefs.Create('NewTable');
+end;
+
+destructor TDDTableDef.Destroy;
+
+begin
+  FreeAndNil(FFieldDefs);
+  FreeAndNil(FIndexDefs);
+  inherited Destroy;
+end;
+
+Function TDDTableDef.ImportFromDataset(Dataset: TDataSet; DoClear : Boolean = False; UpdateExisting : Boolean = True) : Integer;
+
+Var
+  I : Integer;
+  FD : TDDFieldDef;
+  F : TField;
+  FieldExists : Boolean;
+  
+begin
+  if DoClear then
+    FFieldDefs.Clear;
+  Result:=0;
+  For I:=0 to Dataset.Fields.Count-1 do
+  begin
+    F:=Dataset.Fields[i];
+    FD:=FFieldDefs.FindField(F.FieldName);
+    If (FD=Nil) then
+    begin
+      FD:=FFieldDefs.AddField(F.FieldName);
+      FieldExists := False;
+    end
+    else
+    begin
+      if not UpdateExisting then FD:=Nil;
+      FieldExists := True;
+    end;
+    if (FD<>Nil) then
+    begin
+      Inc(Result);
+      FD.ImportFromField(F,FieldExists);
+    end;
+  end;
+end;
+
+procedure TDDTableDef.ApplyToDataset(Dataset: TDataset);
+
+var
+  I  : integer;
+  FD : TDDFieldDef;
+  F  : TField;
+  
+begin
+  For I:=0 to Dataset.FieldCount-1 do
+    begin
+    F:=Dataset.Fields[i];
+    FD:=FFieldDefs.FieldByName(F.FieldName);
+    If (FD<>Nil) then
+      FD.ApplyToField(F);
+    end;
+end;
+
+function TDDTableDef.AddField(AFieldName: String): TDDFieldDef;
+begin
+  Result:=Fields.AddField(AFieldName);
+end;
+
+procedure TDDTableDef.SaveToIni(Ini: TCustomInifile; ASection: String);
+begin
+  With Ini do
+    begin
+    WriteString(ASection,KeyTableName,TableName);
+    WriteString(ASection,KeyPrimaryKeyConstraint,FPRimaryKeyName);
+    end;
+  If Assigned(OnProgress) then
+    OnProgress(Self,Format(SSavingFieldsFrom,[TableName]));
+  FFieldDefs.SaveToIni(Ini,ASection+SFieldSuffix);
+  FIndexDefs.SaveToIni(Ini,ASection+SIndexSuffix);
+end;
+
+procedure TDDTableDef.LoadFromIni(Ini: TCustomInifile; ASection: String);
+begin
+  With Ini do
+    begin
+    TableName:=ReadString(ASection,KeyTableName,TableName);
+    FPrimaryKeyName:=ReadString(ASection,KeyPrimaryKeyConstraint,'');
+    end;
+  If Assigned(OnProgress) then
+    OnProgress(Self,Format(SLoadingFieldsFrom,[TableName]));
+  FFieldDefs.LoadFromIni(Ini,ASection+SFieldSuffix);
+  FIndexDefs.LoadFromIni(Ini,ASection+SIndexSuffix);
+end;
+
+{ ---------------------------------------------------------------------
+  TDDTableDefs
+  ---------------------------------------------------------------------}
+
+function TDDTableDefs.GetTable(Index : Integer): TDDTableDef;
+begin
+  Result:=TDDTableDef(Items[Index]);
+end;
+
+procedure TDDTableDefs.SetTable(Index : Integer; const AValue: TDDTableDef);
+begin
+  Items[Index]:=AValue;
+end;
+
+function TDDTableDefs.AddTable(ATableName: String): TDDTableDef;
+
+Var
+  I : Integer;
+  
+begin
+  If (ATableName<>'') and (IndexOfTable(ATableName)<>-1) then
+    Raise EDataDict.CreateFmt(SErrDuplicateTableName,[ATableName]);
+  If (ATableName='') then
+    begin
+    I:=0;
+    Repeat
+      Inc(I);
+      ATAbleName:=SNewTable+IntToStr(i);
+    Until (IndexOfTable(ATableName)=-1);
+    end;
+  Result:=Add as TDDTableDef;
+  Result.TableName:=ATableName;
+end;
+
+function TDDTableDefs.IndexOfTable(ATableName: String): Integer;
+begin
+  Result:=Count-1;
+  While (Result>=0) and (CompareText(GetTable(Result).TableName,ATableName)<>0) do
+    Dec(Result)
+end;
+
+function TDDTableDefs.FindTable(ATableName: String): TDDTableDef;
+
+Var
+  I : integer;
+
+begin
+  I:=IndexOfTable(ATableName);
+  If (I=-1) then
+    Result:=Nil
+  else
+    Result:=GetTable(I);
+end;
+
+function TDDTableDefs.TableByName(ATableName: String): TDDTableDef;
+begin
+  Result:=FindTable(ATableName);
+  If Result=Nil then
+    Raise EDatadict.CreateFmt(SErrTableNotFound,[ATableName]);
+end;
+
+{ ---------------------------------------------------------------------
+  TDatadictionary
+  ---------------------------------------------------------------------}
+
+procedure TFPDataDictionary.SetOnProgress(const AValue: TDDProgressEvent);
+begin
+  FOnProgress:=AValue;
+  FTables.OnProgress:=FOnProgress;
+end;
+
+constructor TFPDataDictionary.Create;
+begin
+  FTables:=TDDTableDefs.Create(TDDTableDef);
+end;
+
+destructor TFPDataDictionary.Destroy;
+begin
+  FreeAndNil(FTables);
+  inherited Destroy;
+end;
+
+procedure TFPDataDictionary.SaveToFile(AFileName: String; KeepBackup: Boolean = True);
+
+Var
+  Ini : TMemIniFile;
+
+begin
+  If (AFileName='') then
+    AFileName:=FFileName;
+  if (AFileName='') and (Name<>'') then
+    AFileName:=Name+DefaultDDExt;
+  if (AFileName='') then
+    Raise EDataDict.Create(SErrNoFileName);
+  If FileExists(AFileName) then
+    If KeepBackup then
+      RenameFile(AFileName,AFileName+'.bak')
+    else
+      DeleteFile(AFileName);
+  Ini:=TMemIniFile.Create(AFileName);
+  try
+    SaveToIni(Ini,SDataDict);
+    Ini.UpdateFile;
+    FFileName:=AFileName;
+  finally
+    FreeAndNil(Ini);
+  end;
+end;
+
+procedure TFPDataDictionary.SaveToIni(Ini: TCustomIniFile; ASection: String);
+begin
+  Ini.WriteString(ASection,KeyDataDictName,Name);
+  FTables.SaveToIni(Ini,SDatadictTables);
+end;
+
+procedure TFPDataDictionary.LoadFromFile(AFileName: String);
+
+Var
+  Ini : TMemInifile;
+
+begin
+  if (AFileName='') then
+    Raise EDataDict.Create(SErrNoFileName);
+  Ini:=TMemIniFile.Create(AFileName);
+  try
+    LoadFromIni(Ini,SDataDict);
+    FFileName:=AFileName;
+    If (Name='') then
+      Name:=ChangeFileExt(ExtractFileName(AFileName),'');
+  finally
+    FreeAndNil(Ini);
+  end;
+
+end;
+
+procedure TFPDataDictionary.LoadFromIni(Ini: TCustomIniFile; ASection: String);
+begin
+  FDDName:=Ini.ReadString(ASection,KeyDataDictName,'');
+  FTables.Clear;
+  FTables.LoadFromIni(Ini,SDataDictTables);
+end;
+
+procedure TFPDataDictionary.ApplyToDataset(ADataset: TDataset);
+begin
+  ApplytoDataset(ADataset,FOnApplyDatadictEvent);
+end;
+
+procedure TFPDataDictionary.ApplyToDataset(ADataset: TDataset;
+  OnApply: TOnApplyDataDictEvent);
+
+Var
+  I : Integer;
+  F : TField;
+  FD : TDDFieldDef;
+  FN,TN : String;
+  Allow : Boolean;
+  
+begin
+  For I:=0 to ADataset.Fields.Count-1 do
+    begin
+    F:=ADataset.Fields[i];
+    FN:=F.Origin;
+    If (FN='') then
+      FN:=F.FieldName;
+    FD:=FindFieldDef(FN,TN);
+    Allow:=(FD<>Nil);
+    If Assigned(OnApply) then
+      OnApply(Self,FD,F,Allow);
+    If (FD<>Nil) and Allow then
+      FD.ApplyToField(F);
+    end;
+end;
+
+function TFPDataDictionary.CanonicalizeFieldName(const InFN: String; Out TableDef : TDDTableDef; Out FN: String): Boolean;
+
+Var
+  TN : String;
+  P : integer;
+begin
+  Result:=False;
+  FN:=InFN;
+  TableDef:=Nil;
+  // Improve to check for quotes
+  P:=Pos('.',FN);
+  If (P<>0) then
+    begin
+    TN:=Copy(FN,1,P-1);
+    Delete(FN,1,P);
+    TableDef:=Tables.FindTable(TN);
+    end;
+  Result:=TableDef<>Nil;
+end;
+
+Function TFPDataDictionary.CanonicalizeFieldName(Const InFN : String; Out TN,FN : String) : Boolean;
+
+Var
+  TD : TDDTableDef;
+
+begin
+  Result:=CanonicalizeFieldName(InFN,TD,FN);
+  If Result then
+    TN:=TD.TableName
+  else
+    TN:='';
+end;
+
+// To be good, we should make a hashlist with all tables.fields and search that...
+// For now, we cache the last matching table. This should work well for most common cases.
+function TFPDataDictionary.FindFieldDef(FieldName: String; out TableName: String
+  ): TDDFieldDef;
+
+Var
+  TD : TDDTableDef;
+  FN,TN : String;
+  I : Integer;
+  
+begin
+  Result:=Nil;
+  If CanonicalizeFieldName(FieldName,TD,FN) then
+    begin
+    Result:=TD.Fields.FieldByName(FN);
+    If (Result<>Nil) then
+      FLastMatchTableDef:=TD;
+    end
+  else
+    begin
+    If (FLastMatchTableDef<>Nil) then
+      begin
+      TD:=FLastMatchTableDef;
+      If (TD<>Nil) then
+        Result:=TD.Fields.FindField(FN)
+      else
+        begin
+        // Hard scan of all tables...
+        I:=0;
+        While (Result=Nil) and (I<Tables.Count) do
+          begin
+          TD:=Tables[i];
+          Result:=TD.Fields.FindField(FN);
+          If (Result<>Nil) then
+            FLastMatchTableDef:=TD;
+          Inc(I);
+          end;
+        end;
+      end;
+    end;
+  If (Result<>Nil) then
+    TableName:=FLastMatchTableDef.TableName;
+end;
+
+function TFPDataDictionary.FindFieldDef(FieldName: String): TDDFieldDef;
+
+Var
+  Dummy : String;
+
+begin
+  Result:=FindFieldDef(FieldName,Dummy);
+end;
+
+{ ---------------------------------------------------------------------
+  TFPDDEngine
+  ---------------------------------------------------------------------}
+
+procedure TFPDDEngine.DoProgress(const Msg: String);
+begin
+  If Assigned(FOnProgress) then
+    FOnProgress(Self,Msg);
+end;
+
+procedure TFPDDEngine.IndexDefsToDDIndexDefs(IDS: TIndexDefs; DDIDS: TDDindexDefs
+  );
+  
+Var
+  D : TIndexDef;
+  DD : TDDindexDef;
+  I : Integer;
+  
+begin
+  DDIDS.Clear;
+  For I:=0 to IDS.Count-1 do
+    begin
+    D:=IDS[I];
+    DD:=DDIDS.AddDDIndexDef(D.Name);
+    DD.Assign(D);
+    end;
+end;
+
+destructor TFPDDEngine.Destroy;
+begin
+  Disconnect;
+  inherited Destroy;
+end;
+
+function TFPDDEngine.GetConnectString: String;
+
+Var
+  CB : TGetConnectionEvent;
+  
+begin
+  CB:=GetEngineConnectionStringCallBack(Self.ClassName);
+  if (CB=Nil) then
+    Raise EDataDict.CreateFmt(SerrNoConnectionDialog,[Self.ClassName]);
+  Result:='';
+  CB(Self,Result);
+end;
+
+function TFPDDEngine.ImportTables(Tables: TDDTableDefs; List: TStrings; UpdateExisting : Boolean): Integer;
+
+Var
+  I,J : Integer;
+  TD : TDDTableDef;
+
+begin
+  Result:=0;
+  For I:=0 to List.Count-1 do
+    begin
+    TD:=Nil;
+    j:=Tables.IndexOfTable(List[i]);
+    If (J=-1) then
+      TD:=Tables.AddTAble(List[i])
+    else if UpdateExisting then
+      TD:=Tables[J];
+    If (TD<>nil) then
+      begin
+      DoProgress(Format(SDDImportingTable,[TD.TableName]));
+      ImportFields(TD);
+      Inc(Result);
+      end
+    end;
+end;
+
+function TFPDDEngine.CreateSQLEngine: TFPDDSQLEngine;
+begin
+  Result:=TFPDDSQLEngine.Create;
+end;
+
+class function TFPDDEngine.EngineCapabilities: TFPDDEngineCapabilities;
+begin
+  Result:=[];
+end;
+
+procedure TFPDDEngine.CreateTable(Table: TDDTableDef);
+begin
+  Raise EDataDict.CreateFmt(SErrCreateTableNotSupported,[DBType]);
+end;
+
+function TFPDDEngine.ViewTable(Const TableName: String; DatasetOwner: TComponent
+  ): TDataset;
+begin
+  Raise EDataDict.CreateFmt(SErrViewTableNotSupported,[DBType]);
+end;
+
+function TFPDDEngine.RunQuery(SQL: String): Integer;
+
+begin
+  Raise EDataDict.CreateFmt(SErrRunQueryNotSupported,[DBType]);
+end;
+
+function TFPDDEngine.CreateQuery(SQL: String; DatasetOwner : TComponent): TDataset;
+begin
+  Raise EDataDict.CreateFmt(SErrOpenQueryNotSupported,[DBType]);
+end;
+
+procedure TFPDDEngine.SetQueryStatement(SQL: String; AQuery: TDataset);
+begin
+  Raise EDataDict.CreateFmt(SErrSetQueryStatementNotSupported,[DBType]);
+end;
+
+function TFPDDEngine.GetTableIndexDefs(ATableName: String; Defs: TDDIndexDefs
+  ): integer;
+begin
+  Raise EDataDict.CreateFmt(SErrGetTableIndexDefsNotSupported,[DBType]);
+end;
+
+{ ---------------------------------------------------------------------
+  TFPDDSQLEngine
+  ---------------------------------------------------------------------}
+
+{ Utility functions }
+
+constructor TFPDDSQLEngine.Create;
+begin
+  FTerminatorChar:=DefaultSQLTerminatorChar;
+  FFieldQuoteChar:=DefaultSQLFieldQuoteChar;
+  FOptions:=DefaultSQLEngineOptions;
+  FMaxLineLength:=DefaultSQLEngineLineLength;
+  FIndent:=DefaultSQLEngineIndent;
+end;
+
+procedure TFPDDSQLEngine.CheckTableDef;
+begin
+  If (FTableDef=Nil) then
+    Raise EDataDict.Create(SErrMissingTableDef);
+end;
+
+procedure TFPDDSQLEngine.NoIndent;
+begin
+  FNoIndent:=True;
+end;
+
+procedure TFPDDSQLEngine.ResetLine;
+begin
+  FLastLength:=0;
+  NoIndent;
+end;
+
+procedure TFPDDSQLEngine.FixUpStatement(var Res: String);
+begin
+  Res:=Trim(Res);
+  if (eoAddTerminator in Options) then
+    Res:=Res+FTerminatorChar;
+end;
+
+Procedure TFPDDSQLEngine.AddToStringLN(Var Res : String;S : String);
+
+begin
+  AddToString(Res,S);
+  Res:=Res+LineEnding;
+  FLastLength:=0;
+end;
+
+procedure TFPDDSQLEngine.AddToString(Var Res: String; S: String);
+begin
+  If (FMaxLineLength>0) and (FLastLength+Length(S)+1>FMaxLineLength) then
+    begin
+    FLastLength:=0;
+    Res:=Res+LineEnding;
+    end
+  else If (FLastLength<>0) and (S<>'') then
+    S:=' '+S;
+  If (FLastlength=0) then
+    begin
+    If not FNoIndent then
+      begin
+      Res:=Res+StringOfChar(' ',Indent);
+      FLastlength:=FlastLength+Indent;
+      end;
+    end;
+  FLastLength:=FLastLength+Length(S);
+  FNoIndent:=False;
+  Res:=Res+S;
+end;
+
+procedure TFPDDSQLEngine.AddFieldString(var Res: String; S: String);
+begin
+  If eoLineFeedAfterField in FOptions then
+    AddToStringLn(Res,S)
+  else
+    AddToString(Res,S)
+end;
+
+function TFPDDSQLEngine.CreateAndTerm(FD: TDDFieldDef; UseOldParam: Boolean
+  ): string;
+begin
+  Result:=FieldNameString(FD)+' = '+FieldParamString(FD,UseOldParam);
+  if (eoAndTermsInBrackets in FOptions) then
+    Result:='('+Result+')';
+end;
+
+function TFPDDSQLEngine.CreateWhereSQL(var Res : String;FieldList: TFPDDFieldList; UseOldParam:Boolean): String;
+
+Var
+  i : Integer;
+  FD : TDDFieldDef;
+  S : String;
+
+begin
+  Result:='';
+  If Assigned(FieldList) and (FieldList.Count>0) then
+    begin
+    For i:=0 to FieldList.Count-1 do
+      begin
+      FD:=FieldList[i];
+      S:=CreateAndTerm(FD,UseOldParam);
+      If (I>0) then
+        S:=SAnd+' '+S;
+      If eoLineFeedAfterAndTerm in Options then
+        AddToStringLN(Res,S)
+      else
+        AddToString(Res,S);
+      end;
+    end;
+end;
+
+procedure TFPDDSQLEngine.AddWhereClause(var Res: String;
+  FieldList: TFPDDFieldList; UseOldParam: Boolean);
+begin
+  If Assigned(FieldList) and (FieldList.Count>0) then
+    begin
+    NoIndent;
+    AddToStringLn(Res,SWhere);
+    CreateWhereSQL(Res,FieldList,UseOldParam);
+    end;
+end;
+
+{ Functions with engine-specific strings in it. Can be overridden }
+
+function TFPDDSQLEngine.FieldNameString(FD: TDDFieldDef): string;
+begin
+  Result:=FD.FieldName;
+  if (eoQuoteFieldNames in FOptions) then
+    Result:=FFieldQuoteChar+Result+FFieldQuoteChar;
+end;
+
+function TFPDDSQLEngine.TableNameString(TD: TDDTableDef): string;
+begin
+  Result:=TD.TableName;
+end;
+
+function TFPDDSQLEngine.FieldParamString(FD: TDDFieldDef; UseOldParam: Boolean
+  ): string;
+begin
+  Result:=FD.FieldName;
+  If UseOldParam then
+    Result:=SOLD+Result;
+  Result:=':'+Result;
+end;
+
+function TFPDDSQLEngine.FieldTypeString(FD : TDDFieldDef) : String;
+{
+ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
+    ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate,  ftTime, ftDateTime,
+    ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
+    ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar,
+    ftWideString, ftLargeint, ftADT, ftArray, ftReference,
+    ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface,
+    ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd}
+begin
+  Result:=SQLFieldTypes[fD.FieldType];
+  If (Result='') then
+    Raise EDataDict.CreateFmt(SErrFieldTypeNotSupported,[GetEnumName(TypeInfo(TFieldType),Ord(FD.FieldType))]);
+  case FD.FieldType of
+    ftString,
+    ftFixedChar,
+    ftWideString :
+      Result:=Result+Format('(%d)',[FD.Size]);
+    ftBCD,
+    ftFMTBCD :
+      Result:=Result+Format('(%d,%d)',[FD.Precision,FD.Size]);
+  end;
+end;
+
+function TFPDDSQLEngine.FieldDefaultString(FD : TDDFieldDef) : String;
+
+begin
+  Result:=SDefault+' '+FD.DBDefault;
+end;
+
+function TFPDDSQLEngine.FieldCheckString(FD : TDDFieldDef) : String;
+
+begin
+  Result:=Trim(FD.Constraint);
+  If (Result<>'') then
+    begin
+    If (Result[1]<>'(') or (Result[Length(Result)]<>')') then
+      Result:='('+Result+')';
+    Result:=SCheck+' '+Result;
+    end;
+end;
+
+function TFPDDSQLEngine.FieldDeclarationString(FD : TDDFieldDef) : String;
+
+var
+  S : String;
+
+begin
+  Result:=FieldNameString(FD)+' '+FieldTypeString(FD);
+  If (FD.DBDefault<>'') then
+    Result:=Result+' '+FieldDefaultString(FD);
+  If FD.Required then
+    Result:=Result+' '+SNotNull;
+  S:=FieldCheckString(FD);
+  If (S<>'') then
+    Result:=Result+' '+S;
+end;
+
+{ SQL Creation functions. Can be overridden if needed. }
+  
+function TFPDDSQLEngine.CreateSelectSQL(FieldList, KeyFields: TFPDDFieldList
+  ): String;
+  
+Var
+  i : Integer;
+  FD : TDDFieldDef;
+  S : String;
+  
+begin
+  CheckTableDef;
+  Result:='';
+  ResetLine;
+  AddToStringLn(Result,SSelect);
+  For i:=0 to FieldList.Count-1 do
+    begin
+    FD:=FieldList[i];
+    S:=FieldNameString(FD);
+    If (I<FieldList.Count-1) then
+      S:=S+',';
+    AddFieldString(Result,S);
+    end;
+  If Not (eoLineFeedAfterField in FOptions) then
+    AddToStringLn(Result,'');
+  NoIndent;
+  AddToStringLn(Result,SFrom);
+  AddToStringLn(Result,TableNameString(TableDef));
+  AddWhereClause(Result,KeyFields,False);
+  FixUpStatement(Result);
+end;
+
+
+function TFPDDSQLEngine.CreateInsertSQL(FieldList: TFPDDFieldList): String;
+
+Var
+  i : Integer;
+  FD : TDDFieldDef;
+  S : String;
+
+begin
+  CheckTableDef;
+  Result:='';
+  ResetLine;
+  AddToString(Result,SInsertInto);
+  AddToStringLn(Result,TableNameString(TableDef));
+  For i:=0 to FieldList.Count-1 do
+    begin
+    FD:=FieldList[i];
+    S:=FieldNameString(FD);
+    If (I=0) then
+      S:='('+S;
+    If (I<FieldList.Count-1) then
+      S:=S+','
+    else
+      S:=S+')';
+    AddFieldString(Result,S);
+    end;
+  If Not (eoLineFeedAfterField in FOptions) then
+    AddToStringLn(Result,'');
+  NoIndent;
+  AddToStringLn(Result,SValues);
+  For i:=0 to FieldList.Count-1 do
+    begin
+    FD:=FieldList[i];
+    S:=FieldParamString(FD,False);
+    If (I=0) then
+      S:='('+S;
+    If (I<FieldList.Count-1) then
+      S:=S+','
+    else
+      S:=S+')';
+    AddFieldString(Result,S);
+    end;
+  FixUpStatement(Result);
+end;
+
+function TFPDDSQLEngine.CreateUpdateSQL(FieldList, KeyFields: TFPDDFieldList
+  ): String;
+
+Var
+  i : Integer;
+  FD : TDDFieldDef;
+  S : String;
+
+begin
+  CheckTableDef;
+  ResetLine;
+  Result:='';
+  AddToString(Result,SUPDATE);
+  AddToStringLN(Result,TableNameString(TableDef));
+  NoIndent;
+  AddToStringLN(Result,SSET);
+  If Assigned(FieldList) and (FieldList.Count>0) then
+    begin
+    For i:=0 to FieldList.Count-1 do
+      begin
+      FD:=FieldList[i];
+      S:=FieldNameString(FD)+' = '+FieldParamString(FD,False);
+      If (I<FieldList.Count-1) then
+        S:=S+',';
+      AddFieldString(Result,S);
+      end;
+    end;
+  AddWhereClause(Result,KeyFields,eoUseOldInWhereParams in Options);
+  FixUpStatement(Result);
+end;
+
+function TFPDDSQLEngine.CreateDeleteSQL(KeyFields: TFPDDFieldList): String;
+begin
+  CheckTableDef;
+  ResetLine;
+  Result:='';
+  AddToStringLN(Result,SDeleteFrom);
+  AddToStringLN(Result,TableNameString(TableDef));
+  AddWhereClause(Result,KeyFields,eoUseOldInWhereParams in Options);
+  FixUpStatement(Result);
+end;
+
+
+function TFPDDSQLEngine.CreateCreateSQL(Fields, KeyFields: TFPDDFieldList
+  ): String;
+  
+Var
+  S : String;
+  I : integer;
+  
+begin
+  CheckTableDef;
+  Result:='';
+  ResetLine;
+  AddToStringLn(Result,SCreateTable+' '+TableNameString(TableDef)+' (');
+  For I:=0 to Fields.Count-1 do
+    begin
+    S:=FieldDeclarationString(Fields[i]);
+    If (I<Fields.Count-1) or (Assigned(KeyFields) and (KeyFields.Count<>0)) then
+      S:=S+',';
+    AddToStringLn(Result,S);
+    end;
+  If (Assigned(KeyFields) and (KeyFields.Count<>0)) then
+    begin
+    S:=SCONSTRAINT+' '+TableDef.PrimaryKeyConstraintName+' '+SPrimaryKey+' (';
+    For I:=0 to KeyFields.Count-1 do
+      begin
+      S:=S+FieldNameString(KeyFields[i]);
+      If I<KeyFields.Count-1 then
+        S:=S+','
+      else
+        S:=S+')'
+      end;
+    AddToStringLn(Result,S);
+    end;
+  NoIndent;
+  AddToStringLn(Result,')');
+  FixUpStatement(Result);
+end;
+
+function TFPDDSQLEngine.CreateCreateSQL(KeyFields: TFPDDFieldList): String;
+
+Var
+  Fl : TFPDDFieldList;
+
+begin
+  CheckTableDef;
+  FL:=TFPDDfieldList.CreateFromTableDef(TableDef);
+  try
+    Result:=CreateCreateSQL(FL,KeyFields);
+  finally
+    FL.Free;
+  end;
+end;
+
+{ TStrings versions of SQL creation statements. }
+
+procedure TFPDDSQLEngine.CreateSelectSQLStrings(FieldList,KeyFields: TFPDDFieldList; SQL: TStrings);
+
+begin
+  SQL.Text:=CreateSelectSQL(FieldList,KeyFields);
+end;
+
+procedure TFPDDSQLEngine.CreateInsertSQLStrings(FieldList: TFPDDFieldList; SQL: TStrings);
+begin
+  SQL.Text:=CreateInsertSQL(FieldList);
+end;
+
+procedure TFPDDSQLEngine.CreateUpdateSQLStrings(FieldList, KeyFields: TFPDDFieldList;
+  SQL: TStrings);
+begin
+  SQL.Text:=CreateUpdateSQL(FieldList,KeyFields);
+end;
+
+procedure TFPDDSQLEngine.CreateDeleteSQLStrings(KeyFields: TFPDDFieldList;
+  SQL: TStrings);
+begin
+  SQL.Text:=CreateDeleteSQL(KeyFields);
+end;
+
+procedure TFPDDSQLEngine.CreateCreateSQLStrings(Fields,
+  KeyFields: TFPDDFieldList; SQL: TStrings);
+begin
+  SQL.Text:=CreateCreateSQL(Fields,KeyFields);
+end;
+
+procedure TFPDDSQLEngine.CreateCreateSQLStrings(KeyFields: TFPDDFieldList;
+  SQL: TStrings);
+begin
+  SQL.Text:=CreateCreateSQL(KeyFields);
+end;
+
+{ ---------------------------------------------------------------------
+  TDDFieldList
+  ---------------------------------------------------------------------}
+
+function TFPDDFieldList.GetFieldDef(Index : Integer): TDDFieldDef;
+begin
+  Result:=TDDFieldDef(Items[Index]);
+end;
+
+procedure TFPDDFieldList.SetFieldDef(Index : Integer; const AValue: TDDFieldDef);
+begin
+  Items[Index]:=AValue;
+end;
+
+constructor TFPDDFieldList.CreateFromTableDef(TD: TDDTableDef);
+
+begin
+  CreateFromFieldDefs(TD.Fields);
+end;
+
+constructor TFPDDFieldList.CreateFromFieldDefs(FD: TDDFieldDefs);
+
+Var
+  I : Integer;
+
+begin
+  Inherited Create;
+  Capacity:=FD.Count;
+  For I:=0 to FD.Count-1 do
+    Add(FD[i]);
+end;
+
+{ TDDIndexDef }
+
+function TDDIndexDef.GetSectionName: String;
+begin
+  Result:=IndexName;
+end;
+
+procedure TDDIndexDef.SetSectionName(const Value: String);
+begin
+  IndexName:=Value;
+end;
+
+procedure TDDIndexDef.Assign(ASource: TPersistent);
+
+Var
+  DD : TDDIndexDef;
+  D : TIndexDef;
+
+begin
+  If ASource is TDDIndexDef then
+    begin
+    DD:=ASource as TDDIndexDef;
+    IndexName:=DD.IndexName;
+    Expression:=DD.Expression;
+    Fields:=DD.Expression;
+    CaseInsFields:=DD.CaseInsFields;
+    DescFields:=DD.DescFields;
+    Options:=DD.Options;
+    Source:=DD.Source;
+    end
+  else if ASource is TIndexDef then
+    begin
+    D:=ASource as TIndexDef;
+    IndexName:=D.Name;
+    Expression:=D.Expression;
+    Fields:=D.Fields;
+    CaseInsFields:=D.CaseInsFields;
+    DescFields:=D.DescFields;
+    Options:=D.Options;
+    Source:=D.Source;
+    end
+  else
+    inherited Assign(ASource);
+end;
+
+{ TDDIndexDefs }
+
+function TDDIndexDefs.GetIndex(Index : Integer): TDDIndexDef;
+begin
+  Result:=Items[Index] as TDDIndexDef;
+end;
+
+procedure TDDIndexDefs.SetIndex(Index : Integer; const AValue: TDDIndexDef);
+begin
+  Items[Index]:=AValue;
+end;
+
+procedure TDDIndexDefs.SetTableName(const AValue: String);
+begin
+  FTableName:=AValue;
+  FSectionPrefix:=AValue;
+  GlobalSection:=AValue+SIndexSuffix;
+end;
+
+constructor TDDIndexDefs.Create(ATableName: String);
+begin
+  FPrefix:='Index';
+  TableName:=ATableName;
+  Inherited Create(TDDIndexDef);
+end;
+
+function TDDIndexDefs.AddDDIndexDef(AName: String): TDDIndexDef;
+begin
+  Result:=Add as TDDIndexDef;
+  Result.IndexName:=AName;
+end;
+
+initialization
+
+finalization
+  FreeAndNil(DDEngines);
+end.
+

+ 184 - 0
packages/fcl-db/src/datadict/fpdddbf.pp

@@ -0,0 +1,184 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    DBF Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddDbf;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, db,dbf, fpdatadict;
+  
+Type
+
+  { TDBFDDimporter }
+
+  { TDBFDDEngine }
+
+  TDBFDDEngine = Class(TFPDDEngine)
+  Private
+    FDBF : TDBF;
+  Public
+    Procedure Disconnect ; override;
+    Function Connect(const AConnectString : String) : Boolean; override;
+    Function GetTableList(List : TStrings) : Integer; override;
+    Function ImportFields(Table : TDDTableDef) : Integer; override;
+    Function ViewTable(Const TableName: String; DatasetOwner : TComponent) : TDataset; override;
+    Function GetTableIndexDefs(ATableName : String; Defs : TDDIndexDefs) : integer ; override;
+    Class function Description : string; override;
+    Class function DBType : String; override;
+    Class function EngineCapabilities : TFPDDEngineCapabilities; override;
+  end;
+  
+Procedure InitDBFImporter;
+Procedure DoneDBFImporter;
+
+implementation
+
+uses dbf_idxfile;
+
+procedure TDBFDDEngine.Disconnect;
+begin
+  FConnectString:='';
+  FConnected:=False;
+  FreeAndNil(FDBF);
+end;
+
+function TDBFDDEngine.Connect(const AConnectString : String): Boolean;
+begin
+  FDBF:=TDBF.Create(Self);
+  FDBF.FilePath:=AConnectString;
+  FConnected:=True;
+  FConnectString:=AConnectString;
+  Result:=True;
+end;
+
+Function TDBFDDEngine.GetTableList(List: TStrings) : Integer;
+
+Var
+  Info : TSearchrec;
+  FN : String;
+ 
+begin
+  Result:=0;
+  If Assigned(FDBF) then
+    begin
+    FN:=IncludeTrailingPathDelimiter(FDBF.FilePath);
+    If FindFirst(FN+'*.dbf',0,Info)=0 then
+      try
+        Repeat
+          inc(Result);
+          If Assigned(List) then
+            List.Add(info.name);
+        Until (FindNext(Info)<>0);
+      finally
+        FindClose(Info);
+      end;
+    end;
+end;
+
+Function TDBFDDEngine.ImportFields(Table: TDDTableDef) : Integer;
+begin
+  Result:=0;
+  if Assigned(FDBF) then
+    begin
+    FDBF.TableName:=Table.TableName;
+    FDBF.Open;
+    Try
+      Table.ImportFromDataset(FDBF);
+    Finally
+      FDBF.Close;
+    end;
+    end;
+end;
+
+function TDBFDDEngine.ViewTable(const TableName: String;
+  DatasetOwner: TComponent): TDataset;
+  
+Var
+  D : TDBF;
+  
+begin
+  If DatasetOwner=Nil then
+   DatasetOwner:=Self;
+  D:=TDBF.Create(DatasetOwner);
+  D.FilePath:=FDBF.FilePath;
+  D.TableName:=TableName;
+  Result:=D;
+end;
+
+function TDBFDDEngine.GetTableIndexDefs(ATableName: String; Defs: TDDIndexDefs
+  ): integer;
+  
+Var
+  D : TDBF;
+  DBD : TDBFIndexDef;
+  DD : TDDIndexDef;
+  I : Integer;
+  
+begin
+  D:=TDBF.Create(Self);
+  Try
+    D.FilePath:=FDBF.FilePath;
+    D.TableName:=ATableName;
+    D.IndexDefs.Update;
+    Defs.Clear;
+    For I:=0 to D.IndexDefs.Count-1 do
+      begin
+      DBD:=D.IndexDefs[i];
+      DD:=Defs.AddDDIndexDef(DBD.Name);
+      DD.Fields:=DBD.SortField;
+      DD.Options:=DBD.Options;
+      end;
+    Result:=Defs.Count;
+  Finally
+    D.Free;
+  end;
+end;
+
+Class function TDBFDDEngine.Description: string;
+begin
+  Result:='DBase database dictionary importer';
+end;
+
+class function TDBFDDEngine.DBType: String;
+begin
+  Result:='DBase files';
+end;
+
+class function TDBFDDEngine.EngineCapabilities: TFPDDEngineCapabilities;
+begin
+  Result:=[ecImport,ecViewTable];
+end;
+
+Procedure InitDBFImporter;
+
+begin
+  RegisterDictionaryEngine(TDBFDDEngine);
+end;
+
+Procedure DoneDBFImporter;
+
+begin
+  UnRegisterDictionaryEngine(TDBFDDEngine);
+end;
+
+Initialization
+  InitDBFImporter;
+Finalization
+  DoneDBFImporter;
+end.
+

+ 79 - 0
packages/fcl-db/src/datadict/fpddfb.pp

@@ -0,0 +1,79 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    Firebird/Interbase Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddfb;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+  
+Type
+
+  { TSQLDBFBDDEngine }
+  
+  TSQLDBFBDDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+  // Backwards compatibility
+  TSQLDBIBDDEngine = TSQLDBFBDDEngine;
+  
+
+Procedure RegisterFBDDEngine;
+Procedure UnRegisterFBDDEngine;
+
+implementation
+
+uses ibconnection;
+
+Procedure RegisterFBDDEngine;
+
+begin
+  RegisterDictionaryEngine(TSQLDBFBDDEngine);
+end;
+
+Procedure UnRegisterFBDDEngine;
+
+begin
+  UnRegisterDictionaryEngine(TSQLDBFBDDEngine);
+end;
+
+{ TSQLDBFBDDEngine }
+
+function TSQLDBFBDDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=TIBConnection.Create(Self);
+end;
+
+class function TSQLDBFBDDEngine.Description: string;
+begin
+  Result:='Firebird/Interbase connection using SQLDB';
+end;
+
+class function TSQLDBFBDDEngine.DBType: String;
+begin
+  Result:='Firebird/Interbase';
+end;
+
+end.
+

+ 73 - 0
packages/fcl-db/src/datadict/fpddmysql40.pp

@@ -0,0 +1,73 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    MySQL 4.0 Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddmysql40;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+  
+Type
+  { TSQLDBMySql40DDEngine }
+
+  TSQLDBMySql40DDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+  
+Procedure RegisterMySQL40DDEngine;
+Procedure UnRegisterMySQL40DDEngine;
+
+implementation
+
+uses mysql40conn;
+
+procedure RegisterMySQL40DDEngine;
+begin
+  RegisterDictionaryEngine(TSQLDBMySQL40DDEngine);
+end;
+
+procedure UnRegisterMySQL40DDEngine;
+begin
+  UnRegisterDictionaryEngine(TSQLDBMySQL40DDEngine);
+end;
+
+
+{ TSQLDBMySql40DDEngine }
+
+function TSQLDBMySql40DDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=mysql40conn.TMySQL40Connection.Create(Self);
+end;
+
+class function TSQLDBMySql40DDEngine.Description: string;
+begin
+  Result:='Mysql 4.0 connection using SQLDB';
+end;
+
+class function TSQLDBMySql40DDEngine.DBType: String;
+begin
+  Result:='MySQL 4.0';
+end;
+
+end.
+

+ 74 - 0
packages/fcl-db/src/datadict/fpddmysql41.pp

@@ -0,0 +1,74 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    MySQL 4.1 Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddmysql41;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpDataDict,fpddsqldb;
+  
+Type
+  { TSQLDBMySql41DDEngine }
+
+  TSQLDBMySql41DDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+Procedure RegisterMySQL41DDEngine;
+Procedure UnRegisterMySQL41DDEngine;
+
+implementation
+
+uses mysql41conn;
+
+Procedure RegisterMySQL41DDEngine;
+
+begin
+  RegisterDictionaryEngine(TSQLDBMySQL41DDEngine);
+end;
+
+Procedure UnRegisterMySQL41DDEngine;
+
+begin
+  UnRegisterDictionaryEngine(TSQLDBMySQL41DDEngine);
+end;
+
+{ TSQLDBMySql41DDEngine }
+
+function TSQLDBMySql41DDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=mysql41conn.TMySQL41Connection.Create(Self);
+end;
+
+class function TSQLDBMySql41DDEngine.Description: string;
+begin
+  Result:='Mysql 4.1 connection using SQLDB';
+end;
+
+class function TSQLDBMySql41DDEngine.DBType: String;
+begin
+  Result:='MySQL 4.1';
+end;
+
+end.
+

+ 74 - 0
packages/fcl-db/src/datadict/fpddmysql50.pp

@@ -0,0 +1,74 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    MySQL 5.0 Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddmysql50;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+  
+Type
+  { TSQLDBMySql5DDEngine }
+
+  TSQLDBMySql5DDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+Procedure RegisterMySQL50DDEngine;
+Procedure UnRegisterMySQL50DDEngine;
+
+implementation
+
+uses mysql50conn;
+
+Procedure RegisterMySQL50DDEngine;
+
+begin
+  RegisterDictionaryEngine(TSQLDBMySQL5DDEngine);
+end;
+
+Procedure UnRegisterMySQL50DDEngine;
+
+begin
+  UnRegisterDictionaryEngine(TSQLDBMySQL5DDEngine);
+end;
+
+{ TSQLDBMySql5DDEngine }
+
+function TSQLDBMySql5DDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=mysql50conn.TMySQL50Connection.Create(Self);
+end;
+
+class function TSQLDBMySql5DDEngine.Description: string;
+begin
+  Result:='Mysql 5.0 connection using SQLDB';
+end;
+
+class function TSQLDBMySql5DDEngine.DBType: String;
+begin
+  Result:='MySQL 5.0';
+end;
+
+end.
+

+ 72 - 0
packages/fcl-db/src/datadict/fpddodbc.pp

@@ -0,0 +1,72 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    ODBC Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddodbc;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+
+Type
+  { TSQLDBODBCDDEngine }
+
+  TSQLDBODBCDDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+Procedure RegisterODBCDDengine;
+Procedure UnRegisterODBCDDengine;
+
+implementation
+
+uses odbcconn;
+
+procedure RegisterODBCDDengine;
+begin
+  RegisterDictionaryEngine(TSQLDBODBCDDEngine);
+end;
+
+procedure UnRegisterODBCDDengine;
+begin
+  UnRegisterDictionaryEngine(TSQLDBODBCDDEngine);
+end;
+
+{ TSQLDBODBCDDEngine }
+
+function TSQLDBODBCDDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=TODBCConnection.Create(Self);
+end;
+
+class function TSQLDBODBCDDEngine.Description: string;
+begin
+  Result:='ODBC connection using SQLDB';
+end;
+
+class function TSQLDBODBCDDEngine.DBType: String;
+begin
+  Result:='ODBC';
+end;
+
+end.
+

+ 74 - 0
packages/fcl-db/src/datadict/fpddoracle.pp

@@ -0,0 +1,74 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    Oracle Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+unit fpddoracle;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+  
+Type
+  { TSQLDBORACLEEngine }
+  TSQLDBOracleDDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+Procedure RegisterOracleDDEngine;
+Procedure UnRegisterOracleDDEngine;
+
+
+implementation
+
+uses oracleconnection;
+
+procedure RegisterOracleDDEngine;
+begin
+  RegisterDictionaryEngine(TSQLDBORACLEDDEngine);
+end;
+
+procedure UnRegisterOracleDDEngine;
+begin
+  UnRegisterDictionaryEngine(TSQLDBORACLEDDEngine);
+end;
+
+
+{ TSQLDBORACLEDDEngine }
+
+function TSQLDBORACLEDDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=TOracleConnection.Create(Self);
+end;
+
+class function TSQLDBORACLEDDEngine.Description: string;
+begin
+  Result:='Oracle connection using SQLDB';
+end;
+
+class function TSQLDBORACLEDDEngine.DBType: String;
+begin
+  Result:='Oracle';
+end;
+
+end.
+

+ 72 - 0
packages/fcl-db/src/datadict/fpddpq.pp

@@ -0,0 +1,72 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    Postgresql Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddpq;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+
+Type
+  { TSQLDBPostGreSQLDDEngine }
+
+  TSQLDBPostGreSQLDDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+Procedure RegisterPostgreSQLDDengine;
+Procedure UnRegisterPostgreSQLDDengine;
+
+implementation
+
+uses pqconnection;
+
+procedure RegisterPostgreSQLDDengine;
+begin
+  RegisterDictionaryEngine(TSQLDBPostGreSQLDDEngine);
+end;
+
+procedure UnRegisterPostgreSQLDDengine;
+begin
+  UnRegisterDictionaryEngine(TSQLDBPostGreSQLDDEngine);
+end;
+
+{ TSQLDBPostGreSQLDDEngine }
+
+function TSQLDBPostGreSQLDDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=TPQConnection.Create(Self);
+end;
+
+class function TSQLDBPostGreSQLDDEngine.Description: string;
+begin
+  Result:='PostGreSQL using SQLDB';
+end;
+
+class function TSQLDBPostGreSQLDDEngine.DBType: String;
+begin
+  Result:='PostGreSQL';
+end;
+
+end.
+

+ 175 - 0
packages/fcl-db/src/datadict/fpddregstd.pp

@@ -0,0 +1,175 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    Standard Data Dictionary Engines registration.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+{
+  This unit has a routine and a component to register standard distributed
+  Data dictionary engines in an application. The Component version is meant for
+  use in Lazarus: Drop it on a form, set the engines you want to see
+  registered, and set active to true. When the form is created a run-time,
+  the selected engines will be registered.
+
+  The simple call takes an optional single argument, a set which tells
+  the call which engines to register. If none is specified, all formats
+  are registered.
+
+}
+unit fpddregstd;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, fpdatadict;
+
+Type
+  TDataDictEngine = (teDBF,teFirebird,teOracle,teMySQL40,teMySQL41,teMySQL50,
+                       tePostgreSQL,teSQLite3,teODBC);
+  TDataDictEngines = set of TDataDictEngine;
+
+Const
+  AllStdDDEngines = [teDBF,teFirebird,teOracle,teMySQL40,teMySQL41,teMySQL50,
+                     tePostgreSQL,teSQLite3,teODBC];
+                     
+Type
+
+  { TStandardDDEngines }
+
+  TStandardDDEngines = Class(TComponent)
+  Private
+    FActive: Boolean;
+    FRegistered,
+    FEngines: TDataDictEngines;
+    procedure SetActive(const AValue: Boolean);
+    Procedure DoRegister;
+    Procedure DoUnregister;
+  Public
+    Constructor Create(AOwner : TComponent); override;
+    Procedure Loaded; override;
+  Published
+    Property Active : Boolean Read FActive Write SetActive;
+    Property Engines : TDataDictEngines Read FEngines Write FEngines Default AllStdDDEngines;
+  end;
+
+Function RegisterStdDDEngines(Engines : TDataDictEngines) : TDataDictEngines; overload;
+Function RegisterStdDDEngines : TDataDictEngines; overload;
+Function UnRegisterStdDDEngines(Engines : TDataDictEngines) : TDataDictEngines;
+
+implementation
+
+uses
+  fpdddbf,
+  fpddfb,
+  fpddpq,
+  fpddOracle,
+  fpddsqlite3,
+  fpddmysql40,
+  fpddmysql41,
+  fpddmysql50,
+  fpddodbc;
+  
+Const
+
+  StdEngineClasses : Array [TDataDictEngine] of TFPDDEngineClass
+                   = (TDBFDDEngine, TSQLDBFBDDEngine, TSQLDBOracleDDEngine,
+                      TSQLDBMySql40DDEngine, TSQLDBMySql41DDEngine ,
+                      TSQLDBMySql5DDEngine, TSQLDBPostGreSQLDDEngine,
+                      TSQLDBSQLite3DDEngine,TSQLDBODBCDDEngine);
+
+  StdEngineRegs : Array [TDataDictEngine] of procedure
+                = (@InitDBFImporter, @RegisterFBDDEngine, @RegisterOracleDDEngine,
+                  @RegisterMySQL40DDEngine, @RegisterMySQL41DDEngine,
+                  @RegisterMySQL50DDEngine, @RegisterPostgreSQLDDengine,
+                  @RegisterSQLite3DDEngine, @RegisterODBCDDengine);
+
+  StdEngineUnRegs : Array [TDataDictEngine] of procedure
+                = (@DoneDBFImporter, @UnRegisterFBDDEngine, @UnRegisterOracleDDEngine,
+                  @UnRegisterMySQL40DDEngine, @UnRegisterMySQL41DDEngine,
+                  @UnRegisterMySQL50DDEngine, @UnRegisterPostgreSQLDDengine,
+                  @UnRegisterSQLite3DDEngine, @UnRegisterODBCDDengine);
+                  
+function RegisterStdDDEngines(Engines: TDataDictEngines): TDataDictEngines;
+
+Var
+  E : TDataDictEngine;
+
+begin
+  Result:=[];
+  For E:=Low(TDataDictEngine) to High(TDataDictEngine) do
+    If (E in Engines) and (Not IsDictionaryEngineRegistered(StdEngineClasses[E])) then
+      begin
+      StdEngineRegs[E];
+      Include(Result,E);
+      end;
+end;
+
+function RegisterStdDDEngines: TDataDictEngines;
+begin
+  Result:=RegisterStdDDEngines(AllStdDDEngines);
+end;
+
+function UnRegisterStdDDEngines(Engines: TDataDictEngines): TDataDictEngines;
+
+Var
+  E : TDataDictEngine;
+
+begin
+  Result:=[];
+  For E:=Low(TDataDictEngine) to High(TDataDictEngine) do
+    If (E in Engines) and IsDictionaryEngineRegistered(StdEngineClasses[E]) then
+      begin
+      StdEngineUnRegs[E];
+      Include(Result,E);
+      end;
+
+end;
+
+{ TStandardDDEngines }
+
+procedure TStandardDDEngines.SetActive(const AValue: Boolean);
+begin
+  if FActive=AValue then
+    exit;
+  FActive:=AValue;
+  If Not (csLoading in ComponentState) then
+    If Active then
+      DoRegister
+    else
+      DoUnregister;
+end;
+
+procedure TStandardDDEngines.Loaded;
+begin
+  If FActive then
+    DoRegister;
+end;
+
+procedure TStandardDDEngines.DoRegister;
+begin
+  FRegistered:=RegisterSTDDDengines(FEngines);
+end;
+
+procedure TStandardDDEngines.DoUnregister;
+begin
+  UnRegisterSTDDDengines(FRegistered);
+end;
+
+constructor TStandardDDEngines.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+end;
+
+end.
+

+ 219 - 0
packages/fcl-db/src/datadict/fpddsqldb.pp

@@ -0,0 +1,219 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    SQLDB Data Dictionary Engine common Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddsqldb;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, DB, sqldb, fpdatadict;
+
+Type
+
+  { TSQLDBDDEngine }
+
+  TSQLDBDDEngine = Class(TFPDDEngine)
+  Private
+    FConn: TSQLConnection;
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; virtual; abstract;
+    Function CreateSQLQuery(ADatasetOwner: TComponent) : TSQLQuery;
+    Property Connection : TSQLConnection Read FConn;
+  Public
+    Procedure Disconnect ; override;
+    Function HostSupported: Boolean; virtual;
+    Function Connect(const AConnectString : String) : Boolean; override;
+    Function GetTableList(List : TStrings) : Integer; override;
+    Function ImportFields(Table : TDDTableDef) : Integer; override;
+    Function ViewTable(Const TableName: String; DatasetOwner : TComponent) : TDataset; override;
+    Function RunQuery(SQL : String) : Integer; override;
+    Function CreateQuery(SQL : String; DatasetOwner : TComponent) : TDataset; override;
+    Procedure SetQueryStatement(SQL : String; AQuery : TDataset); override;
+    Function GetTableIndexDefs(ATableName : String; Defs : TDDIndexDefs) : integer ; override;
+    Class function EngineCapabilities : TFPDDEngineCapabilities; override;
+  end;
+
+
+
+Const
+  // used in connectionstring
+  KeyHostName     = 'Host';
+  KeyDatabaseName = 'Database';
+  KeyUserName     = 'User';
+  KeyPassword     = 'Password';
+  KeyEncode       = 'Trivial';
+
+implementation
+
+
+uses strutils;
+
+Resourcestring
+  SErrQueryNotSQLQuery = 'Query object "%s" is not a SQL Query';
+  
+{ TSQLDBDDEngine }
+
+function TSQLDBDDEngine.HostSupported: Boolean;
+begin
+  Result:=True;
+end;
+
+function TSQLDBDDEngine.CreateSQLQuery(ADatasetOwner: TComponent): TSQLQuery;
+begin
+  Result:=TSQLQuery.Create(ADatasetOwner);
+  Result.DataBase:=FConn;
+  Result.Transaction:=FConn.TRansaction;
+end;
+
+procedure TSQLDBDDEngine.Disconnect;
+begin
+  FreeAndNil(FConn);
+  FConnectString:='';
+  FConnected:=False;
+end;
+
+function TSQLDBDDEngine.Connect(const AConnectString: String): Boolean;
+
+Var
+  L : TStringList;
+  
+begin
+  FConn:=CreateConnection(AConnectString);
+  FConn.Transaction:=TSQLTransaction.Create(FConn);
+  L:=TStringList.Create;
+  Try
+    L.CommaText:=AConnectString;
+    If HostSupported then
+      FConn.HostName:=L.Values[KeyHostName];
+    FConn.DatabaseName:=L.Values[KeyDatabaseName];
+    FConn.UserName:=L.Values[KeyUserName];
+    FConn.Password:=XorDecode(KeyEncode,L.Values[KeyPassword]);
+    FConn.LoginPrompt:=False;
+    FConn.Connected:=True;
+    FConnected:=True;
+    FConnectString:=AConnectString;
+    Result:=True;
+  Finally
+    L.Free;
+  end;
+end;
+
+function TSQLDBDDEngine.GetTableList(List: TStrings): Integer;
+begin
+  FConn.GetTableNames(List,False);
+end;
+
+function TSQLDBDDEngine.ImportFields(Table: TDDTableDef): Integer;
+
+Const
+  SQL = 'SELECT * from %s where (1=0)';
+
+Var
+  Q : TSQLQuery;
+  
+begin
+  Q:=CreateSQLQuery(Nil);
+  try
+    Q.Sql.Text:=Format(SQL,[Table.TableName]);
+    Q.Open;
+    try
+      Result:=Table.ImportFromDataset(Q);
+    finally
+      Q.CLose;
+    end;
+  finally
+    Q.Free;
+  end;
+end;
+
+function TSQLDBDDEngine.ViewTable(const TableName: String;
+  DatasetOwner: TComponent): TDataset;
+  
+Var
+  Q : TSQLQuery;
+  
+begin
+  Q:=CreateSQLQuery(DatasetOwner);
+  Q.SQL.Text:='SELECT * FROM '+TableName;
+  Result:=Q;
+end;
+
+function TSQLDBDDEngine.RunQuery(SQL: String): Integer;
+
+Var
+  Q : TSQLQuery;
+
+begin
+  Q:=CreateSQLQuery(Nil);
+  Try
+    Q.SQL.Text:=SQL;
+    Q.ExecSQL;
+    Result:=0;
+  Finally
+    Q.Free;
+  end;
+end;
+
+function TSQLDBDDEngine.CreateQuery(SQL: String; DatasetOwner: TComponent
+  ): TDataset;
+
+Var
+  Q : TSQLQuery;
+
+begin
+  Q:=CreateSQLQuery(Nil);
+  Result:=Q;
+  Q.SQL.Text:=SQL;
+  Q.Open;
+end;
+
+procedure TSQLDBDDEngine.SetQueryStatement(SQL: String; AQuery: TDataset);
+begin
+  If Not (AQuery is TSQLQuery) then
+    Raise EDataDict.CreateFmt(SErrQueryNotSQLQuery,[AQuery.ClassName]);
+  (AQuery as TSQLQuery).SQL.Text:=SQL;
+end;
+
+function TSQLDBDDEngine.GetTableIndexDefs(ATableName: String; Defs: TDDIndexDefs
+  ): integer;
+  
+Var
+  Q : TSQLQuery;
+  
+begin
+  Q:=TSQLQuery.Create(Self);
+  Try
+    Q.Database:=FConn;
+    Q.Transaction:=FConn.Transaction;
+    Q.SQL.text:=Format('SELECT * FROM %s WHERE (1=2)',[ATAbleName]);
+    Q.ReadOnly:=False;
+    Q.Prepare;
+    Q.IndexDefs.Update;
+    IndexDefsToDDIndexDefs(Q.IndexDefs,Defs);
+    Result:=Defs.Count;
+  finally
+    Q.Free;
+  end;
+end;
+
+class function TSQLDBDDEngine.EngineCapabilities: TFPDDEngineCapabilities;
+begin
+  Result:=[ecimport,ecViewTable, ecRunQuery, ecTableIndexes];
+end;
+
+end.
+

+ 72 - 0
packages/fcl-db/src/datadict/fpddsqlite3.pp

@@ -0,0 +1,72 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Michael Van Canneyt, member of the
+    Free Pascal development team
+
+    SQLite3 Data Dictionary Engine Implementation.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+unit fpddsqlite3;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sqldb, fpdatadict, fpddsqldb;
+  
+Type
+  { TSQLDBSQLite3DDEngine }
+
+  TSQLDBSQLite3DDEngine = Class(TSQLDBDDEngine)
+  Protected
+    Function CreateConnection(AConnectString  : String) : TSQLConnection; override;
+  Public
+    Class function Description : string; override;
+    Class function DBType : String; override;
+  end;
+
+Procedure RegisterSQLite3DDEngine;
+Procedure UnRegisterSQLite3DDEngine;
+
+implementation
+
+uses sqlite3conn;
+
+procedure RegisterSQLite3DDEngine;
+begin
+  RegisterDictionaryEngine(TSQLDBSQLITE3DDEngine);
+end;
+
+procedure UnRegisterSQLite3DDEngine;
+begin
+  UnRegisterDictionaryEngine(TSQLDBSQLITE3DDEngine);
+end;
+
+{ TSQLDBSQLite3DDEngine }
+
+function TSQLDBSQLite3DDEngine.CreateConnection(AConnectString: String
+  ): TSQLConnection;
+begin
+  Result:=TSQLITE3Connection.Create(Self);
+end;
+
+class function TSQLDBSQLite3DDEngine.Description: string;
+begin
+  Result:='SQLite 3 database using SQLDB';
+end;
+
+class function TSQLDBSQLite3DDEngine.DBType: String;
+begin
+  Result:='SQLITE3';
+end;
+
+end.
+