소스 검색

Merged revisions 3109,3111,3120,3123,3126,3138,3149,3155-3156,3162,3169,3172-3173,3187,3209-3210,3215 via svnmerge from
http://[email protected]/svn/fpc/trunk

........
r3109 | joost | 2006-04-01 16:58:11 +0200 (Sat, 01 Apr 2006) | 2 lines

+ added check for empty dataset to TDataset.Delete
+ Updated comment regarding bookmarks and appending records
........
r3111 | joost | 2006-04-01 18:03:41 +0200 (Sat, 01 Apr 2006) | 1 line

+ Replaced the array-based record-buffer for a linked-list buffer
........
r3120 | michael | 2006-04-02 10:24:31 +0200 (Sun, 02 Apr 2006) | 1 line

+ Initial support for Master/Detail relations
........
r3123 | joost | 2006-04-02 20:34:25 +0200 (Sun, 02 Apr 2006) | 2 lines

+ re-implemented RecNo and Recordcount
+ fix in the result of GetNextPacket
........
r3126 | joost | 2006-04-02 21:31:28 +0200 (Sun, 02 Apr 2006) | 1 line

+ removed obsolete deleted-flag
........
r3138 | joost | 2006-04-04 00:21:12 +0200 (Tue, 04 Apr 2006) | 3 lines

* re-implemented cancelupdates
* Delete now also works on edited and inserted records
* Clearbuffers now also initialises/empties the ActiveBuffer
........
r3149 | joost | 2006-04-05 12:35:12 +0200 (Wed, 05 Apr 2006) | 1 line

+ Fix a leak of connections
........
r3155 | michael | 2006-04-05 21:54:29 +0200 (Wed, 05 Apr 2006) | 1 line

+ Renamed msgintf to dbugmsg to avoid conflict with Lazarus msgintf
........
r3156 | michael | 2006-04-05 21:55:34 +0200 (Wed, 05 Apr 2006) | 1 line

Library initialized only if not done before
........
r3162 | vincents | 2006-04-07 12:12:27 +0200 (Fri, 07 Apr 2006) | 1 line

* regenerated for i386-darwin support
........
r3169 | michael | 2006-04-08 14:35:19 +0200 (Sat, 08 Apr 2006) | 1 line

+ Added support for NEWDECIMAL from MySQL 5
........
r3172 | michael | 2006-04-08 16:40:59 +0200 (Sat, 08 Apr 2006) | 1 line

Patch from IvankoB on Yandex.Ru to add support for REINTRODUCE, DEPRECATED, STATIC, OVERRIDE, MESSAGE modifiers
........
r3173 | michael | 2006-04-08 16:42:22 +0200 (Sat, 08 Apr 2006) | 1 line

Patch from IvankoB on Yandex.Ru to add support for REINTRODUCE, DEPRECATED, STATIC, OVERRIDE, MESSAGE modifiers
........
r3187 | michael | 2006-04-09 21:28:36 +0200 (Sun, 09 Apr 2006) | 1 line

+ Patch from Luiz Americo to map unknown field types to string
........
r3209 | joost | 2006-04-14 21:47:10 +0200 (Fri, 14 Apr 2006) | 3 lines

+ fix for InternalgotoBookmark
+ Changed ProviderFlags to published
+ Implemented Locate
........
r3210 | joost | 2006-04-14 21:54:52 +0200 (Fri, 14 Apr 2006) | 1 line

+ moved InternalInitRecord from Clearbuffers to Resync
........
r3215 | joost | 2006-04-15 19:04:41 +0200 (Sat, 15 Apr 2006) | 6 lines

+ Commented out Debug-procedure DumpMem
+ implemented TField.Text
+ fixed TField.CanModify
+ implemented TDataset.CheckBiDirectional
+ Fixed TDataset.FilterOptions
+ implemented TDataset.SetFound
........

git-svn-id: branches/fixes_2_0@3263 -

peter 19 년 전
부모
커밋
e119addb4a

+ 1 - 1
.gitattributes

@@ -759,6 +759,7 @@ fcl/inc/cgiapp.pp svneol=native#text/plain
 fcl/inc/contnrs.pp svneol=native#text/plain
 fcl/inc/custapp.pp svneol=native#text/plain
 fcl/inc/dbugintf.pp svneol=native#text/plain
+fcl/inc/dbugmsg.pp svneol=native#text/plain
 fcl/inc/eventlog.pp svneol=native#text/plain
 fcl/inc/ezcgi.pp svneol=native#text/plain
 fcl/inc/felog.inc svneol=native#text/plain
@@ -767,7 +768,6 @@ fcl/inc/gettext.pp svneol=native#text/plain
 fcl/inc/idea.pp svneol=native#text/plain
 fcl/inc/inifiles.pp svneol=native#text/plain
 fcl/inc/iostream.pp svneol=native#text/plain
-fcl/inc/msgintf.pp svneol=native#text/plain
 fcl/inc/pipes.pp svneol=native#text/plain
 fcl/inc/process.pp svneol=native#text/plain
 fcl/inc/process.txt svneol=native#text/plain

+ 35 - 36
fcl/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/02/13]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/04/18]
 #
 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 m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-solaris x86_64-linux x86_64-freebsd x86_64-win64 arm-linux arm-palmos arm-wince powerpc64-linux
@@ -350,28 +350,28 @@ ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_DIRS+=xml image db shedit passrc net fpcunit
 endif
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process fileinfo resolve ssockets syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  resolve ssockets
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
@@ -380,13 +380,13 @@ ifeq ($(FULL_TARGET),i386-netware)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  resolve ssockets
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  resolve ssockets
@@ -398,16 +398,16 @@ ifeq ($(FULL_TARGET),i386-netwlibc)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  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 xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process fileinfo resolve ssockets syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
@@ -416,55 +416,55 @@ ifeq ($(FULL_TARGET),m68k-atari)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process fileinfo resolve ssockets syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
+override TARGET_UNITS+=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp wformat whtml wtex rttiutils bufstream streamex  process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_RSTS+=ssockets cachecls resolve custapp cgiapp eventlog registry simpleipc
@@ -1840,12 +1840,17 @@ 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
@@ -2738,14 +2743,15 @@ override FPCOPT+=-gl
 override FPCOPTDEF+=DEBUG
 endif
 ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
 ifeq ($(CPU_TARGET),i386)
 FPCCPUOPT:=-OG2p3
-else
+endif
 ifeq ($(CPU_TARGET),powerpc)
 FPCCPUOPT:=-O1r
-else
-FPCCPUOPT:=
 endif
+else
+FPCCPUOPT:=-O2
 endif
 override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
 override FPCOPTDEF+=RELEASE
