Bläddra i källkod

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 år sedan
förälder
incheckning
a4717b59b2
34 ändrade filer med 3983 tillägg och 413 borttagningar
  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/felog.inc 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/htmldefs.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/cfgtest.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/debugtest.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/testser.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/testur.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/pqconnection.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/sqlite/Makefile 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
 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
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 override PACKAGE_NAME=fcl-base
-override PACKAGE_VERSION=2.2.1
+override PACKAGE_VERSION=2.0.0
 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
 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
 endif
 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
 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
 endif
 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
 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
 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
 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
 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
@@ -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
 endif
 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
 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
 endif
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
 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
 endif
 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
 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
 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
 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
 endif
 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
 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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
@@ -1955,6 +1955,9 @@ ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_NETDB=1
+REQUIRE_PACKAGES_LIBASYNC=1
+REQUIRE_PACKAGES_PTHREADS=1
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 REQUIRE_PACKAGES_RTL=1

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

@@ -4,11 +4,12 @@
 
 [package]
 name=fcl-base
-version=2.2.1
+version=2.0.0
 
 [require]
 packages=paszlib hash
 packages_linux=netdb libasync pthreads
+packages_beos=netdb libasync pthreads
 packages_freebsd=netdb libasync pthreads
 packages_darwin=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 \
       eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream \
       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_emx=resolve ssockets
 # syncobjs requires GetLastOSError function

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

@@ -669,7 +669,7 @@ end;
 Function TCustomDaemon.UnInstall : Boolean;
 begin
   Result:=True;
-  Application.SysInstallDaemon(Self);
+  Application.SysUnInstallDaemon(Self);
 end;
 
 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 ReadFloat(const Section, Ident: string; Default: Double): Double; 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 WriteDateTime(const Section, Ident: string; Value: TDateTime); virtual;
     procedure WriteFloat(const Section, Ident: string; Value: Double); 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 ReadSections(Strings: TStrings); virtual; abstract;
     procedure ReadSectionValues(const Section: string; Strings: TStrings); virtual; abstract;
@@ -487,59 +487,27 @@ begin
 end;
 
 function TCustomIniFile.ReadDate(const Section, Ident: string; Default: TDateTime): TDateTime;
-var
-  s: string;
+
 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;
 
 function TCustomIniFile.ReadDateTime(const Section, Ident: string; Default: TDateTime): TDateTime;
-var
-  s: string;
+
 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;
 
 function TCustomIniFile.ReadFloat(const Section, Ident: string; Default: Double): Double;
-var
-  s: string;
+
 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;
 
 function TCustomIniFile.ReadTime(const Section, Ident: string; Default: TDateTime): TDateTime;
-var
-  s: string;
+
 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;
 
 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
-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
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
@@ -231,19 +231,19 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 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
 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
 endif
 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
 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
 endif
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 endif
 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
 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
 endif
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
@@ -1270,9 +1273,11 @@ ifeq ($(FULL_TARGET),i386-beos)
 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_NETDB=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-FPCUNIT=1
 REQUIRE_PACKAGES_PASJPEG=1
@@ -1960,6 +1965,7 @@ REQUIRE_PACKAGES_FCL-WEB=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
@@ -2124,6 +2130,30 @@ REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
 REQUIRE_PACKAGES_SQLITE=1
 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)
 REQUIRE_PACKAGES_RTL=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 \
          istream doecho testol testcont txmlreg testreg tstelcmd \
          testapp testcgi testbs testbf cachetest poolmm1 poolmm2 tarmakercons \
-         tarmakerconsgzip
+         tarmakerconsgzip 
 programs_win32=showver testproc testhres testnres testsres testrhre \
                testrnre testrsre testur ipcserver ipcclient debugtest \
-               dbugsrv
+               dbugsrv testtimer
 programs_linux=sockcli isockcli dsockcli socksvr isocksvr dsocksvr \
                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 \
                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 \
                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 \
                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 \
              testrnre testrsre testur
 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)
 poolmm2.pp   Test for pooledmm (nonfree) (VS)
 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 SetRequired(const AValue: Boolean);
   public
+    constructor create(ACollection : TCollection); overload;
     constructor Create(AOwner: TFieldDefs; const AName: string;
       ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Longint); overload;
     destructor Destroy; override;

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

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

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

@@ -28,6 +28,13 @@ end;}
     TFieldDef
   ---------------------------------------------------------------------}
 
+Constructor TFieldDef.Create(ACollection : TCollection);
+
+begin
+  Inherited create(ACollection);
+  FFieldNo:=Index+1;
+end;
+
 Constructor TFieldDef.Create(AOwner: TFieldDefs; const AName: string;
       ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Longint);
 
@@ -236,7 +243,8 @@ procedure TFieldDefs.Update;
 begin
   if not Updated then
     begin
-    DataSet.InitFieldDefs;
+    If Assigned(Dataset) then
+      DataSet.InitFieldDefs;
     Updated := True;
     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)
-    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,
     for details about the copyright.
@@ -10,9 +11,7 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
-{$IFDEF FPC}
 {$mode objfpc}
-{$ENDIF FPC}
 {$H+}
 {
   TMemDataset : In-memory dataset.
@@ -22,18 +21,14 @@
   E-mail: [email protected]
 }
 
-
 unit memds;
 
 interface
 
 uses
-  SysUtils, Classes, DB;
-
-Const
-  //Default size used when string size is 0
-  MEMDS_STRING_MAXSIZE = 200;
+ sysutils, classes, db, types;
 
+const
   // Stream Markers.
   MarkerSize  = SizeOf(Integer);
 
@@ -50,28 +45,30 @@ type
     BookmarkFlag: TBookmarkFlag;
   end;
 
-  PInteger  = ^Integer;
-  PSmallInt = ^SmallInt;
-  PInt64    = ^Int64;
-  PFloat    = ^Double;
-  PBoolean  = ^Boolean;
-
-
   TMemDataset=class(TDataSet)
   private
     FOpenStream : TStream;
     FFileName : String;
-    FModified : Boolean;
+    FFileModified : Boolean;
     FStream: TMemoryStream;
     FRecInfoOffset: integer;
