Browse Source

Merged revisions 7364,7380,7765,7939,7955,8023-8024,8038,8062,8077,8103-8106,8153,8167-8169,8173,8183-8185,8221,8263,8293,8343,8346,8348,8355-8356,8436-8437 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7364 | michael | 2007-05-16 17:31:11 +0200 (Wed, 16 May 2007) | 1 line

* Introduced TCustomSQLQuery, with properties in protected mode
........
r7380 | michael | 2007-05-17 18:17:28 +0200 (Thu, 17 May 2007) | 1 line

* Use StrToXXXDef functions for readXXX()
........
r7765 | michael | 2007-06-22 00:15:08 +0200 (Fri, 22 Jun 2007) | 1 line

* Implemented TFPTimer
........
r7939 | michael | 2007-07-03 23:31:25 +0200 (Tue, 03 Jul 2007) | 1 line

* Integrated some improvements by Martin Schreiber
........
r7955 | michael | 2007-07-05 09:40:41 +0200 (Thu, 05 Jul 2007) | 1 line

* Published property Database in TSQLQuery again
........
r8023 | michael | 2007-07-11 23:25:31 +0200 (Wed, 11 Jul 2007) | 1 line

* Initial commit
........
r8024 | michael | 2007-07-11 23:26:36 +0200 (Wed, 11 Jul 2007) | 1 line

* Added sqlite
........
r8038 | joost | 2007-07-13 15:04:41 +0200 (Fri, 13 Jul 2007) | 1 line

* THTMLCustomPageContentProducer added
........
r8062 | michael | 2007-07-15 12:56:38 +0200 (Sun, 15 Jul 2007) | 1 line

* Added check for descending index
........
r8077 | michael | 2007-07-16 19:20:35 +0200 (Mon, 16 Jul 2007) | 1 line

* Made GetConnectionDef Public
........
r8103 | joost | 2007-07-19 23:56:02 +0200 (Thu, 19 Jul 2007) | 1 line

* Avoid unnecessary calls to ProduceContent. (ie: avoid generating the website twice)
........
r8104 | joost | 2007-07-20 00:00:04 +0200 (Fri, 20 Jul 2007) | 2 lines

* Place labels in the header of a THTMLDatasetFormGridProducer
* Changed the domain of a loop, so that all tablecells are drawn in the same manner
........
r8105 | joost | 2007-07-20 12:13:51 +0200 (Fri, 20 Jul 2007) | 1 line

* Changed the domain of the loop also for the header
........
r8106 | joost | 2007-07-20 12:49:42 +0200 (Fri, 20 Jul 2007) | 1 line

* Use the Action form a control as a Link in a THTMLDatasetFormGridProducer
........
r8153 | marco | 2007-07-23 20:15:13 +0200 (Mon, 23 Jul 2007) | 2 lines

* -stream methods virtual because of tregistryinifile

........
r8167 | michael | 2007-07-27 11:02:09 +0200 (Fri, 27 Jul 2007) | 1 line

* Added check for circular datasource reference
........
r8168 | michael | 2007-07-27 11:06:42 +0200 (Fri, 27 Jul 2007) | 1 line

* Added check for circular datasource reference in case datasource not nil
........
r8169 | marco | 2007-07-27 13:18:55 +0200 (Fri, 27 Jul 2007) | 2 lines

* aaccess also for treginifile.

........
r8173 | joost | 2007-07-28 00:09:32 +0200 (Sat, 28 Jul 2007) | 1 line

* If Serverfilted is true, use the ServerFilter instead of the normal Filter
........
r8183 | joost | 2007-07-28 23:49:06 +0200 (Sat, 28 Jul 2007) | 1 line

* Added fitlabel and fmNone
........
r8184 | joost | 2007-07-29 00:01:40 +0200 (Sun, 29 Jul 2007) | 1 line

* Implemented HandleGetOnPost
........
r8185 | joost | 2007-07-29 00:14:59 +0200 (Sun, 29 Jul 2007) | 1 line

* Added THTTPContentProducer.Request
........
r8221 | michael | 2007-08-04 20:36:25 +0200 (Sat, 04 Aug 2007) | 1 line

* Re-published properties that disappeared
........
r8263 | michael | 2007-08-11 22:25:45 +0200 (Sat, 11 Aug 2007) | 1 line

* Initial explanation of architecture
........
r8293 | joost | 2007-08-20 23:10:32 +0200 (Mon, 20 Aug 2007) | 1 line

* Commented out some debug-code which causes problems on windows
........
r8343 | michael | 2007-08-31 15:25:47 +0200 (Fri, 31 Aug 2007) | 1 line

* Fixed issue #9528 with patch from Sergei Gorelkin
........
r8346 | michael | 2007-09-01 01:18:34 +0200 (Sat, 01 Sep 2007) | 1 line

* Patch from Inoussa OUEDRAOGO to make it compilable with Delphi (WST has support for Delphi)
........
r8348 | michael | 2007-09-01 20:47:28 +0200 (Sat, 01 Sep 2007) | 1 line

* Uninstall called sysinstall instead of sysuninstall
........
r8355 | michael | 2007-09-02 18:20:13 +0200 (Sun, 02 Sep 2007) | 1 line

* Fixed access violation on destroy
........
r8356 | michael | 2007-09-02 18:27:00 +0200 (Sun, 02 Sep 2007) | 4 lines

* Allow Nil owner for TFieldDefs (.Update method)
* TFieldDef.Create override, initializes FFieldNo.
Fixes MemDS streaming issue.

........
r8436 | joost | 2007-09-12 12:59:04 +0200 (Wed, 12 Sep 2007) | 1 line

* Trim obtained names in GetDBInfo
........
r8437 | joost | 2007-09-12 13:24:19 +0200 (Wed, 12 Sep 2007) | 2 lines

* Implemented form-input buttons. Especially usefull since the button-tag in is implemented wrongly in IE
* Checkboxes are now checked is .asboolean is true, instead of some arbitrary string comparisions
........

git-svn-id: branches/fixes_2_2@8457 -

peter 18 years ago
parent
commit
a4717b59b2
34 changed files with 3983 additions and 413 deletions
  1. 6 0
      .gitattributes
  2. 31 28
      packages/fcl-base/Makefile
  3. 12 10
      packages/fcl-base/Makefile.fpc
  4. 1 1
      packages/fcl-base/src/inc/daemonapp.pp
  5. 261 0
      packages/fcl-base/src/inc/fptimer.pp
  6. 10 42
      packages/fcl-base/src/inc/inifiles.pp
  7. 48 18
      packages/fcl-base/tests/Makefile
  8. 6 6
      packages/fcl-base/tests/Makefile.fpc
  9. 2 1
      packages/fcl-base/tests/README
  10. 89 0
      packages/fcl-base/tests/daemon.txt
  11. 61 0
      packages/fcl-base/tests/testtimer.pp
  12. 1 0
      packages/fcl-db/src/db.pas
  13. 2 1
      packages/fcl-db/src/dbconst.pas
  14. 9 1
      packages/fcl-db/src/fields.inc
  15. 149 141
      packages/fcl-db/src/memds/memds.pp
  16. 168 24
      packages/fcl-db/src/sqldb/Makefile
  17. 8 8
      packages/fcl-db/src/sqldb/Makefile.fpc
  18. 3 1
      packages/fcl-db/src/sqldb/interbase/ibconnection.pp
  19. 114 59
      packages/fcl-db/src/sqldb/sqldb.pp
  20. 2058 0
      packages/fcl-db/src/sqldb/sqlite/Makefile
  21. 24 0
      packages/fcl-db/src/sqldb/sqlite/Makefile.fpc
  22. 732 0
      packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp
  23. 37 5
      packages/fcl-passrc/src/pastree.pp
  24. 4 4
      packages/fcl-passrc/src/paswrite.pp
  25. 8 8
      packages/fcl-passrc/src/pparser.pp
  26. 2 2
      packages/fcl-passrc/src/pscanner.pp
  27. 10 0
      packages/fcl-registry/src/regini.inc
  28. 2 0
      packages/fcl-registry/src/registry.pp
  29. 18 3
      packages/fcl-web/src/custcgi.pp
  30. 52 38
      packages/fcl-web/src/fpdatasetform.pp
  31. 37 0
      packages/fcl-web/src/fphtml.pp
  32. 11 5
      packages/fcl-web/src/fphttp.pp
  33. 6 6
      packages/fcl-xml/src/xmlread.pp
  34. 1 1
      packages/fcl-xml/src/xmlwrite.pp

+ 6 - 0
.gitattributes

@@ -3891,6 +3891,7 @@ packages/fcl-base/src/inc/eventlog.pp svneol=native#text/plain
 packages/fcl-base/src/inc/ezcgi.pp svneol=native#text/plain
 packages/fcl-base/src/inc/ezcgi.pp svneol=native#text/plain
 packages/fcl-base/src/inc/felog.inc svneol=native#text/plain
 packages/fcl-base/src/inc/felog.inc svneol=native#text/plain
 packages/fcl-base/src/inc/fpasync.pp svneol=native#text/plain
 packages/fcl-base/src/inc/fpasync.pp svneol=native#text/plain
+packages/fcl-base/src/inc/fptimer.pp svneol=native#text/plain
 packages/fcl-base/src/inc/gettext.pp svneol=native#text/plain
 packages/fcl-base/src/inc/gettext.pp svneol=native#text/plain
 packages/fcl-base/src/inc/htmldefs.pp svneol=native#text/plain
 packages/fcl-base/src/inc/htmldefs.pp svneol=native#text/plain
 packages/fcl-base/src/inc/idea.pp svneol=native#text/plain
 packages/fcl-base/src/inc/idea.pp svneol=native#text/plain
@@ -3972,6 +3973,7 @@ packages/fcl-base/tests/base64decodingtestcase.pas svneol=native#text/plain
 packages/fcl-base/tests/cachetest.pp svneol=native#text/plain
 packages/fcl-base/tests/cachetest.pp svneol=native#text/plain
 packages/fcl-base/tests/cfgtest.pp svneol=native#text/plain
 packages/fcl-base/tests/cfgtest.pp svneol=native#text/plain
 packages/fcl-base/tests/daemon.pp svneol=native#text/plain
 packages/fcl-base/tests/daemon.pp svneol=native#text/plain
+packages/fcl-base/tests/daemon.txt svneol=native#text/plain
 packages/fcl-base/tests/dbugsrv.pp svneol=native#text/plain
 packages/fcl-base/tests/dbugsrv.pp svneol=native#text/plain
 packages/fcl-base/tests/debugtest.pp svneol=native#text/plain
 packages/fcl-base/tests/debugtest.pp svneol=native#text/plain
 packages/fcl-base/tests/doecho.pp svneol=native#text/plain
 packages/fcl-base/tests/doecho.pp svneol=native#text/plain
@@ -4035,6 +4037,7 @@ packages/fcl-base/tests/testrsre.pp svneol=native#text/plain
 packages/fcl-base/tests/testrtf.pp svneol=native#text/plain
 packages/fcl-base/tests/testrtf.pp svneol=native#text/plain
 packages/fcl-base/tests/testser.pp svneol=native#text/plain
 packages/fcl-base/tests/testser.pp svneol=native#text/plain
 packages/fcl-base/tests/testsres.pp svneol=native#text/plain
 packages/fcl-base/tests/testsres.pp svneol=native#text/plain
+packages/fcl-base/tests/testtimer.pp svneol=native#text/plain
 packages/fcl-base/tests/testunzip.pp svneol=native#text/plain
 packages/fcl-base/tests/testunzip.pp svneol=native#text/plain
 packages/fcl-base/tests/testur.pp svneol=native#text/plain
 packages/fcl-base/tests/testur.pp svneol=native#text/plain
 packages/fcl-base/tests/testweb.pp svneol=native#text/plain
 packages/fcl-base/tests/testweb.pp svneol=native#text/plain
@@ -4161,6 +4164,9 @@ packages/fcl-db/src/sqldb/postgres/fpmake.inc svneol=native#text/plain
 packages/fcl-db/src/sqldb/postgres/fpmake.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/postgres/fpmake.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/postgres/pqconnection.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/postgres/pqconnection.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/sqldb.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/sqldb.pp svneol=native#text/plain
+packages/fcl-db/src/sqldb/sqlite/Makefile svneol=native#text/plain
+packages/fcl-db/src/sqldb/sqlite/Makefile.fpc svneol=native#text/plain
+packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/testsqldb.pp svneol=native#text/plain
 packages/fcl-db/src/sqldb/testsqldb.pp svneol=native#text/plain
 packages/fcl-db/src/sqlite/Makefile svneol=native#text/plain
 packages/fcl-db/src/sqlite/Makefile svneol=native#text/plain
 packages/fcl-db/src/sqlite/Makefile.fpc svneol=native#text/plain
 packages/fcl-db/src/sqlite/Makefile.fpc svneol=native#text/plain

+ 31 - 28
packages/fcl-base/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/09/12]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
 #
 #
 default: all
 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
 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
@@ -231,30 +231,30 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 override PACKAGE_NAME=fcl-base
 override PACKAGE_NAME=fcl-base