@@ -2754,9 +2760,7 @@ ifdef STRIP
 override FPCOPT+=-Xs
 endif
 ifdef OPTIMIZE
-ifeq ($(CPU_TARGET),i386)
-override FPCOPT+=-OG2p3
-endif
+override FPCOPT+=-O2
 endif
 ifdef VERBOSE
 override FPCOPT+=-vwni
@@ -2800,11 +2804,6 @@ override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
 override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
 endif
 endif
-ifeq ($(OS_TARGET),linux)
-ifeq ($(FPC_VERSION),1.0.6)
-override FPCOPTDEF+=HASUNIX
-endif
-endif
 ifdef CREATESHARED
 override FPCOPT+=-Cg
 ifeq ($(CPU_TARGET),i386)
@@ -4131,4 +4130,4 @@ ifneq ($(wildcard fpcmake.loc),)
 include fpcmake.loc
 endif
 xmlreg.pp: avl_tree$(PPUEXT) xml inc/xmlreg.pp
-dbugintf$(PPUEXT): msgintf.pp simpleipc.pp
+dbugintf$(PPUEXT): dbugmsg.pp simpleipc.pp

+ 9 - 9
fcl/Makefile.fpc

@@ -28,14 +28,14 @@ dirs=xml image db shedit passrc net fpcunit
 units=contnrs inifiles ezcgi pipes rtfpars idea base64 gettext \
       iostream zstream cachecls avl_tree xmlreg registry eventlog custapp cgiapp \
       wformat whtml wtex rttiutils bufstream streamex
-units_freebsd=process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
-units_darwin=process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
-units_solaris=process ssockets resolve fpasync syncobjs simpleipc msgintf dbugintf
-units_netbsd=process ssockets resolve fpasync simpleipc msgintf dbugintf
-units_openbsd=process ssockets resolve fpasync simpleipc msgintf dbugintf
-units_linux=process resolve ssockets fpasync syncobjs simpleipc msgintf dbugintf
-units_win32=process fileinfo resolve ssockets syncobjs simpleipc msgintf dbugintf
-units_wince=process fileinfo resolve ssockets syncobjs simpleipc msgintf dbugintf
+units_freebsd=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
+units_darwin=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
+units_solaris=process ssockets resolve fpasync syncobjs simpleipc dbugmsg dbugintf
+units_netbsd=process ssockets resolve fpasync simpleipc dbugmsg dbugintf
+units_openbsd=process ssockets resolve fpasync simpleipc dbugmsg dbugintf
+units_linux=process resolve ssockets fpasync syncobjs simpleipc dbugmsg dbugintf
+units_win32=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
+units_wince=process fileinfo resolve ssockets syncobjs simpleipc dbugmsg dbugintf
 units_os2=resolve ssockets
 units_emx=resolve ssockets
 units_netware=resolve ssockets
@@ -67,4 +67,4 @@ fpcdir=..
 # xmlreg needs the XML units, XML units depend on avl_tree
 xmlreg.pp: avl_tree$(PPUEXT) xml inc/xmlreg.pp
 
-dbugintf$(PPUEXT): msgintf.pp simpleipc.pp
+dbugintf$(PPUEXT): dbugmsg.pp simpleipc.pp

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 318 - 370
fcl/db/bufdataset.inc


+ 20 - 7
fcl/db/dataset.inc

@@ -991,10 +991,17 @@ begin
   //!! To be implemented
 end;
 
+Procedure TDataset.CheckBiDirectional;
+
+begin
+  if FIsUniDirectional then DataBaseError(SUniDirectional);
+end;
+
 Procedure TDataset.SetFilterOptions(Value: TFilterOptions);
 
 begin
-  //!! To be implemented
+  CheckBiDirectional;
+  FFilterOptions := Value;
 end;
 
 Procedure TDataset.SetFilterText(const Value: string);
@@ -1012,7 +1019,7 @@ end;
 Procedure TDataset.SetFound(const Value: Boolean);
 
 begin
-  //!! To be implemented
+  FFound := Value;
 end;
 
 Procedure TDataset.SetModified(Value: Boolean);
@@ -1054,7 +1061,8 @@ end;
 Procedure TDataset.SetOnFilterRecord(const Value: TFilterRecordEvent);
 
 begin
-  //!! To be implemented
+  CheckBiDirectional;
+  FOnFilterRecord := Value;
 end;
 
 Procedure TDataset.SetRecNo(Value: Longint);
@@ -1209,10 +1217,11 @@ end;
 
 Procedure TDataset.Delete;
 
-
 begin
   If Not CanModify then
     DatabaseError(SDatasetReadOnly,Self);
+  If IsEmpty then
+    DatabaseError(SDatasetEmpty,Self);
   if State in [dsInsert] then
   begin
     Cancel;
@@ -1296,6 +1305,9 @@ Procedure TDataset.DoInsertAppend(DoAppend : Boolean);
     fBOF := false;
     // 29:01:05, JvdS: Why is this here?!? It can result in records with the same bookmark-data?
     // I would say that the 'internalinsert' should do this. But I don't know how Tdbf handles it
+
+    // 1-apr-06, JvdS: It just sets the bookmark of the newly inserted record to the place
+    // where the record should be inserted. So it is ok.
     if FRecordcount > 0 then
       SetBookMarkData(ActiveBuffer,pointer(BookBeforeInsert));
     end;
@@ -1633,7 +1645,7 @@ Var
   Function ScrollBackward : Integer;
 
   begin
-    if FIsUniDirectional then DatabaseError(SUniDirectional);
+    CheckBiDirectional;
     Result:=0;
 {$ifdef dsdebug}
     Writeln('Scrolling backward:',Abs(Distance));
@@ -1806,6 +1818,8 @@ begin
 {$endif}
       // nothing found, invalidate buffer and bail out.
       ClearBuffers;
+      // Make sure that the active record is 'empty', ie: that all fields are null
+      InternalInitRecord(ActiveBuffer);
       DataEvent(deDatasetChange,0);
       exit;
       end;
@@ -1983,8 +1997,7 @@ end;
 Function TDataset.Locate(const keyfields: string; const keyvalues: Variant; options: TLocateOptions) : boolean;
 
 begin
-  if fIsUnidirectional then
-    DataBaseError(SUniDirectional);
+  CheckBiDirectional;
   Result := False;
 end;
 

+ 117 - 16
fcl/db/datasource.inc

@@ -163,7 +163,10 @@ end;
 Function TDatalink.GetDataSet : TDataset;
 
 begin
-  Result:=FDataSource.DataSet
+  If Assigned(Datasource) then
+    Result:=DataSource.DataSet
+  else
+    Result:=Nil;  
 end;
 
 