-    FRecInfoSize: integer;
     FRecCount: integer;
     FRecSize: integer;
     FRecBufferSize: integer;
     FCurrRecNo: integer;
     FIsOpen: boolean;
     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
     // Mandatory
     function  AllocRecordBuffer: PChar; override;
@@ -114,23 +111,7 @@ type
     // If SaveData=False, a size 0 block should be written.
     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
     constructor Create(AOwner:tComponent); override;
     destructor Destroy; override;
@@ -149,7 +130,7 @@ type
     Procedure CopyFromDataset(DataSet : TDataSet);
     Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
 
-    Property Modified : Boolean Read FModified;
+    Property FileModified : Boolean Read FFileModified;
 
   published
     Property FileName : String Read FFileName Write FFileName;
@@ -188,6 +169,33 @@ ResourceString
   SErrInvalidMarkerAtPos    = 'Wrong data stream marker at position %d. Got %d, expected %d';
   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
   ---------------------------------------------------------------------}
@@ -238,8 +246,6 @@ constructor TMemDataset.Create(AOwner:tComponent);
 begin
   inherited create(aOwner);
   FStream:=TMemoryStream.Create;
-  FFieldOffsetList := TList.Create;
-  FRecInfoSize:=SizeOf(TMTRecInfo);
   FRecCount:=0;
   FRecSize:=0;
   FRecBufferSize:=0;
@@ -251,7 +257,6 @@ end;
 Destructor TMemDataset.Destroy;
 begin
   FStream.Free;
-  FFieldOffsetList.Free;
   inherited Destroy;
 end;
 
@@ -262,8 +267,7 @@ end;
 
 function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer;
 begin
-  //FFieldOffsetList calculated once in createtable
-  Result:=Integer(FFieldOffsetList.Items[FieldNo-1]);
+ result:= ffieldoffsets[fieldno-1];
 end;
 
 Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const);
@@ -272,21 +276,22 @@ begin
   Raise MDSError.CreateFmt(Fmt,Args);
 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
-   RaiseError(SErrFieldTypeNotSupported,[FieldDefs.Items[FieldNo-1].Name]);
+  RaiseError(SErrFieldTypeNotSupported,[FieldDefs.Items[FieldNo-1].Name]);
  end;
 end;
 
@@ -299,7 +304,6 @@ begin
        Buffer:=nil
      else
        Buffer:=ActiveBuffer;
-
   dsEdit,
   dsInsert:
      Buffer:=ActiveBuffer;
@@ -308,7 +312,7 @@ begin
  else
    Buffer:=nil;
  end;
- Result:=Assigned(Buffer);
+ Result:=(Buffer<>nil);
 end;
 
 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
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.WriteBuffer(Buffer^, FRecSize);
-  FModified:=True;
+  FFileModified:=True;
 end;
 
 procedure TMemDataset.MDSAppendRecord(Buffer:PChar);   //Appends a Rec (from Buffer) to Stream
 begin
   FStream.Position:=MDSGetRecordOffset(FRecCount);
   FStream.WriteBuffer(Buffer^, FRecSize);
-  FModified:=True;
+  FFileModified:=True;
 end;
 
 //Abstract Overrides
@@ -344,8 +348,11 @@ end;
 
 procedure TMemDataset.InternalInitRecord(Buffer: PChar);
 
+var
+  I : integer;
+
 begin
- FillChar(Buffer^,FRecSize,0);
+ fillchar(buffer^,frecsize,0);
 end;
 
 procedure TMemDataset.InternalDelete;
@@ -387,7 +394,7 @@ begin
   Finally
     TS.Free;
   end;
-  FModified:=True;
+  FFileModified:=True;
 end;
 
 procedure TMemDataset.InternalInitFieldDefs;
@@ -477,7 +484,7 @@ begin
   CheckMarker(F,smData);
   Size:=ReadInteger(F);
   FStream.Clear;
-  if Size>0 then FStream.CopyFrom(F,Size);
+  FStream.CopyFrom(F,Size);
   FRecCount:=Size div FRecSize;
   FCurrRecNo:=-1;
 end;
@@ -489,7 +496,7 @@ begin
   ReadFieldDefsFromStream(F);
   LoadDataFromStream(F);
   CheckMarker(F,smEOF);
-  FModified:=False;
+  FFileModified:=False;
 end;
 
 Procedure TMemDataSet.LoadFromFile(AFileName : String);
@@ -582,7 +589,7 @@ begin
     WriteInteger(F,FStream.Size);
     FStream.Position:=0;
     F.CopyFrom(FStream,FStream.Size);
-    FModified:=False;
+    FFileModified:=False;
     end
   else
     begin
@@ -594,13 +601,17 @@ end;
 procedure TMemDataset.InternalClose;
 
 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;
 
 procedure TMemDataset.InternalPost;
@@ -621,6 +632,7 @@ begin
 end;
 
 function TMemDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+
 var
   Accepted: Boolean;
 
@@ -651,8 +663,8 @@ begin
     if result=grOK then
       begin
       MDSReadRecord(Buffer, FCurrRecNo);
-      MDSSetRecInfo( Buffer,bfCurrent,FCurrRecNo );
-
+      PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=FCurrRecNo;
+      PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag:=bfCurrent;
       if (Filtered) then
         Accepted:=MDSFilterRecord(Buffer) //Filtering
       else
@@ -664,36 +676,46 @@ begin
 end;
 
 function TMemDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
-
 var
-  SrcBuffer: PChar;
-
+ SrcBuffer: PChar;
+ I: integer;
 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
-   Move((SrcBuffer+MDSGetFieldOffset(Field.FieldNo))^, Buffer^, MDSGetFieldSize(Field.FieldNo));
-   result:=True;
+   Move((SrcBuffer+ffieldoffsets[I])^, Buffer^,FFieldSizes[I]);
    end;
 end;
 
 procedure TMemDataset.SetFieldData(Field: TField; Buffer: Pointer);
-
 var
-  DestBuffer: PChar;
+ DestBuffer: PChar;
+ I,J: integer;
 
 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;
 
 function TMemDataset.GetRecordSize: Word;
 
 begin