-override PACKAGE_VERSION=2.2.1
+override PACKAGE_VERSION=2.0.0
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -263,13 +263,13 @@ ifeq ($(FULL_TARGET),i386-netware)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets syncobjs
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets syncobjs
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets
@@ -281,7 +281,7 @@ ifeq ($(FULL_TARGET),i386-netwlibc)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets syncobjs
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  resolve ssockets syncobjs
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -290,13 +290,13 @@ ifeq ($(FULL_TARGET),i386-symbian)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -305,7 +305,7 @@ ifeq ($(FULL_TARGET),m68k-atari)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -314,10 +314,10 @@ ifeq ($(FULL_TARGET),m68k-embedded)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -326,7 +326,7 @@ ifeq ($(FULL_TARGET),powerpc-macos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -335,37 +335,37 @@ ifeq ($(FULL_TARGET),powerpc-embedded)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -380,10 +380,10 @@ ifeq ($(FULL_TARGET),arm-symbian)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
@@ -1955,6 +1955,9 @@ ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_NETDB=1
+REQUIRE_PACKAGES_LIBASYNC=1
+REQUIRE_PACKAGES_PTHREADS=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1

+ 12 - 10
packages/fcl-base/Makefile.fpc

@@ -4,11 +4,12 @@
 
 
 [package]
 [package]
 name=fcl-base
 name=fcl-base
-version=2.2.1
+version=2.0.0
 
 
 [require]
 [require]
 packages=paszlib hash
 packages=paszlib hash
 packages_linux=netdb libasync pthreads
 packages_linux=netdb libasync pthreads
+packages_beos=netdb libasync pthreads
 packages_freebsd=netdb libasync pthreads
 packages_freebsd=netdb libasync pthreads
 packages_darwin=netdb libasync pthreads
 packages_darwin=netdb libasync pthreads
 packages_solaris=netdb libasync pthreads
 packages_solaris=netdb libasync pthreads
@@ -34,15 +35,16 @@ units=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext \
       iostream zstream cachecls avl_tree \
       iostream zstream cachecls avl_tree \
       eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream \
       eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream \
       streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
       streamex blowfish zipper streamio inicol pooledmm libtar streamcoll
-units_freebsd=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
-units_darwin=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
-units_solaris=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
-units_netbsd=process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
-units_openbsd=process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp
-units_linux=process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp
-units_win32=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager
-units_win64=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager
-units_wince=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
+units_beos=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf 
+units_freebsd=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
+units_darwin=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer 
+units_solaris=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
+units_netbsd=process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
+units_openbsd=process ssockets resolve fpasync simpleipc dbugmsg dbugintf daemonapp fptimer
+units_linux=process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf daemonapp fptimer
+units_win32=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager fptimer
+units_win64=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf daemonapp ServiceManager fptimer
+units_wince=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf fptimer
 units_os2=resolve ssockets
 units_os2=resolve ssockets
 units_emx=resolve ssockets
 units_emx=resolve ssockets
 # syncobjs requires GetLastOSError function
 # syncobjs requires GetLastOSError function

+ 1 - 1
packages/fcl-base/src/inc/daemonapp.pp

@@ -669,7 +669,7 @@ end;
 Function TCustomDaemon.UnInstall : Boolean;
 Function TCustomDaemon.UnInstall : Boolean;
 begin
 begin
   Result:=True;
   Result:=True;
-  Application.SysInstallDaemon(Self);
+  Application.SysUnInstallDaemon(Self);
 end;
 end;
 
 
 function TCustomDaemon.HandleCustomCode(ACode: DWord): Boolean;
 function TCustomDaemon.HandleCustomCode(ACode: DWord): Boolean;

+ 261 - 0
packages/fcl-base/src/inc/fptimer.pp

@@ -0,0 +1,261 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 1999-2000 by Michael Van Canneyt.
+
+    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.
+
+ **********************************************************************}
+
+{
+  A generic timer component. Can be used in GUI and non-GUI apps.
+  Based heavily on an idea by Graeme Geldenhuys, extended so
+  the tick mechanism is pluggable.
+  
+  Note that the system implementation will only work for timers
+  in the main thread, as it uses synchronize to do the job.
+  You need to enable threads in your application for the system
+  implementation to work.
+  
+  A nice improvement would be an implementation that works
+  in all threads, such as the threadedtimer of IBX for linux.
+}
+
+unit fpTimer;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes;
+
+type
+  TFPTimerDriver = Class;
+  
+  TFPCustomTimer = class(TComponent)
+  private
+    FInterval: Integer;
+    FDriver : TFPTimerDriver;
+    FOnTimer: TNotifyEvent;
+    FContinue: Boolean;
+    FRunning: Boolean;
+    FEnabled: Boolean;
+    procedure   SetEnabled(Value: Boolean );
+  protected
+    property  Continue: Boolean read FContinue write FContinue;
+    procedure Timer; virtual;
+    Function CreateTimerDriver : TFPTimerDriver;
+  public
+    Constructor Create(AOwner: TComponent); override;
+    Destructor Destroy; override;
+    procedure StartTimer; virtual;
+    procedure StopTimer; virtual;
+  protected
+    property Enabled: Boolean read FEnabled write SetEnabled;
+    property Interval: Integer read FInterval write FInterval;
+    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
+  end;
+
+  TFPTimer = Class(TFPCustomTimer)
+  Published
+    Property Enabled;
+    Property Interval;
+    Property OnTimer;
+  end;  
+
+  TFPTimerDriver = Class(TObject)
+    FTimer : TFPCustomTimer;
+  Public
+    Constructor Create(ATimer : TFPCustomTimer); virtual;
+    Procedure StartTimer; virtual; abstract;
+    Procedure StopTimer; virtual; abstract;
+    Property Timer : TFPCustomTimer Read FTimer;
+  end;
+  TFPTimerDriverClass = Class of TFPTimerDriver;
+
+Var
+  DefaultTimerDriverClass : TFPTimerDriverClass = Nil;
+
+implementation
+
+uses
+  SysUtils;
+
+{ ---------------------------------------------------------------------
+    TFPTimer
+  ---------------------------------------------------------------------}
+
+constructor TFPCustomTimer.Create(AOwner: TComponent);
+begin
+  inherited;
+  FDriver:=CreateTimerDriver;
+end;
+
+destructor TFPCustomTimer.Destroy;
+
+begin
+  If FEnabled then
+    StopTimer;
+  FDriver.FTimer:=Nil;  
+  FreeAndNil(FDriver);
+  Inherited;
+end;
+
+
+Function TFPCustomTimer.CreateTimerDriver : TFPTimerDriver;
+
+begin
+  Result:=DefaultTimerDriverClass.Create(Self);
+end;
+
+procedure TFPCustomTimer.SetEnabled(Value: Boolean);
+begin
+  if Value <> FEnabled then
+    begin
+    if Value then
+      StartTimer
+    else
+      StopTimer;
+    end;
+end;
+
+procedure TFPCustomTimer.StartTimer;
+begin
+  If FEnabled then
+    Exit;
+  FEnabled:=True;
+  FContinue:=True;  
+  If Not (csDesigning in ComponentState) then  
+    FDriver.StartTimer;
+end;
+
+procedure TFPCustomTimer.StopTimer;
+begin
+  If Not FEnabled then 
+    Exit;
+  FEnabled:=False;
+  FContinue:=False;  
+  FDriver.StopTimer;
+end;
+
+procedure TFPCustomTimer.Timer;
+
+begin
+  { We check on FEnabled: If by any chance a tick comes in after it was
+    set to false, the user won't notice, since no event is triggered.}
+  If FEnabled and Assigned(FOnTimer) then
+    FOnTimer(Self);
+end;
+
+{ ---------------------------------------------------------------------
+  TFPTimerDriver
+  ---------------------------------------------------------------------}
+  
+
+Constructor TFPTimerDriver.Create(ATimer : TFPCustomTimer);
+
+begin
+  FTimer:=ATimer;
+end;
+
+
+{ ---------------------------------------------------------------------
+    Default implementation. Threaded timer, one thread per timer.
+  ---------------------------------------------------------------------}
+  
+Type
+  TFPTimerThread = class(TThread)
+  private
+    FTimerDriver: TFPTimerDriver;
+    Function Timer : TFPCustomTimer;
+  public
+    procedure Execute; override;
+    constructor CreateTimerThread(ATimerDriver: TFPTimerDriver);
+  end;
+
+  TFPThreadedTimerDriver = Class(TFPTimerDriver)
+  Private
+    FThread : TFPTimerThread;
+  Public
+    Procedure StartTimer; override;
+    Procedure StopTimer; override;
+  end;
+
+function _GetTickCount: Cardinal;
+begin
+  Result := Cardinal(Trunc(Now * 24 * 60 * 60 * 1000));
+end;
+
+{ ---------------------------------------------------------------------
+    TFPTimerThread
+  ---------------------------------------------------------------------}
+  
+constructor TFPTimerThread.CreateTimerThread(ATimerDriver: TFPTimerDriver);
+begin
+  inherited Create(True);
+  FTimerDriver:=ATimerDriver;
+  FreeOnTerminate := True;
+end;
+
+Function TFPTimerThread.Timer : TFPCustomTimer;
+
+begin
+  If Assigned(FTimerDriver) Then
+    Result:=FTimerDriver.FTimer
+  else
+    Result:=Nil;  
+end;
+
+procedure TFPTimerThread.Execute;
+var
+  SleepTime: Integer;
+  Last: Cardinal;
+  T : TFPCustomTimer;
+  
+begin
+  while Not Terminated do
+    begin
+    Last := _GetTickCount;
+    T:=Timer;
+    If Assigned(T) then
+      begin
+      SleepTime := T.FInterval - (_GetTickCount - Last);
+      if SleepTime < 10 then
+        SleepTime := 10;
+      Sleep(SleepTime);
+      T:=Timer;
+      If Assigned(T) then
+        Synchronize(@T.Timer);
+      end
+    else
+      Terminate;  
+    end;
+end;
+
+{ ---------------------------------------------------------------------
+    TFPThreadedTimerDriver
+  ---------------------------------------------------------------------}
+
+Procedure TFPThreadedTimerDriver.StartTimer; 
+
+begin
+  FThread:=TFPTimerThread.CreateTimerThread(Self);
+  FThread.Resume;
+end;
+
+Procedure TFPThreadedTimerDriver.StopTimer;
+begin
+  FThread.FTimerDriver:=Nil;
+  FThread.Terminate; // Will free itself.
+end;
+
+
+Initialization
+  DefaultTimerDriverClass:=TFPThreadedTimerDriver;
+end.
+

+ 10 - 42
packages/fcl-base/src/inc/inifiles.pp

@@ -137,12 +137,12 @@ type
     function ReadDateTime(const Section, Ident: string; Default: TDateTime): TDateTime; virtual;
     function ReadDateTime(const Section, Ident: string; Default: TDateTime): TDateTime; virtual;
     function ReadFloat(const Section, Ident: string; Default: Double): Double; virtual;
     function ReadFloat(const Section, Ident: string; Default: Double): Double; virtual;
     function ReadTime(const Section, Ident: string; Default: TDateTime): TDateTime; virtual;
     function ReadTime(const Section, Ident: string; Default: TDateTime): TDateTime; virtual;
-    function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer;
+    function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer; virtual;
     procedure WriteDate(const Section, Ident: string; Value: TDateTime); virtual;
     procedure WriteDate(const Section, Ident: string; Value: TDateTime); virtual;
     procedure WriteDateTime(const Section, Ident: string; Value: TDateTime); virtual;
     procedure WriteDateTime(const Section, Ident: string; Value: TDateTime); virtual;
     procedure WriteFloat(const Section, Ident: string; Value: Double); virtual;
     procedure WriteFloat(const Section, Ident: string; Value: Double); virtual;
     procedure WriteTime(const Section, Ident: string; Value: TDateTime); virtual;
     procedure WriteTime(const Section, Ident: string; Value: TDateTime); virtual;
-    procedure WriteBinaryStream(const Section, Name: string; Value: TStream); 
+    procedure WriteBinaryStream(const Section, Name: string; Value: TStream); virtual;
     procedure ReadSection(const Section: string; Strings: TStrings); virtual; abstract;
     procedure ReadSection(const Section: string; Strings: TStrings); virtual; abstract;
     procedure ReadSections(Strings: TStrings); virtual; abstract;
     procedure ReadSections(Strings: TStrings); virtual; abstract;
     procedure ReadSectionValues(const Section: string; Strings: TStrings); virtual; abstract;
     procedure ReadSectionValues(const Section: string; Strings: TStrings); virtual; abstract;
@@ -487,59 +487,27 @@ begin
 end;
 end;
 
 
 function TCustomIniFile.ReadDate(const Section, Ident: string; Default: TDateTime): TDateTime;
 function TCustomIniFile.ReadDate(const Section, Ident: string; Default: TDateTime): TDateTime;
-var
-  s: string;
+
 begin
 begin
-  Result := Default;
-  s := ReadString(Section, Ident, '');
-  if s > '' then try
-    Result := StrToDate(s);
-  except
-    on EConvertError do
-    else raise;
-  end;
+  Result := StrToDateDef(ReadString(Section, Ident, ''),Default);
 end;
 end;
 
 
 function TCustomIniFile.ReadDateTime(const Section, Ident: string; Default: TDateTime): TDateTime;
 function TCustomIniFile.ReadDateTime(const Section, Ident: string; Default: TDateTime): TDateTime;
-var
-  s: string;
+
 begin
 begin
-  Result := Default;
-  s := ReadString(Section, Ident, '');
-  if s > '' then try
-    Result := StrToDateTime(s);
-  except
-    on EConvertError do
-    else raise;
-  end;
+  Result := StrToDateTimeDef(ReadString(Section, Ident, ''),Default);
 end;
 end;
 
 
 function TCustomIniFile.ReadFloat(const Section, Ident: string; Default: Double): Double;
 function TCustomIniFile.ReadFloat(const Section, Ident: string; Default: Double): Double;
-var
-  s: string;
+
 begin
 begin
-  Result := Default;
-  s := ReadString(Section, Ident, '');
-  if s > '' then try
-    Result := StrToFloat(s);
-  except
-    on EConvertError do
-    else raise;
-  end;
+  Result:=StrToFloatDef(ReadString(Section, Ident, ''),Default);
 end;
 end;
 
 
 function TCustomIniFile.ReadTime(const Section, Ident: string; Default: TDateTime): TDateTime;
 function TCustomIniFile.ReadTime(const Section, Ident: string; Default: TDateTime): TDateTime;
-var
-  s: string;
+
 begin
 begin
-  Result := Default;
-  s := ReadString(Section, Ident, '');
-  if s > '' then try
-    Result := StrToTime(s);
-  except
-    on EConvertError do
-    else raise;
-  end;
+  Result := StrToTimeDef(ReadString(Section, Ident, ''),Default);
 end;
 end;
 
 
 procedure TCustomIniFile.WriteDate(const Section, Ident: string; Value: TDateTime);
 procedure TCustomIniFile.WriteDate(const Section, Ident: string; Value: TDateTime);

+ 48 - 18
packages/fcl-base/tests/Makefile

@@ -1,8 +1,8 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
 #
 #
 default: all
 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-embedded
+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
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
 LIMIT83fs = go32v2 os2 emx watcom
@@ -231,19 +231,19 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  showver testproc testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  showver testproc testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  isockcli isocksvr testhres testnres testsres testrhre testrnre testrsre testur
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  isockcli isocksvr testhres testnres testsres testrhre testrnre testrsre testur
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -252,7 +252,7 @@ ifeq ($(FULL_TARGET),i386-netbsd)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -267,7 +267,7 @@ ifeq ($(FULL_TARGET),i386-wdosx)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  isockcli isocksvr testhres testnres testsres testrhre testrnre testrsre testur
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  isockcli isocksvr testhres testnres testsres testrhre testrnre testrsre testur
@@ -288,10 +288,10 @@ ifeq ($(FULL_TARGET),i386-symbian)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -312,7 +312,7 @@ ifeq ($(FULL_TARGET),m68k-embedded)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -324,7 +324,7 @@ ifeq ($(FULL_TARGET),powerpc-macos)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -333,22 +333,22 @@ ifeq ($(FULL_TARGET),powerpc-embedded)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -357,7 +357,7 @@ ifeq ($(FULL_TARGET),x86_64-embedded)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -378,7 +378,10 @@ ifeq ($(FULL_TARGET),arm-symbian)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip  sockcli isockcli dsockcli socksvr isocksvr dsocksvr testhres testnres testsres testrhre testrnre testrsre testur ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
 override TARGET_PROGRAMS+=stringl dparser fstream mstream list threads testrtf cfgtest xmldump htdump testez tidea b64test b64test2 b64enc b64dec restest testz testz2 istream doecho testol testcont txmlreg testreg tstelcmd testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons tarmakerconsgzip
@@ -1270,9 +1273,11 @@ ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_NETDB=1
+REQUIRE_PACKAGES_LIBASYNC=1
+REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-DB=1
 REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_NETDB=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-FPCUNIT=1
 REQUIRE_PACKAGES_FCL-FPCUNIT=1
 REQUIRE_PACKAGES_PASJPEG=1
 REQUIRE_PACKAGES_PASJPEG=1
@@ -1960,6 +1965,7 @@ REQUIRE_PACKAGES_FCL-WEB=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -2124,6 +2130,30 @@ REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_SQLITE=1
 REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_NETDB=1
+REQUIRE_PACKAGES_LIBASYNC=1
+REQUIRE_PACKAGES_PTHREADS=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-DB=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_FCL-FPCUNIT=1
+REQUIRE_PACKAGES_PASJPEG=1
+REQUIRE_PACKAGES_FCL-IMAGE=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_FCL-REGISTRY=1
+REQUIRE_PACKAGES_FCL-WEB=1
+REQUIRE_PACKAGES_IBASE=1
+REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_ODBC=1
+REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_HASH=1

+ 6 - 6
packages/fcl-base/tests/Makefile.fpc

@@ -8,22 +8,22 @@ programs=stringl dparser fstream mstream list threads testrtf \
          b64test b64test2 b64enc b64dec restest testz testz2 \
          b64test b64test2 b64enc b64dec restest testz testz2 \
          istream doecho testol testcont txmlreg testreg tstelcmd \
          istream doecho testol testcont txmlreg testreg tstelcmd \
          testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons \
          testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons \
-         tarmakerconsgzip
+         tarmakerconsgzip 
 programs_win32=showver testproc testhres testnres testsres testrhre \
 programs_win32=showver testproc testhres testnres testsres testrhre \
                testrnre testrsre testur ipcserver ipcclient debugtest \
                testrnre testrsre testur ipcserver ipcclient debugtest \
-               dbugsrv
+               dbugsrv testtimer
 programs_linux=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
 programs_linux=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
                testhres testnres testsres testrhre testrnre testrsre testur \
                testhres testnres testsres testrhre testrnre testrsre testur \
-               ipcserver ipcclient debugtest dbugsrv asiotest
+               ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 programs_darwin=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
 programs_darwin=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
                testhres testnres testsres testrhre testrnre testrsre testur \
                testhres testnres testsres testrhre testrnre testrsre testur \
-               ipcserver ipcclient debugtest dbugsrv asiotest
+               ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 programs_freebsd=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
 programs_freebsd=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
                testhres testnres testsres testrhre testrnre testrsre testur \
                testhres testnres testsres testrhre testrnre testrsre testur \
-               ipcserver ipcclient debugtest dbugsrv asiotest
+               ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 programs_solaris=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
 programs_solaris=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
                testhres testnres testsres testrhre testrnre testrsre testur \
                testhres testnres testsres testrhre testrnre testrsre testur \
-               ipcserver ipcclient debugtest dbugsrv asiotest
+               ipcserver ipcclient debugtest dbugsrv asiotest testtimer
 programs_os2=isockcli isocksvr testhres testnres testsres testrhre \
 programs_os2=isockcli isocksvr testhres testnres testsres testrhre \
              testrnre testrsre testur
              testrnre testrsre testur
 programs_emx=isockcli isocksvr testhres testnres testsres testrhre \
 programs_emx=isockcli isocksvr testhres testnres testsres testrhre \

+ 2 - 1
packages/fcl-base/tests/README

@@ -71,4 +71,5 @@ testzip.pp   Test for TZipper class (MVC)
 poolmm1.pp   Test for pooledmm (free) (MG)
 poolmm1.pp   Test for pooledmm (free) (MG)
 poolmm2.pp   Test for pooledmm (nonfree) (VS)
 poolmm2.pp   Test for pooledmm (nonfree) (VS)
 testweb.pp   Test for fpcgi (MVC)
 testweb.pp   Test for fpcgi (MVC)
-daemon.pp    Test for daemonapp (MVC)
+daemon.pp    Test for daemonapp (MVC)
+testtimer.pp Test for TFPTimer (MVC)

+ 89 - 0
packages/fcl-base/tests/daemon.txt

@@ -0,0 +1,89 @@
+The daemonapp unit implements support for daemon (service) applications
+in free pascal.
+
+On Windows, these applications will act as services. On Linux, they are
+normal command-line applications.
+
+The unit implements 3 classes:
+
+TDaemonApplication
+------------------
+
+  A TCustomApplication descendent. It is the main entry point for the
+  application. It handles the starting/stopping/installing of the service.
+
+TDaemon
+-------
+
+  A TDatamodule descendent. Here, the actual daemon service code should be
+  implemented. There are several events:
+
+  before/after install
+    Executed before/after the service is being installed. Mainly useful on
+    windows. Triggered if the binary is run with the --install option. 
+
+  before/after uninstall
+    Executed before/after the service is being installed. Mainly useful on
+    windows. Triggered if the binary is run with the --uninstall option.
+
+  OnStart
+    Executed when the service is started. This event handler should return
+    as soon as possible. So at most it should start some event loops or
+    start a thread which does the actual work. if it takes a long time
+    to start, call ReportStatus at regular intervals to report the current 
+    status (important on  Windows)
+
+  OnStop
+    Executed when the service is stopped. This event handler should return
+    as soon as possible.  if it takes a long time to stop, call ReportStatus 
+     at regular intervals to report the current status (important on  Windows)
+
+  OnPause
+    Executed when the service should be paused.
+
+  OnContinue
+    Executed when the service should be continued.
+
+  OnShutdown
+    If stop does not work, the service will be forcedly shut down.
+
+The TDaemon class has a property Logger, which is a TEventLog descendent, which
+can be used to write messages to the system log.
+
+An application can contain many daemons/services. Each of them will be run
+in it's own thread. Only the main program will run in the main thread.
+
+TDaemonMapper
+-------------
+
+  This is used to define the service(s) in the system: it contains all
+  properties with which to define the services in this binary to the system.
+  The definitions are kept in the DaemonDefs property (a collection)
+
+  Each item in the daemondefs collection defines a service: it needs a TDaemon 
+  descendent classname, a name (must be a unique name on the system) a 
+  display name. The winbindings property contains options which are specific to
+  windows: they correspond to the options one sees in the service manager.
+
+  Note that the TDaemonMapper can be used to define 2 services, but they can
+  use 2 instances of the same TDaemon descendent class to handle the service.
+
+  for example: the daemonmapper can be used to create 2 http server daemons,
+  each which listens on a separate port. TDaemon has a property Definition,
+  which is the definiton that was used to create the instance.
+
+Schematically one could draw it like this:
+
+TDaemonApplication
+ +- TDaemonMapper
+     +-TDaemonDef1 -> TDaemon instance
+     +-TDaemonDef2 -> TDaemon instance
+
+Note that the daemon instances work independently, they are each running
+in their own thread. (plus an additional thread which handles the control
+messages from the windows service manager)
+
+There is a lazarus package available which installs support for daemons in 
+the IDE.
+
+Michael.

+ 61 - 0
packages/fcl-base/tests/testtimer.pp

@@ -0,0 +1,61 @@
+{$mode objfpc}
+{$H+}
+program testtimer;
+
+uses 
+{$ifdef unix}
+  cthreads,
+{$endif}
+  sysutils,classes,custapp,fptimer;
+
+Type
+  TTestTimerApp = Class(TCustomApplication)
+  Private
+    FTimer : TFPTimer;
+    FCount : Integer;
+    FTick : Integer;
+  Public  
+    Procedure DoRun; override;
+    Procedure DoTick(Sender : TObject);
+  end;
+
+Procedure TTestTimerApp.DoRun; 
+
+begin
+  FTimer:=TFPTimer.Create(Self);
+  FTimer.Interval:=100;
+  FTimer.OnTimer:=@DoTick;
+  FTimer.Enabled:=True;
+  Try
+    FTick:=0;
+    FCount:=0;
+    While (FCount<10) do
+      begin
+      Inc(FTick);
+      CheckSynchronize; // Needed, because we are not running in a GUI loop.
+      Sleep(1);
+      end;
+  Finally
+    FTimer.Enabled:=False;
+    FreeAndNil(FTimer);
+  end;
+  Terminate;
+end;
+
+Procedure TTestTimerApp.DoTick(Sender : TObject);
+
+begin
+  Inc(FCount);
+  Writeln('Received timer event ',FCount,' after ',FTick,' ticks.');
+  FTick:=0;
+end;
+        
+
+begin
+  With TTestTimerApp.Create(Nil) do
+    Try
+      Run
+    finally
+      Free;
+    end;  
+end.

+ 1 - 0
packages/fcl-db/src/db.pas

@@ -182,6 +182,7 @@ type
     procedure SetSize(const AValue: Word);
     procedure SetSize(const AValue: Word);
     procedure SetRequired(const AValue: Boolean);
     procedure SetRequired(const AValue: Boolean);
   public
   public
+    constructor create(ACollection : TCollection); overload;
     constructor Create(AOwner: TFieldDefs; const AName: string;
     constructor Create(AOwner: TFieldDefs; const AName: string;
       ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Longint); overload;
       ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Longint); overload;
     destructor Destroy; override;
     destructor Destroy; override;

+ 2 - 1
packages/fcl-db/src/dbconst.pas

@@ -95,7 +95,8 @@ Resourcestring
   SNoFieldIndexes          = 'No index currently active';
   SNoFieldIndexes          = 'No index currently active';
   SNotIndexField           = 'Field ''%s'' is not indexed and cannot be modified';
   SNotIndexField           = 'Field ''%s'' is not indexed and cannot be modified';
   SErrUnknownConnectorType = 'Unknown connector type';
   SErrUnknownConnectorType = 'Unknown connector type';
-
+  SErrCircularDataSourceReferenceNotAllowed = 'Circular datasource references are not allowed.';
+  
 
 
 Implementation
 Implementation
 
 

+ 9 - 1
packages/fcl-db/src/fields.inc

@@ -28,6 +28,13 @@ end;}
     TFieldDef
     TFieldDef
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
 
 
+Constructor TFieldDef.Create(ACollection : TCollection);
+
+begin
+  Inherited create(ACollection);
+  FFieldNo:=Index+1;
+end;
+
 Constructor TFieldDef.Create(AOwner: TFieldDefs; const AName: string;
 Constructor TFieldDef.Create(AOwner: TFieldDefs; const AName: string;
       ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Longint);
       ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Longint);
 
 
@@ -236,7 +243,8 @@ procedure TFieldDefs.Update;
 begin
 begin
   if not Updated then
   if not Updated then
     begin
     begin
-    DataSet.InitFieldDefs;
+    If Assigned(Dataset) then
+      DataSet.InitFieldDefs;
     Updated := True;
     Updated := True;
     end;
     end;
 end;
 end;

+ 149 - 141
packages/fcl-db/src/memds/memds.pp

@@ -1,6 +1,7 @@
 {
 {
     This file is part of the Free Component Library (FCL)
     This file is part of the Free Component Library (FCL)
-    Copyright (c) 1999-2006 by the Free Pascal development team
+    Copyright (c) 1999-2007 by the Free Pascal development team
+    Some modifications (c) 2007 by Martin Schreiber
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
@@ -10,9 +11,7 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
  **********************************************************************}
  **********************************************************************}
-{$IFDEF FPC}
 {$mode objfpc}
 {$mode objfpc}
-{$ENDIF FPC}
 {$H+}
 {$H+}
 {
 {
   TMemDataset : In-memory dataset.
   TMemDataset : In-memory dataset.
@@ -22,18 +21,14 @@
   E-mail: [email protected]
   E-mail: [email protected]
 }
 }
 
 
-
 unit memds;
 unit memds;
 
 
 interface
 interface
 
 
 uses
 uses
-  SysUtils, Classes, DB;
-
-Const
-  //Default size used when string size is 0
-  MEMDS_STRING_MAXSIZE = 200;
+ sysutils, classes, db, types;
 
 
+const
   // Stream Markers.
   // Stream Markers.
   MarkerSize  = SizeOf(Integer);
   MarkerSize  = SizeOf(Integer);
 
 
@@ -50,28 +45,30 @@ type
     BookmarkFlag: TBookmarkFlag;
     BookmarkFlag: TBookmarkFlag;
   end;
   end;
 
 