@@ -329,8 +332,8 @@ constructor TMasterDataLink.Create(ADataSet: TDataSet);
 
 begin
   inherited Create;
-  FDataSet := ADataSet;
-  FFields := TList.Create;
+  FDetailDataSet:=ADataSet;
+  FFields:=TList.Create;
 end;
 
 
@@ -353,26 +356,25 @@ begin
     FFields.Clear;
     raise;
   end;
-  if FDataSet.Active and not (csDestroying in FDataSet.ComponentState) then
+  if FDetailDataSet.Active and not (csDestroying in FDetailDataSet.ComponentState) then
     if Active and (FFields.Count > 0) then
-    begin
-      if Assigned(FOnMasterChange) then FOnMasterChange(Self);
-    end else
-      if Assigned(FOnMasterDisable) then FOnMasterDisable(Self);
+      DoMasterChange
+    else
+      DoMasterDisable;  
 end;
 
 
 Procedure TMasterDataLink.CheckBrowseMode;
 
 begin
-  if FDataSet.Active then FDataSet.CheckBrowseMode;
+  if FDetailDataSet.Active then FDetailDataSet.CheckBrowseMode;
 end;
 
 
 Function TMasterDataLink.GetDetailDataSet: TDataSet;
 
 begin
-  Result := FDataSet;
+  Result := FDetailDataSet;
 end;
 
 
@@ -386,23 +388,122 @@ end;
 Procedure TMasterDataLink.RecordChanged(Field: TField);
 
 begin
-  if (DataSource.State <> dsSetKey) and FDataSet.Active and
+  if (DataSource.State <> dsSetKey) and FDetailDataSet.Active and
      (FFields.Count > 0) and ((Field = nil) or
-     (FFields.IndexOf(Field) >= 0)) and
-     Assigned(FOnMasterChange) then
-    FOnMasterChange(Self);
+     (FFields.IndexOf(Field) >= 0)) then
+    DoMasterChange;  
 end;
 
 procedure TMasterDatalink.SetFieldNames(const Value: string);
 
 begin
   if FFieldNames <> Value then
-  begin
+    begin
     FFieldNames := Value;
     ActiveChanged;
-  end;
+    end;
+end;
+
+Procedure TMasterDataLink.DoMasterDisable; 
+
+begin
+  if Assigned(FOnMasterDisable) then 
+    FOnMasterDisable(Self);
+end;
+
+Procedure TMasterDataLink.DoMasterChange; 
+
+begin
+  If Assigned(FOnMasterChange) then
+    FOnMasterChange(Self);
+end;
+
+{ ---------------------------------------------------------------------
+    TMasterDataLink
+  ---------------------------------------------------------------------}
+
+constructor TMasterParamsDataLink.Create(ADataSet: TDataSet);
+
+Var
+  P : TParams;
+
+begin
+  inherited Create(ADataset);
+  If (ADataset<>Nil) then
+    begin
+    P:=TParams(GetObjectProp(ADataset,'Params',TParams));
+    if (P<>Nil) then
+      Params:=P;
+    end;  
+end;
+
+
+Procedure TMasterParamsDataLink.SetParams(AVAlue : TParams);  
+
+Var
+  N : String;
+
+begin
+  N:=DetailDataset.Name;
+  FParams:=AValue;
+  If (AValue<>Nil) then
+    RefreshParamNames;
 end;
 