-  Result:=FRecSize;
+ Result:= FRecSize;
 end;
 
 procedure TMemDataset.InternalGotoBookmark(ABookmark: Pointer);
@@ -715,34 +737,36 @@ var
   ReqBookmark: integer;
 
 begin
-  ReqBookmark:=MDSGetRecInfo(Buffer).Bookmark;
+  ReqBookmark:=PRecInfo(Buffer+FRecInfoOffset)^.Bookmark;
   InternalGotoBookmark (@ReqBookmark);
 end;
 
 function TMemDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+
 begin
- Result:=MDSGetRecInfo(Buffer).BookmarkFlag;
+  Result:=PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag;
 end;
 
 procedure TMemDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+
 begin
-  MDSSetRecInfo(Buffer,Value);
+  PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag := Value;
 end;
 
 procedure TMemDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
 
 begin
   if Data<>nil then
-    PInteger(Data)^:=MDSGetRecInfo(Buffer).Bookmark;
+    PInteger(Data)^:=PRecInfo(Buffer+FRecInfoOffset)^.Bookmark;
 end;
 
 procedure TMemDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
 
 begin
   if Data<>nil then
-    MDSSetRecInfo(Buffer, PInteger(Data)^)
+    PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=PInteger(Data)^
   else
-    MDSSetRecInfo( Buffer, 0);
+    PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=0;
 end;
 
 function TMemDataset.MDSFilterRecord(Buffer: PChar): Boolean;
@@ -755,34 +779,12 @@ begin
   if not Assigned(OnFilterRecord) then
     Exit;
   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;
 
 Function TMemDataset.DataSize : Integer;
@@ -812,22 +814,32 @@ begin
     end;
 end;
 
-procedure TMemDataset.CreateTable;
+procedure tmemdataset.calcrecordlayout;
 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
   FStream.Clear;
   FRecCount:=0;
   FCurrRecNo:=-1;
   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;
 end;
 
@@ -854,7 +866,7 @@ Function TMemDataset.GetRecNo: Longint;
 begin
   UpdateCursorPos;
   if (FCurrRecNo<0) then
-    Result:=0
+    Result:=1
   else
     Result:=FCurrRecNo+1;
 end;
@@ -875,7 +887,7 @@ end;
 Procedure TMemDataset.CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
 
 Var
-  I, iDataSize : Integer;
+  I  : Integer;
   F,F1,F2 : TField;
   L1,L2  : TList;
   N : String;
@@ -885,12 +897,8 @@ begin
   // NOT from fielddefs. The data may not be available in buffers !!
   For I:=0 to Dataset.FieldCount-1 do
     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;
   CreateTable;
   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