-  PInteger  = ^Integer;
-  PSmallInt = ^SmallInt;
-  PInt64    = ^Int64;
-  PFloat    = ^Double;
-  PBoolean  = ^Boolean;
-
-
   TMemDataset=class(TDataSet)
   TMemDataset=class(TDataSet)
   private
   private
     FOpenStream : TStream;
     FOpenStream : TStream;
     FFileName : String;
     FFileName : String;
-    FModified : Boolean;
+    FFileModified : Boolean;
     FStream: TMemoryStream;
     FStream: TMemoryStream;
     FRecInfoOffset: integer;
     FRecInfoOffset: integer;
-    FRecInfoSize: integer;
     FRecCount: integer;
     FRecCount: integer;
     FRecSize: integer;
     FRecSize: integer;
     FRecBufferSize: integer;
     FRecBufferSize: integer;
     FCurrRecNo: integer;
     FCurrRecNo: integer;
     FIsOpen: boolean;
     FIsOpen: boolean;
     FFilterBuffer: PChar;
     FFilterBuffer: PChar;
-    FFieldOffsetList : TList;
+    ffieldoffsets: PInteger;
+    ffieldsizes: PInteger;
+    procedure calcrecordlayout;
+    function  MDSGetRecordOffset(ARecNo: integer): longint;
+    function  MDSGetFieldOffset(FieldNo: integer): integer;
+    function  MDSGetBufferSize(FieldNo: integer): integer;
+    function  MDSGetActiveBuffer(var Buffer: PChar): Boolean;
+    procedure MDSReadRecord(Buffer:PChar;ARecNo:Integer);
+    procedure MDSWriteRecord(Buffer:PChar;ARecNo:Integer);
+    procedure MDSAppendRecord(Buffer:PChar);
+    function  MDSFilterRecord(Buffer: PChar): Boolean;
   protected
   protected
     // Mandatory
     // Mandatory
     function  AllocRecordBuffer: PChar; override;
     function  AllocRecordBuffer: PChar; override;
@@ -114,23 +111,7 @@ type
     // If SaveData=False, a size 0 block should be written.
     // If SaveData=False, a size 0 block should be written.
     Procedure SaveDataToStream(F : TStream; SaveData : Boolean); virtual;
     Procedure SaveDataToStream(F : TStream; SaveData : Boolean); virtual;
 
 
-  private
-    function  MDSGetRecordOffset(ARecNo: integer): longint;
-    function  MDSGetFieldOffset(FieldNo: integer): integer;
-    function  MDSGetFieldSize(FieldNo: integer): integer;
-    function  MDSGetActiveBuffer(var Buffer: PChar): Boolean;
-    procedure MDSReadRecord(Buffer:PChar;ARecNo:Integer);
-    procedure MDSWriteRecord(Buffer:PChar;ARecNo:Integer);
-    procedure MDSAppendRecord(Buffer:PChar);
-    function  MDSFilterRecord(Buffer: PChar): Boolean;
-    function  MDSGetRecInfo(Buffer: PChar): TMTRecInfo;
-    procedure MDSSetRecInfo(Buffer: PChar;
-                            Flag: TBookmarkFlag);
-    procedure MDSSetRecInfo(Buffer: PChar;
-                            Flag: TBookmarkFlag;
-                            ABookmark: Longint);
-    procedure MDSSetRecInfo(Buffer: PChar;
-                            ABookmark: Longint);
+
   public
   public
     constructor Create(AOwner:tComponent); override;
     constructor Create(AOwner:tComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -149,7 +130,7 @@ type
     Procedure CopyFromDataset(DataSet : TDataSet);
     Procedure CopyFromDataset(DataSet : TDataSet);
     Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
     Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
 
 
-    Property Modified : Boolean Read FModified;
+    Property FileModified : Boolean Read FFileModified;
 
 
   published
   published
     Property FileName : String Read FFileName Write FFileName;
     Property FileName : String Read FFileName Write FFileName;
@@ -188,6 +169,33 @@ ResourceString
   SErrInvalidMarkerAtPos    = 'Wrong data stream marker at position %d. Got %d, expected %d';
   SErrInvalidMarkerAtPos    = 'Wrong data stream marker at position %d. Got %d, expected %d';
   SErrNoFileName            = 'Filename must not be empty.';
   SErrNoFileName            = 'Filename must not be empty.';
 
 
+Const
+  SizeRecInfo = SizeOf(TMTRecInfo);
+
+procedure unsetfieldisnull(nullmask: pbyte; const x: integer);
+
+begin
+ inc(nullmask,(x shr 3));
+ nullmask^:= nullmask^ or (1 shl (x and 7));
+end;
+
+
+procedure setfieldisnull(nullmask: pbyte; const x: integer);
+
+begin
+ inc(nullmask,(x shr 3));
+ nullmask^:= nullmask^ and Not (1 shl (x and 7));
+end;
+
+
+function getfieldisnull(nullmask: pbyte; const x: integer): boolean;
+
+begin
+ inc(nullmask,(x shr 3));
+ result:= nullmask^ and (1 shl (x and 7)) = 0;
+end;
+
+
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
     Stream functions
     Stream functions
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
@@ -238,8 +246,6 @@ constructor TMemDataset.Create(AOwner:tComponent);
 begin
 begin
   inherited create(aOwner);
   inherited create(aOwner);
   FStream:=TMemoryStream.Create;
   FStream:=TMemoryStream.Create;
-  FFieldOffsetList := TList.Create;
-  FRecInfoSize:=SizeOf(TMTRecInfo);
   FRecCount:=0;
   FRecCount:=0;
   FRecSize:=0;
   FRecSize:=0;
   FRecBufferSize:=0;
   FRecBufferSize:=0;
@@ -251,7 +257,6 @@ end;
 Destructor TMemDataset.Destroy;
 Destructor TMemDataset.Destroy;
 begin
 begin
   FStream.Free;
   FStream.Free;
-  FFieldOffsetList.Free;
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
@@ -262,8 +267,7 @@ end;
 
 
 function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer;
 function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer;
 begin
 begin
-  //FFieldOffsetList calculated once in createtable
-  Result:=Integer(FFieldOffsetList.Items[FieldNo-1]);
+ result:= ffieldoffsets[fieldno-1];
 end;
 end;
 
 
 Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const);
 Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const);
@@ -272,21 +276,22 @@ begin
   Raise MDSError.CreateFmt(Fmt,Args);
   Raise MDSError.CreateFmt(Fmt,Args);
 end;
 end;
 
 
-function TMemDataset.MDSGetFieldSize(FieldNo: integer): integer;
-
-begin
-  case FieldDefs.Items[FieldNo-1].Datatype of
-   ftString:   result:=FieldDefs.Items[FieldNo-1].Size+1;
-   ftBoolean:  result:=SizeOf(Wordbool);
-   ftFloat:    result:=SizeOf(Double);
-   ftLargeInt: result:=SizeOf(int64);
-   ftSmallInt: result:=SizeOf(SmallInt);
-   ftInteger:  result:=SizeOf(Integer);
-   ftDate:     result:=SizeOf(TDateTime);
-   ftTime:     result:=SizeOf(TDateTime);
-   ftDateTime: result:=SizeOf(TDateTime);
+function TMemDataset.MDSGetBufferSize(FieldNo: integer): integer;
+var
+ dt1: tfieldtype;
+begin
+ dt1:= FieldDefs.Items[FieldNo-1].Datatype;
+ case dt1 of
+  ftString:   result:=FieldDefs.Items[FieldNo-1].Size+1;
+  ftBoolean:  result:=SizeOf(Wordbool);
+  ftFloat:    result:=SizeOf(Double);
+  ftLargeInt: result:=SizeOf(int64);
+  ftSmallInt: result:=SizeOf(SmallInt);
+  ftInteger:  result:=SizeOf(Integer);
+  ftDate:     result:=SizeOf(TDateTime);
+  ftTime:     result:=SizeOf(TDateTime);
  else
  else
-   RaiseError(SErrFieldTypeNotSupported,[FieldDefs.Items[FieldNo-1].Name]);
+  RaiseError(SErrFieldTypeNotSupported,[FieldDefs.Items[FieldNo-1].Name]);
  end;
  end;
 end;
 end;
 
 
@@ -299,7 +304,6 @@ begin
        Buffer:=nil
        Buffer:=nil
      else
      else
        Buffer:=ActiveBuffer;
        Buffer:=ActiveBuffer;
-
   dsEdit,
   dsEdit,
   dsInsert:
   dsInsert:
      Buffer:=ActiveBuffer;
      Buffer:=ActiveBuffer;
@@ -308,7 +312,7 @@ begin
  else
  else
    Buffer:=nil;
    Buffer:=nil;
  end;
  end;
- Result:=Assigned(Buffer);
+ Result:=(Buffer<>nil);
 end;
 end;
 
 
 procedure TMemDataset.MDSReadRecord(Buffer:PChar;ARecNo:Integer);   //Reads a Rec from Stream in Buffer
 procedure TMemDataset.MDSReadRecord(Buffer:PChar;ARecNo:Integer);   //Reads a Rec from Stream in Buffer
@@ -321,14 +325,14 @@ procedure TMemDataset.MDSWriteRecord(Buffer:PChar;ARecNo:Integer);  //Writes a R
 begin
 begin
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.WriteBuffer(Buffer^, FRecSize);
   FStream.WriteBuffer(Buffer^, FRecSize);
-  FModified:=True;
+  FFileModified:=True;
 end;
 end;
 
 
 procedure TMemDataset.MDSAppendRecord(Buffer:PChar);   //Appends a Rec (from Buffer) to Stream
 procedure TMemDataset.MDSAppendRecord(Buffer:PChar);   //Appends a Rec (from Buffer) to Stream
 begin
 begin
   FStream.Position:=MDSGetRecordOffset(FRecCount);
   FStream.Position:=MDSGetRecordOffset(FRecCount);
   FStream.WriteBuffer(Buffer^, FRecSize);
   FStream.WriteBuffer(Buffer^, FRecSize);
-  FModified:=True;
+  FFileModified:=True;
 end;
 end;
 
 
 //Abstract Overrides
 //Abstract Overrides
@@ -344,8 +348,11 @@ end;
 
 
 procedure TMemDataset.InternalInitRecord(Buffer: PChar);
 procedure TMemDataset.InternalInitRecord(Buffer: PChar);
 
 
+var
+  I : integer;
+
 begin
 begin
- FillChar(Buffer^,FRecSize,0);
+ fillchar(buffer^,frecsize,0);
 end;
 end;
 
 
 procedure TMemDataset.InternalDelete;
 procedure TMemDataset.InternalDelete;
@@ -387,7 +394,7 @@ begin
   Finally
   Finally
     TS.Free;
     TS.Free;
   end;
   end;
-  FModified:=True;
+  FFileModified:=True;
 end;
 end;
 
 
 procedure TMemDataset.InternalInitFieldDefs;
 procedure TMemDataset.InternalInitFieldDefs;
@@ -477,7 +484,7 @@ begin
   CheckMarker(F,smData);
   CheckMarker(F,smData);
   Size:=ReadInteger(F);
   Size:=ReadInteger(F);
   FStream.Clear;
   FStream.Clear;
-  if Size>0 then FStream.CopyFrom(F,Size);
+  FStream.CopyFrom(F,Size);
   FRecCount:=Size div FRecSize;
   FRecCount:=Size div FRecSize;
   FCurrRecNo:=-1;
   FCurrRecNo:=-1;
 end;
 end;
@@ -489,7 +496,7 @@ begin
   ReadFieldDefsFromStream(F);
   ReadFieldDefsFromStream(F);
   LoadDataFromStream(F);
   LoadDataFromStream(F);
   CheckMarker(F,smEOF);
   CheckMarker(F,smEOF);
-  FModified:=False;
+  FFileModified:=False;
 end;
 end;
 
 
 Procedure TMemDataSet.LoadFromFile(AFileName : String);
 Procedure TMemDataSet.LoadFromFile(AFileName : String);
@@ -582,7 +589,7 @@ begin
     WriteInteger(F,FStream.Size);
     WriteInteger(F,FStream.Size);
     FStream.Position:=0;
     FStream.Position:=0;
     F.CopyFrom(FStream,FStream.Size);
     F.CopyFrom(FStream,FStream.Size);
-    FModified:=False;
+    FFileModified:=False;
     end
     end
   else
   else
     begin
     begin
@@ -594,13 +601,17 @@ end;
 procedure TMemDataset.InternalClose;
 procedure TMemDataset.InternalClose;
 
 
 begin
 begin
-  if (FModified) and (FFileName<>'') then
-    SaveToFile(FFileName,True);
-  FIsOpen:=False;
-  FModified:=False;
-  BindFields(False);
-  if DefaultFields then
-    DestroyFields;
+ if (FFileModified) and (FFileName<>'') then begin
+  SaveToFile(FFileName,True);
+ end;
+ FIsOpen:=False;
+ FFileModified:=False;
+ // BindFields(False);
+ if DefaultFields then begin
+  DestroyFields;
+ end;
+ FreeMem(FFieldOffsets);
+ FreeMem(FFieldSizes);
 end;
 end;
 
 
 procedure TMemDataset.InternalPost;
 procedure TMemDataset.InternalPost;
@@ -621,6 +632,7 @@ begin
 end;
 end;
 
 
 function TMemDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 function TMemDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+
 var
 var
   Accepted: Boolean;
   Accepted: Boolean;
 
 
@@ -651,8 +663,8 @@ begin
     if result=grOK then
     if result=grOK then
       begin
       begin
       MDSReadRecord(Buffer, FCurrRecNo);
       MDSReadRecord(Buffer, FCurrRecNo);
-      MDSSetRecInfo( Buffer,bfCurrent,FCurrRecNo );
-
+      PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=FCurrRecNo;
+      PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag:=bfCurrent;
       if (Filtered) then
       if (Filtered) then
         Accepted:=MDSFilterRecord(Buffer) //Filtering
         Accepted:=MDSFilterRecord(Buffer) //Filtering
       else
       else
@@ -664,36 +676,46 @@ begin
 end;
 end;
 
 
 function TMemDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
 function TMemDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
-
 var
 var
-  SrcBuffer: PChar;
-
+ SrcBuffer: PChar;
+ I: integer;
 begin
 begin
- result:=False;
- if not MDSGetActiveBuffer(SrcBuffer) then
-   Exit;
- if (Field.FieldNo>0) and (Assigned(Buffer)) and (Assigned(SrcBuffer)) then
+ I:= Field.FieldNo - 1;
+ result:= (I >= 0) and MDSGetActiveBuffer(SrcBuffer) and 
+          not getfieldisnull(pointer(srcbuffer),I);
+ if result and (buffer <> nil) then 
    begin
    begin
-   Move((SrcBuffer+MDSGetFieldOffset(Field.FieldNo))^, Buffer^, MDSGetFieldSize(Field.FieldNo));
-   result:=True;
+   Move((SrcBuffer+ffieldoffsets[I])^, Buffer^,FFieldSizes[I]);
    end;
    end;
 end;
 end;
 
 
 procedure TMemDataset.SetFieldData(Field: TField; Buffer: Pointer);
 procedure TMemDataset.SetFieldData(Field: TField; Buffer: Pointer);
-
 var
 var
-  DestBuffer: PChar;
+ DestBuffer: PChar;
+ I,J: integer;
 
 
 begin
 begin
- MDSGetActiveBuffer(DestBuffer);
- if (Field.FieldNo>0) and (Assigned(Buffer)) and (Assigned(DestBuffer)) then
-   Move(Buffer^,(DestBuffer+MDSGetFieldOffset(Field.FieldNo))^, MDSGetFieldSize(Field.FieldNo));
+ I:= Field.FieldNo - 1;
+ if (I >= 0) and  MDSGetActiveBuffer(DestBuffer) then 
+   begin
+   if buffer = nil then 
+     setfieldisnull(pointer(destbuffer),I)
+   else 
+     begin 
+     unsetfieldisnull(pointer(destbuffer),I);
+     J:=FFieldSizes[I];
+     if Field.DataType=ftString then
+       Dec(J); // Do not move terminating 0, which is in the size.
+     Move(Buffer^,(DestBuffer+FFieldOffsets[I])^,J);
+     dataevent(defieldchange,ptrint(field));
+     end;
+   end;
 end;
 end;
 
 
 function TMemDataset.GetRecordSize: Word;
 function TMemDataset.GetRecordSize: Word;
 
 
 begin
 begin
-  Result:=FRecSize;
+ Result:= FRecSize;
 end;
 end;
 
 
 procedure TMemDataset.InternalGotoBookmark(ABookmark: Pointer);
 procedure TMemDataset.InternalGotoBookmark(ABookmark: Pointer);
@@ -715,34 +737,36 @@ var
   ReqBookmark: integer;
   ReqBookmark: integer;
 
 
 begin
 begin
-  ReqBookmark:=MDSGetRecInfo(Buffer).Bookmark;
+  ReqBookmark:=PRecInfo(Buffer+FRecInfoOffset)^.Bookmark;
   InternalGotoBookmark (@ReqBookmark);
   InternalGotoBookmark (@ReqBookmark);
 end;
 end;
 
 
 function TMemDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
 function TMemDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+
 begin
 begin
- Result:=MDSGetRecInfo(Buffer).BookmarkFlag;
+  Result:=PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag;
 end;
 end;
 
 
 procedure TMemDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
 procedure TMemDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+
 begin
 begin
-  MDSSetRecInfo(Buffer,Value);
+  PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag := Value;
 end;
 end;
 
 
 procedure TMemDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
 procedure TMemDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
 
 
 begin
 begin
   if Data<>nil then
   if Data<>nil then
-    PInteger(Data)^:=MDSGetRecInfo(Buffer).Bookmark;
+    PInteger(Data)^:=PRecInfo(Buffer+FRecInfoOffset)^.Bookmark;
 end;
 end;
 
 
 procedure TMemDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
 procedure TMemDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
 
 
 begin
 begin
   if Data<>nil then
   if Data<>nil then
-    MDSSetRecInfo(Buffer, PInteger(Data)^)
+    PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=PInteger(Data)^
   else
   else
-    MDSSetRecInfo( Buffer, 0);
+    PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=0;
 end;
 end;
 
 
 function TMemDataset.MDSFilterRecord(Buffer: PChar): Boolean;
 function TMemDataset.MDSFilterRecord(Buffer: PChar): Boolean;
@@ -755,34 +779,12 @@ begin
   if not Assigned(OnFilterRecord) then
   if not Assigned(OnFilterRecord) then
     Exit;
     Exit;
   SaveState:=SetTempState(dsFilter);
   SaveState:=SetTempState(dsFilter);
-  FFilterBuffer:=Buffer;
-  OnFilterRecord(Self,Result);
-  RestoreState(SaveState);
-end;
-
-function  TMemDataset.MDSGetRecInfo(Buffer: PChar): TMTRecInfo;
-begin
-  Move(PRecInfo(Buffer+FRecInfoOffset)^,Result,FRecInfoSize);
-end;
-
-procedure TMemDataset.MDSSetRecInfo(Buffer: PChar;
-                                    Flag: TBookmarkFlag);
-begin
-  Unaligned(PRecInfo(Buffer+FRecInfoOffset)^).BookmarkFlag := Flag;
-end;
-
-procedure TMemDataset.MDSSetRecInfo(Buffer: PChar;
-                                    Flag: TBookmarkFlag;
-                                    ABookmark: Longint);
-begin
-  Unaligned(PRecInfo(Buffer+FRecInfoOffset)^).Bookmark := ABookmark;
-  Unaligned(PRecInfo(Buffer+FRecInfoOffset)^).BookmarkFlag := Flag;
-end;
-
-procedure TMemDataset.MDSSetRecInfo(Buffer: PChar;
-                                    ABookmark: Longint);
-begin
-  Unaligned(PRecInfo(Buffer+FRecInfoOffset)^).Bookmark := ABookmark;
+  Try
+    FFilterBuffer:=Buffer;
+    OnFilterRecord(Self,Result);
+  Finally  
+    RestoreState(SaveState);
+  end;  
 end;
 end;
 
 
 Function TMemDataset.DataSize : Integer;
 Function TMemDataset.DataSize : Integer;
@@ -812,22 +814,32 @@ begin
     end;
     end;
 end;
 end;
 
 
-procedure TMemDataset.CreateTable;
+procedure tmemdataset.calcrecordlayout;
 var
 var
-  i : Longint;
-  iSize : ptrint;
+  i,count : integer;
+begin
+ Count := fielddefs.count;
+ FFieldOffsets:=getmem(Count*sizeof(integer));
+ FFieldSizes:=getmem(Count*sizeof(integer));
+ FRecSize:= (Count+7) div 8; //null mask
+ for i:= 0 to Count-1 do 
+   begin
+   ffieldoffsets[i] := frecsize;
+   ffieldsizes[i] := MDSGetbufferSize(i+1);
+   FRecSize:= FRecSize+FFieldSizes[i];
+   end;
+end;
+
+procedure TMemDataset.CreateTable;
+
 begin
 begin
   FStream.Clear;
   FStream.Clear;
   FRecCount:=0;
   FRecCount:=0;
   FCurrRecNo:=-1;
   FCurrRecNo:=-1;
   FIsOpen:=False;
   FIsOpen:=False;