+Procedure TMasterParamsDataLink.RefreshParamNames; 
+
+Var
+  FN : String;
+  DS : TDataset;
+  F  : TField;
+  I : Integer;
+
+begin
+  FN:='';
+  DS:=Dataset;
+  If Assigned(FParams) then
+    begin
+    F:=Nil;
+    For I:=0 to FParams.Count-1 do
+      begin
+      If Assigned(DS) then
+        F:=DS.FindField(FParams[i].Name);
+      If (Not Assigned(DS)) or (F<>Nil) then
+        begin
+        If (FN<>'') then
+          FN:=FN+';';
+        FN:=FN+FParams[i].Name; 
+        end;
+      end;
+    end;
+  FieldNames:=FN;  
+end;
+
+Procedure TMasterParamsDataLink.CopyParamsFromMaster(CopyBound : Boolean);
+
+begin
+  if Assigned(FParams) then
+    FParams.CopyParamValuesFromDataset(Dataset,CopyBound);
+end;
+
+Procedure TMasterParamsDataLink.DoMasterDisable; 
+
+begin
+  Inherited;
+  If Assigned(DetailDataset) and DetailDataset.Active then
+    DetailDataset.Close;
+end;
+
+Procedure TMasterParamsDataLink.DoMasterChange; 
+
+begin
+  Inherited;
+  if Assigned(Params) and Assigned(DetailDataset) and DetailDataset.Active then
+    begin
+    DetailDataset.Close;
+    DetailDataset.Open;
+    end;
+end;
 
 { ---------------------------------------------------------------------
     TDatasource

+ 44 - 34
fcl/db/db.pp

@@ -218,7 +218,6 @@ type
     FAlignMent : TAlignment;
     FAttributeSet : String;
     FCalculated : Boolean;
-    FCanModify : Boolean;
     FConstraintErrorMessage : String;
     FCustomConstraint : String;
     FDataSet : TDataSet;
@@ -227,7 +226,6 @@ type
     FDefaultExpression : String;
     FDisplayLabel : String;
     FDisplayWidth : Longint;
-    FEditText : String;
     FFieldKind : TFieldKind;
     FFieldName : String;
     FFieldNo : Longint;
@@ -260,6 +258,8 @@ type
     procedure SetIndex(AValue: Integer);
     Procedure SetDataset(AValue : TDataset);
     function GetDisplayText: String;
+    function GetEditText: String;
+    procedure SetEditText(const AValue: string);
     procedure SetDisplayLabel(const AValue: string);
     procedure SetDisplayWidth(const AValue: Longint);
     function GetDisplayWidth: integer;
@@ -337,7 +337,7 @@ type
     property AsVariant: variant read GetAsVariant write SetAsVariant;
     property AttributeSet: string read FAttributeSet write FAttributeSet;
     property Calculated: Boolean read FCalculated write FCalculated;
-    property CanModify: Boolean read FCanModify;
+    property CanModify: Boolean read GetCanModify;
     property CurValue: Variant read GetCurValue;
     property DataSet: TDataSet read FDataSet write SetDataSet;
     property DataSize: Word read GetDataSize;
@@ -350,11 +350,10 @@ type
     property NewValue: Variant read GetNewValue write SetNewValue;
     property Offset: word read FOffset;
     property Size: Word read FSize write FSize;
-    property Text: string read FEditText write FEditText;
+    property Text: string read GetEditText write SetEditText;
     property ValidChars : TFieldChars Read FValidChars;
     property Value: variant read GetAsVariant write SetAsVariant;
     property OldValue: variant read GetOldValue;
-    property ProviderFlags : TProviderFlags read FProviderFlags write FProviderFlags;
     property LookupList: TLookupList read GetLookupList;
   published
     property AlignMent : TAlignMent Read FAlignMent write SetAlignment default taLeftJustify;
@@ -374,6 +373,7 @@ type
     property KeyFields: string read FKeyFields write FKeyFields;
     property LookupCache: Boolean read FLookupCache write FLookupCache;
     property Origin: string read FOrigin write FOrigin;
+    property ProviderFlags : TProviderFlags read FProviderFlags write FProviderFlags;
     property ReadOnly: Boolean read FReadOnly write SetReadOnly;
     property Required: Boolean read FRequired write FRequired;
     property Visible: Boolean read FVisible write SetVisible default True;
@@ -985,6 +985,7 @@ type
     procedure CalculateFields(Buffer: PChar); virtual;
     procedure CheckActive; virtual;
     procedure CheckInactive; virtual;
+    procedure CheckBiDirectional;
     procedure Loaded; override;
     procedure ClearBuffers; virtual;
     procedure ClearCalcFields(Buffer: PChar); virtual;
@@ -1166,7 +1167,7 @@ type
     property FieldValues[fieldname : string] : Variant read GetFieldValues write SetFieldValues; default;
     property Filter: string read FFilterText write SetFilterText;
     property Filtered: Boolean read FFiltered write SetFiltered default False;
-    property FilterOptions: TFilterOptions read FFilterOptions write FFilterOptions;
+    property FilterOptions: TFilterOptions read FFilterOptions write SetFilterOptions;
     property Active: Boolean read GetActive write SetActive default False;
     property AutoCalcFields: Boolean read FAutoCalcFields write FAutoCalcFields;
     property BeforeOpen: TDataSetNotifyEvent read FBeforeOpen write FBeforeOpen;
@@ -1265,7 +1266,7 @@ type
 
   TMasterDataLink = class(TDetailDataLink)
   private
-    FDataSet: TDataSet;
+    FDetailDataSet: TDataSet;
     FFieldNames: string;
     FFields: TList;
     FOnMasterChange: TNotifyEvent;
@@ -1277,8 +1278,10 @@ type
     function GetDetailDataSet: TDataSet; override;
     procedure LayoutChanged; override;
     procedure RecordChanged(Field: TField); override;
+    Procedure DoMasterDisable; virtual;
+    Procedure DoMasterChange; virtual;
   public
-    constructor Create(ADataSet: TDataSet);
+    constructor Create(ADataSet: TDataSet);virtual;
     destructor Destroy; override;
     property FieldNames: string read FFieldNames write SetFieldNames;
     property Fields: TList read FFields;
@@ -1470,52 +1473,46 @@ type
 
   { TBufDataset }
 
+  PBufRecLinkItem = ^TBufRecLinkItem;
+  TBufRecLinkItem = record
+    prior   : PBufRecLinkItem;
+    next    : PBufRecLinkItem;
+  end;
+
   PBufBookmark = ^TBufBookmark;
   TBufBookmark = record
-    BookmarkData : integer;
+    BookmarkData : PBufRecLinkItem;
     BookmarkFlag : TBookmarkFlag;
   end;
 
-  PFieldUpdateBuffer = ^TFieldUpdateBuffer;
-  TFieldUpdateBuffer = record
-    FieldNo      : integer;
-    NewValue     : pointer;
-    IsNull       : boolean;
-  end;
-
-  TFieldsUpdateBuffer = array of TFieldUpdateBuffer;
-
   PRecUpdateBuffer = ^TRecUpdateBuffer;
   TRecUpdateBuffer = record
-    RecordNo           : integer;
-    FieldsUpdateBuffer : TFieldsUpdateBuffer;
     UpdateKind         : TUpdateKind;
+    BookmarkData       : pointer;
+    OldValuesBuffer    : pchar;
   end;
 
   TRecordsUpdateBuffer = array of TRecUpdateBuffer;
 
   TBufDataset = class(TDBDataSet)
   private
-    FBBuffers       : TBufferArray;
+    FCurrentRecBuf  : PBufRecLinkItem;
+    FLastRecBuf     : PBufRecLinkItem;
+    FFirstRecBuf    : PBufRecLinkItem;
     FBRecordCount   : integer;
-    FBBufferCount   : integer;
-    FBCurrentRecord : integer;
-    FIsEOF          : boolean;
-    FIsBOF          : boolean;
+
     FPacketRecords  : integer;
     FRecordSize     : Integer;
     FNullmaskSize   : byte;
     FOpen           : Boolean;
     FUpdateBuffer   : TRecordsUpdateBuffer;
-    FEditBuf        : PRecUpdateBuffer;
-    FApplyingUpdates: boolean;
-    FBDeletedRecords: integer;
+    FCurrentUpdateBuffer : integer;
+
     FFieldBufPositions : array of longint;
     procedure CalcRecordSize;
     function LoadBuffer(Buffer : PChar): TGetResult;
     function GetFieldSize(FieldDef : TFieldDef) : longint;
-    function GetRecordUpdateBuffer(rno : integer;var RecUpdBuf : PRecUpdateBuffer) : boolean;
-    function GetFieldUpdateBuffer(fieldno : integer;RecUpdBuf : PRecUpdateBuffer;var FieldUpdBuf : pFieldUpdateBuffer) : boolean;
+    function GetRecordUpdateBuffer : boolean;
     procedure SetPacketRecords(aValue : integer);
     function  IntAllocRecordBuffer: PChar;
   protected
@@ -1531,9 +1528,6 @@ type
     function getnextpacket : integer;
     function GetRecordSize: Word; override;
     procedure InternalPost; override;
-    procedure InternalCancel; override;
-    procedure InternalEdit; override;
-    procedure InternalInsert; override;
     procedure InternalDelete; override;
     procedure InternalFirst; override;
     procedure InternalLast; override;
@@ -1629,6 +1623,7 @@ type
     Procedure AssignField(Field: TField);
     Procedure AssignToField(Field: TField);
     Procedure AssignFieldValue(Field: TField; const AValue: Variant);
+    procedure AssignFromField(Field : TField);
     Procedure Clear;
     Procedure GetData(Buffer: Pointer);
     Function  GetDataSize: Integer;
@@ -1692,11 +1687,26 @@ type
     Function  ParseSQL(SQL: String; DoCreate: Boolean; ParameterStyle : TParamStyle): String; overload;
     Function  ParseSQL(SQL: String; DoCreate: Boolean; ParameterStyle : TParamStyle; var ParamBinding: TParambinding): String; overload;
     Procedure RemoveParam(Value: TParam);
+    Procedure CopyParamValuesFromDataset(ADataset : TDataset; CopyBound : Boolean);
     Property Dataset : TDataset Read GetDataset;
     Property Items[Index: Integer] : TParam read GetItem write SetItem; default;
     Property ParamValues[const ParamName: string] : Variant read GetParamValue write SetParamValue;
   end;
 
+  TMasterParamsDataLink = Class(TMasterDataLink)
+  Private
+    FParams : TParams;
+    Procedure SetParams(AVAlue : TParams);  
+  Protected  
+    Procedure DoMasterDisable; override;
+    Procedure DoMasterChange; override;
+  Public
+    constructor Create(ADataSet: TDataSet); override;
+    Procedure RefreshParamNames; virtual;
+    Procedure CopyParamsFromMaster(CopyBound : Boolean); virtual;
+    Property Params : TParams Read FParams Write SetParams;  
+  end;
+
 const
   FieldTypetoVariantMap : array[TFieldType] of Integer = (varError, varOleStr, varSmallint,
     varInteger, varSmallint, varBoolean, varDouble, varCurrency, varCurrency,
@@ -1830,7 +1840,7 @@ Function DateTimeToDateTimeRec(DT: TFieldType; Data: TDateTime): TDateTimeRec;
 
 implementation
 
-uses dbconst;
+uses dbconst,typinfo;
 
 { ---------------------------------------------------------------------
     Auxiliary functions

+ 1 - 0
fcl/db/dbconst.pp

@@ -77,6 +77,7 @@ Const
   SUnsupportedFieldType    = 'Fieldtype %s is not supported';
   SInvPacketRecordsValue   = 'PacketRecords has to be larger then 0';
   SInvalidSearchFieldType  = 'Searching in fields of type %s is not supported';
+  SDatasetEmpty            = 'The dataset is empty';
 
 Implementation
 

+ 62 - 1
fcl/db/dsparams.inc

@@ -676,7 +676,7 @@ begin
   if Assigned(Field) then
     begin
     // Need TField.Value
-    // AssignFieldValue(Field,Field.Value);
+    AssignFieldValue(Field,Field.Value);
     Name:=Field.FieldName;
     end
   else
@@ -721,7 +721,46 @@ begin
     end;
 end;
 
+procedure TParam.AssignFromField(Field : TField);
+
+begin
+  if Assigned(Field) then
+    begin
+    FDataType:=Field.DataType;
+    case Field.DataType of
+      ftUnknown  : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);
+      // Need TField.AsSmallInt
+      ftSmallint : AsSmallint:=Field.AsInteger;
+      // Need TField.AsWord
+      ftWord     : AsWord:=Field.AsInteger;
+      ftInteger,
+      ftAutoInc  : AsInteger:=Field.AsInteger;
+      // Need TField.AsCurrency
+      ftCurrency : AsCurrency:=Field.asCurrency;
+      ftFloat    : AsFloat:=Field.asFloat;
+      ftBoolean  : AsBoolean:=Field.AsBoolean;
+      ftBlob,
+      ftGraphic..ftTypedBinary,
+      ftOraBlob,
+      ftOraClob,
+      ftString,
+      ftMemo,
+      ftAdt,
+      ftFixedChar: AsString:=Field.AsString;
+      ftTime,
+      ftDate,
+      ftDateTime : AsDateTime:=Field.AsDateTime;
+      ftBytes,
+      ftVarBytes : ; // Todo.
+    else
+      If not (DataType in [ftCursor, ftArray, ftDataset,ftReference]) then
+        DatabaseErrorFmt(SBadParamFieldType, [Name], DataSet);
+    end;
+    end;
+end;
+
 Procedure TParam.AssignFieldValue(Field: TField; const AValue: Variant);
+
 begin
   If Assigned(Field) then
     begin
@@ -917,3 +956,25 @@ begin
   end;
 end;
 
+
+Procedure TParams.CopyParamValuesFromDataset(ADataset : TDataset; CopyBound : Boolean);
+
+Var
+  I : Integer;
+  P : TParam;
+  F : TField;
+  
+begin
+  If (ADataSet<>Nil) then
+    For I:=0 to Count-1 do
+     begin
+     P:=Items[i];
+     if CopyBound or (not P.Bound) then
+       begin
+       F:=ADataset.FieldByName(P.Name);
+       P.AssignFromField(F);   
+       If Not CopyBound then
+         P.Bound:=False;
+       end;
+    end;
+end;

+ 19 - 2
fcl/db/fields.inc

@@ -13,7 +13,7 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
-Procedure DumpMem (P : Pointer;Size : Longint);
+{Procedure DumpMem (P : Pointer;Size : Longint);
 
 Var i : longint;
 
@@ -22,7 +22,7 @@ begin
   For I:=0 to Size-1 do
     Write (Pbyte(P)[i],' ');
   Writeln;
-end;
+end;}
 
 { ---------------------------------------------------------------------
     TFieldDef
@@ -879,6 +879,23 @@ end;
 
 // TField private methods
 
+procedure TField.SetEditText(const AValue: string);
+begin
+  if Assigned(OnSetText) then
+    OnSetText(Self, AValue)
+  else
+    SetText(AValue);
+end;
+
+function TField.GetEditText: String;
+begin
+  SetLength(Result, 0);
+  if Assigned(OnGetText) then
+    OnGetText(Self, Result, False)
+  else
+    GetText(Result, False);
+end;
+
 function TField.GetDisplayText: String;
 begin
   SetLength(Result, 0);

+ 30 - 7
fcl/db/sqldb/mysql/mysqlconn.inc

@@ -5,7 +5,7 @@
 interface
 
 uses
-  Classes, SysUtils,sqldb,db,
+  Classes, SysUtils,sqldb,db,dynlibs,
 {$IfDef mysql50}
   mysql50dyn;
   {$DEFINE TConnectionName:=TMySQL50Connection}
@@ -54,6 +54,7 @@ Type
     FHostInfo: String;
     FServerInfo: String;
     FMySQL : PMySQL;
+    FDidConnect : Boolean;
     function GetClientInfo: string;
     function GetServerStatus: String;
     procedure ConnectMySQL(var HMySQL : PMySQL;H,U,P : pchar);
@@ -150,11 +151,20 @@ end;
 
 function TConnectionName.GetClientInfo: string;
 
+Var
+  B : Boolean;
+
 begin
   // To make it possible to call this if there's no connection yet
-  InitialiseMysql;
-  Result:=strpas(mysql_get_client_info());
-  ReleaseMysql;
+  B:=(MysqlLibraryHandle=Nilhandle);
+  If B then
+    InitialiseMysql;
+  Try  
+    Result:=strpas(mysql_get_client_info());
+  Finally  
+    if B then
+      ReleaseMysql;
+  end;  
 end;
 
 function TConnectionName.GetServerStatus: String;
@@ -194,7 +204,9 @@ end;
 
 procedure TConnectionName.DoInternalConnect;
 begin
-  InitialiseMysql;
+  FDidConnect:=(MySQLLibraryHandle=NilHandle);
+  if FDidConnect then
+    InitialiseMysql;
 {$IFDEF mysql50}
   if copy(strpas(mysql_get_client_info()),1,3)<>'5.0' then
     Raise EInOutError.CreateFmt(SErrNotversion50,[strpas(mysql_get_client_info())]);
@@ -217,7 +229,8 @@ begin
   inherited DoInternalDisconnect;
   mysql_close(FMySQL);
   FMySQL:=Nil;
-  ReleaseMysql;
+  if FDidConnect then
+    ReleaseMysql;
 end;
 
 function TConnectionName.GetHandle: pointer;
@@ -260,7 +273,11 @@ end;
 
 procedure TConnectionName.UnPrepareStatement(cursor: TSQLCursor);
 begin
-  // not necessary
+  With Cursor as TCursorName do
+    begin
+    mysql_close(FQMySQL);
+    FQMysql := nil;
+    end;
 end;
 
 procedure TConnectionName.FreeFldBuffers(cursor: TSQLCursor);
@@ -321,6 +338,9 @@ begin
       NewType := ftInteger;
       NewSize := 0;
       end;
+{$ifdef mysql50}
+    FIELD_TYPE_NEWDECIMAL,
+{$endif}
     FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
       begin
       NewType := ftFloat;
@@ -534,6 +554,9 @@ begin
         VI := 0;
       Move(VI, Dest^, Result);
       end;
+{$ifdef mysql50}
+    FIELD_TYPE_NEWDECIMAL,
+{$endif}      
     FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
       begin
       Result := SizeOf(Double);

+ 50 - 2
fcl/db/sqldb/sqldb.pp

@@ -176,6 +176,7 @@ type
     FWhereStartPos       : integer;
     FWhereStopPos        : integer;
     FParseSQL            : boolean;
+    FMasterLink          : TMasterParamsDatalink;
 //    FSchemaInfo          : TSchemaInfo;
 
     procedure FreeFldBuffers;
@@ -211,6 +212,8 @@ type
     Procedure SetActive (Value : Boolean); override;
     procedure SetFiltered(Value: Boolean); override;
     procedure SetFilterText(const Value: string); override;
+    Function GetDataSource : TDatasource;
+    Procedure SetDataSource(AValue : TDatasource); 
   public
     procedure Prepare; virtual;
     procedure UnPrepare; virtual;
@@ -220,6 +223,7 @@ type
     procedure SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string); virtual;
     function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
     property Prepared : boolean read IsPrepared;
+    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
   published
     // redeclared data set properties
     property Active;
@@ -260,6 +264,7 @@ type
     property UsePrimaryKeyAsKey : boolean read FUsePrimaryKeyAsKey write SetUsePrimaryKeyAsKey;
     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;
   end;
 
@@ -545,8 +550,9 @@ begin
   UnPrepare;
   if (FSQL <> nil) then
     begin
-    if not assigned(FParams) then FParams := TParams.create(self);
     FParams.ParseSQL(FSQL.Text,True);
+    If Assigned(FMasterLink) then
+      FMasterLink.RefreshParamNames;
     end;
 end;
 
@@ -708,6 +714,8 @@ end;
 
 procedure TSQLQuery.Execute;
 begin
+  If (FParams.Count>0) and Assigned(FMasterLink) then
+    FMasterLink.CopyParamsFromMaster(False);
   (Database as tsqlconnection).execute(Fcursor,Transaction as tsqltransaction, FParams);
 end;
 
@@ -921,6 +929,7 @@ end;
 constructor TSQLQuery.Create(AOwner : TComponent);
 begin
   inherited Create(AOwner);
+  FParams := TParams.create(self);
   FSQL := TStringList.Create;
   FSQL.OnChange := @OnChangeSQL;
   FIndexDefs := TIndexDefs.Create(Self);
@@ -929,7 +938,6 @@ begin
 // Delphi has upWhereAll as default, but since strings and oldvalue's don't work yet
 // (variants) set it to upWhereKeyOnly
   FUpdateMode := upWhereKeyOnly;
-
   FUsePrimaryKeyAsKey := True;
 end;
 
@@ -938,6 +946,7 @@ begin
   if Active then Close;
   UnPrepare;
   if assigned(FCursor) then (Database as TSQLConnection).DeAllocateCursorHandle(FCursor);
+  FreeAndNil(FMasterLink);
   FreeAndNil(FParams);
   FreeAndNil(FSQL);
   FreeAndNil(FIndexDefs);
@@ -1134,4 +1143,43 @@ begin
     else Result := stNone;
 end;
 
+Procedure TSQLQuery.SetDataSource(AVAlue : TDatasource);
+
+Var
+  DS : TDatasource;
+
+begin
+  DS:=DataSource;
+  If (AValue<>DS) then
+    begin
+    If Assigned(DS) then
+      DS.RemoveFreeNotification(Self);
+    If Assigned(AValue) then
+      begin
+      AValue.FreeNotification(Self);  
+      FMasterLink:=TMasterParamsDataLink.Create(Self);
+      FMasterLink.Datasource:=AValue;
+      end
+    else
+      FreeAndNil(FMasterLink);  
+    end;
+end;
+
+Function TSQLQuery.GetDataSource : TDatasource;
+
+begin
+  If Assigned(FMasterLink) then
+    Result:=FMasterLink.DataSource
+  else
+    Result:=Nil;
+end;
+
+procedure TSQLQuery.Notification(AComponent: TComponent; Operation: TOperation); 
+
+begin
+  Inherited;
+  If (Operation=opRemove) and (AComponent=DataSource) then
+    DataSource:=Nil;
+end;
+
 end.

+ 2 - 1
fcl/db/sqlite/sqlite3ds.pas

@@ -166,7 +166,8 @@ begin
      FieldSize:=SizeOf(Word);
    end else
    begin
-     DatabaseError('Field type "'+ColumnStr+'" not recognized',Self);
+     AType:= ftString;
+     FieldSize:=0;
    end;
    FieldDefs.Add(StrPas(sqlite3_column_name(vm,i)), AType, FieldSize, False);
    {$ifdef DEBUG}

+ 1 - 1
fcl/inc/dbugintf.pp

@@ -51,7 +51,7 @@ ResourceString
 implementation
 
 Uses 
-  SysUtils, classes,msgintf, process, simpleipc;
+  SysUtils, classes,dbugmsg, process, simpleipc;
 
 Const
   DmtInformation = lctInformation;

+ 1 - 1
fcl/inc/msgintf.pp → fcl/inc/dbugmsg.pp

@@ -15,7 +15,7 @@
  **********************************************************************}
 {$mode objfpc}
 {$h+}
-unit msgintf;
+unit dbugmsg;
 
 interface
 

+ 3 - 1
fcl/passrc/pastree.pp

@@ -346,7 +346,7 @@ type
     function GetDeclaration(full: Boolean): string; override;
     procedure GetModifiers(List: TStrings);
     IsVirtual, IsDynamic, IsAbstract, IsOverride,
-      IsOverload, IsMessage: Boolean;
+      IsOverload, IsMessage, isReintroduced, isStatic: Boolean;
   end;
 
   TPasFunction = class(TPasProcedure)
@@ -1374,6 +1374,8 @@ begin
   DoAdd(IsOverride,' Override');
   DoAdd(IsAbstract,' Abstract');
   DoAdd(IsOverload,' Overload');
+  DoAdd(IsReintroduced,' Reintroduce');
+  DoAdd(IsStatic,' Static');
   DoAdd(IsMessage,' Message');
 end;
 

+ 5 - 0
fcl/passrc/paswrite.pp

@@ -303,6 +303,11 @@ begin
     wrt(' override;');
   if AProc.IsOverload then
     wrt(' overload;');
+  if AProc.IsReintroduced then
+    wrt(' reintroduce;');
+  if AProc.IsStatic then
+    wrt(' static;');
+
 
   // !!!: Not handled: Message, calling conventions
 

+ 198 - 89
fcl/passrc/pparser.pp

@@ -1421,16 +1421,41 @@ begin
  {       El['calling-conv'] := 'cdecl';}
         ExpectToken(tkSemicolon);
         end 
+      else if (Tok='PASCAL') then
+        begin
+{        El['calling-conv'] := 'pascal';}
+        ExpectToken(tkSemicolon);
+        end 
       else if (Tok='STDCALL') then
         begin
 {        El['calling-conv'] := 'stdcall';}
         ExpectToken(tkSemicolon);
         end 
+      else if (Tok='OLDFPCCALL') then
+        begin
+{        El['calling-conv'] := 'oldfpccall';}
+        ExpectToken(tkSemicolon);
+        end 
+      else if (Tok='EXTDECL') then
+        begin
+{        El['calling-conv'] := 'extdecl';}
+        ExpectToken(tkSemicolon);
+        end 
+      else if (Tok='REGISTER') then
+        begin
+{        El['calling-conv'] := 'register';}
+        ExpectToken(tkSemicolon);
+        end 
       else if (Tok='COMPILERPROC') then
         begin
 {      El['calling-conv'] := 'compilerproc';}
         ExpectToken(tkSemicolon);
         end
+      else if (Tok='VARARGS') then
+        begin
+{      'varargs': needs CDECL & EXTERNAL }
+        ExpectToken(tkSemicolon);
+        end
       else if (tok='DEPRECATED') then  
         begin
 {       El['calling-conv'] := 'deprecated';}
@@ -1445,6 +1470,10 @@ begin
         begin
         ExpectToken(tkSemicolon);
         end 
+      else if (tok='ASSEMBLER') then
+        begin
+        ExpectToken(tkSemicolon);
+        end 
       else if (UpperCase(CurTokenString) = 'EXTERNAL') then  
         repeat
           NextToken;
@@ -1482,116 +1511,184 @@ procedure TPasParser.ParseProperty(Element:TPasElement);
   begin
     ExpectIdentifier;
     Result := CurTokenString;
-    while True do
-    begin
+
+    while True do begin
       NextToken;
-      if CurToken = tkDot then
-      begin
+      if CurToken = tkDot then begin
         ExpectIdentifier;
         Result := Result + '.' + CurTokenString;
       end else
         break;
     end;
-    UngetToken;
+	
+    if CurToken = tkSquaredBraceOpen then begin
+      Result := Result + '[';
+      NextToken;
+      if CurToken in [tkIdentifier, tkNumber] then begin
+	Result := Result + CurTokenString;
+      end;
+      ExpectToken(tkSquaredBraceClose);
+      Result := Result + ']';
+    end else 
+      UngetToken;
+  
+//    writeln(Result);
+
   end;
 
 begin
+
   NextToken;
-  // !!!: Parse array properties correctly
-  if CurToken = tkSquaredBraceOpen then
-  begin
-  ParseArgList(Element, TPasProperty(Element).Args, tkSquaredBraceClose);
-  NextToken;
+// if array prop then parse [ arg1:type1;... ]  
+  if CurToken = tkSquaredBraceOpen then begin
+  // !!!: Parse array properties correctly  
+    ParseArgList(Element, TPasProperty(Element).Args, tkSquaredBraceClose);
+    NextToken;
   end;
 
-  if CurToken = tkColon then
-  begin
+  if CurToken = tkColon then begin
+// if ":prop_data_type" if supplied then read it  
   // read property type
-          TPasProperty(Element).VarType := ParseType(Element);
-  NextToken;
+    TPasProperty(Element).VarType := ParseType(Element);
+    NextToken;
   end;
-  if CurToken <> tkSemicolon then
-  begin
-  // read 'index' access modifier
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'INDEX') then
-          TPasProperty(Element).IndexValue := ParseExpression
-  else
-          UngetToken;
-  NextToken;
+
+  if CurToken <> tkSemicolon then begin
+//  if indexed prop then read the index value    
+    if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'INDEX') then
+//    read 'index' access modifier    
+      TPasProperty(Element).IndexValue := ParseExpression
+    else
+//    not indexed prop will be recheck for another token
+      UngetToken;
+
+    NextToken;
   end;