-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
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
@@ -233,70 +233,73 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(F
 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_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_DIRS+=interbase postgres
+override TARGET_DIRS+=interbase postgres sqlite
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_DIRS+=interbase odbc mysql
+override TARGET_DIRS+=interbase odbc mysql sqlite
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_DIRS+=interbase postgres mysql odbc oracle
+override TARGET_DIRS+=interbase postgres mysql odbc oracle sqlite
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_DIRS+=interbase postgres
+override TARGET_DIRS+=interbase postgres sqlite
 endif
 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
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_UNITS+=sqldb
@@ -448,6 +451,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_UNITS+=sqldb
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=sqldb
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_UNITS+=sqldb
 endif
@@ -601,6 +607,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_RSTS+=sqldb
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_RSTS+=sqldb
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_RSTS+=sqldb
 endif
@@ -755,6 +764,9 @@ 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
@@ -1544,6 +1556,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 REQUIRE_PACKAGES_RTL=1
@@ -1555,6 +1568,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
@@ -1566,6 +1580,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
@@ -1577,6 +1592,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
@@ -1594,6 +1610,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 REQUIRE_PACKAGES_RTL=1
@@ -1605,6 +1622,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 REQUIRE_PACKAGES_RTL=1
@@ -1619,6 +1637,7 @@ ifeq ($(FULL_TARGET),i386-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 REQUIRE_PACKAGES_RTL=1
@@ -1633,6 +1652,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 REQUIRE_PACKAGES_RTL=1
@@ -1641,6 +1661,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
@@ -1649,6 +1670,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 REQUIRE_PACKAGES_RTL=1
@@ -1663,6 +1685,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
@@ -1677,6 +1700,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 REQUIRE_PACKAGES_RTL=1
@@ -1685,6 +1709,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 REQUIRE_PACKAGES_RTL=1
@@ -1699,6 +1724,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 REQUIRE_PACKAGES_RTL=1
@@ -1713,6 +1739,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 REQUIRE_PACKAGES_RTL=1
@@ -1721,6 +1748,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 REQUIRE_PACKAGES_RTL=1
@@ -1735,6 +1763,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 REQUIRE_PACKAGES_RTL=1
@@ -1743,12 +1772,14 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
@@ -1760,6 +1791,7 @@ REQUIRE_PACKAGES_POSTGRES=1
 REQUIRE_PACKAGES_MYSQL=1
 REQUIRE_PACKAGES_ODBC=1
 REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
@@ -1768,6 +1800,7 @@ ifeq ($(FULL_TARGET),arm-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_IBASE=1
 REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 REQUIRE_PACKAGES_RTL=1
@@ -1788,6 +1821,16 @@ 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-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
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
@@ -1948,6 +1991,32 @@ ifdef UNITDIR_ORACLE
 override COMPILER_UNITDIR+=$(UNITDIR_ORACLE)
 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
@@ -2439,6 +2508,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 TARGET_DIRS_INTERBASE=1
@@ -2446,6 +2516,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 TARGET_DIRS_INTERBASE=1
@@ -2453,6 +2524,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 TARGET_DIRS_INTERBASE=1
@@ -2460,6 +2532,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 TARGET_DIRS_INTERBASE=1
@@ -2467,6 +2540,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 TARGET_DIRS_INTERBASE=1
@@ -2474,10 +2548,12 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_POSTGRES=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 TARGET_DIRS_INTERBASE=1
@@ -2485,6 +2561,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 TARGET_DIRS_INTERBASE=1
@@ -2492,6 +2569,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 TARGET_DIRS_INTERBASE=1
@@ -2499,6 +2577,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 TARGET_DIRS_INTERBASE=1
@@ -2506,6 +2585,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 TARGET_DIRS_INTERBASE=1
@@ -2513,6 +2593,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 TARGET_DIRS_INTERBASE=1
@@ -2520,6 +2601,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 TARGET_DIRS_INTERBASE=1
@@ -2527,6 +2609,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 TARGET_DIRS_INTERBASE=1
@@ -2534,6 +2617,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 TARGET_DIRS_INTERBASE=1
@@ -2541,6 +2625,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 TARGET_DIRS_INTERBASE=1
@@ -2548,6 +2633,7 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 TARGET_DIRS_INTERBASE=1
@@ -2555,11 +2641,13 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_MYSQL=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 TARGET_DIRS_INTERBASE=1
@@ -2567,10 +2655,12 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=1
 TARGET_DIRS_ORACLE=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 TARGET_DIRS_INTERBASE=1
 TARGET_DIRS_POSTGRES=1
+TARGET_DIRS_SQLITE=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 TARGET_DIRS_INTERBASE=1
@@ -2578,6 +2668,15 @@ TARGET_DIRS_POSTGRES=1
 TARGET_DIRS_MYSQL=1
 TARGET_DIRS_ODBC=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
 ifdef TARGET_DIRS_INTERBASE
 interbase_all:
@@ -2804,6 +2903,51 @@ oracle:
 	$(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
 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))
 debug: fpc_debug
 smart: fpc_smart

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

@@ -6,14 +6,14 @@
 main=fcl-db
 
 [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
 rsts=sqldb
 

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

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

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

@@ -29,6 +29,7 @@ type TSchemaType = (stNoSchema, stTables, stSysTables, stProcedures, stColumns,
 type
   TSQLConnection = class;
   TSQLTransaction = class;
+  TCustomSQLQuery = class;
   TSQLQuery = class;
   TSQLScript = class;
 
@@ -162,9 +163,9 @@ type
     property Params : TStringList read FParams write FParams;
   end;
 
-{ TSQLQuery }
+{ TCustomSQLQuery }
 
-  TSQLQuery = class (Tbufdataset)
+  TCustomSQLQuery = class (Tbufdataset)
   private
     FCursor              : TSQLCursor;
     FUpdateable          : boolean;
@@ -193,7 +194,7 @@ type
 
     FUpdateQry,
     FDeleteQry,
-    FInsertQry           : TSQLQuery;
+    FInsertQry           : TCustomSQLQuery;
 
     procedure FreeFldBuffers;
     procedure InitUpdates(ASQL : string);
@@ -240,13 +241,12 @@ type
     procedure SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string); virtual;
     property Prepared : boolean read IsPrepared;
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
-  published
+  protected
+      
     // redeclared data set properties
     property Active;
     property Filter;
     property Filtered;
-    property ServerFilter: string read FServerFilterText write SetServerFilterText;
-    property ServerFiltered: Boolean read FServerFiltered write SetServerFiltered default False;
 //    property FilterOptions;
     property BeforeOpen;
     property AfterOpen;
@@ -272,7 +272,8 @@ type
     property OnPostError;
     property AutoCalcFields;
     property Database;
-
+  // protected
+//    property SchemaInfo : TSchemaInfo read FSchemaInfo default stNoSchema;
     property Transaction;
     property ReadOnly : Boolean read FReadOnly write SetReadOnly;
     property SQL : TStringlist read FSQL write FSQL;
@@ -286,7 +287,58 @@ type
     property StatementType : TStatementType read GetStatementType;
     property ParseSQL : Boolean read FParseSQL write SetParseSQL;
     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;
 
 { TSQLScript }
@@ -294,7 +346,7 @@ type
   TSQLScript = class (Tcomponent)
   private
     FScript  : TStrings;
-    FQuery   : TSQLQuery;
+    FQuery   : TCustomSQLQuery;
     FDatabase : TDatabase;
     FTransaction : TDBTransaction;
   protected
@@ -371,6 +423,7 @@ type
 Procedure RegisterConnection(Def : TConnectionDefClass);
 Procedure UnRegisterConnection(Def : TConnectionDefClass);
 Procedure UnRegisterConnection(ConnectionName : String);
+Function GetConnectionDef(ConnectorName : String) : TConnectionDef;
 Procedure GetConnectionList(List : TSTrings);
 
 implementation
@@ -476,13 +529,13 @@ end;
 
 procedure TSQLConnection.GetDBInfo(const SchemaType : TSchemaType; const SchemaObjectName, ReturnField : string; List: TStrings);
 
-var qry : TSQLQuery;
+var qry : TCustomSQLQuery;
 
 begin
   if not assigned(Transaction) then
     DatabaseError(SErrConnTransactionnSet);
 
-  qry := tsqlquery.Create(nil);
+  qry := TCustomSQLQuery.Create(nil);
   qry.transaction := Transaction;
   qry.database := Self;
   with qry do
@@ -493,7 +546,7 @@ begin
     List.Clear;
     while not eof do
       begin
-      List.Append(fieldbyname(ReturnField).asstring);
+      List.Append(trim(fieldbyname(ReturnField).asstring));
       Next;
       end;
     end;
@@ -668,8 +721,8 @@ begin
     end;
 end;
 
-{ TSQLQuery }
-procedure TSQLQuery.OnChangeSQL(Sender : TObject);
+{ TCustomSQLQuery }
+procedure TCustomSQLQuery.OnChangeSQL(Sender : TObject);
 
 var ConnOptions : TConnOptions;
 
@@ -687,20 +740,20 @@ begin
     end;
 end;
 
-procedure TSQLQuery.OnChangeModifySQL(Sender : TObject);
+procedure TCustomSQLQuery.OnChangeModifySQL(Sender : TObject);
 
 begin
   CheckInactive;
 end;
 
-Procedure TSQLQuery.SetTransaction(Value : TDBTransaction);
+Procedure TCustomSQLQuery.SetTransaction(Value : TDBTransaction);
 
 begin
   UnPrepare;
   inherited;
 end;
 
-procedure TSQLQuery.SetDatabase(Value : TDatabase);
+procedure TCustomSQLQuery.SetDatabase(Value : TDatabase);
 
 var db : tsqlconnection;
 
@@ -717,25 +770,25 @@ begin
     end;
 end;
 
-Function TSQLQuery.IsPrepared : Boolean;
+Function TCustomSQLQuery.IsPrepared : Boolean;
 
 begin
   Result := Assigned(FCursor) and FCursor.FPrepared;
 end;
 
-Function TSQLQuery.AddFilter(SQLstr : string) : string;
+Function TCustomSQLQuery.AddFilter(SQLstr : string) : string;
 
 begin
   if FWhereStartPos = 0 then
     SQLstr := SQLstr + ' where (' + Filter + ')'
   else if FWhereStopPos > 0 then
-    system.insert(' and ('+Filter+') ',SQLstr,FWhereStopPos+1)
+    system.insert(' and ('+ServerFilter+') ',SQLstr,FWhereStopPos+1)
   else
-    system.insert(' where ('+Filter+') ',SQLstr,FWhereStartPos);
+    system.insert(' where ('+ServerFilter+') ',SQLstr,FWhereStartPos);
   Result := SQLstr;
 end;
 
-procedure TSQLQuery.ApplyFilter;
+procedure TCustomSQLQuery.ApplyFilter;
 
 var S : String;
 
@@ -756,7 +809,7 @@ begin
   First;
 end;
 
-Procedure TSQLQuery.SetActive (Value : Boolean);
+Procedure TCustomSQLQuery.SetActive (Value : Boolean);
 
 begin
   inherited SetActive(Value);
@@ -766,7 +819,7 @@ begin
 end;
 
 
-procedure TSQLQuery.SetServerFiltered(Value: Boolean);
+procedure TCustomSQLQuery.SetServerFiltered(Value: Boolean);
 
 begin
   if Value and not FParseSQL then DatabaseErrorFmt(SNoParseSQL,['Filtering ']);
@@ -777,7 +830,7 @@ begin
     end;
 end;
 
-procedure TSQLQuery.SetServerFilterText(const Value: string);
+procedure TCustomSQLQuery.SetServerFilterText(const Value: string);
 begin
   if Value <> ServerFilter then
     begin
@@ -786,7 +839,7 @@ begin
     end;
 end;
 
-procedure TSQLQuery.Prepare;
+procedure TCustomSQLQuery.Prepare;
 var
   db    : tsqlconnection;
   sqltr : tsqltransaction;
@@ -828,7 +881,7 @@ begin
     end;
 end;
 
-procedure TSQLQuery.UnPrepare;
+procedure TCustomSQLQuery.UnPrepare;
 
 begin
   CheckInactive;
@@ -836,12 +889,12 @@ begin
     UnPrepareStatement(FCursor);
 end;
 
-procedure TSQLQuery.FreeFldBuffers;
+procedure TCustomSQLQuery.FreeFldBuffers;
 begin
   if assigned(FCursor) then (Database as tsqlconnection).FreeFldBuffers(FCursor);
 end;
 
-function TSQLQuery.Fetch : boolean;
+function TCustomSQLQuery.Fetch : boolean;
 begin
   if not (Fcursor.FStatementType in [stSelect]) then
     Exit;
@@ -850,25 +903,25 @@ begin
   Result := not FIsEOF;
 end;
 
-procedure TSQLQuery.Execute;
+procedure TCustomSQLQuery.Execute;
 begin
   If (FParams.Count>0) and Assigned(FMasterLink) then
     FMasterLink.CopyParamsFromMaster(False);
   (Database as tsqlconnection).execute(Fcursor,Transaction as tsqltransaction, FParams);
 end;
 
-function TSQLQuery.LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean;
+function TCustomSQLQuery.LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean;
 
 begin
   result := (Database as tSQLConnection).LoadField(FCursor,FieldDef,buffer, Createblob)
 end;
 
-procedure TSQLQuery.InternalAddRecord(Buffer: Pointer; AAppend: Boolean);
+procedure TCustomSQLQuery.InternalAddRecord(Buffer: Pointer; AAppend: Boolean);
 begin
   // not implemented - sql dataset
 end;
 
-procedure TSQLQuery.InternalClose;
+procedure TCustomSQLQuery.InternalClose;
 begin
   if StatementType = stSelect then FreeFldBuffers;
 // 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;
 end;
 
-procedure TSQLQuery.InternalInitFieldDefs;
+procedure TCustomSQLQuery.InternalInitFieldDefs;
 begin
   if FLoadingFieldDefs then
     Exit;
@@ -900,7 +953,7 @@ begin
   end;
 end;
 
-procedure TSQLQuery.SQLParser(var ASQL : string);
+procedure TCustomSQLQuery.SQLParser(var ASQL : string);
 
 type TParsePart = (ppStart,ppSelect,ppWhere,ppFrom,ppOrder,ppComment,ppGroup,ppBogus);
 
@@ -1029,7 +1082,7 @@ begin
     end
 end;
 
-procedure TSQLQuery.InitUpdates(ASQL : string);
+procedure TCustomSQLQuery.InitUpdates(ASQL : string);
 
 
 begin
@@ -1043,12 +1096,12 @@ begin
 
 end;
 
-procedure TSQLQuery.InternalOpen;
+procedure TCustomSQLQuery.InternalOpen;
 
-  procedure InitialiseModifyQuery(var qry : TSQLQuery; aSQL: TSTringList);
+  procedure InitialiseModifyQuery(var qry : TCustomSQLQuery; aSQL: TSTringList);
   
   begin
-    qry := TSQLQuery.Create(nil);
+    qry := TCustomSQLQuery.Create(nil);
     with qry do
       begin
       ParseSQL := False;
@@ -1120,7 +1173,7 @@ end;
 
 // public part
 
-procedure TSQLQuery.ExecSQL;
+procedure TCustomSQLQuery.ExecSQL;
 begin
   try
     Prepare;
@@ -1132,7 +1185,7 @@ begin
   end;
 end;
 
-constructor TSQLQuery.Create(AOwner : TComponent);
+constructor TCustomSQLQuery.Create(AOwner : TComponent);
 begin
   inherited Create(AOwner);
   FParams := TParams.create(self);
@@ -1159,7 +1212,7 @@ begin
   FUsePrimaryKeyAsKey := True;
 end;
 
-destructor TSQLQuery.Destroy;
+destructor TCustomSQLQuery.Destroy;
 begin
   if Active then Close;
   UnPrepare;
@@ -1174,7 +1227,7 @@ begin
   inherited Destroy;
 end;
 
-procedure TSQLQuery.SetReadOnly(AValue : Boolean);
+procedure TCustomSQLQuery.SetReadOnly(AValue : Boolean);
 
 begin
   CheckInactive;
@@ -1186,7 +1239,7 @@ begin
   else FReadOnly := True;
 end;
 
-procedure TSQLQuery.SetParseSQL(AValue : Boolean);
+procedure TCustomSQLQuery.SetParseSQL(AValue : Boolean);
 
 begin
   CheckInactive;
@@ -1200,7 +1253,7 @@ begin
     FParseSQL := True;
 end;
 
-procedure TSQLQuery.SetUsePrimaryKeyAsKey(AValue : Boolean);
+procedure TCustomSQLQuery.SetUsePrimaryKeyAsKey(AValue : Boolean);
 
 begin
   if not Active then FusePrimaryKeyAsKey := AValue
@@ -1211,14 +1264,14 @@ begin
     end;
 end;
 
-Procedure TSQLQuery.UpdateIndexDefs;
+Procedure TCustomSQLQuery.UpdateIndexDefs;
 
 begin
   if assigned(DataBase) then
     (DataBase as TSQLConnection).UpdateIndexDefs(FIndexDefs,FTableName);
 end;
 
-Procedure TSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
+Procedure TCustomSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
 
   procedure UpdateWherePart(var sql_where : string;x : integer);
 
@@ -1294,7 +1347,7 @@ Procedure TSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
     result := 'delete from ' + FTableName + ' where ' + sql_where;
   end;
 
-var qry : tsqlquery;
+var qry : TCustomSQLQuery;
     x   : integer;
     Fld : TField;
     
@@ -1330,7 +1383,7 @@ begin
 end;
 
 
-Function TSQLQuery.GetCanModify: Boolean;
+Function TCustomSQLQuery.GetCanModify: Boolean;
 
 begin
   // the test for assigned(FCursor) is needed for the case that the dataset isn't opened
@@ -1340,25 +1393,25 @@ begin
     Result := False;
 end;
 
-function TSQLQuery.GetIndexDefs : TIndexDefs;
+function TCustomSQLQuery.GetIndexDefs : TIndexDefs;
 
 begin
   Result := FIndexDefs;
 end;
 
-procedure TSQLQuery.SetIndexDefs(AValue : TIndexDefs);
+procedure TCustomSQLQuery.SetIndexDefs(AValue : TIndexDefs);
 
 begin
   FIndexDefs := AValue;
 end;
 
-procedure TSQLQuery.SetUpdateMode(AValue : TUpdateMode);
+procedure TCustomSQLQuery.SetUpdateMode(AValue : TUpdateMode);
 
 begin
   FUpdateMode := AValue;
 end;
 
-procedure TSQLQuery.SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string);
+procedure TCustomSQLQuery.SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string);
 
 begin
   ReadOnly := True;
@@ -1366,20 +1419,20 @@ begin
   SQL.Add((DataBase as tsqlconnection).GetSchemaInfoSQL(SchemaType, SchemaObjectName, SchemaPattern));
 end;
 
-procedure TSQLQuery.LoadBlobIntoBuffer(FieldDef: TFieldDef;
+procedure TCustomSQLQuery.LoadBlobIntoBuffer(FieldDef: TFieldDef;
   ABlobBuf: PBufBlobField);
 begin
   (DataBase as tsqlconnection).LoadBlobIntoBuffer(FieldDef, ABlobBuf, FCursor,(Transaction as tsqltransaction));
 end;
 
-function TSQLQuery.GetStatementType : TStatementType;
+function TCustomSQLQuery.GetStatementType : TStatementType;
 
 begin
   if assigned(FCursor) then Result := FCursor.FStatementType
     else Result := stNone;
 end;
 
-Procedure TSQLQuery.SetDataSource(AVAlue : TDatasource);
+Procedure TCustomSQLQuery.SetDataSource(AVAlue : TDatasource);
 
 Var
   DS : TDatasource;
@@ -1388,6 +1441,8 @@ begin
   DS:=DataSource;
   If (AValue<>DS) then
     begin
+    If Assigned(AValue) and (AValue.Dataset=Self) then
+      DatabaseError(SErrCircularDataSourceReferenceNotAllowed,Self);
     If Assigned(DS) then
       DS.RemoveFreeNotification(Self);
     If Assigned(AValue) then
@@ -1401,7 +1456,7 @@ begin
     end;
 end;
 
-Function TSQLQuery.GetDataSource : TDatasource;
+Function TCustomSQLQuery.GetDataSource : TDatasource;
 
 begin
   If Assigned(FMasterLink) then
@@ -1410,7 +1465,7 @@ begin
     Result:=Nil;
 end;
 
-procedure TSQLQuery.Notification(AComponent: TComponent; Operation: TOperation); 
+procedure TCustomSQLQuery.Notification(AComponent: TComponent; Operation: TOperation); 
 
 begin
   Inherited;
@@ -1445,7 +1500,7 @@ constructor TSQLScript.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);
   FScript := TStringList.Create;
-  FQuery := TSQLQuery.Create(nil);
+  FQuery := TCustomSQLQuery.Create(nil);
 end;
 
 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
     SourceFilename: string;
     SourceLinenumber: Integer;
+    Visibility: TPasMemberVisibility;
+  public
     constructor Create(const AName: string; AParent: TPasElement); virtual;
     procedure AddRef;
     procedure Release;
@@ -90,7 +92,6 @@ type
     function GetModule: TPasModule;
     function ElementTypeName: string; virtual;
     function GetDeclaration(full : Boolean) : string; virtual;
-    Visibility: TPasMemberVisibility;
     property RefCount: LongWord read FRefCount;
     property Name: string read FName write FName;
     property Parent: TPasElement read FParent;
@@ -103,6 +104,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     procedure AddUnitToUsesList(const AUnitName: string);
+  public
     UsesList: TList;            // TPasUnresolvedTypeRef or TPasModule elements
     Declarations, ResStrings, Types, Consts, Classes,
       Functions, Variables: TList;
@@ -113,6 +115,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     InterfaceSection, ImplementationSection: TPasSection;
     PackageName: string;
   end;
@@ -122,6 +125,7 @@ type
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
+  public
     Modules: TList;     // List of TPasModule objects
   end;
 
@@ -129,6 +133,7 @@ type
   public
     function ElementTypeName: string; override;
     function GetDeclaration(full : Boolean) : string; Override;
+  public
     Value: string;
   end;
 
@@ -142,6 +147,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : Boolean): string; override;
+  public
     DestType: TPasType;
   end;
 