-  iSize:=0;
-  for I:=1 to FieldDefs.Count do begin
-    FFieldOffsetList.Add(Pointer(iSize));
-    iSize:=iSize+MDSGetFieldSize(I);
-  end;
-  FRecInfoOffset:=iSize;
-  FRecSize:=iSize+FRecInfoSize;
+  calcrecordlayout;
+  FRecInfoOffset:=FRecSize;
+  FRecSize:=FRecSize+SizeRecInfo;
   FRecBufferSize:=FRecSize;
   FRecBufferSize:=FRecSize;
 end;
 end;
 
 
@@ -854,7 +866,7 @@ Function TMemDataset.GetRecNo: Longint;
 begin
 begin
   UpdateCursorPos;
   UpdateCursorPos;
   if (FCurrRecNo<0) then
   if (FCurrRecNo<0) then
-    Result:=0
+    Result:=1
   else
   else
     Result:=FCurrRecNo+1;
     Result:=FCurrRecNo+1;
 end;
 end;
@@ -875,7 +887,7 @@ end;
 Procedure TMemDataset.CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
 Procedure TMemDataset.CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
 
 
 Var
 Var
-  I, iDataSize : Integer;
+  I  : Integer;
   F,F1,F2 : TField;
   F,F1,F2 : TField;
   L1,L2  : TList;
   L1,L2  : TList;
   N : String;
   N : String;
@@ -885,12 +897,8 @@ begin
   // NOT from fielddefs. The data may not be available in buffers !!
   // NOT from fielddefs. The data may not be available in buffers !!
   For I:=0 to Dataset.FieldCount-1 do
   For I:=0 to Dataset.FieldCount-1 do
     begin
     begin
-     F:=Dataset.Fields[I];
-     if (F.DataType=ftString) and (F.Size=0)
-     then iDataSize:=MEMDS_STRING_MAXSIZE
-     else iDataSize:=F.Size;
-
-     TFieldDef.Create(FieldDefs,F.FieldName,F.DataType,iDataSize,F.Required,F.FieldNo);
+    F:=Dataset.Fields[I];
+    TFieldDef.Create(FieldDefs,F.FieldName,F.DataType,F.Size,F.Required,F.FieldNo);
     end;
     end;
   CreateTable;
   CreateTable;
   If CopyData then
   If CopyData then

+ 168 - 24
packages/fcl-db/src/sqldb/Makefile

@@ -1,8 +1,8 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
 #
 #
 default: all
 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-embedded
+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
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
 LIMIT83fs = go32v2 os2 emx watcom
@@ -233,70 +233,73 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(F
 override PACKAGE_NAME=fcl-db
 override PACKAGE_NAME=fcl-db
 PACKAGEDIR_MAIN:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-db/Makefile.fpc,$(PACKAGESDIR))))))
 PACKAGEDIR_MAIN:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-db/Makefile.fpc,$(PACKAGESDIR))))))
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_DIRS+=interbase postgres
+override TARGET_DIRS+=interbase postgres sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_DIRS+=interbase odbc mysql
+override TARGET_DIRS+=interbase odbc mysql sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_DIRS+=interbase postgres
+override TARGET_DIRS+=interbase postgres sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_UNITS+=sqldb
 override TARGET_UNITS+=sqldb
@@ -448,6 +451,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_UNITS+=sqldb
 override TARGET_UNITS+=sqldb
 endif
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=sqldb
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_UNITS+=sqldb
 override TARGET_UNITS+=sqldb
 endif
 endif
@@ -601,6 +607,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_RSTS+=sqldb
 override TARGET_RSTS+=sqldb
 endif
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_RSTS+=sqldb
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_RSTS+=sqldb
 override TARGET_RSTS+=sqldb
 endif
 endif
@@ -755,6 +764,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override COMPILER_OPTIONS+=-S2
 override COMPILER_OPTIONS+=-S2
 endif
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_OPTIONS+=-S2
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override COMPILER_OPTIONS+=-S2
 override COMPILER_OPTIONS+=-S2
 endif
 endif
@@ -1544,6 +1556,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1555,6 +1568,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1566,6 +1580,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1577,6 +1592,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1594,6 +1610,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1605,6 +1622,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1619,6 +1637,7 @@ ifeq ($(FULL_TARGET),i386-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1633,6 +1652,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1641,6 +1661,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1649,6 +1670,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1663,6 +1685,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1677,6 +1700,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1685,6 +1709,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1699,6 +1724,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1713,6 +1739,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1721,6 +1748,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1735,6 +1763,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1743,12 +1772,14 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1760,6 +1791,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1768,6 +1800,7 @@ ifeq ($(FULL_TARGET),arm-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1788,6 +1821,16 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_IBASE=1
+REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_ODBC=1
+REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -1948,6 +1991,32 @@ ifdef UNITDIR_ORACLE
 override COMPILER_UNITDIR+=$(UNITDIR_ORACLE)
 override COMPILER_UNITDIR+=$(UNITDIR_ORACLE)
 endif
 endif
 endif
 endif
+ifdef REQUIRE_PACKAGES_SQLITE
+PACKAGEDIR_SQLITE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_SQLITE),)
+ifneq ($(wildcard $(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)),)
+UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_SQLITE)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_SQLITE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_SQLITE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_SQLITE=
+UNITDIR_SQLITE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_SQLITE),)
+UNITDIR_SQLITE:=$(firstword $(UNITDIR_SQLITE))
+else
+UNITDIR_SQLITE=
+endif
+endif
+ifdef UNITDIR_SQLITE
+override COMPILER_UNITDIR+=$(UNITDIR_SQLITE)
+endif
+endif
 ifndef NOCPUDEF
 ifndef NOCPUDEF
 override FPCOPTDEF=$(CPU_TARGET)
 override FPCOPTDEF=$(CPU_TARGET)
 endif
 endif
@@ -2439,6 +2508,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2446,6 +2516,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2453,6 +2524,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2460,6 +2532,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2467,6 +2540,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2474,10 +2548,12 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_POSTGRES=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2485,6 +2561,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2492,6 +2569,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2499,6 +2577,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2506,6 +2585,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2513,6 +2593,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2520,6 +2601,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2527,6 +2609,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2534,6 +2617,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2541,6 +2625,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2548,6 +2633,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2555,11 +2641,13 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2567,10 +2655,12 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_POSTGRES=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_INTERBASE=1
@@ -2578,6 +2668,15 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+TARGET_DIRS_INTERBASE=1
+TARGET_DIRS_POSTGRES=1
+TARGET_DIRS_MYSQL=1
+TARGET_DIRS_ODBC=1
+TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 endif
 ifdef TARGET_DIRS_INTERBASE
 ifdef TARGET_DIRS_INTERBASE
 interbase_all:
 interbase_all:
@@ -2804,6 +2903,51 @@ oracle:
 	$(MAKE) -C oracle all
 	$(MAKE) -C oracle all
 .PHONY: oracle_all oracle_debug oracle_smart oracle_release oracle_units oracle_examples oracle_shared oracle_install oracle_sourceinstall oracle_exampleinstall oracle_distinstall oracle_zipinstall oracle_zipsourceinstall oracle_zipexampleinstall oracle_zipdistinstall oracle_clean oracle_distclean oracle_cleanall oracle_info oracle_makefiles oracle
 .PHONY: oracle_all oracle_debug oracle_smart oracle_release oracle_units oracle_examples oracle_shared oracle_install oracle_sourceinstall oracle_exampleinstall oracle_distinstall oracle_zipinstall oracle_zipsourceinstall oracle_zipexampleinstall oracle_zipdistinstall oracle_clean oracle_distclean oracle_cleanall oracle_info oracle_makefiles oracle
 endif
 endif
+ifdef TARGET_DIRS_SQLITE
+sqlite_all:
+	$(MAKE) -C sqlite all
+sqlite_debug:
+	$(MAKE) -C sqlite debug
+sqlite_smart:
+	$(MAKE) -C sqlite smart
+sqlite_release:
+	$(MAKE) -C sqlite release
+sqlite_units:
+	$(MAKE) -C sqlite units
+sqlite_examples:
+	$(MAKE) -C sqlite examples
+sqlite_shared:
+	$(MAKE) -C sqlite shared
+sqlite_install:
+	$(MAKE) -C sqlite install
+sqlite_sourceinstall:
+	$(MAKE) -C sqlite sourceinstall
+sqlite_exampleinstall:
+	$(MAKE) -C sqlite exampleinstall
+sqlite_distinstall:
+	$(MAKE) -C sqlite distinstall
+sqlite_zipinstall:
+	$(MAKE) -C sqlite zipinstall
+sqlite_zipsourceinstall:
+	$(MAKE) -C sqlite zipsourceinstall
+sqlite_zipexampleinstall:
+	$(MAKE) -C sqlite zipexampleinstall
+sqlite_zipdistinstall:
+	$(MAKE) -C sqlite zipdistinstall
+sqlite_clean:
+	$(MAKE) -C sqlite clean
+sqlite_distclean:
+	$(MAKE) -C sqlite distclean
+sqlite_cleanall:
+	$(MAKE) -C sqlite cleanall
+sqlite_info:
+	$(MAKE) -C sqlite info
+sqlite_makefiles:
+	$(MAKE) -C sqlite makefiles
+sqlite:
+	$(MAKE) -C sqlite all
+.PHONY: sqlite_all sqlite_debug sqlite_smart sqlite_release sqlite_units sqlite_examples sqlite_shared sqlite_install sqlite_sourceinstall sqlite_exampleinstall sqlite_distinstall sqlite_zipinstall sqlite_zipsourceinstall sqlite_zipexampleinstall sqlite_zipdistinstall sqlite_clean sqlite_distclean sqlite_cleanall sqlite_info sqlite_makefiles sqlite
+endif
 all: fpc_all $(addsuffix _all,$(TARGET_DIRS))
 all: fpc_all $(addsuffix _all,$(TARGET_DIRS))
 debug: fpc_debug
 debug: fpc_debug
 smart: fpc_smart
 smart: fpc_smart

+ 8 - 8
packages/fcl-db/src/sqldb/Makefile.fpc

@@ -6,14 +6,14 @@
 main=fcl-db
 main=fcl-db
 
 
 [target]
 [target]
-dirs_linux=interbase postgres mysql odbc oracle
-dirs_freebsd=interbase postgres mysql odbc oracle
-dirs_darwin=interbase postgres mysql odbc oracle
-dirs_netbsd=interbase postgres mysql odbc oracle
-dirs_openbsd=interbase postgres mysql odbc oracle
-dirs_win32=interbase postgres mysql odbc oracle
-dirs_win64=interbase odbc mysql
-dirs_wince=interbase postgres 
+dirs_linux=interbase postgres mysql odbc oracle sqlite
+dirs_freebsd=interbase postgres mysql odbc oracle sqlite
+dirs_darwin=interbase postgres mysql odbc oracle sqlite
+dirs_netbsd=interbase postgres mysql odbc oracle sqlite
+dirs_openbsd=interbase postgres mysql odbc oracle sqlite
+dirs_win32=interbase postgres mysql odbc oracle sqlite
+dirs_win64=interbase odbc mysql sqlite
+dirs_wince=interbase postgres sqlite
 units=sqldb
 units=sqldb
 rsts=sqldb
 rsts=sqldb
 
 

+ 3 - 1
packages/fcl-db/src/sqldb/interbase/ibconnection.pp

@@ -995,7 +995,8 @@ begin
               'ind.rdb$relation_name, '+
               'ind.rdb$relation_name, '+
               'ind.rdb$unique_flag, '+
               'ind.rdb$unique_flag, '+
               'ind_seg.rdb$field_name, '+
               'ind_seg.rdb$field_name, '+
-              'rel_con.rdb$constraint_type '+
+              'rel_con.rdb$constraint_type, '+
+              'ind.rdb$index_type '+
             'from '+
             'from '+
               'rdb$index_segments ind_seg, '+
               'rdb$index_segments ind_seg, '+
               'rdb$indices ind '+
               'rdb$indices ind '+
@@ -1017,6 +1018,7 @@ begin
     Fields := trim(qry.Fields[3].asstring);
     Fields := trim(qry.Fields[3].asstring);
     If qry.fields[4].asstring = 'PRIMARY KEY' then options := options + [ixPrimary];
     If qry.fields[4].asstring = 'PRIMARY KEY' then options := options + [ixPrimary];
     If qry.fields[2].asinteger = 1 then options := options + [ixUnique];
     If qry.fields[2].asinteger = 1 then options := options + [ixUnique];
+    If qry.fields[5].asInteger = 1 then options:=options+[ixDescending];
     qry.next;
     qry.next;
     while (name = trim(qry.fields[0].asstring)) and (not qry.eof) do
     while (name = trim(qry.fields[0].asstring)) and (not qry.eof) do
       begin
       begin

+ 114 - 59
packages/fcl-db/src/sqldb/sqldb.pp

@@ -29,6 +29,7 @@ type TSchemaType = (stNoSchema, stTables, stSysTables, stProcedures, stColumns,
 type
 type
   TSQLConnection = class;
   TSQLConnection = class;
   TSQLTransaction = class;
   TSQLTransaction = class;
+  TCustomSQLQuery = class;
   TSQLQuery = class;
   TSQLQuery = class;
   TSQLScript = class;
   TSQLScript = class;
 
 
@@ -162,9 +163,9 @@ type
     property Params : TStringList read FParams write FParams;
     property Params : TStringList read FParams write FParams;
   end;
   end;
 
 
-{ TSQLQuery }
+{ TCustomSQLQuery }
 
 
-  TSQLQuery = class (Tbufdataset)
+  TCustomSQLQuery = class (Tbufdataset)
   private
   private
     FCursor              : TSQLCursor;
     FCursor              : TSQLCursor;
     FUpdateable          : boolean;
     FUpdateable          : boolean;
@@ -193,7 +194,7 @@ type
 
 
     FUpdateQry,
     FUpdateQry,
     FDeleteQry,
     FDeleteQry,
-    FInsertQry           : TSQLQuery;
+    FInsertQry           : TCustomSQLQuery;
 
 
     procedure FreeFldBuffers;
     procedure FreeFldBuffers;
     procedure InitUpdates(ASQL : string);
     procedure InitUpdates(ASQL : string);
@@ -240,13 +241,12 @@ type
     procedure SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string); virtual;
     procedure SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string); virtual;
     property Prepared : boolean read IsPrepared;
     property Prepared : boolean read IsPrepared;
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
-  published
+  protected
+      
     // redeclared data set properties
     // redeclared data set properties
     property Active;
     property Active;
     property Filter;
     property Filter;
     property Filtered;
     property Filtered;
-    property ServerFilter: string read FServerFilterText write SetServerFilterText;
-    property ServerFiltered: Boolean read FServerFiltered write SetServerFiltered default False;
 //    property FilterOptions;
 //    property FilterOptions;
     property BeforeOpen;
     property BeforeOpen;
     property AfterOpen;
     property AfterOpen;
@@ -272,7 +272,8 @@ type
     property OnPostError;
     property OnPostError;
     property AutoCalcFields;
     property AutoCalcFields;
     property Database;
     property Database;
-
+  // protected
+//    property SchemaInfo : TSchemaInfo read FSchemaInfo default stNoSchema;
     property Transaction;
     property Transaction;
     property ReadOnly : Boolean read FReadOnly write SetReadOnly;
     property ReadOnly : Boolean read FReadOnly write SetReadOnly;
     property SQL : TStringlist read FSQL write FSQL;
     property SQL : TStringlist read FSQL write FSQL;
@@ -286,7 +287,58 @@ type
     property StatementType : TStatementType read GetStatementType;
     property StatementType : TStatementType read GetStatementType;
     property ParseSQL : Boolean read FParseSQL write SetParseSQL;
     property ParseSQL : Boolean read FParseSQL write SetParseSQL;
     Property DataSource : TDatasource Read GetDataSource Write SetDatasource;
     Property DataSource : TDatasource Read GetDataSource Write SetDatasource;
-//    property SchemaInfo : TSchemaInfo read FSchemaInfo default stNoSchema;
+    property ServerFilter: string read FServerFilterText write SetServerFilterText;
+    property ServerFiltered: Boolean read FServerFiltered write SetServerFiltered default False;
+  end;
+
+{ TSQLQuery }
+  TSQLQuery = Class(TCustomSQLQuery)
+  Published
+   // TDataset stuff
+    Property Active;
+    Property AutoCalcFields;
+    Property Filter;
+    Property Filtered;
+    Property AfterCancel;
+    Property AfterClose;
+    Property AfterDelete;
+    Property AfterEdit;
+    Property AfterInsert;
+    Property AfterOpen;
+    Property AfterPost;
+    Property AfterScroll;
+    Property BeforeCancel;
+    Property BeforeClose;
+    Property BeforeDelete;
+    Property BeforeEdit;
+    Property BeforeInsert;
+    Property BeforeOpen;
+    Property BeforePost;
+    Property BeforeScroll;
+    Property OnCalcFields;
+    Property OnDeleteError;
+    Property OnEditError;
+    Property OnFilterRecord;
+    Property OnNewRecord;
+    Property OnPostError;
+
+    //    property SchemaInfo default stNoSchema;
+    property Database;
+    property Transaction;
+    property ReadOnly;
+    property SQL;
+    property UpdateSQL;
+    property InsertSQL;
+    property DeleteSQL;
+    property IndexDefs;
+    property Params;
+    property UpdateMode;
+    property UsePrimaryKeyAsKey;
+    property StatementType;
+    property ParseSQL;
+    Property DataSource;
+    property ServerFilter;
+    property ServerFiltered;
   end;
   end;
 
 
 { TSQLScript }
 { TSQLScript }
@@ -294,7 +346,7 @@ type
   TSQLScript = class (Tcomponent)
   TSQLScript = class (Tcomponent)
   private
   private
     FScript  : TStrings;
     FScript  : TStrings;
-    FQuery   : TSQLQuery;
+    FQuery   : TCustomSQLQuery;
     FDatabase : TDatabase;
     FDatabase : TDatabase;
     FTransaction : TDBTransaction;
     FTransaction : TDBTransaction;
   protected
   protected
@@ -371,6 +423,7 @@ type
 Procedure RegisterConnection(Def : TConnectionDefClass);
 Procedure RegisterConnection(Def : TConnectionDefClass);
 Procedure UnRegisterConnection(Def : TConnectionDefClass);
 Procedure UnRegisterConnection(Def : TConnectionDefClass);
 Procedure UnRegisterConnection(ConnectionName : String);
 Procedure UnRegisterConnection(ConnectionName : String);
+Function GetConnectionDef(ConnectorName : String) : TConnectionDef;
 Procedure GetConnectionList(List : TSTrings);
 Procedure GetConnectionList(List : TSTrings);
 
 
 implementation
 implementation
@@ -476,13 +529,13 @@ end;
 
 
 procedure TSQLConnection.GetDBInfo(const SchemaType : TSchemaType; const SchemaObjectName, ReturnField : string; List: TStrings);
 procedure TSQLConnection.GetDBInfo(const SchemaType : TSchemaType; const SchemaObjectName, ReturnField : string; List: TStrings);
 
 
-var qry : TSQLQuery;
+var qry : TCustomSQLQuery;
 
 
 begin
 begin
   if not assigned(Transaction) then
   if not assigned(Transaction) then
     DatabaseError(SErrConnTransactionnSet);
     DatabaseError(SErrConnTransactionnSet);
 
 
-  qry := tsqlquery.Create(nil);
+  qry := TCustomSQLQuery.Create(nil);
   qry.transaction := Transaction;
   qry.transaction := Transaction;
   qry.database := Self;
   qry.database := Self;
   with qry do
   with qry do
@@ -493,7 +546,7 @@ begin
     List.Clear;
     List.Clear;
     while not eof do
     while not eof do
       begin
       begin
-      List.Append(fieldbyname(ReturnField).asstring);
+      List.Append(trim(fieldbyname(ReturnField).asstring));
       Next;
       Next;
       end;
       end;
     end;
     end;
@@ -668,8 +721,8 @@ begin
     end;
     end;
 end;
 end;
 
 
-{ TSQLQuery }
-procedure TSQLQuery.OnChangeSQL(Sender : TObject);
+{ TCustomSQLQuery }
+procedure TCustomSQLQuery.OnChangeSQL(Sender : TObject);
 
 
 var ConnOptions : TConnOptions;
 var ConnOptions : TConnOptions;
 
 
@@ -687,20 +740,20 @@ begin
     end;
     end;
 end;
 end;
 
 
-procedure TSQLQuery.OnChangeModifySQL(Sender : TObject);
+procedure TCustomSQLQuery.OnChangeModifySQL(Sender : TObject);
 
 
 begin
 begin
   CheckInactive;
   CheckInactive;
 end;
 end;
 
 
-Procedure TSQLQuery.SetTransaction(Value : TDBTransaction);
+Procedure TCustomSQLQuery.SetTransaction(Value : TDBTransaction);
 
 
 begin
 begin
   UnPrepare;
   UnPrepare;
   inherited;
   inherited;
 end;
 end;
 
 