-  if CurToken <> tkSemicolon then
-  begin
-  // read 'read' access modifier
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'READ') then
-          TPasProperty(Element).ReadAccessorName := GetAccessorName
-  else
-          UngetToken;
-  NextToken;
+  
+// if the accessors list is not finished  
+  if CurToken <> tkSemicolon then begin
+    // read 'read' access modifier
+    if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'READ') then
+      TPasProperty(Element).ReadAccessorName := GetAccessorName
+    else
+//    not read accessor will be recheck for another token
+      UngetToken;
+    
+    NextToken;
   end;
-  if CurToken <> tkSemicolon then
-  begin
-  // read 'write' access modifier
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'WRITE') then
-          TPasProperty(Element).WriteAccessorName := GetAccessorName
-  else
-          UngetToken;
-  NextToken;
+  
+// if the accessors list is not finished    
+  if CurToken <> tkSemicolon then begin
+    // read 'write' access modifier
+    if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'WRITE') then
+      TPasProperty(Element).WriteAccessorName := GetAccessorName
+    else
+//    not write accessor will be recheck for another token
+      UngetToken;
+    
+    NextToken;
   end;
-  if CurToken <> tkSemicolon then
-  begin
-  // read 'stored' access modifier
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'STORED') then
-  begin
-          NextToken;
-          if CurToken = tkTrue then
-          TPasProperty(Element).StoredAccessorName := 'True'
-          else if CurToken = tkFalse then
-          TPasProperty(Element).StoredAccessorName := 'False'
-          else if CurToken = tkIdentifier then
-          TPasProperty(Element).StoredAccessorName := CurTokenString
-          else
-          ParseExc(SParserSyntaxError);
-  end else
-          UngetToken;
-  NextToken;
+  
+// if the specifiers list is not finished      
+  if CurToken <> tkSemicolon then begin
+    // read 'stored' access modifier
+    if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'STORED') then begin
+      NextToken;
+      if CurToken = tkTrue then
+        TPasProperty(Element).StoredAccessorName := 'True'
+      else if CurToken = tkFalse then
+        TPasProperty(Element).StoredAccessorName := 'False'
+      else if CurToken = tkIdentifier then
+        TPasProperty(Element).StoredAccessorName := CurTokenString
+      else
+        ParseExc(SParserSyntaxError);
+    end else
+//    not stored accessor will be recheck for another token    
+      UngetToken;
+
+    NextToken;
   end;