@@ -150,6 +156,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : Boolean): string; override;
+  public
     DestType: TPasType;
   end;
 
@@ -169,6 +176,7 @@ type
   public
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     RangeStart, RangeEnd: string;
   end;
 
@@ -177,6 +185,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     IndexRange : string;
     IsPacked : Boolean;          // 12/04/04 - Dave - Added
     ElType: TPasType;
@@ -187,12 +196,14 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     ElType: TPasType;
   end;
 
   TPasEnumValue = class(TPasElement)
   public
     function ElementTypeName: string; override;
+  public
     IsValueUsed: Boolean;
     Value: Integer;
     AssignedValue : string;
@@ -205,6 +216,7 @@ type
      function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
     Procedure GetEnumNames(Names : TStrings);
+  public
     Values: TList;      // List of TPasEnumValue objects
   end;
 
@@ -213,6 +225,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     EnumType: TPasType;
   end;
 
@@ -222,6 +235,7 @@ type
   public
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
+  public
     Values: TStringList;
     Members: TPasRecordType;
   end;
@@ -232,6 +246,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     IsPacked: Boolean;
     Members: TList;     // array of TPasVariable elements
     VariantName: string;
@@ -247,6 +262,7 @@ type
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
     function ElementTypeName: string; override;
+  public
     ObjKind: TPasObjKind;
     AncestorType: TPasType;     // TPasClassType or TPasUnresolvedTypeRef
     IsPacked: Boolean;        // 12/04/04 - Dave - Added