-procedure TSQLQuery.SetDatabase(Value : TDatabase);
+procedure TCustomSQLQuery.SetDatabase(Value : TDatabase);
 
 
 var db : tsqlconnection;
 var db : tsqlconnection;
 
 
@@ -717,25 +770,25 @@ begin
     end;
     end;
 end;
 end;
 
 
-Function TSQLQuery.IsPrepared : Boolean;
+Function TCustomSQLQuery.IsPrepared : Boolean;
 
 
 begin
 begin
   Result := Assigned(FCursor) and FCursor.FPrepared;
   Result := Assigned(FCursor) and FCursor.FPrepared;
 end;
 end;
 
 
-Function TSQLQuery.AddFilter(SQLstr : string) : string;
+Function TCustomSQLQuery.AddFilter(SQLstr : string) : string;
 
 
 begin
 begin
   if FWhereStartPos = 0 then
   if FWhereStartPos = 0 then
     SQLstr := SQLstr + ' where (' + Filter + ')'
     SQLstr := SQLstr + ' where (' + Filter + ')'
   else if FWhereStopPos > 0 then
   else if FWhereStopPos > 0 then
-    system.insert(' and ('+Filter+') ',SQLstr,FWhereStopPos+1)
+    system.insert(' and ('+ServerFilter+') ',SQLstr,FWhereStopPos+1)
   else
   else
-    system.insert(' where ('+Filter+') ',SQLstr,FWhereStartPos);
+    system.insert(' where ('+ServerFilter+') ',SQLstr,FWhereStartPos);
   Result := SQLstr;
   Result := SQLstr;
 end;
 end;
 
 
-procedure TSQLQuery.ApplyFilter;
+procedure TCustomSQLQuery.ApplyFilter;
 
 
 var S : String;
 var S : String;
 
 
@@ -756,7 +809,7 @@ begin
   First;
   First;
 end;
 end;
 
 
-Procedure TSQLQuery.SetActive (Value : Boolean);
+Procedure TCustomSQLQuery.SetActive (Value : Boolean);
 
 
 begin
 begin
   inherited SetActive(Value);
   inherited SetActive(Value);
@@ -766,7 +819,7 @@ begin
 end;
 end;
 
 
 
 
-procedure TSQLQuery.SetServerFiltered(Value: Boolean);
+procedure TCustomSQLQuery.SetServerFiltered(Value: Boolean);
 
 
 begin
 begin
   if Value and not FParseSQL then DatabaseErrorFmt(SNoParseSQL,['Filtering ']);
   if Value and not FParseSQL then DatabaseErrorFmt(SNoParseSQL,['Filtering ']);
@@ -777,7 +830,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-procedure TSQLQuery.SetServerFilterText(const Value: string);
+procedure TCustomSQLQuery.SetServerFilterText(const Value: string);
 begin
 begin
   if Value <> ServerFilter then
   if Value <> ServerFilter then
     begin
     begin
@@ -786,7 +839,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-procedure TSQLQuery.Prepare;
+procedure TCustomSQLQuery.Prepare;
 var
 var
   db    : tsqlconnection;
   db    : tsqlconnection;
   sqltr : tsqltransaction;
   sqltr : tsqltransaction;
@@ -828,7 +881,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-procedure TSQLQuery.UnPrepare;
+procedure TCustomSQLQuery.UnPrepare;
 
 
 begin
 begin
   CheckInactive;
   CheckInactive;
@@ -836,12 +889,12 @@ begin
     UnPrepareStatement(FCursor);
     UnPrepareStatement(FCursor);
 end;
 end;
 
 
-procedure TSQLQuery.FreeFldBuffers;
+procedure TCustomSQLQuery.FreeFldBuffers;
 begin
 begin
   if assigned(FCursor) then (Database as tsqlconnection).FreeFldBuffers(FCursor);
   if assigned(FCursor) then (Database as tsqlconnection).FreeFldBuffers(FCursor);
 end;
 end;
 
 
-function TSQLQuery.Fetch : boolean;
+function TCustomSQLQuery.Fetch : boolean;
 begin
 begin
   if not (Fcursor.FStatementType in [stSelect]) then
   if not (Fcursor.FStatementType in [stSelect]) then
     Exit;
     Exit;
@@ -850,25 +903,25 @@ begin
   Result := not FIsEOF;
   Result := not FIsEOF;
 end;
 end;
 
 
-procedure TSQLQuery.Execute;
+procedure TCustomSQLQuery.Execute;
 begin
 begin
   If (FParams.Count>0) and Assigned(FMasterLink) then
   If (FParams.Count>0) and Assigned(FMasterLink) then
     FMasterLink.CopyParamsFromMaster(False);
     FMasterLink.CopyParamsFromMaster(False);
   (Database as tsqlconnection).execute(Fcursor,Transaction as tsqltransaction, FParams);
   (Database as tsqlconnection).execute(Fcursor,Transaction as tsqltransaction, FParams);
 end;
 end;
 
 
-function TSQLQuery.LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean;
+function TCustomSQLQuery.LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean;
 
 
 begin
 begin
   result := (Database as tSQLConnection).LoadField(FCursor,FieldDef,buffer, Createblob)
   result := (Database as tSQLConnection).LoadField(FCursor,FieldDef,buffer, Createblob)
 end;
 end;
 
 
-procedure TSQLQuery.InternalAddRecord(Buffer: Pointer; AAppend: Boolean);
+procedure TCustomSQLQuery.InternalAddRecord(Buffer: Pointer; AAppend: Boolean);
 begin
 begin
   // not implemented - sql dataset
   // not implemented - sql dataset
 end;
 end;
 
 
-procedure TSQLQuery.InternalClose;
+procedure TCustomSQLQuery.InternalClose;
 begin
 begin
   if StatementType = stSelect then FreeFldBuffers;
   if StatementType = stSelect then FreeFldBuffers;
 // Database and FCursor could be nil, for example if the database is not assigned, and .open is called
 // Database and FCursor could be nil, for example if the database is not assigned, and .open is called
@@ -883,7 +936,7 @@ begin
   inherited internalclose;
   inherited internalclose;
 end;
 end;
 
 
-procedure TSQLQuery.InternalInitFieldDefs;
+procedure TCustomSQLQuery.InternalInitFieldDefs;
 begin
 begin
   if FLoadingFieldDefs then
   if FLoadingFieldDefs then
     Exit;
     Exit;
@@ -900,7 +953,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TSQLQuery.SQLParser(var ASQL : string);
+procedure TCustomSQLQuery.SQLParser(var ASQL : string);
 
 
 type TParsePart = (ppStart,ppSelect,ppWhere,ppFrom,ppOrder,ppComment,ppGroup,ppBogus);
 type TParsePart = (ppStart,ppSelect,ppWhere,ppFrom,ppOrder,ppComment,ppGroup,ppBogus);
 
 
@@ -1029,7 +1082,7 @@ begin
     end
     end
 end;
 end;
 
 
-procedure TSQLQuery.InitUpdates(ASQL : string);
+procedure TCustomSQLQuery.InitUpdates(ASQL : string);
 
 
 
 
 begin
 begin
@@ -1043,12 +1096,12 @@ begin
 
 
 end;
 end;
 
 
-procedure TSQLQuery.InternalOpen;
+procedure TCustomSQLQuery.InternalOpen;
 
 
-  procedure InitialiseModifyQuery(var qry : TSQLQuery; aSQL: TSTringList);
+  procedure InitialiseModifyQuery(var qry : TCustomSQLQuery; aSQL: TSTringList);
   
   
   begin
   begin
-    qry := TSQLQuery.Create(nil);
+    qry := TCustomSQLQuery.Create(nil);
     with qry do
     with qry do
       begin
       begin
       ParseSQL := False;
       ParseSQL := False;
@@ -1120,7 +1173,7 @@ end;
 
 
 // public part
 // public part
 
 
-procedure TSQLQuery.ExecSQL;
+procedure TCustomSQLQuery.ExecSQL;
 begin
 begin
   try
   try
     Prepare;
     Prepare;
@@ -1132,7 +1185,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-constructor TSQLQuery.Create(AOwner : TComponent);
+constructor TCustomSQLQuery.Create(AOwner : TComponent);
 begin
 begin
   inherited Create(AOwner);
   inherited Create(AOwner);
   FParams := TParams.create(self);
   FParams := TParams.create(self);
@@ -1159,7 +1212,7 @@ begin
   FUsePrimaryKeyAsKey := True;
   FUsePrimaryKeyAsKey := True;
 end;
 end;
 
 
-destructor TSQLQuery.Destroy;
+destructor TCustomSQLQuery.Destroy;
 begin
 begin
   if Active then Close;
   if Active then Close;
   UnPrepare;
   UnPrepare;
@@ -1174,7 +1227,7 @@ begin
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
-procedure TSQLQuery.SetReadOnly(AValue : Boolean);
+procedure TCustomSQLQuery.SetReadOnly(AValue : Boolean);
 
 
 begin
 begin
   CheckInactive;
   CheckInactive;
@@ -1186,7 +1239,7 @@ begin
   else FReadOnly := True;
   else FReadOnly := True;
 end;
 end;
 
 
-procedure TSQLQuery.SetParseSQL(AValue : Boolean);
+procedure TCustomSQLQuery.SetParseSQL(AValue : Boolean);
 
 
 begin
 begin
   CheckInactive;
   CheckInactive;
@@ -1200,7 +1253,7 @@ begin
     FParseSQL := True;
     FParseSQL := True;
 end;
 end;
 
 
-procedure TSQLQuery.SetUsePrimaryKeyAsKey(AValue : Boolean);
+procedure TCustomSQLQuery.SetUsePrimaryKeyAsKey(AValue : Boolean);
 
 
 begin
 begin
   if not Active then FusePrimaryKeyAsKey := AValue
   if not Active then FusePrimaryKeyAsKey := AValue
@@ -1211,14 +1264,14 @@ begin
     end;
     end;
 end;
 end;
 
 
-Procedure TSQLQuery.UpdateIndexDefs;
+Procedure TCustomSQLQuery.UpdateIndexDefs;
 
 
 begin
 begin
   if assigned(DataBase) then
   if assigned(DataBase) then
     (DataBase as TSQLConnection).UpdateIndexDefs(FIndexDefs,FTableName);
     (DataBase as TSQLConnection).UpdateIndexDefs(FIndexDefs,FTableName);
 end;
 end;
 
 
-Procedure TSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
+Procedure TCustomSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
 
 
   procedure UpdateWherePart(var sql_where : string;x : integer);
   procedure UpdateWherePart(var sql_where : string;x : integer);
 
 
@@ -1294,7 +1347,7 @@ Procedure TSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
     result := 'delete from ' + FTableName + ' where ' + sql_where;
     result := 'delete from ' + FTableName + ' where ' + sql_where;
   end;
   end;
 
 
-var qry : tsqlquery;
+var qry : TCustomSQLQuery;
     x   : integer;
     x   : integer;
     Fld : TField;
     Fld : TField;
     
     
@@ -1330,7 +1383,7 @@ begin
 end;
 end;
 
 
 
 
-Function TSQLQuery.GetCanModify: Boolean;
+Function TCustomSQLQuery.GetCanModify: Boolean;
 
 
 begin
 begin
   // the test for assigned(FCursor) is needed for the case that the dataset isn't opened
   // the test for assigned(FCursor) is needed for the case that the dataset isn't opened
@@ -1340,25 +1393,25 @@ begin
     Result := False;
     Result := False;
 end;
 end;
 
 
-function TSQLQuery.GetIndexDefs : TIndexDefs;
+function TCustomSQLQuery.GetIndexDefs : TIndexDefs;
 
 
 begin
 begin
   Result := FIndexDefs;
   Result := FIndexDefs;
 end;
 end;
 
 
-procedure TSQLQuery.SetIndexDefs(AValue : TIndexDefs);
+procedure TCustomSQLQuery.SetIndexDefs(AValue : TIndexDefs);
 
 
 begin
 begin
   FIndexDefs := AValue;
   FIndexDefs := AValue;
 end;
 end;
 
 
-procedure TSQLQuery.SetUpdateMode(AValue : TUpdateMode);
+procedure TCustomSQLQuery.SetUpdateMode(AValue : TUpdateMode);
 
 
 begin
 begin
   FUpdateMode := AValue;
   FUpdateMode := AValue;
 end;
 end;
 
 
-procedure TSQLQuery.SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string);
+procedure TCustomSQLQuery.SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string);
 
 
 begin
 begin
   ReadOnly := True;
   ReadOnly := True;
@@ -1366,20 +1419,20 @@ begin
   SQL.Add((DataBase as tsqlconnection).GetSchemaInfoSQL(SchemaType, SchemaObjectName, SchemaPattern));
   SQL.Add((DataBase as tsqlconnection).GetSchemaInfoSQL(SchemaType, SchemaObjectName, SchemaPattern));
 end;
 end;
 
 
-procedure TSQLQuery.LoadBlobIntoBuffer(FieldDef: TFieldDef;
+procedure TCustomSQLQuery.LoadBlobIntoBuffer(FieldDef: TFieldDef;
   ABlobBuf: PBufBlobField);
   ABlobBuf: PBufBlobField);
 begin
 begin
   (DataBase as tsqlconnection).LoadBlobIntoBuffer(FieldDef, ABlobBuf, FCursor,(Transaction as tsqltransaction));
   (DataBase as tsqlconnection).LoadBlobIntoBuffer(FieldDef, ABlobBuf, FCursor,(Transaction as tsqltransaction));
 end;
 end;
 
 
-function TSQLQuery.GetStatementType : TStatementType;
+function TCustomSQLQuery.GetStatementType : TStatementType;
 
 
 begin
 begin
   if assigned(FCursor) then Result := FCursor.FStatementType
   if assigned(FCursor) then Result := FCursor.FStatementType
     else Result := stNone;
     else Result := stNone;
 end;
 end;
 
 
-Procedure TSQLQuery.SetDataSource(AVAlue : TDatasource);
+Procedure TCustomSQLQuery.SetDataSource(AVAlue : TDatasource);
 
 
 Var
 Var
   DS : TDatasource;
   DS : TDatasource;
@@ -1388,6 +1441,8 @@ begin
   DS:=DataSource;
   DS:=DataSource;
   If (AValue<>DS) then
   If (AValue<>DS) then
     begin
     begin
+    If Assigned(AValue) and (AValue.Dataset=Self) then
+      DatabaseError(SErrCircularDataSourceReferenceNotAllowed,Self);
     If Assigned(DS) then
     If Assigned(DS) then
       DS.RemoveFreeNotification(Self);
       DS.RemoveFreeNotification(Self);
     If Assigned(AValue) then
     If Assigned(AValue) then
@@ -1401,7 +1456,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-Function TSQLQuery.GetDataSource : TDatasource;
+Function TCustomSQLQuery.GetDataSource : TDatasource;
 
 
 begin
 begin
   If Assigned(FMasterLink) then
   If Assigned(FMasterLink) then
@@ -1410,7 +1465,7 @@ begin
     Result:=Nil;
     Result:=Nil;
 end;
 end;
 
 
-procedure TSQLQuery.Notification(AComponent: TComponent; Operation: TOperation); 
+procedure TCustomSQLQuery.Notification(AComponent: TComponent; Operation: TOperation); 
 
 
 begin
 begin
   Inherited;
   Inherited;
@@ -1445,7 +1500,7 @@ constructor TSQLScript.Create(AOwner: TComponent);
 begin
 begin
   inherited Create(AOwner);
   inherited Create(AOwner);
   FScript := TStringList.Create;
   FScript := TStringList.Create;
-  FQuery := TSQLQuery.Create(nil);
+  FQuery := TCustomSQLQuery.Create(nil);
 end;
 end;
 
 
 destructor TSQLScript.Destroy;
 destructor TSQLScript.Destroy;

+ 2058 - 0
packages/fcl-db/src/sqldb/sqlite/Makefile