-  if CurToken <> tkSemicolon then
-  begin
-  // read 'default' value modifier
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'DEFAULT') then
-          TPasProperty(Element).DefaultValue := ParseExpression
-  else
-          UngetToken;
-  NextToken;
+  
+// if the specifiers list is not finished        
+  if CurToken <> tkSemicolon then begin
+    if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'DEFAULT') then
+//    read 'default' value modifier -> ParseExpression(DEFAULT <value>) 
+      TPasProperty(Element).DefaultValue := ParseExpression
+    else
+//    not "default <value>" prop will be recheck for another token        
+      UngetToken;
+      
+    NextToken;
   end;
-  if CurToken <> tkSemicolon then
-  begin
-  // read 'nodefault' modifier
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'NODEFAULT') then
-  begin
-          TPasProperty(Element).IsNodefault:=true;
+  
+// if the specifiers list is not finished          
+  if CurToken <> tkSemicolon then begin
+    if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'NODEFAULT') then begin
+//    read 'nodefault' modifier
+      TPasProperty(Element).IsNodefault:=true;
+    end;
+//  stop recheck for specifiers - start from next token
+    NextToken;
   end;
-  NextToken;
+
+// after NODEFAULT may be a ";"
+  if CurToken = tkSemicolon then begin
+    // read semicolon
+    NextToken;
   end;