@@ -261,6 +277,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     Access: TArgumentAccess;
     ArgType: TPasType;
     Value: string;
@@ -272,11 +289,11 @@ type
     destructor Destroy; override;
     class function TypeName: string; virtual;
     function ElementTypeName: string; override;
-    IsOfObject: Boolean;
     function GetDeclaration(full : boolean) : string; override;
     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
   end;
 
@@ -284,6 +301,7 @@ type
   public
     destructor Destroy; override;
     function ElementTypeName : string; override;
+  public
     ResultType: TPasType;
   end;
 
@@ -293,6 +311,7 @@ type
     class function TypeName: string; override;
     function ElementTypeName: string; override;
     function GetDeclaration(Full : boolean) : string; override;
+  public
     ResultEl: TPasResultElement;
   end;
 
@@ -314,6 +333,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     VarType: TPasType;
     Value: string;
     Modifiers : string;
@@ -331,6 +351,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function GetDeclaration(full : boolean) : string; override;
+  public
     Args: TList;        // List of TPasArgument objects
     IndexValue, ReadAccessorName, WriteAccessorName,
       StoredAccessorName, DefaultValue: string;
@@ -348,6 +369,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function TypeName: string; override;
+  public
     Overloads: TList;           // List of TPasProcedure nodes
   end;
 