@@ -0,0 +1,2058 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/04/28]
+#
+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
+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 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))
+FPC:=$(shell $(FPCPROG) -PB)
+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+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=sqlite3conn
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=sqlite3conn
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_OPTIONS+=-S2
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_OPTIONS+=-S2
+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 sqlite
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_SQLITE=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
+ifdef REQUIRE_PACKAGES_SQLITE
+PACKAGEDIR_SQLITE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_SQLITE),)
+ifneq ($(wildcard $(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)),)
+UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_SQLITE)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_SQLITE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_SQLITE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_SQLITE=
+UNITDIR_SQLITE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_SQLITE),)
+UNITDIR_SQLITE:=$(firstword $(UNITDIR_SQLITE))
+else
+UNITDIR_SQLITE=
+endif
+endif
+ifdef UNITDIR_SQLITE
+override COMPILER_UNITDIR+=$(UNITDIR_SQLITE)
+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) -Xc
+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))
+EXECPPAS:=@$(PPAS)
+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 %$(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
+.NOTPARALLEL:

+ 24 - 0
packages/fcl-db/src/sqldb/sqlite/Makefile.fpc

@@ -0,0 +1,24 @@
+#
+# Makefile.fpc for SQL IBConnection
+#
+
+[package]
+main=fcl-db
+
+[target]
+units=sqlite3conn
+
+[require]
+packages=sqlite
+
+[compiler]
+options=-S2
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../../../../..
+
+[rules]
+.NOTPARALLEL:

+ 732 - 0
packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp

@@ -0,0 +1,732 @@
+{
+    This file is part of the Free Pascal Classes Library (FCL).
+    Copyright (c) 2006 by the Free Pascal development team
+
+    SQLite3 connection for SQLDB
+
+    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.
+
+ **********************************************************************}
+ 
+{ 
+  Based on an implementation by Martin Schreiber, part of MSEIDE.
+  Reworked all code so it conforms to FCL coding standards.
+} 
+ 
+unit sqlite3conn;
+{$mode objfpc}
+{$h+}
+
+interface
+
+uses
+  classes, db, bufdataset, sqldb, sqlite3dyn, types;
+
+const
+  sqliteerrormax = 99;
+ 
+type
+  PDateTime = ^TDateTime;
+  
+  TSqliteOption = (sloTransactions,sloDesignTransactions);
+  TSqliteOptions = set of TSqliteOption;
+ 
+  TStringArray = Array of string;
+  PStringArray = ^TStringArray;
+ 
+  TArrayStringArray = Array of TStringArray;
+  PArrayStringArray = ^TArrayStringArray;
+ 
+  TSQLite3Connection = class(TSQLConnection)
+  private
+    fhandle: psqlite3;
+    foptions: TSQLiteOptions;
+    function blobscached: boolean;
+    procedure setoptions(const avalue: tsqliteoptions);
+  protected
+    function stringquery(const asql: string): TStringArray;
+    function stringsquery(const asql: string): TArrayStringArray;
+    procedure checkerror(const aerror: integer);
+    
+    procedure DoInternalConnect; override;
+    procedure DoInternalDisconnect; override;
+    function GetHandle : pointer; override;
+ 
+    Function AllocateCursorHandle : TSQLCursor; override;
+                        //aowner used as blob cache
+    Procedure DeAllocateCursorHandle(var cursor : TSQLCursor); override;
+    Function AllocateTransactionHandle : TSQLHandle; override;
+ 
+    procedure PrepareStatement(cursor: TSQLCursor; ATransaction : TSQLTransaction; 
+                          buf: string; AParams : TParams); override;
+    procedure Execute(cursor: TSQLCursor;atransaction:tSQLtransaction; AParams : TParams); override;
+    function Fetch(cursor : TSQLCursor) : boolean; override;
+    procedure AddFieldDefs(cursor: TSQLCursor; FieldDefs : TfieldDefs); override;
+    procedure UnPrepareStatement(cursor : TSQLCursor); override;
+ 
+    procedure FreeFldBuffers(cursor : TSQLCursor); override;
+    function LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; override;
+           //if bufsize < 0 -> buffer was to small, should be -bufsize
+    function GetTransactionHandle(trans : TSQLHandle): pointer; override;
+    function Commit(trans : TSQLHandle) : boolean; override;
+    function RollBack(trans : TSQLHandle) : boolean; override;
+    function StartdbTransaction(trans : TSQLHandle; aParams : string) : boolean; override;
+    procedure CommitRetaining(trans : TSQLHandle); override;
+    procedure RollBackRetaining(trans : TSQLHandle); override;
+    procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction : TSQLTransaction); override;
+    // New methods
+    procedure execsql(const asql: string);
+    procedure UpdateIndexDefs(var IndexDefs : TIndexDefs; const TableName : string); // Differs from SQLDB.
+    function  getprimarykeyfield(const atablename: string; const acursor: tsqlcursor): string; 
+  public
+    function GetInsertID: int64; 
+  published
+    property Options: TSqliteOptions read FOptions write SetOptions;
+  end;
+ 
+implementation
+
+uses
+  dbconst, sysutils, typinfo, dateutils;
+ 
+type
+
+ TStorageType = (stNone,stInteger,stFloat,stText,stBlob,stNull);
+ 
+ TSQLite3Cursor = class(tsqlcursor)
+  private
+   fhandle : psqlite3;
+   fstatement: psqlite3_stmt;
+   ftail: pchar;
+   fstate: integer;
+   fparambinding: array of Integer;
+   procedure checkerror(const aerror: integer);
+   procedure bindparams(AParams : TParams);
+   Procedure Prepare(Buf : String; APArams : TParams);
+   Procedure UnPrepare;
+   Procedure Execute;
+   Function Fetch : Boolean;
+ end;
+
+procedure freebindstring(astring: pointer); cdecl;
+begin
+  FreeMem(AString);
+end;
+
+procedure TSQLite3Cursor.checkerror(const aerror: integer);
+
+Var
+  S : String;
+
+begin
+ if (aerror<>sqlite_ok) then 
+   begin
+   S:=strpas(sqlite3_errmsg(fhandle));
+   DatabaseError(S);
+   end;
+end;
+
+Procedure TSQLite3Cursor.bindparams(AParams : TParams);
+
+  Function PCharStr(Const S : String) : PChar;
+  
+  begin
+    Result:=StrAlloc(Length(S)+1);
+    If (Result<>Nil) then
+      StrPCopy(Result,S);
+  end;
+  
+Var
+  I : Integer;
+  P : TParam;  
+  pc : pchar;
+  str1: string;
+  cu1: currency;
+  do1: double;
+  parms : array of Integer;
+  
+begin
+  for I:=1  to high(fparambinding)+1 do 
+    begin
+    P:=aparams[fparambinding[I-1]];
+    if P.isnull then 
+      checkerror(sqlite3_bind_null(fstatement,I))
+    else 
+      case P.datatype of
+        ftinteger,
+        ftboolean,
+        ftsmallint: checkerror(sqlite3_bind_int(fstatement,I,p.asinteger));
+        ftword:     checkerror(sqlite3_bind_int(fstatement,I,P.asword));
+        ftlargeint: checkerror(sqlite3_bind_int64(fstatement,I,P.aslargeint));
+        ftbcd: begin
+               cu1:= P.ascurrency;
+               checkerror(sqlite3_bind_int64(fstatement,I,pint64(@cu1)^));
+               end;
+        ftfloat,
+        ftcurrency,
+        ftdatetime,
+        ftdate,
+        fttime: begin
+                do1:= P.asfloat;
+                checkerror(sqlite3_bind_double(fstatement,I,do1));
+                end;
+        ftstring: begin
+                  str1:= p.asstring;
+                  checkerror(sqlite3_bind_text(fstatement,I,pcharstr(str1), length(str1),@freebindstring));
+                  end;
+        ftblob: begin
+                str1:= P.asstring;
+                checkerror(sqlite3_bind_blob(fstatement,I,pcharstr(str1), length(str1),@freebindstring));
+                end; 
+      else 
+        databaseerror('Parameter type '+getenumname(typeinfo(tfieldtype),ord(P.datatype))+' not supported.');
+      end; { Case }
+    end;   
+end;
+
+Procedure TSQLite3Cursor.Prepare(Buf : String; APArams : TParams);
+
+begin
+  if assigned(aparams) and (aparams.count > 0) then 
+    buf := aparams.parsesql(buf,false,false,false,psinterbase,fparambinding);
+  checkerror(sqlite3_prepare(fhandle,pchar(buf),length(buf),@fstatement,@ftail));
+end;
+
+Procedure TSQLite3Cursor.UnPrepare;
+
+begin
+  sqlite3_finalize(fstatement); // No check.
+end;
+
+Procedure TSQLite3Cursor.Execute;
+
+var
+ wo1: word;
+
+begin
+{$ifdef i386}
+  wo1:= get8087cw;
+  set8087cw(wo1 or $1f);             //mask exceptions, Sqlite3 has overflow
+  Try  // Why do people always forget this ??
+{$endif}
+    fstate:= sqlite3_step(fstatement);
+{$ifdef i386}
+  finally  
+    set8087cw(wo1);                    //restore
+  end;
+{$endif}  
+  if (fstate<=sqliteerrormax) then 
+    checkerror(sqlite3_reset(fstatement));
+  if (fstate=sqlite_row) then 
+    fstate:= sqliteerrormax; //first row
+end;  
+
+Function TSQLite3Cursor.Fetch : Boolean;
+
+begin
+  if (fstate=sqliteerrormax) then 
+    fstate:=sqlite_row //first row;
+  else if (fstate=sqlite_row) then 
+    begin
+    fstate:=sqlite3_step(fstatement);
+    if (fstate<=sqliteerrormax) then 
+      checkerror(sqlite3_reset(fstatement));  //right error returned??
+    end;
+  result:=(fstate=sqlite_row);
+end;
+
+{ TSQLite3Connection }
+
+procedure TSQLite3Connection.LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction : TSQLTransaction); 
+
+var
+ blobid: integer;
+ int1,int2: integer;
+ str1: string;
+ bo1: boolean;
+begin
+{$WARNING TSQLite3Connection.LoadBlobIntoBuffer not implemented !}
+{ if (mode = bmwrite) and (field.dataset is tmsesqlquery) then begin
+  result:= tmsebufdataset(field.dataset).createblobbuffer(field);
+ end
+ else begin
+  result:= nil;
+  if mode = bmread then begin
+   if field.getData(@blobId) then begin
+    result:= acursor.getcachedblob(blobid);
+   end;
+  end;
+ end;
+ }
+ 
+end;
+
+function TSQLite3Connection.AllocateTransactionHandle: TSQLHandle;
+begin
+ result:= tsqlhandle.create;
+end;
+
+function TSQLite3Connection.AllocateCursorHandle: TSQLCursor;
+
+Var
+  Res : TSQLite3Cursor;
+
+begin
+  Res:= TSQLite3Cursor.create;
+  Res.fhandle:=self.fhandle;
+  Result:=Res;
+end;
+
+procedure TSQLite3Connection.DeAllocateCursorHandle(var cursor: TSQLCursor);
+begin
+  freeandnil(cursor);
+end;
+
+procedure TSQLite3Connection.PrepareStatement(cursor: TSQLCursor;
+               ATransaction: TSQLTransaction; buf: string; AParams: TParams);
+begin
+  TSQLite3Cursor(cursor).Prepare(Buf,AParams);
+end;
+
+procedure TSQLite3Connection.UnPrepareStatement(cursor: TSQLCursor);
+
+begin
+  TSQLite3Cursor(cursor).UnPrepare;
+end;
+
+
+Type
+  TFieldMap = Record
+    N : String;
+    T : TFieldType;
+    S : Integer;
+  end;  
+  
+Const
+  FieldMapCount = 15;
+  FieldMap : Array [1..FieldMapCount] of TFieldMap = (
+   (n:'INT'; t: ftInteger; S: SizeOf(Integer)),
+   (n:'LARGEINT'; t:ftlargeInt; S: SizeOf(Int64)),
+   (n:'WORD'; t: ftWord; S: SizeOf(Word)),
+   (n:'SMALLINT'; t: ftSmallint; S: SizeOf(SmallInt)),
+   (n:'BOOLEAN'; t: ftBoolean; S: SizeOf(WordBool)),
+   (n:'REAL'; t: ftFloat; S: SizeOf(Double)),
+   (n:'DOUBLE'; t: ftFloat; S: SizeOf(Double)),
+   (n:'DATETIME'; t: ftDateTime; S: SizeOf(TDateTime)), // MUST be before date
+   (n:'DATE'; t: ftDate; S: SizeOf(TDateTime)),
+   (n:'TIME'; t: ftTime; S: SizeOf(TDateTime)),
+   (n:'CURRENCY'; t: ftCurrency; S: SizeOf(double)),
+   (n:'VARCHAR'; t: ftString; S: 255),
+   (n:'NUMERIC'; t: ftBCD; S: SizeOf(Currency)),
+   (n:'TEXT'; t: ftmemo; S: 0),
+   (n:'BLOB'; t: ftBlob; S: 0)
+{ Template:   
+  (n:''; t: ft; S: SizeOf())
+}
+  );
+
+procedure TSQLite3Connection.AddFieldDefs(cursor: TSQLCursor;
+               FieldDefs: TfieldDefs);
+var
+ i     : integer;
+ FN,FD : string;
+ ft1   : tfieldtype;
+ size1 : word;
+ ar1   : TStringArray;
+ fi    : integer;
+ st    : psqlite3_stmt;
+ 
+begin
+  st:=TSQLite3Cursor(cursor).fstatement;
+  for i:= 0 to sqlite3_column_count(st) - 1 do 
+    begin
+    FN:=sqlite3_column_name(st,i);
+    FD:=uppercase(sqlite3_column_decltype(st,i));
+    ft1:= ftUnknown;
+    size1:= 0;
+    fi:=1;
+    While (ft1=ftUnknown) and (fi<=FieldMapCount) do
+      begin
+      if pos(FieldMap[fi].N,FD)=1 then
+        begin
+        ft1:=FieldMap[fi].t;
+        size1:=FieldMap[fi].S;
+        end;
+      Inc(fi);
+      end;
+    // handle some specials.  
+    case ft1 of  
+      ftString: begin
+                fi:=pos('(',FD);
+                if (fi>0) then
+                  begin
+                  System.Delete(FD,1,fi);
+                  fi:=pos(')',FD);
+                  size1:=StrToIntDef(trim(copy(FD,1,fi-1)),255);
+                  end;
+                end;
+      ftUnknown : DatabaseError('Unknown record type: '+FN);
+    end; // Case
+    tfielddef.create(fielddefs,FN,ft1,size1,false,i+1);
+    end;
+end;
+
+procedure TSQLite3Connection.Execute(cursor: TSQLCursor; atransaction: tsqltransaction; AParams: TParams);
+var
+ SC : TSQLite3Cursor;
+            
+begin
+  SC:=TSQLite3Cursor(cursor);
+  If (AParams<>Nil) then
+    SC.BindParams(AParams);
+  SC.Execute;    
+end;
+
+Function NextWord(Var S : ShortString; Sep : Char) : String;
+
+Var
+  P : Integer;
+
+begin
+  P:=Pos(Sep,S);
+  If (P=0) then 
+    P:=Length(S)+1;
+  Result:=Copy(S,1,P-1);
+  Delete(S,1,P);
+end;
+
+Function ParseSQLiteDate(S : ShortString) : TDateTime;
+
+Var
+  Year, Month, Day : Integer;
+
+begin
+ Result:=0;
+ If TryStrToInt(NextWord(S,'-'),Year) then
+   if TryStrToInt(NextWord(S,'-'),Month) then
+     if TryStrToInt(NextWord(S,'-'),Day) then
+        Result:=EncodeDate(Year,Month,Day);
+end;
+
+Function ParseSQLiteTime(S : ShortString) : TDateTime;
+
+Var
+  Hour, Min, Sec : Integer;
+
+begin
+  Result:=0;
+  If TryStrToInt(NextWord(S,':'),Hour) then
+    if TryStrToInt(NextWord(S,':'),Min) then
+      if TryStrToInt(NextWord(S,':'),Sec) then
+        Result:=EncodeTime(Hour,Min,Sec,0);
+end;
+
+Function ParseSQLiteDateTime(S : String) : TDateTime;
+
+var
+  P : Integer;
+  DS,TS : ShortString;
+
+begin
+  DS:='';
+  TS:='';
+  P:=Pos(' ',S);
+  If (P<>0) then
+    begin
+    DS:=Copy(S,1,P-1);
+    TS:=S;
+    Delete(TS,1,P);
+    end
+  else
+    begin  
+    If (Pos('-',S)<>0) then
+      DS:=S
+    else if (Pos(':',S)<>0) then
+      TS:=S;
+    end;
+  Result:=ParseSQLiteDate(DS)+ParseSQLiteTime(TS);    
+end;
+function TSQLite3Connection.LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;buffer : pointer; out CreateBlob : boolean) : boolean;
+
+var
+ st1: TStorageType;
+ fnum: integer;
+ i: integer;
+ i64: int64;
+ int1,int2: integer;
+ str1: string;
+ ar1,ar2: TStringArray;
+ st    : psqlite3_stmt;
+ 
+begin
+  st:=TSQLite3Cursor(cursor).fstatement;
+  fnum:= FieldDef.fieldno - 1;
+  st1:= TStorageType(sqlite3_column_type(st,fnum));
+  result:= st1 <> stnull;
+  if Not result then 
+    Exit;
+  case FieldDef.datatype of
+    ftInteger  : pinteger(buffer)^  := sqlite3_column_int(st,fnum);
+    ftSmallInt : psmallint(buffer)^ := sqlite3_column_int(st,fnum);
+    ftWord     : pword(buffer)^     := sqlite3_column_int(st,fnum);
+    ftBoolean  : pwordbool(buffer)^ := sqlite3_column_int(st,fnum)<>0;
+    ftLargeInt,
+    ftBCD      : PInt64(buffer)^:= sqlite3_column_int64(st,fnum);
+    ftFloat,
+    ftCurrency : pdouble(buffer)^:= sqlite3_column_double(st,fnum);
+    ftDateTime,
+    ftDate,
+    ftTime:  if st1 = sttext then 
+               begin
+               result:= false;
+               setlength(str1,sqlite3_column_bytes(st,fnum));
+               move(sqlite3_column_text(st,fnum)^,str1[1],length(str1));
+               PDateTime(Buffer)^:=ParseSqliteDateTime(str1)
+               end
+             else
+               Pdatetime(buffer)^:= sqlite3_column_double(st,fnum);
+    ftString: begin
+              int1:= sqlite3_column_bytes(st,fnum);
+              if int1>FieldDef.Size then 
+                int1:=FieldDef.Size;
+              if int1 > 0 then 
+                 move(sqlite3_column_text(st,fnum)^,buffer^,int1);
+              end;
+    ftMemo,
+    ftBlob: begin
+            int2:= sqlite3_column_bytes(st,fnum);
+            {$WARNING Blob data not handled correctly }
+            // int1:= addblobdata(sqlite3_column_text(st,fnum),int2);
+            move(int1,buffer^,sizeof(int1)); //save id
+            end;
+  else { Case }
+   result:= false; // unknown
+  end; { Case }
+end;
+
+function TSQLite3Connection.Fetch(cursor: TSQLCursor): boolean;
+
+begin
+  Result:=TSQLite3Cursor(cursor).Fetch;
+end;
+
+procedure TSQLite3Connection.FreeFldBuffers(cursor: TSQLCursor);
+begin
+ //dummy
+end;
+
+function TSQLite3Connection.GetTransactionHandle(trans: TSQLHandle): pointer;
+begin
+ result:= nil;
+end;
+
+function TSQLite3Connection.Commit(trans: TSQLHandle): boolean;
+begin
+  execsql('COMMIT');
+  result:= true;
+end;
+
+function TSQLite3Connection.RollBack(trans: TSQLHandle): boolean;
+begin
+  execsql('ROLLBACK');
+  result:= true;
+end;
+
+function TSQLite3Connection.StartdbTransaction(trans: TSQLHandle;
+               aParams: string): boolean;
+begin
+  execsql('BEGIN');
+  result:= true;
+end;
+
+procedure TSQLite3Connection.CommitRetaining(trans: TSQLHandle);
+begin
+  commit(trans);  
+  execsql('BEGIN');
+end;
+
+procedure TSQLite3Connection.RollBackRetaining(trans: TSQLHandle);
+begin
+  rollback(trans);
+  execsql('BEGIN');
+end;
+
+procedure TSQLite3Connection.DoInternalConnect;
+var
+  str1: string;
+begin
+  if Length(databasename)=0 then
+    DatabaseError(SErrNoDatabaseName,self);
+  initialisesqlite;
+  str1:= databasename;
+  checkerror(sqlite3_open(pchar(str1),@fhandle));
+end;
+
+procedure TSQLite3Connection.DoInternalDisconnect;
+
+begin
+  if fhandle <> nil then 
+    begin
+    checkerror(sqlite3_close(fhandle));
+    fhandle:= nil;
+    releasesqlite;
+    end; 
+end;
+
+function TSQLite3Connection.GetHandle: pointer;
+begin
+  result:= fhandle;
+end;
+
+procedure TSQLite3Connection.checkerror(const aerror: integer);
+
+Var
+  S : String;
+
+begin
+ if (aerror<>sqlite_ok) then 
+   begin
+   S:=strpas(sqlite3_errmsg(fhandle));
+   DatabaseError(S,Self);
+   end;
+end;
+
+procedure TSQLite3Connection.execsql(const asql: string);
+var
+ err  : pchar;
+ str1 : string;
+ res  : integer;
+begin
+ err:= nil;
+ Res := sqlite3_exec(fhandle,pchar(asql),nil,nil,@err);
+ if err <> nil then 
+   begin
+   str1:= strpas(err);
+   sqlite3_free(err);
+   end;
+ if (res<>sqlite_ok) then 
+   databaseerror(str1);
+end;
+
+function TSQLite3Connection.blobscached: boolean;
+begin
+  result:= true;
+end;
+
+function execcallback(adata: pointer; ncols: longint; //adata = PStringArray
+                avalues: PPchar; anames: PPchar):longint; cdecl;
+var
+  P : PStringArray;
+  i : integer;
+  
+begin
+  P:=PStringArray(adata); 
+  SetLength(P^,ncols);
+  for i:= 0 to ncols - 1 do 
+    P^[i]:= strPas(avalues[i]);
+  result:= 0;
+end;
+
+function TSQLite3Connection.stringquery(const asql: string): TStringArray;
+begin
+  SetLength(result,0);
+  CheckError(sqlite3_exec(fhandle,pchar(asql),@execcallback,@result,nil));
+end;
+
+function execscallback(adata: pointer; ncols: longint; //adata = PArrayStringArray
+                avalues: PPchar; anames: PPchar):longint; cdecl;
+var
+ I,N : integer;
+ PP : PArrayStringArray;
+ p  : PStringArray;
+ 
+begin
+ PP:=PArrayStringArray(adata);
+ N:=high(PP^); // Length-1;
+ setlength(PP^,N+2); // increase with 1;
+ p:= @(PP^[N]); // newly added array, fill with data.
+ setlength(p^,ncols); 
+ for i:= 0 to ncols - 1 do 
+   p^[i]:= strPas(avalues[i]);
+ result:= 0;
+end;
+
+function TSQLite3Connection.stringsquery(const asql: string): TArrayStringArray;
+begin
+  SetLength(result,0);
+  checkerror(sqlite3_exec(fhandle,pchar(asql),@execscallback,@result,nil));
+end;
+
+function TSQLite3Connection.getprimarykeyfield(const atablename: string;
+                                const acursor: tsqlcursor): string;
+var
+  int1,int2: integer;
+  ar1: TArrayStringArray;
+  str1: string;
+  
+begin
+  result:= '';
+  if atablename <> '' then 
+    begin
+    ar1:= stringsquery('PRAGMA table_info('+atablename+');');
+    for int1:= 0 to high(ar1) do 
+      begin
+      if (high(ar1[int1]) >= 5) and (ar1[int1][5] <> '0') then 
+        begin
+        result:= ar1[int1][1];
+        break;
+        end;
+      end;
+    end;
+end;
+
+procedure TSQLite3Connection.UpdateIndexDefs(var IndexDefs: TIndexDefs;
+                              const TableName: string);
+var
+  str1: string;
+  
+begin
+  str1:= getprimarykeyfield(tablename,nil);
+  if str1 <> '' then 
+    begin
+    indexdefs.add('$PRIMARY_KEY$',str1,[ixPrimary,ixUnique]);
+    end;
+end;
+{
+procedure TSQLite3Connection.UpdateIndexDefs(var IndexDefs: TIndexDefs;
+                              const TableName: string);
+var
+ int1,int2: integer;
+ ar1: TArrayStringArray;
+ str1: string;
+begin
+ ar1:= stringsquery('PRAGMA table_info('+tablename+');');
+ for int1:= 0 to high(ar1) do begin
+  if (high(ar1[int1]) >= 5) and (ar1[int1][5] <> '0') then begin
+   indexdefs.add('$PRIMARY_KEY$',ar1[int1][1],[ixPrimary,ixUnique]);
+   break;
+  end;
+ end;
+end;
+}
+
+function TSQLite3Connection.getinsertid: int64;
+begin
+ result:= sqlite3_last_insert_rowid(fhandle);
+end;
+
+procedure TSQLite3Connection.setoptions(const avalue: tsqliteoptions);
+begin
+ if avalue <> foptions then 
+   begin
+   checkdisconnected;
+   foptions:= avalue;
+   end;
+end;
+
+end.

+ 37 - 5
packages/fcl-passrc/src/pastree.pp

@@ -82,6 +82,8 @@ type
   public
   public
     SourceFilename: string;
     SourceFilename: string;
     SourceLinenumber: Integer;
     SourceLinenumber: Integer;
+    Visibility: TPasMemberVisibility;
+  public
     constructor Create(const AName: string; AParent: TPasElement); virtual;
     constructor Create(const AName: string; AParent: TPasElement); virtual;
     procedure AddRef;
     procedure AddRef;
     procedure Release;
     procedure Release;
@@ -90,7 +92,6 @@ type
     function GetModule: TPasModule;
     function GetModule: TPasModule;
     function ElementTypeName: string; virtual;
     function ElementTypeName: string; virtual;
     function GetDeclaration(full : Boolean) : string; virtual;
     function GetDeclaration(full : Boolean) : string; virtual;