-  if CurToken = tkSemicolon then
-  begin
-  // read semicolon
-  NextToken;
+
+  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'DEFAULT') then begin
+//  what is after DEFAULT token at the end  
+    NextToken;
+    if CurToken = tkSemicolon then begin
+//    ";" then DEFAULT=prop
+      TPasProperty(Element).IsDefault := True;
+      UngetToken;
+    end else begin
+//    "!;" then a step back to get phrase "DEFAULT <value>"
+      UngetToken;
+//    DefaultValue  -> ParseExpression(DEFAULT <value>)  and stay on the <value>
+      TPasProperty(Element).DefaultValue := ParseExpression;
+    end;
+
+//!!  there may be DEPRECATED token
+    NextToken;
+    
   end;
-  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'DEFAULT') then
-  begin
-  NextToken;
-  if CurToken = tkSemicolon then
-  begin
-	  TPasProperty(Element).IsDefault := True;
-          UngetToken;
-  end else
-  begin
-          UngetToken;
-          TPasProperty(Element).DefaultValue := ParseExpression;
+
+// after DEFAULT may be a ";"
+  if CurToken = tkSemicolon then begin
+    // read semicolon
+    NextToken;
   end;
+  
+  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'DEPRECATED') then begin
+//  nothing to do on DEPRECATED - just to accept
+//    NextToken;
   end else