@@ -356,9 +378,10 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function TypeName: string; override;
-    ProcType: TPasProcedureType;
     function GetDeclaration(full: Boolean): string; override;
     procedure GetModifiers(List: TStrings);
+  public
+    ProcType: TPasProcedureType;
     IsVirtual, IsDynamic, IsAbstract, IsOverride,
       IsOverload, IsMessage, isReintroduced, isStatic: Boolean;
   end;
@@ -396,6 +419,7 @@ type
     destructor Destroy; override;
     function ElementTypeName: string; override;
     function TypeName: string; virtual;
+  public
     ProcType: TPasProcedureType;
     Locals: TList;
     Body: TPasImplBlock;
@@ -425,12 +449,14 @@ type
   public
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
+  public
     Commands: TStrings;
   end;
 
   TPasImplIfElse = class(TPasImplElement)
   public
     destructor Destroy; override;
+  public
     Condition: string;
     IfBranch, ElseBranch: TPasImplElement;
   end;
@@ -438,6 +464,7 @@ type
   TPasImplForLoop = class(TPasImplElement)
   public
     destructor Destroy; override;
+  public
     Variable: TPasVariable;
     StartValue, EndValue: string;
     Body: TPasImplElement;
@@ -452,6 +479,7 @@ type
     function AddIfElse(const ACondition: string): TPasImplIfElse;
     function AddForLoop(AVar: TPasVariable;
       const AStartValue, AEndValue: string): TPasImplForLoop;
+  public
     Elements: TList;    // TPasImplElement objects
   end;
 
@@ -473,6 +501,10 @@ implementation
 
 uses SysUtils;
 
+{$IFNDEF FPC}
+  const
+    LineEnding = sLineBreak;
+{$ENDIF}
 
 { Parse tree element type name functions }
 

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

@@ -37,8 +37,8 @@ type
     constructor Create(AStream: TStream);
     destructor Destroy; override;
     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 WriteType(AType: TPasType);