-    Visibility: TPasMemberVisibility;
     property RefCount: LongWord read FRefCount;
     property RefCount: LongWord read FRefCount;
     property Name: string read FName write FName;
     property Name: string read FName write FName;
     property Parent: TPasElement read FParent;
     property Parent: TPasElement read FParent;
@@ -103,6 +104,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     procedure AddUnitToUsesList(const AUnitName: string);
     procedure AddUnitToUsesList(const AUnitName: string);
+  public
     UsesList: TList;            // TPasUnresolvedTypeRef or TPasModule elements
     UsesList: TList;            // TPasUnresolvedTypeRef or TPasModule elements
     Declarations, ResStrings, Types, Consts, Classes,
     Declarations, ResStrings, Types, Consts, Classes,
       Functions, Variables: TList;
       Functions, Variables: TList;
@@ -113,6 +115,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     InterfaceSection, ImplementationSection: TPasSection;
     InterfaceSection, ImplementationSection: TPasSection;
     PackageName: string;
     PackageName: string;
   end;
   end;
@@ -122,6 +125,7 @@ type
     constructor Create(const AName: string; AParent: TPasElement); override;
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
+  public
     Modules: TList;     // List of TPasModule objects
     Modules: TList;     // List of TPasModule objects
   end;
   end;
 
 
@@ -129,6 +133,7 @@ type
   public
   public
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : Boolean) : string; Override;
     function GetDeclaration(full : Boolean) : string; Override;
+  public
     Value: string;
     Value: string;
   end;
   end;
 
 
@@ -142,6 +147,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : Boolean): string; override;
     function GetDeclaration(full : Boolean): string; override;
+  public
     DestType: TPasType;
     DestType: TPasType;
   end;
   end;
 
 
@@ -150,6 +156,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : Boolean): string; override;
     function GetDeclaration(full : Boolean): string; override;
+  public
     DestType: TPasType;
     DestType: TPasType;
   end;
   end;
 
 
@@ -169,6 +176,7 @@ type
   public
   public
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     RangeStart, RangeEnd: string;
     RangeStart, RangeEnd: string;
   end;
   end;
 
 
@@ -177,6 +185,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     IndexRange : string;
     IndexRange : string;
     IsPacked : Boolean;          // 12/04/04 - Dave - Added
     IsPacked : Boolean;          // 12/04/04 - Dave - Added
     ElType: TPasType;
     ElType: TPasType;
@@ -187,12 +196,14 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     ElType: TPasType;
     ElType: TPasType;
   end;
   end;
 
 
   TPasEnumValue = class(TPasElement)
   TPasEnumValue = class(TPasElement)
   public
   public
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
+  public
     IsValueUsed: Boolean;
     IsValueUsed: Boolean;
     Value: Integer;
     Value: Integer;
     AssignedValue : string;
     AssignedValue : string;
@@ -205,6 +216,7 @@ type
      function ElementTypeName: string; override;
      function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
     Procedure GetEnumNames(Names : TStrings);
     Procedure GetEnumNames(Names : TStrings);
+  public
     Values: TList;      // List of TPasEnumValue objects
     Values: TList;      // List of TPasEnumValue objects
   end;
   end;
 
 
@@ -213,6 +225,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     EnumType: TPasType;
     EnumType: TPasType;
   end;
   end;
 
 
@@ -222,6 +235,7 @@ type
   public
   public
     constructor Create(const AName: string; AParent: TPasElement); override;
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
     destructor Destroy; override;
+  public
     Values: TStringList;
     Values: TStringList;
     Members: TPasRecordType;
     Members: TPasRecordType;
   end;
   end;
@@ -232,6 +246,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     IsPacked: Boolean;
     IsPacked: Boolean;
     Members: TList;     // array of TPasVariable elements
     Members: TList;     // array of TPasVariable elements
     VariantName: string;
     VariantName: string;
@@ -247,6 +262,7 @@ type
     constructor Create(const AName: string; AParent: TPasElement); override;
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
+  public
     ObjKind: TPasObjKind;
     ObjKind: TPasObjKind;
     AncestorType: TPasType;     // TPasClassType or TPasUnresolvedTypeRef
     AncestorType: TPasType;     // TPasClassType or TPasUnresolvedTypeRef
     IsPacked: Boolean;        // 12/04/04 - Dave - Added
     IsPacked: Boolean;        // 12/04/04 - Dave - Added
@@ -261,6 +277,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     Access: TArgumentAccess;
     Access: TArgumentAccess;
     ArgType: TPasType;
     ArgType: TPasType;
     Value: string;
     Value: string;
@@ -272,11 +289,11 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     class function TypeName: string; virtual;
     class function TypeName: string; virtual;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
-    IsOfObject: Boolean;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
     procedure GetArguments(List : TStrings);
     procedure GetArguments(List : TStrings);
-    function CreateArgument(const AName, AUnresolvedTypeName: string):
-      TPasArgument;
+    function CreateArgument(const AName, AUnresolvedTypeName: string):TPasArgument;
+  public
+    IsOfObject: Boolean;
     Args: TList;        // List of TPasArgument objects
     Args: TList;        // List of TPasArgument objects
   end;
   end;
 
 
@@ -284,6 +301,7 @@ type
   public
   public
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName : string; override;
     function ElementTypeName : string; override;
+  public
     ResultType: TPasType;
     ResultType: TPasType;
   end;
   end;
 
 
@@ -293,6 +311,7 @@ type
     class function TypeName: string; override;
     class function TypeName: string; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(Full : boolean) : string; override;
     function GetDeclaration(Full : boolean) : string; override;
+  public
     ResultEl: TPasResultElement;
     ResultEl: TPasResultElement;
   end;
   end;
 
 
@@ -314,6 +333,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     VarType: TPasType;
     VarType: TPasType;
     Value: string;
     Value: string;
     Modifiers : string;
     Modifiers : string;
@@ -331,6 +351,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     Args: TList;        // List of TPasArgument objects
     Args: TList;        // List of TPasArgument objects
     IndexValue, ReadAccessorName, WriteAccessorName,
     IndexValue, ReadAccessorName, WriteAccessorName,
       StoredAccessorName, DefaultValue: string;
       StoredAccessorName, DefaultValue: string;
@@ -348,6 +369,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function TypeName: string; override;
     function TypeName: string; override;
+  public
     Overloads: TList;           // List of TPasProcedure nodes
     Overloads: TList;           // List of TPasProcedure nodes
   end;
   end;
 
 
@@ -356,9 +378,10 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function TypeName: string; override;
     function TypeName: string; override;
-    ProcType: TPasProcedureType;
     function GetDeclaration(full: Boolean): string; override;
     function GetDeclaration(full: Boolean): string; override;
     procedure GetModifiers(List: TStrings);
     procedure GetModifiers(List: TStrings);
+  public
+    ProcType: TPasProcedureType;
     IsVirtual, IsDynamic, IsAbstract, IsOverride,
     IsVirtual, IsDynamic, IsAbstract, IsOverride,
       IsOverload, IsMessage, isReintroduced, isStatic: Boolean;
       IsOverload, IsMessage, isReintroduced, isStatic: Boolean;
   end;
   end;
@@ -396,6 +419,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function ElementTypeName: string; override;
     function TypeName: string; virtual;
     function TypeName: string; virtual;
+  public
     ProcType: TPasProcedureType;
     ProcType: TPasProcedureType;
     Locals: TList;
     Locals: TList;
     Body: TPasImplBlock;
     Body: TPasImplBlock;
@@ -425,12 +449,14 @@ type
   public
   public
     constructor Create(const AName: string; AParent: TPasElement); override;
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
     destructor Destroy; override;
+  public
     Commands: TStrings;
     Commands: TStrings;
   end;
   end;
 
 
   TPasImplIfElse = class(TPasImplElement)
   TPasImplIfElse = class(TPasImplElement)
   public
   public
     destructor Destroy; override;
     destructor Destroy; override;
+  public
     Condition: string;
     Condition: string;
     IfBranch, ElseBranch: TPasImplElement;
     IfBranch, ElseBranch: TPasImplElement;
   end;
   end;
@@ -438,6 +464,7 @@ type
   TPasImplForLoop = class(TPasImplElement)
   TPasImplForLoop = class(TPasImplElement)
   public
   public
     destructor Destroy; override;
     destructor Destroy; override;
+  public
     Variable: TPasVariable;
     Variable: TPasVariable;
     StartValue, EndValue: string;
     StartValue, EndValue: string;
     Body: TPasImplElement;
     Body: TPasImplElement;
@@ -452,6 +479,7 @@ type
     function AddIfElse(const ACondition: string): TPasImplIfElse;
     function AddIfElse(const ACondition: string): TPasImplIfElse;
     function AddForLoop(AVar: TPasVariable;
     function AddForLoop(AVar: TPasVariable;
       const AStartValue, AEndValue: string): TPasImplForLoop;
       const AStartValue, AEndValue: string): TPasImplForLoop;
+  public
     Elements: TList;    // TPasImplElement objects
     Elements: TList;    // TPasImplElement objects
   end;
   end;
 
 
@@ -473,6 +501,10 @@ implementation
 
 
 uses SysUtils;
 uses SysUtils;
 
 
+{$IFNDEF FPC}
+  const
+    LineEnding = sLineBreak;
+{$ENDIF}
 
 
 { Parse tree element type name functions }
 { Parse tree element type name functions }
 
 

+ 4 - 4
packages/fcl-passrc/src/paswrite.pp

@@ -37,8 +37,8 @@ type
     constructor Create(AStream: TStream);
     constructor Create(AStream: TStream);
     destructor Destroy; override;
     destructor Destroy; override;
     procedure wrt(const s: string);
     procedure wrt(const s: string);
-    procedure wrtln(const s: string);
-    procedure wrtln;
+    procedure wrtln(const s: string);overload;
+    procedure wrtln;overload;
 
 
     procedure WriteElement(AElement: TPasElement);
     procedure WriteElement(AElement: TPasElement);
     procedure WriteType(AType: TPasType);
     procedure WriteType(AType: TPasType);
@@ -60,8 +60,8 @@ type
   end;
   end;
 
 
 
 
-procedure WritePasFile(AElement: TPasElement; const AFilename: string);
-procedure WritePasFile(AElement: TPasElement; AStream: TStream);
+procedure WritePasFile(AElement: TPasElement; const AFilename: string);overload;
+procedure WritePasFile(AElement: TPasElement; AStream: TStream);overload;
 
 
 
 
 
 

+ 8 - 8
packages/fcl-passrc/src/pparser.pp