-  UngetToken;
+    UngetToken;;
+    
+//!!   else
+//  not DEFAULT prop accessor will be recheck for another token      
+//!!    UngetToken;
+
+{
+  if CurToken = tkSemicolon then begin
+    // read semicolon
+    NextToken;
+  end;
+  if (CurToken = tkIdentifier) and (UpperCase(CurTokenText) = 'DEPRECATED') then begin
+//  nothing to do - just to process
+    NextToken;
+  end;
+  if CurToken = tkSemicolon then begin
+    // read semicolon
+    NextToken;
+  end;
+}
+
+
+    
 end;
 
 
@@ -1782,19 +1879,31 @@ var
           Proc.IsAbstract := True
         else if s = 'OVERRIDE' then
           Proc.IsOverride := True
+        else if s = 'REINTRODUCE' then
+          Proc.IsReintroduced := True
         else if s = 'OVERLOAD' then
           Proc.IsOverload := True
-        else if s = 'MESSAGE' then
-        begin
+        else if s = 'STATIC' then
+          Proc.IsStatic := True
+        else if s = 'MESSAGE' then begin
           Proc.IsMessage := True;
           repeat
             NextToken;
           until CurToken = tkSemicolon;
           UngetToken;
-        end else if s = 'CDECL' then
+        end 
+	else if s = 'CDECL' then
+{      El['calling-conv'] := 'cdecl';}
+	else if s = 'PASCAL' then
 {      El['calling-conv'] := 'cdecl';}
         else if s = 'STDCALL' then
 {      El['calling-conv'] := 'stdcall';}
+        else if s = 'OLDFPCCALL' then
+{      El['calling-conv'] := 'oldfpccall';}
+        else if s = 'EXTDECL' then
+{      El['calling-conv'] := 'extdecl';}
+        else if s = 'DEPRECATED' then
+{      El['calling-conv'] := 'deprecated';}
         else
         begin
           UngetToken;

+ 1 - 1
fcl/tests/dbugsrv.pp

@@ -3,7 +3,7 @@ program dbugsrv;
 {$APPTYPE CONSOLE}
 
 uses
-  classes,SysUtils,simpleipc,msgintf;
+  classes,SysUtils,simpleipc,dbugmsg;
 
 Var
   Srv : TSimpleIPCServer;

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.