@@ -60,8 +60,8 @@ type
   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
     function CreateElement(AClass: TPTreeElement; const AName: String;
       AParent: TPasElement; const ASourceFilename: String;
-      ASourceLinenumber: Integer): TPasElement;
+      ASourceLinenumber: Integer): TPasElement;overload;
     function CreateElement(AClass: TPTreeElement; const AName: String;
       AParent: TPasElement; AVisibility: TPasMemberVisibility;
-      const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
+      const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;overload;
       virtual; abstract;
     function CreateFunctionType(const AName, AResultName: String; AParent: TPasElement;
       UseParentAsResultParent: Boolean; const ASourceFilename: String;
@@ -105,9 +105,9 @@ type
     procedure ParseExc(const Msg: String);
   protected
     function CreateElement(AClass: TPTreeElement; const AName: String;
-      AParent: TPasElement): TPasElement;
+      AParent: TPasElement): TPasElement;overload;
     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;
   public
     Options : set of TPOptions;
@@ -120,8 +120,8 @@ type
     procedure ExpectToken(tk: TToken);
     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;
     procedure ParseArrayType(Element: TPasArrayType);
     procedure ParseFileType(Element: TPasFileType);
@@ -136,9 +136,9 @@ type
     function ParseConstDecl(Parent: TPasElement): TPasConst;
     function ParseResourcestringDecl(Parent: TPasElement): TPasResString;
     function ParseTypeDecl(Parent: TPasElement): TPasType;
-    procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList);
+    procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList);overload;
     procedure ParseInlineVarDecl(Parent: TPasElement; VarList: TList;
-      AVisibility : TPasMemberVisibility; ClosingBrace: Boolean);
+      AVisibility : TPasMemberVisibility; ClosingBrace: Boolean);overload;
     procedure ParseVarDecl(Parent: TPasElement; List: TList);
     procedure ParseArgList(Parent: TPasElement; Args: TList; EndToken: TToken);
     procedure ParseProcedureOrFunctionHeader(Parent: TPasElement;

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

@@ -194,8 +194,8 @@ type
 
     function GetCurColumn: Integer;
   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;
   public
     Options : set of TPOptions;

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

@@ -13,6 +13,16 @@ begin
    fPath := '';
 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);
 begin
 	if not OpenKey(fPath+Section,true) then Exit;

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

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

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

@@ -115,12 +115,14 @@ Type
     FEmail : String;
     FAdministrator : String;
     FOutput : TStream;
+    FHandleGetOnPost : Boolean;
     Procedure InitRequestVars;
     Function GetEmail : String;
     Function GetAdministrator : String;
     Function GetRequestVariable(Const VarName : String) : String;
     Function GetRequestVariableCount : Integer;
   Public
+    constructor Create(AOwner: TComponent); override;
     Destructor Destroy; override;
     Property Request : TCGIRequest read FRequest;
     Property Response: TCGIResponse Read FResponse;
@@ -139,6 +141,7 @@ Type
     Function UploadedFileName(Const VarName : String) : String;
     Property Email : String Read GetEmail Write FEmail;
     Property Administrator : String Read GetAdministrator Write FAdministrator;
+    Property HandleGetOnPost : Boolean Read FHandleGetOnPost Write FHandleGetOnPost;
     Property RequestVariables[VarName : String] : String Read GetRequestVariable;
     Property RequestVariableCount : Integer Read GetRequestVariableCount;
   end;
@@ -354,7 +357,11 @@ begin
     Raise Exception.Create(SErrNoRequestMethod);
   FRequest.InitFromEnvironment;
   if CompareText(R,'POST')=0 then
-    Request.InitPostVars
+    begin
+    Request.InitPostVars;
+    if FHandleGetOnPost then
+      Request.InitGetVars;
+    end
   else if CompareText(R,'GET')=0 then
     Request.InitGetVars
   else
@@ -407,13 +414,15 @@ begin
       I.Free;
     end;
     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
         CopyFrom(M,0);
         M.Position:=0;
       Finally
         Free;
-      end;
+      end;}
     CT:=ContentType;
     if Pos('MULTIPART/FORM-DATA',Uppercase(CT))<>0 then
       ProcessMultiPart(M,CT)
@@ -470,6 +479,12 @@ begin
     Result:=0;
 end;
 
+constructor TCustomCGIApplication.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FHandleGetOnPost := True;
+end;
+
 Procedure TCustomCGIApplication.AddResponse(Const S : String);
 
 Var

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

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

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

@@ -46,6 +46,27 @@ type
   TWriterEvent = procedure (Sender:THTMLContentProducer; aWriter : THTMLWriter) 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 = class (THTMLContentProducer)
@@ -471,5 +492,21 @@ begin
     FOnGetContent(Self,ARequest,HTMLPage,Handled);
 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.
 

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

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

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

@@ -678,7 +678,7 @@ begin
       if TXMLReader(FReader).FXML11 then
         Result := #10;
   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
     DecodingError('Invalid character');
 end;
@@ -812,7 +812,7 @@ function TISO8859_1Decoder.DecodeNext: WideChar;
 begin
   with FSource do
   begin
-    Result := WideChar(FBuf[0]);
+    Result := WideChar(ord(FBuf[0]));
     Inc(FBuf);
   end;
 end;
@@ -862,7 +862,7 @@ var
 begin
   with FSource do
   begin
-    Result := WideChar(FBuf[0]);
+    Result := WideChar(byte(FBuf[0]));
     Inc(FBuf);
     if Result < #$80 then
       Exit;
@@ -1099,7 +1099,7 @@ var
 begin
   for I := 1 to Length(s) do
   begin
-    if FCurChar <> WideChar(s[i]) then
+    if FCurChar <> WideChar(ord(s[i])) then
       FatalError('Expected "%s"', [s]);
     GetChar;
   end;
@@ -1115,7 +1115,7 @@ end;
 procedure TXMLReader.SkipString(const ValidChars: TSetOfChar);
 begin
   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
     BufAppend(FValue, FCurChar);
     GetChar;
@@ -1647,7 +1647,7 @@ begin
     for I := 0 to FValue.Length-1 do
     begin
       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);
       if (wc = #10) or (wc = #13) then
         FValue.Buffer[I] := #32;

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

@@ -305,7 +305,7 @@ begin
   EndPos := 1;
   while EndPos <= Length(s) do
   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
       wrtChars(@s[StartPos], EndPos - StartPos);
       SpecialCharCallback(s[EndPos]);