@@ -50,10 +50,10 @@ type
   public
   public
     function CreateElement(AClass: TPTreeElement; const AName: String;
     function CreateElement(AClass: TPTreeElement; const AName: String;
       AParent: TPasElement; const ASourceFilename: String;
       AParent: TPasElement; const ASourceFilename: String;
-      ASourceLinenumber: Integer): TPasElement;
+      ASourceLinenumber: Integer): TPasElement;overload;
     function CreateElement(AClass: TPTreeElement; const AName: String;
     function CreateElement(AClass: TPTreeElement; const AName: String;
       AParent: TPasElement; AVisibility: TPasMemberVisibility;
       AParent: TPasElement; AVisibility: TPasMemberVisibility;
-      const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
+      const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;overload;
       virtual; abstract;
       virtual; abstract;
     function CreateFunctionType(const AName, AResultName: String; AParent: TPasElement;
     function CreateFunctionType(const AName, AResultName: String; AParent: TPasElement;
       UseParentAsResultParent: Boolean; const ASourceFilename: String;
       UseParentAsResultParent: Boolean; const ASourceFilename: String;
@@ -105,9 +105,9 @@ type
     procedure ParseExc(const Msg: String);
     procedure ParseExc(const Msg: String);
   protected
   protected
     function CreateElement(AClass: TPTreeElement; const AName: String;
     function CreateElement(AClass: TPTreeElement; const AName: String;
-      AParent: TPasElement): TPasElement;
+      AParent: TPasElement): TPasElement;overload;
     function CreateElement(AClass: TPTreeElement; const AName: String;
     function CreateElement(AClass: TPTreeElement; const AName: String;
-      AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
+      AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;overload;
     Function CheckHint(Element : TPasElement; ExpectSemiColon : Boolean) : TPasMemberHints;
     Function CheckHint(Element : TPasElement; ExpectSemiColon : Boolean) : TPasMemberHints;
   public
   public
     Options : set of TPOptions;
     Options : set of TPOptions;
@@ -120,8 +120,8 @@ type
     procedure ExpectToken(tk: TToken);
     procedure ExpectToken(tk: TToken);
     function ExpectIdentifier: String;
     function ExpectIdentifier: String;
 
 
-    function ParseType(Parent: TPasElement; Prefix : String): TPasType;
-    function ParseType(Parent: TPasElement): TPasType;
+    function ParseType(Parent: TPasElement; Prefix : String): TPasType;overload;
+    function ParseType(Parent: TPasElement): TPasType;overload;
     function ParseComplexType: TPasType;
     function ParseComplexType: TPasType;
     procedure ParseArrayType(Element: TPasArrayType);
     procedure ParseArrayType(Element: TPasArrayType);
     procedure ParseFileType(Element: TPasFileType);
     procedure ParseFileType(Element: TPasFileType);
@@ -136,9 +136,9 @@ type
     function ParseConstDecl(Parent: TPasElement): TPasConst;
     function ParseConstDecl(Parent: TPasElement): TPasConst;
     function ParseResourcestringDecl(Parent: TPasElement): TPasResString;
     function ParseResourcestringDecl(Parent: TPasElement): TPasResString;
     function ParseTypeDecl(Parent: TPasElement): TPasType;
     function ParseTypeDecl(Parent: TPasElement): TPasType;
-    procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList);
+    procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList);overload;
     procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList;
     procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList;
-      AVisibility : TPasMemberVisibility; ClosingBrace: Boolean);
+      AVisibility : TPasMemberVisibility; ClosingBrace: Boolean);overload;
     procedure ParseVarDecl(Parent: TPasElement; List: TList);
     procedure ParseVarDecl(Parent: TPasElement; List: TList);
     procedure ParseArgList(Parent: TPasElement; Args: TList; EndToken: TToken);
     procedure ParseArgList(Parent: TPasElement; Args: TList; EndToken: TToken);
     procedure ParseProcedureOrFunctionHeader(Parent: TPasElement;
     procedure ParseProcedureOrFunctionHeader(Parent: TPasElement;

+ 2 - 2
packages/fcl-passrc/src/pscanner.pp

@@ -194,8 +194,8 @@ type
 
 
     function GetCurColumn: Integer;
     function GetCurColumn: Integer;
   protected
   protected
-    procedure Error(const Msg: string);
-    procedure Error(const Msg: string; Args: array of Const);
+    procedure Error(const Msg: string);overload;
+    procedure Error(const Msg: string; Args: array of Const);overload;
     function DoFetchToken: TToken;
     function DoFetchToken: TToken;
   public
   public
     Options : set of TPOptions;
     Options : set of TPOptions;

+ 10 - 0
packages/fcl-registry/src/regini.inc

@@ -13,6 +13,16 @@ begin
    fPath := '';
    fPath := '';
 end;
 end;
 
 
+constructor TRegIniFile.Create(const FN: String;aaccess:longword);
+begin
+  inherited Create(aaccess);
+  fFileName := FN;
+  if fFileName<>'' then
+   fPath := fFileName + '\'
+  else
+   fPath := '';
+end;
+
 procedure TRegIniFile.DeleteKey(const Section, Ident: String);
 procedure TRegIniFile.DeleteKey(const Section, Ident: String);
 begin
 begin
 	if not OpenKey(fPath+Section,true) then Exit;
 	if not OpenKey(fPath+Section,true) then Exit;

+ 2 - 0
packages/fcl-registry/src/registry.pp

@@ -14,6 +14,7 @@ Uses
     Windows,
     Windows,
   {$endif XMLREG}
   {$endif XMLREG}
     Classes,
     Classes,
+    inifiles,
     SysUtils;
     SysUtils;
 
 
   {$I regdef.inc}
   {$I regdef.inc}
@@ -132,6 +133,7 @@ type
     fPath    : String;
     fPath    : String;
   public
   public
     constructor Create(const FN: string);
     constructor Create(const FN: string);
+    constructor Create(const FN: string;aaccess:longword); overload;
     function ReadString(const Section, Ident, Default: string): string;
     function ReadString(const Section, Ident, Default: string): string;
     function ReadInteger(const Section, Ident: string;
     function ReadInteger(const Section, Ident: string;
                 Default: Longint): Longint;
                 Default: Longint): Longint;

+ 18 - 3
packages/fcl-web/src/custcgi.pp

@@ -115,12 +115,14 @@ Type
     FEmail : String;
     FEmail : String;
     FAdministrator : String;
     FAdministrator : String;
     FOutput : TStream;
     FOutput : TStream;
+    FHandleGetOnPost : Boolean;
     Procedure InitRequestVars;
     Procedure InitRequestVars;
     Function GetEmail : String;
     Function GetEmail : String;
     Function GetAdministrator : String;
     Function GetAdministrator : String;
     Function GetRequestVariable(Const VarName : String) : String;
     Function GetRequestVariable(Const VarName : String) : String;
     Function GetRequestVariableCount : Integer;
     Function GetRequestVariableCount : Integer;
   Public
   Public
+    constructor Create(AOwner: TComponent); override;
     Destructor Destroy; override;
     Destructor Destroy; override;
     Property Request : TCGIRequest read FRequest;
     Property Request : TCGIRequest read FRequest;
     Property Response: TCGIResponse Read FResponse;
     Property Response: TCGIResponse Read FResponse;
@@ -139,6 +141,7 @@ Type
     Function UploadedFileName(Const VarName : String) : String;
     Function UploadedFileName(Const VarName : String) : String;
     Property Email : String Read GetEmail Write FEmail;
     Property Email : String Read GetEmail Write FEmail;
     Property Administrator : String Read GetAdministrator Write FAdministrator;
     Property Administrator : String Read GetAdministrator Write FAdministrator;
+    Property HandleGetOnPost : Boolean Read FHandleGetOnPost Write FHandleGetOnPost;
     Property RequestVariables[VarName : String] : String Read GetRequestVariable;
     Property RequestVariables[VarName : String] : String Read GetRequestVariable;
     Property RequestVariableCount : Integer Read GetRequestVariableCount;
     Property RequestVariableCount : Integer Read GetRequestVariableCount;
   end;
   end;
@@ -354,7 +357,11 @@ begin
     Raise Exception.Create(SErrNoRequestMethod);
     Raise Exception.Create(SErrNoRequestMethod);
   FRequest.InitFromEnvironment;
   FRequest.InitFromEnvironment;
   if CompareText(R,'POST')=0 then
   if CompareText(R,'POST')=0 then
-    Request.InitPostVars
+    begin
+    Request.InitPostVars;
+    if FHandleGetOnPost then
+      Request.InitGetVars;
+    end
   else if CompareText(R,'GET')=0 then
   else if CompareText(R,'GET')=0 then
     Request.InitGetVars
     Request.InitGetVars
   else
   else
@@ -407,13 +414,15 @@ begin
       I.Free;
       I.Free;
     end;
     end;
     M.Position:=0;
     M.Position:=0;
-    With TFileStream.Create('/tmp/query',fmCreate) do
+// joost, aug 20th: I've removed this. It doesn't work with windows and I think
+// it's a debug-only thing...
+{    With TFileStream.Create('/tmp/query',fmCreate) do
       try
       try
         CopyFrom(M,0);
         CopyFrom(M,0);
         M.Position:=0;
         M.Position:=0;
       Finally
       Finally
         Free;
         Free;
-      end;
+      end;}
     CT:=ContentType;
     CT:=ContentType;
     if Pos('MULTIPART/FORM-DATA',Uppercase(CT))<>0 then
     if Pos('MULTIPART/FORM-DATA',Uppercase(CT))<>0 then
       ProcessMultiPart(M,CT)
       ProcessMultiPart(M,CT)
@@ -470,6 +479,12 @@ begin
     Result:=0;
     Result:=0;
 end;
 end;
 
 
+constructor TCustomCGIApplication.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FHandleGetOnPost := True;
+end;
+
 Procedure TCustomCGIApplication.AddResponse(Const S : String);
 Procedure TCustomCGIApplication.AddResponse(Const S : String);
 
 
 Var
 Var

+ 52 - 38
packages/fcl-web/src/fpdatasetform.pp

@@ -29,14 +29,14 @@ type
   TFieldCellEvent = procedure (Sender:THTMLDatasetFormProducer; FieldDef:TFormFieldItem;
   TFieldCellEvent = procedure (Sender:THTMLDatasetFormProducer; FieldDef:TFormFieldItem;
                       IsLabel:boolean; Cell : THTMLCustomelement) of object;
                       IsLabel:boolean; Cell : THTMLCustomelement) of object;
   TButtonEvent = procedure (Sender:THTMLDatasetFormProducer; ButtonDef:TFormButtonItem;
   TButtonEvent = procedure (Sender:THTMLDatasetFormProducer; ButtonDef:TFormButtonItem;
-                      Button : THTML_button) of object;
+                      Button : THTMLAttrsElement) of object;
   TProducerEvent = procedure (Sender:THTMLDatasetFormProducer;  FieldDef:TFormFieldItem;
   TProducerEvent = procedure (Sender:THTMLDatasetFormProducer;  FieldDef:TFormFieldItem;
                       Producer:THTMLContentProducer) of object;
                       Producer:THTMLContentProducer) of object;
   THTMLElementEvent = procedure (Sender:THTMLDatasetFormProducer; element : THTMLCustomElement) of object;
   THTMLElementEvent = procedure (Sender:THTMLDatasetFormProducer; element : THTMLCustomElement) of object;
   TFieldCheckEvent = procedure (aField:TField; var check:boolean) of object;
   TFieldCheckEvent = procedure (aField:TField; var check:boolean) of object;
   
   
   TFormInputType = (fittext,fitpassword,fitcheckbox,fitradio,fitfile,fithidden,
   TFormInputType = (fittext,fitpassword,fitcheckbox,fitradio,fitfile,fithidden,
-                    fitproducer,fittextarea,fitrecordselection);
+                    fitproducer,fittextarea,fitrecordselection,fitlabel);
 
 
   { TTablePosition }
   { TTablePosition }
 
 
@@ -115,7 +115,7 @@ type
     property Items [index : integer] : TFormFieldItem read GetItem write SetItem;
     property Items [index : integer] : TFormFieldItem read GetItem write SetItem;
   end;
   end;
 
 
-  TFormButtonType = (fbtSubmit, fbtReset, fbtPushbutton);
+  TFormButtonType = (fbtSubmit, fbtReset, fbtPushbutton, fbtInputSubmit,fbtInputReset,fbtInputPushButton);
   TImagePlace = (ipOnly, ipBefore, ipAfter, ipUnder, ipAbove);
   TImagePlace = (ipOnly, ipBefore, ipAfter, ipUnder, ipAbove);
 
 
   { TFormButtonItem }
   { TFormButtonItem }
@@ -185,6 +185,7 @@ type
     FSize: integer;
     FSize: integer;
     FSpanned: boolean;
     FSpanned: boolean;
     FValue: string;
     FValue: string;
+    procedure WriteLabel(aWriter: THTMLWriter);
   public
   public
     function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement;
     function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement;
     function WriteHeader (aWriter : THTMLWriter) : THTMLCustomElement;
     function WriteHeader (aWriter : THTMLWriter) : THTMLCustomElement;
@@ -243,7 +244,7 @@ type
   TButtonVerPosition = (bvpTop, bvpBottom);
   TButtonVerPosition = (bvpTop, bvpBottom);
   TButtonVerPositionSet = set of TButtonVerPosition;
   TButtonVerPositionSet = set of TButtonVerPosition;
   TButtonHorPosition = (bhpLeft, bhpCenter, bhpJustify, bhpRight);
   TButtonHorPosition = (bhpLeft, bhpCenter, bhpJustify, bhpRight);
-  TFormMethod = (fmGet, fmPost);
+  TFormMethod = (fmNone, fmGet, fmPost);
 
 
   { THTMLDatasetFormProducer }
   { THTMLDatasetFormProducer }
 
 
@@ -558,10 +559,25 @@ end;
 procedure THTMLDatasetFormProducer.WriteButtons(aWriter: THTMLWriter);
 procedure THTMLDatasetFormProducer.WriteButtons(aWriter: THTMLWriter);
 
 
   procedure WriteButton (aButton : TFormButtonItem);
   procedure WriteButton (aButton : TFormButtonItem);
-  const ButtonTypes : array[TFormButtontype] of THTMLbuttontype = (btsubmit,btreset,btbutton);
+  const ButtonTypes : array[TFormButtontype] of THTMLbuttontype = (btsubmit,btreset,btbutton,btreset,btreset,btreset);
+  const InputTypes : array[TFormButtontype] of THTMLinputtype = (itreset,itreset,itreset,itsubmit,itreset,itbutton);
   var b : THTML_Button;
   var b : THTML_Button;
+      ib: THTML_input;
   begin
   begin
     with aWriter do
     with aWriter do
+     if aButton.ButtonType in [fbtInputPushButton,fbtInputReset,fbtInputSubmit] then
+      begin
+      ib := input;
+      with ib do
+        begin
+        Name := aButton.name;
+        Value := aButton.value;
+        TheType := InputTypes[aButton.ButtonType];
+        if assigned (FAfterButtonCreate) then
+          FAfterButtonCreate (self, aButton, ib);
+        end;
+      end
+     else
       begin
       begin
       b := Startbutton;
       b := Startbutton;
       with b do
       with b do
@@ -647,7 +663,7 @@ begin
   aWriter.StartTableRow;
   aWriter.StartTableRow;
   with tabledef do
   with tabledef do
     begin
     begin
-    for r := 0 to count-2 do
+    for r := 0 to count-1 do
       with TTableCell (Items[r]) do
       with TTableCell (Items[r]) do
         begin
         begin
         if CellType <> ctSpanned then
         if CellType <> ctSpanned then
@@ -664,7 +680,6 @@ begin
           aWriter.StartTableRow;
           aWriter.StartTableRow;
           end;
           end;
         end;
         end;
-    TTableCell(Items[Count-1]).WriteContent(aWriter);
     end;
     end;
   aWriter.EndTableRow;
   aWriter.EndTableRow;
   aWriter.Endtablebody;
   aWriter.Endtablebody;
@@ -678,7 +693,7 @@ begin
   aWriter.StartTableRow;
   aWriter.StartTableRow;
   with tabledef do
   with tabledef do
     begin
     begin
-    for r := 0 to count-2 do
+    for r := 0 to count-1 do
       with TTableCell (Items[r]) do
       with TTableCell (Items[r]) do
         begin
         begin
         c := WriteHeader(aWriter);
         c := WriteHeader(aWriter);
@@ -690,7 +705,6 @@ begin
           aWriter.StartTableRow;
           aWriter.StartTableRow;
           end;
           end;
         end;
         end;
-    TTableCell(Items[Count-1]).WriteContent(aWriter);
     end;
     end;
   aWriter.EndTableRow;
   aWriter.EndTableRow;
   aWriter.Endtablehead;
   aWriter.Endtablehead;
@@ -735,10 +749,10 @@ begin
 end;
 end;
 
 
 function THTMLDatasetFormProducer.StartForm(aWriter: THTMLWriter) : THTMLCustomElement;
 function THTMLDatasetFormProducer.StartForm(aWriter: THTMLWriter) : THTMLCustomElement;
-const MethodAttribute : array[TFormMethod] of string = ('GET','POST');
+const MethodAttribute : array[TFormMethod] of string = ('','GET','POST');
 var t : THTMLCustomElement;
 var t : THTMLCustomElement;
 begin
 begin
-  if FormAction <> '' then
+  if Self.FormMethod <> fmNone then
     begin
     begin
     result := aWriter.Startform;
     result := aWriter.Startform;
     with THTML_Form(result) do
     with THTML_Form(result) do
@@ -762,7 +776,7 @@ begin
   with aWriter do
   with aWriter do
     begin
     begin
     EndTable;
     EndTable;
-    if FormAction <> '' then
+    if self.FormMethod <> fmNone then
       Endform;
       Endform;
     end;
     end;
 end;
 end;
@@ -855,6 +869,7 @@ procedure THTMLDatasetFormEditProducer.ControlToTableDef (aControldef : TFormFie
     with TableDef.CopyTablePosition(aControlDef.ValuePos) do
     with TableDef.CopyTablePosition(aControlDef.ValuePos) do
       begin
       begin
       case aControlDef.inputtype of
       case aControlDef.inputtype of
+        fitlabel,
         fittext,
         fittext,
         fitpassword,
         fitpassword,
         fitcheckbox,
         fitcheckbox,
@@ -871,8 +886,7 @@ procedure THTMLDatasetFormEditProducer.ControlToTableDef (aControldef : TFormFie
           if aControlDef.inputType in [fitcheckbox,fitradio] then
           if aControlDef.inputType in [fitcheckbox,fitradio] then
             begin
             begin
             with aControlDef.Field do
             with aControlDef.Field do
-              Checked := not isnull and (asstring <> '0') and (asstring <> '-')
-                         and (comparetext(asstring,'false') <> 0);
+              Checked := asBoolean;
             if assigned (FOnFieldChecked) then
             if assigned (FOnFieldChecked) then
               FOnFieldChecked (aControlDef.Field, check);
               FOnFieldChecked (aControlDef.Field, check);
             Checked := check;
             Checked := check;
@@ -1007,6 +1021,8 @@ procedure THTMLDatasetFormGridProducer.ControlToTableDef (aControldef : TFormFie
       CellType := ctLabel;
       CellType := ctLabel;
       IsLabel := false;
       IsLabel := false;
       Value := aControlDef.FField.asstring;
       Value := aControlDef.FField.asstring;
+      if aControldef.Action <> '' then
+        Link := Format(aControldef.Action,[value]);
       if not FSeparateLabel and not FIncludeHeader then
       if not FSeparateLabel and not FIncludeHeader then
         begin
         begin
         Caption := aControldef.LabelCaption;
         Caption := aControldef.LabelCaption;
@@ -1026,9 +1042,9 @@ procedure THTMLDatasetFormGridProducer.ControlToTableDef (aControldef : TFormFie
   end;
   end;
 
 
 begin
 begin
-  if assigned (aControlDef.FField) then
+  if assigned (aControlDef.FField) and not IsHeader then
     PlaceFieldValue;
     PlaceFieldValue;
-  if FSeparateLabel and (aControlDef.LabelCaption <> '') then
+  if (IsHeader or FSeparateLabel) and (aControlDef.LabelCaption <> '') then
     PlaceLabel;
     PlaceLabel;
 end;
 end;
 
 
@@ -1046,17 +1062,18 @@ end;
 
 
 { TTableCell }
 { TTableCell }
 
 
-function TTableCell.WriteContent(aWriter: THTMLWriter) : THTMLCustomElement;
+procedure TTableCell.WriteLabel(aWriter: THTMLWriter);
+var HasLink : boolean;
+begin
+  HasLink := (Link <> '');
+  if HasLink then
+    aWriter.Anchor(Value).href := Link
+  else
+    aWriter.Text (Value);
+end;
 
 
-  procedure WriteLabel;
-  var HasLink : boolean;
-  begin
-    HasLink := (Link <> '');
-    if HasLink then
-      aWriter.Anchor(Value).href := Link
-    else
-      aWriter.Text (Value);
-  end;
+
+function TTableCell.WriteContent(aWriter: THTMLWriter) : THTMLCustomElement;
 
 
   procedure WriteTextArea;
   procedure WriteTextArea;
   begin
   begin
@@ -1097,6 +1114,8 @@ function TTableCell.WriteContent(aWriter: THTMLWriter) : THTMLCustomElement;
         aWriter.FormFile(Name, Value);
         aWriter.FormFile(Name, Value);
       fithidden :
       fithidden :
         aWriter.FormHidden (Name, Value);
         aWriter.FormHidden (Name, Value);
+      fitlabel :
+        aWriter.Text (Value);
     end;
     end;
   end;
   end;
 
 
@@ -1139,7 +1158,7 @@ begin
             WriteTextArea
             WriteTextArea
           else
           else
             WriteInput;
             WriteInput;
-        ctLabel : WriteLabel;
+        ctLabel : WriteLabel(aWriter);
         ctProducer : WriteProducer;
         ctProducer : WriteProducer;
       end;
       end;
       Endtablecell;
       Endtablecell;
@@ -1165,17 +1184,12 @@ begin
         align := AlignHorizontal;
         align := AlignHorizontal;
         valign := AlignVertical;
         valign := AlignVertical;
         end;
         end;
-      if CellType <> ctLabel then
-        begin
-        s := FormField.LabelCaption;
-        if self.Link <> '' then
-          aWriter.Anchor(s).href := self.Link
-        else
-          aWriter.Text (s);
-        end
-      else
-        aWriter.Text ('');
-      Endtablecell;
+      case CellType of
+        ctEmpty : ;
+        ctLabel : WriteLabel(aWriter);
+//        ctProducer : WriteProducer;
+      end;
+      Endtableheadcell;
       result := c;
       result := c;
       end;
       end;
 end;
 end;

+ 37 - 0
packages/fcl-web/src/fphtml.pp

@@ -46,6 +46,27 @@ type
   TWriterEvent = procedure (Sender:THTMLContentProducer; aWriter : THTMLWriter) of object;
   TWriterEvent = procedure (Sender:THTMLContentProducer; aWriter : THTMLWriter) of object;
   TBooleanEvent = procedure (Sender:THTMLContentProducer; var flag : boolean) of object;
   TBooleanEvent = procedure (Sender:THTMLContentProducer; var flag : boolean) of object;
 
 
+  { THTMLCustomPagContentProducer }
+
+  { THTMLCustomPageContentProducer }
+
+  THTMLCustomPageContentProducer = class (THTMLContentProducer)
+  private
+    FOnWritePage: TWriterEvent;
+  protected
+    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
+    procedure DoWritePage (aWriter : THTMLWriter); virtual;
+  public
+    Property OnWritePage : TWriterEvent read FOnWritePage write FOnWritePage;
+  end;
+
+  { THTMLCustomPagContentProducer }
+
+  THTMLPageContentProducer = class (THTMLCustomPageContentProducer)
+  published
+    Property OnWritePage;
+  end;
+
   { THTMLCustomDatasetContentProducer }
   { THTMLCustomDatasetContentProducer }
 
 
   THTMLCustomDatasetContentProducer = class (THTMLContentProducer)
   THTMLCustomDatasetContentProducer = class (THTMLContentProducer)
@@ -471,5 +492,21 @@ begin
     FOnGetContent(Self,ARequest,HTMLPage,Handled);
     FOnGetContent(Self,ARequest,HTMLPage,Handled);
 end;
 end;
 
 
+{ THTMLCustomPageContentProducer }
+
+function THTMLCustomPageContentProducer.WriteContent(aWriter: THTMLWriter
+  ): THTMLCustomElement;
+begin
+  result := aWriter.Starthtml;
+  DoWritePage(aWriter);
+  aWriter.Endhtml;
+end;
+
+procedure THTMLCustomPageContentProducer.DoWritePage(aWriter: THTMLWriter);
+begin
+  if assigned (FOnWritePage) then
+    FOnWritePage (self, aWriter);
+end;
+
 end.
 end.
 
 

+ 11 - 5
packages/fcl-web/src/fphttp.pp

@@ -31,6 +31,7 @@ Type
   private
   private
     FAfterResponse: TResponseEvent;
     FAfterResponse: TResponseEvent;
     FBeforeRequest: TRequestEvent;
     FBeforeRequest: TRequestEvent;
+    FRequest      : TRequest;
   Protected
   Protected
     Procedure DoHandleRequest(ARequest : TRequest; AResponse : TResponse; Var Handled : Boolean); virtual;
     Procedure DoHandleRequest(ARequest : TRequest; AResponse : TResponse; Var Handled : Boolean); virtual;
     Procedure DoGetContent(ARequest : TRequest; Content : TStream; Var Handled : Boolean); virtual;
     Procedure DoGetContent(ARequest : TRequest; Content : TStream; Var Handled : Boolean); virtual;
@@ -42,7 +43,8 @@ Type
   Public
   Public
     Procedure GetContent(ARequest : TRequest; Content : TStream; Var Handled : Boolean);
     Procedure GetContent(ARequest : TRequest; Content : TStream; Var Handled : Boolean);
     Function  HaveContent : Boolean; virtual;
     Function  HaveContent : Boolean; virtual;
-    Procedure ContentToStream(Stream : TStream); virtual;
+    function ContentToStream(Stream : TStream) : boolean; virtual;
+    Property Request : TRequest Read FRequest;
   end;
   end;
   
   
   { TCustomWebAction }
   { TCustomWebAction }
@@ -243,9 +245,8 @@ end;
 
 
 procedure THTTPContentProducer.DoGetContent(ARequest: TRequest; Content: TStream; Var Handled : Boolean);
 procedure THTTPContentProducer.DoGetContent(ARequest: TRequest; Content: TStream; Var Handled : Boolean);
 begin
 begin
-  Handled:=HaveContent;
-  If Handled then
-    ContentToStream(Content);
+  FRequest := ARequest;
+  Handled:=ContentToStream(Content);
 end;
 end;
 
 
 function THTTPContentProducer.ProduceContent: String;
 function THTTPContentProducer.ProduceContent: String;
@@ -258,7 +259,7 @@ begin
   Result:=(ProduceContent<>'');
   Result:=(ProduceContent<>'');
 end;
 end;
 
 
-procedure THTTPContentProducer.ContentToStream(Stream: TStream);
+function THTTPContentProducer.ContentToStream(Stream: TStream) : boolean;
 
 
 Var
 Var
   S : String;
   S : String;
@@ -266,7 +267,12 @@ Var
 begin
 begin
   S:=ProduceContent;
   S:=ProduceContent;
   If length(S)>0 then
   If length(S)>0 then
+    begin
     Stream.WriteBuffer(S[1],Length(S));
     Stream.WriteBuffer(S[1],Length(S));
+    Result := True;
+    end
+  else
+    Result := False;
 end;
 end;
 
 
 { TCustomWebAction }
 { TCustomWebAction }

+ 6 - 6
packages/fcl-xml/src/xmlread.pp

@@ -678,7 +678,7 @@ begin
       if TXMLReader(FReader).FXML11 then
       if TXMLReader(FReader).FXML11 then
         Result := #10;
         Result := #10;
   end;
   end;
-  if (Result < #256) and (char(Result) in TXMLReader(FReader).FForbiddenAscii) or
+  if (Result < #256) and (char(ord(Result)) in TXMLReader(FReader).FForbiddenAscii) or
     (Result >= #$FFFE) then
     (Result >= #$FFFE) then
     DecodingError('Invalid character');
     DecodingError('Invalid character');
 end;
 end;
@@ -812,7 +812,7 @@ function TISO8859_1Decoder.DecodeNext: WideChar;
 begin
 begin
   with FSource do
   with FSource do
   begin
   begin
-    Result := WideChar(FBuf[0]);
+    Result := WideChar(ord(FBuf[0]));
     Inc(FBuf);
     Inc(FBuf);
   end;
   end;
 end;
 end;
@@ -862,7 +862,7 @@ var
 begin
 begin
   with FSource do
   with FSource do
   begin
   begin
-    Result := WideChar(FBuf[0]);
+    Result := WideChar(byte(FBuf[0]));
     Inc(FBuf);
     Inc(FBuf);
     if Result < #$80 then
     if Result < #$80 then
       Exit;
       Exit;
@@ -1099,7 +1099,7 @@ var
 begin
 begin
   for I := 1 to Length(s) do
   for I := 1 to Length(s) do
   begin
   begin
-    if FCurChar <> WideChar(s[i]) then
+    if FCurChar <> WideChar(ord(s[i])) then
       FatalError('Expected "%s"', [s]);
       FatalError('Expected "%s"', [s]);
     GetChar;
     GetChar;
   end;
   end;
@@ -1115,7 +1115,7 @@ end;
 procedure TXMLReader.SkipString(const ValidChars: TSetOfChar);
 procedure TXMLReader.SkipString(const ValidChars: TSetOfChar);
 begin
 begin
   FValue.Length := 0;
   FValue.Length := 0;
-  while (ord(FCurChar) < 256) and (char(FCurChar) in ValidChars) do
+  while (ord(FCurChar) < 256) and (char(ord(FCurChar)) in ValidChars) do
   begin
   begin
     BufAppend(FValue, FCurChar);
     BufAppend(FValue, FCurChar);
     GetChar;
     GetChar;
@@ -1647,7 +1647,7 @@ begin
     for I := 0 to FValue.Length-1 do
     for I := 0 to FValue.Length-1 do
     begin
     begin
       wc := FValue.Buffer[I];
       wc := FValue.Buffer[I];
-      if (wc > #255) or not (Char(wc) in PubidChars) then
+      if (wc > #255) or not (Char(ord(wc)) in PubidChars) then
         FatalError('Illegal Public ID literal', True);
         FatalError('Illegal Public ID literal', True);
       if (wc = #10) or (wc = #13) then
       if (wc = #10) or (wc = #13) then
         FValue.Buffer[I] := #32;
         FValue.Buffer[I] := #32;

+ 1 - 1
packages/fcl-xml/src/xmlwrite.pp

@@ -305,7 +305,7 @@ begin
   EndPos := 1;
   EndPos := 1;
   while EndPos <= Length(s) do
   while EndPos <= Length(s) do
   begin
   begin
-    if (s[EndPos] < #255) and (Char(s[EndPos]) in SpecialChars) then
+    if (s[EndPos] < #255) and (Char(ord(s[EndPos])) in SpecialChars) then
     begin
     begin
       wrtChars(@s[StartPos], EndPos - StartPos);
       wrtChars(@s[StartPos], EndPos - StartPos);
       SpecialCharCallback(s[EndPos]);
       SpecialCharCallback(s[EndPos]);